From c0b2468b048b01dd9ff3c1d1ba4b3cca74ade823 Mon Sep 17 00:00:00 2001 From: Nikola Milentijevic Date: Mon, 16 Mar 2015 22:24:29 +0100 Subject: [PATCH 001/254] Consolidate distance factor for 3D audio The semantics of distance factor is now same for both OpenAL and Fmod. The value is given in units per meter, and the default is 1.0. This means that Panda units are understood to be meters by default. For example, for feet one would have to set this value to 3.28. --- panda/src/audio/audioManager.h | 8 ++++---- panda/src/audiotraits/fmodAudioManager.cxx | 11 +++-------- panda/src/audiotraits/fmodAudioManager.h | 7 ++++--- panda/src/audiotraits/fmodAudioSound.cxx | 3 +++ panda/src/audiotraits/openalAudioManager.cxx | 9 ++++----- panda/src/audiotraits/openalAudioManager.h | 10 ++++++---- panda/src/audiotraits/openalAudioSound.cxx | 6 +++--- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/panda/src/audio/audioManager.h b/panda/src/audio/audioManager.h index 4c0915a67f..7fc269f688 100644 --- a/panda/src/audio/audioManager.h +++ b/panda/src/audio/audioManager.h @@ -166,10 +166,10 @@ PUBLISHED: PN_stdfloat *fx, PN_stdfloat *fy, PN_stdfloat *fz, PN_stdfloat *ux, PN_stdfloat *uy, PN_stdfloat *uz); - // Control the "relative scale that sets the distance factor" units for 3D spacialized audio. Default is 1.0 - // Fmod uses meters internally, so give a float in Units-per meter - // Don't know what Miles uses. - // Default is 1.0 which is adjust in panda to be feet. + // Control the "relative scale that sets the distance factor" units for 3D spacialized audio. + // This is a float in units-per-meter. Default value is 1.0, which means that Panda units + // are understood as meters; for e.g. feet, set 3.28. + // This factor is applied only to Fmod and OpenAL at the moment. virtual void audio_3d_set_distance_factor(PN_stdfloat factor); virtual PN_stdfloat audio_3d_get_distance_factor() const; diff --git a/panda/src/audiotraits/fmodAudioManager.cxx b/panda/src/audiotraits/fmodAudioManager.cxx index 3a6a4a82e4..1ee2ffc4d4 100644 --- a/panda/src/audiotraits/fmodAudioManager.cxx +++ b/panda/src/audiotraits/fmodAudioManager.cxx @@ -45,15 +45,8 @@ pset FmodAudioManager::_all_managers; bool FmodAudioManager::_system_is_valid = false; -// This sets the distance factor for 3D audio to use feet. -// FMOD uses meters by default. -// Since Panda use feet we need to compensate for that with a factor of 3.28 -// -// This can be overwritten. You just need to call -// audio_3d_set_distance_factor(PN_stdfloat factor) and set your new factor. - PN_stdfloat FmodAudioManager::_doppler_factor = 1; -PN_stdfloat FmodAudioManager::_distance_factor = 3.28; +PN_stdfloat FmodAudioManager::_distance_factor = 1; PN_stdfloat FmodAudioManager::_drop_off_factor = 1; @@ -110,6 +103,8 @@ FmodAudioManager() { _up.y = 0; _up.z = 0; + _active = true; + _saved_outputtype = FMOD_OUTPUTTYPE_AUTODETECT; if (_system == (FMOD::System *)NULL) { diff --git a/panda/src/audiotraits/fmodAudioManager.h b/panda/src/audiotraits/fmodAudioManager.h index d43933dc4c..cde625c443 100644 --- a/panda/src/audiotraits/fmodAudioManager.h +++ b/panda/src/audiotraits/fmodAudioManager.h @@ -132,9 +132,10 @@ class EXPCL_FMOD_AUDIO FmodAudioManager : public AudioManager { PN_stdfloat *fx, PN_stdfloat *fy, PN_stdfloat *fz, PN_stdfloat *ux, PN_stdfloat *uy, PN_stdfloat *uz); - // Control the "relative distance factor" for 3D spacialized audio. Default is 1.0 - // Fmod uses meters internally, so give a float in Units-per meter - // Don't know what Miles uses. + // Control the "relative scale that sets the distance factor" units for 3D spacialized audio. + // This is a float in units-per-meter. Default value is 1.0, which means that Panda units + // are understood as meters; for e.g. feet, set 3.28. + // This factor is applied only to Fmod and OpenAL at the moment. virtual void audio_3d_set_distance_factor(PN_stdfloat factor); virtual PN_stdfloat audio_3d_get_distance_factor() const; diff --git a/panda/src/audiotraits/fmodAudioSound.cxx b/panda/src/audiotraits/fmodAudioSound.cxx index 4b9446f38d..4a5c788d9c 100644 --- a/panda/src/audiotraits/fmodAudioSound.cxx +++ b/panda/src/audiotraits/fmodAudioSound.cxx @@ -59,6 +59,9 @@ FmodAudioSound(AudioManager *manager, Filename file_name, bool positional) { _velocity.y = 0; _velocity.z = 0; + _min_dist = 1.0; + _max_dist = 1000000000.0; + //Play Rate Variable _playrate = 1; diff --git a/panda/src/audiotraits/openalAudioManager.cxx b/panda/src/audiotraits/openalAudioManager.cxx index e87ebee5f0..d3be9016f9 100644 --- a/panda/src/audiotraits/openalAudioManager.cxx +++ b/panda/src/audiotraits/openalAudioManager.cxx @@ -97,7 +97,7 @@ OpenALAudioManager() { _is_valid = true; //Init 3D attributes - _distance_factor = 3.28; + _distance_factor = 1; _drop_off_factor = 1; _position[0] = 0; @@ -664,11 +664,10 @@ audio_3d_get_listener_attributes(PN_stdfloat *px, PN_stdfloat *py, PN_stdfloat * //////////////////////////////////////////////////////////////////// // Function: OpenALAudioManager::audio_3d_set_distance_factor // Access: Public -// Description: Set units per foot +// Description: Set value in units per meter // WARNING: OpenAL has no distance factor but we use this as a scale // on the min/max distances of sounds to preserve FMOD compatibility. // Also, adjusts the speed of sound to compensate for unit difference. -// OpenAL's default speed of sound is 343.3 m/s == 1126.3 ft/s //////////////////////////////////////////////////////////////////// void OpenALAudioManager:: audio_3d_set_distance_factor(PN_stdfloat factor) { @@ -680,7 +679,7 @@ audio_3d_set_distance_factor(PN_stdfloat factor) { alGetError(); // clear errors if (_distance_factor>0) { - alSpeedOfSound(1126.3*_distance_factor); + alSpeedOfSound(343.3*_distance_factor); al_audio_errcheck("alSpeedOfSound()"); // resets the doppler factor to the correct setting in case it was set to 0.0 by a distance_factor<=0.0 alDopplerFactor(_doppler_factor); @@ -701,7 +700,7 @@ audio_3d_set_distance_factor(PN_stdfloat factor) { //////////////////////////////////////////////////////////////////// // Function: OpenALAudioManager::audio_3d_get_distance_factor // Access: Public -// Description: Sets units per foot +// Description: Get value in units per meter //////////////////////////////////////////////////////////////////// PN_stdfloat OpenALAudioManager:: audio_3d_get_distance_factor() const { diff --git a/panda/src/audiotraits/openalAudioManager.h b/panda/src/audiotraits/openalAudioManager.h index 0dcc0e07e2..787069fe5e 100644 --- a/panda/src/audiotraits/openalAudioManager.h +++ b/panda/src/audiotraits/openalAudioManager.h @@ -88,10 +88,12 @@ class EXPCL_OPENAL_AUDIO OpenALAudioManager : public AudioManager { PN_stdfloat *fx, PN_stdfloat *fy, PN_stdfloat *fz, PN_stdfloat *ux, PN_stdfloat *uy, PN_stdfloat *uz); - // Control the "relative distance factor" for 3D spacialized audio in units-per-foot. Default is 1.0 - // OpenAL has no distance factor but we use this as a scale - // on the min/max distances of sounds to preserve FMOD compatibility. - // Also, adjusts the speed of sound to compensate for unit difference. + // Control the "relative scale that sets the distance factor" units for 3D spacialized audio. + // This is a float in units-per-meter. Default value is 1.0, which means that Panda units + // are understood as meters; for e.g. feet, set 3.28. + // This factor is applied only to Fmod and OpenAL at the moment. + // OpenAL in fact has no distance factor like Fmod, but works with the speed of sound instead, + // so we use this factor to scale the speed of sound. virtual void audio_3d_set_distance_factor(PN_stdfloat factor); virtual PN_stdfloat audio_3d_get_distance_factor() const; diff --git a/panda/src/audiotraits/openalAudioSound.cxx b/panda/src/audiotraits/openalAudioSound.cxx index eb34d24973..a5cecd7601 100644 --- a/panda/src/audiotraits/openalAudioSound.cxx +++ b/panda/src/audiotraits/openalAudioSound.cxx @@ -53,7 +53,7 @@ OpenALAudioSound(OpenALAudioManager* manager, _balance(0), _play_rate(1.0), _positional(positional), - _min_dist(3.28f), + _min_dist(1.0f), _max_dist(1000000000.0f), _drop_off_factor(1.0f), _length(0.0), @@ -745,7 +745,7 @@ set_3d_min_distance(PN_stdfloat dist) { _manager->make_current(); alGetError(); // clear errors - alSourcef(_source,AL_REFERENCE_DISTANCE,_min_dist*_manager->audio_3d_get_distance_factor()); + alSourcef(_source,AL_REFERENCE_DISTANCE,_min_dist); al_audio_errcheck("alSourcefv(_source,AL_REFERENCE_DISTANCE)"); } } @@ -774,7 +774,7 @@ set_3d_max_distance(PN_stdfloat dist) { _manager->make_current(); alGetError(); // clear errors - alSourcef(_source,AL_MAX_DISTANCE,_max_dist*_manager->audio_3d_get_distance_factor()); + alSourcef(_source,AL_MAX_DISTANCE,_max_dist); al_audio_errcheck("alSourcefv(_source,AL_MAX_DISTANCE)"); } } From e9fa116d170c55b0a00537e8d438acbd3fd0b6e9 Mon Sep 17 00:00:00 2001 From: Ed Swartz Date: Mon, 11 May 2015 12:10:18 -0500 Subject: [PATCH 002/254] Dynamically adjust camera clip range in pview --- panda/src/testbed/pview.cxx | 111 ++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/panda/src/testbed/pview.cxx b/panda/src/testbed/pview.cxx index e92df5d220..acbac1bbcb 100644 --- a/panda/src/testbed/pview.cxx +++ b/panda/src/testbed/pview.cxx @@ -27,6 +27,9 @@ #include "panda_getopt.h" #include "preprocess_argv.h" #include "graphicsPipeSelection.h" +#include "asyncTaskManager.h" +#include "asyncTask.h" +#include "boundingSphere.h" // By including checkPandaVersion.h, we guarantee that runtime // attempts to run pview will fail if it inadvertently links with the @@ -234,6 +237,111 @@ report_version() { nout << "\n"; } +// Task that dynamically adjusts the camera len's near/far clipping +// planes to ensure the user can zoom in as close as needed to a model. +// +// Code adapted from WindowFramework::center_trackball(), but +// without moving the camera. When the camera is inside the model, +// the near clip is set to near-zero. +// +class AdjustCameraClipPlanesTask : public AsyncTask { +public: + AdjustCameraClipPlanesTask(const string &name, Camera *camera) : + AsyncTask(name), _camera(camera), _lens(camera->get_lens(0)), _sphere(NULL) + { + NodePath np = framework.get_models(); + PT(BoundingVolume) volume = np.get_bounds(); + + // We expect at least a geometric bounding volume around the world. + nassertv(volume != (BoundingVolume *)NULL); + nassertv(volume->is_of_type(GeometricBoundingVolume::get_class_type())); + CPT(GeometricBoundingVolume) gbv = DCAST(GeometricBoundingVolume, volume); + + if (np.has_parent()) { + CPT(TransformState) net_transform = np.get_parent().get_net_transform(); + PT(GeometricBoundingVolume) new_gbv = DCAST(GeometricBoundingVolume, gbv->make_copy()); + new_gbv->xform(net_transform->get_mat()); + gbv = new_gbv; + } + + // Determine the bounding sphere around the object. + if (gbv->is_infinite()) { + framework_cat.warning() + << "Infinite bounding volume for " << np << "\n"; + return; + } + + if (gbv->is_empty()) { + framework_cat.warning() + << "Empty bounding volume for " << np << "\n"; + return; + } + + // The BoundingVolume might be a sphere (it's likely), but since it + // might not, we'll take no chances and make our own sphere. + _sphere = new BoundingSphere(gbv->get_approx_center(), 0.0f); + if (!_sphere->extend_by(gbv)) { + framework_cat.warning() + << "Cannot determine bounding volume of " << np << "\n"; + return; + } + } + ALLOC_DELETED_CHAIN(AdjustCameraClipPlanesTask); + + virtual DoneStatus do_task() { + if (!_sphere) { + return DS_done; + } + + if (framework.get_num_windows() == 0) { + return DS_cont; + } + + WindowFramework *wf = framework.get_window(0); + if (!wf) { + return DS_cont; + } + + // Get current camera position. + NodePath cameraNP = wf->get_camera_group(); + LPoint3 pos = cameraNP.get_pos(); + + // See how far or close the camera is + LPoint3 center = _sphere->get_center(); + PN_stdfloat radius = _sphere->get_radius(); + + PN_stdfloat min_distance = 0.001 * radius; + + // Choose a suitable distance to view the whole volume in our frame. + // This is based on the camera lens in use. + PN_stdfloat distance; + CPT(GeometricBoundingVolume) gbv = DCAST(GeometricBoundingVolume, _sphere); + if (gbv->contains(pos)) { + // See as up-close to the model as possible + distance = min_distance; + } else { + // View from a distance + distance = (center - pos).length(); + } + + // Ensure the far plane is far enough back to see the entire object. + PN_stdfloat ideal_far_plane = distance + radius * 1.5; + _lens->set_far(max(_lens->get_default_far(), ideal_far_plane)); + + // And that the near plane is far enough forward, but if inside + // the sphere, keep above 0. + PN_stdfloat ideal_near_plane = max(min_distance * 10, distance - radius); + _lens->set_near(min(_lens->get_default_near(), ideal_near_plane)); + + return DS_cont; + } + + Camera *_camera; + Lens *_lens; + PT(BoundingSphere) _sphere; +}; + + int main(int argc, char **argv) { // A call to pystub() to force libpystub.so to be linked in. @@ -389,6 +497,9 @@ main(int argc, char **argv) { window->set_anim_controls(true); } + PT(AdjustCameraClipPlanesTask) task = new AdjustCameraClipPlanesTask("Adjust Camera Bounds", window->get_camera(0)); + framework.get_task_mgr().add(task); + framework.enable_default_keys(); framework.define_key("shift-w", "open a new window", event_W, NULL); framework.define_key("shift-f", "flatten hierarchy", event_F, NULL); From 0925a940cdb295bdfffac7f0b9d6ca3dd7cd8377 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 26 Dec 2016 07:08:51 -0500 Subject: [PATCH 003/254] Fix oops in 1.9.3 release notes --- doc/ReleaseNotes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ReleaseNotes b/doc/ReleaseNotes index 74a0a9ea05..d3e22a1fc3 100644 --- a/doc/ReleaseNotes +++ b/doc/ReleaseNotes @@ -54,6 +54,7 @@ This issue fixes several bugs that were still found in 1.9.2. * Now also compiles on older Linux distros (eg. CentOS 5 / manylinux1) * get_keyboard_map now includes keys on layouts with special characters * Fix crash due to incorrect alignment when compiling Eigen with AVX +* Fix crash when writing 16-bit .tif file (now silently downsamples) ------------------------ RELEASE 1.9.2 ------------------------ @@ -78,7 +79,6 @@ remained in the 1.9.1 release, including: * Fix constant reloading of texture when gl-ignore-mipmaps is set * BamReader now releases the GIL (so it can be used threaded) * Fix AttributeError in direct.stdpy.threading module -* Fix crash when writing 16-bit .tif file (now silently downsamples) ------------------------ RELEASE 1.9.1 ------------------------ From 8c6a2a57cb3cff918a15c390af93698b607190d4 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 26 Dec 2016 07:09:21 -0500 Subject: [PATCH 004/254] Handle symlinks correctly when correcting Mac library deps --- makepanda/makepanda.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index cb175542f2..4bd471ed37 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -2708,17 +2708,17 @@ ConditionalWriteFile(GetOutputDir()+"/etc/Confauto.prc", confautoprc) tp_dir = GetThirdpartyDir() if tp_dir is not None: - dylibs = set() + dylibs = {} if GetTarget() == 'darwin': # Make a list of all the dylibs we ship, to figure out whether we should use # install_name_tool to correct the library reference to point to our copy. for lib in glob.glob(tp_dir + "/*/lib/*.dylib"): - dylibs.add(os.path.basename(lib)) + dylibs[os.path.basename(lib)] = os.path.basename(os.path.realpath(lib)) if not PkgSkip("PYTHON"): for lib in glob.glob(tp_dir + "/*/lib/" + SDK["PYTHONVERSION"] + "/*.dylib"): - dylibs.add(os.path.basename(lib)) + dylibs[os.path.basename(lib)] = os.path.basename(os.path.realpath(lib)) for pkg in PkgListGet(): if PkgSkip(pkg): @@ -2773,7 +2773,8 @@ if tp_dir is not None: libdep = line.split(" ", 1)[0] dep_basename = os.path.basename(libdep) if dep_basename in dylibs: - oscmd("install_name_tool -change %s %s%s %s" % (libdep, dep_prefix, dep_basename, target), True) + dep_target = dylibs[dep_basename] + oscmd("install_name_tool -change %s %s%s %s" % (libdep, dep_prefix, dep_target, target), True) JustBuilt([target], [tp_lib]) From 94641c83a0ef06a5c3d901f66b336631a5c8f9d7 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 28 Dec 2016 19:18:21 +0100 Subject: [PATCH 005/254] linmath: use correct 32-byte alignment when compiling Eigen with AVX --- dtool/src/dtoolbase/dtoolbase.h | 5 +++++ panda/src/linmath/lsimpleMatrix.h | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index 27add7c84d..825592a0d7 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -336,21 +336,26 @@ #define ALIGN_4BYTE #define ALIGN_8BYTE #define ALIGN_16BYTE +#define ALIGN_32BYTE #define ALIGN_64BYTE #elif defined(_MSC_VER) #define ALIGN_4BYTE __declspec(align(4)) #define ALIGN_8BYTE __declspec(align(8)) #define ALIGN_16BYTE __declspec(align(16)) +#define ALIGN_32BYTE __declspec(align(32)) #define ALIGN_64BYTE __declspec(align(64)) #elif defined(__GNUC__) #define ALIGN_4BYTE __attribute__ ((aligned (4))) #define ALIGN_8BYTE __attribute__ ((aligned (8))) #define ALIGN_16BYTE __attribute__ ((aligned (16))) +#define ALIGN_32BYTE __attribute__ ((aligned (32))) #define ALIGN_64BYTE __attribute__ ((aligned (64))) #else #define ALIGN_4BYTE #define ALIGN_8BYTE #define ALIGN_16BYTE +#define ALIGN_32BYTE +#define ALIGN_64BYTE #endif // Do we need to implement memory-alignment enforcement within the diff --git a/panda/src/linmath/lsimpleMatrix.h b/panda/src/linmath/lsimpleMatrix.h index 310dd23d03..ce84b64240 100644 --- a/panda/src/linmath/lsimpleMatrix.h +++ b/panda/src/linmath/lsimpleMatrix.h @@ -61,7 +61,9 @@ private: #endif // HAVE_EIGEN // This is as good a place as any to define this alignment macro. -#ifdef LINMATH_ALIGN +#if defined(LINMATH_ALIGN) && defined(HAVE_EIGEN) && defined(__AVX__) +#define ALIGN_LINMATH ALIGN_32BYTE +#elif defined(LINMATH_ALIGN) #define ALIGN_LINMATH ALIGN_16BYTE #else #define ALIGN_LINMATH From cf105f276c55b7a02b87c527bc01f56ef3df306b Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 28 Dec 2016 20:23:27 +0100 Subject: [PATCH 006/254] More alignment fixes for 32-byte AVX --- dtool/src/dtoolbase/deletedBufferChain.cxx | 4 ++-- dtool/src/dtoolbase/dtoolbase.h | 5 +++++ panda/src/linmath/lsimpleMatrix.h | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/dtool/src/dtoolbase/deletedBufferChain.cxx b/dtool/src/dtoolbase/deletedBufferChain.cxx index 122edf8837..557b6ce9d8 100644 --- a/dtool/src/dtoolbase/deletedBufferChain.cxx +++ b/dtool/src/dtoolbase/deletedBufferChain.cxx @@ -71,7 +71,7 @@ allocate(size_t size, TypeHandle type_handle) { // Allocate memory, and make sure the object starts at the proper alignment. void *mem = NeverFreeMemory::alloc(alloc_size); - intptr_t pad = ((intptr_t)flag_reserved_bytes - (intptr_t)mem) % MemoryHook::get_memory_alignment(); + intptr_t pad = (-(intptr_t)flag_reserved_bytes - (intptr_t)mem) % MemoryHook::get_memory_alignment(); obj = (ObjectNode *)((uintptr_t)mem + pad); #ifdef USE_DELETEDCHAINFLAG @@ -80,7 +80,7 @@ allocate(size_t size, TypeHandle type_handle) { void *ptr = node_to_buffer(obj); -#ifdef _DEBUG +#ifndef NDEBUG assert(((uintptr_t)ptr % MemoryHook::get_memory_alignment()) == 0); #endif diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index b192f24055..c6cbbd7f46 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -339,21 +339,26 @@ typedef struct _object PyObject; #define ALIGN_4BYTE #define ALIGN_8BYTE #define ALIGN_16BYTE +#define ALIGN_32BYTE #define ALIGN_64BYTE #elif defined(_MSC_VER) #define ALIGN_4BYTE __declspec(align(4)) #define ALIGN_8BYTE __declspec(align(8)) #define ALIGN_16BYTE __declspec(align(16)) +#define ALIGN_32BYTE __declspec(align(32)) #define ALIGN_64BYTE __declspec(align(64)) #elif defined(__GNUC__) #define ALIGN_4BYTE __attribute__ ((aligned (4))) #define ALIGN_8BYTE __attribute__ ((aligned (8))) #define ALIGN_16BYTE __attribute__ ((aligned (16))) +#define ALIGN_32BYTE __attribute__ ((aligned (32))) #define ALIGN_64BYTE __attribute__ ((aligned (64))) #else #define ALIGN_4BYTE #define ALIGN_8BYTE #define ALIGN_16BYTE +#define ALIGN_32BYTE +#define ALIGN_64BYTE #endif // Do we need to implement memory-alignment enforcement within the MemoryHook diff --git a/panda/src/linmath/lsimpleMatrix.h b/panda/src/linmath/lsimpleMatrix.h index 0ba2dc1196..5669e18be3 100644 --- a/panda/src/linmath/lsimpleMatrix.h +++ b/panda/src/linmath/lsimpleMatrix.h @@ -58,7 +58,9 @@ private: #endif // HAVE_EIGEN // This is as good a place as any to define this alignment macro. -#ifdef LINMATH_ALIGN +#if defined(LINMATH_ALIGN) && defined(HAVE_EIGEN) && defined(__AVX__) +#define ALIGN_LINMATH ALIGN_32BYTE +#elif defined(LINMATH_ALIGN) #define ALIGN_LINMATH ALIGN_16BYTE #else #define ALIGN_LINMATH From fa851ae5acb2b0ce06a2ae425f896ce7acb983c4 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 4 Jan 2017 22:42:05 +0100 Subject: [PATCH 007/254] Allow custom version to be passed on to makewheel when building with --wheel --- makepanda/makepanda.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 95dc6d791b..c96d188bcb 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -52,6 +52,7 @@ RUNTIME=0 DISTRIBUTOR="" VERSION=None DEBVERSION=None +WHLVERSION=None RPMRELEASE="1" GIT_COMMIT=None P3DSUFFIX=None @@ -163,7 +164,7 @@ def usage(problem): def parseopts(args): global INSTALLER,WHEEL,RTDIST,RUNTIME,GENMAN,DISTRIBUTOR,VERSION global COMPRESSOR,THREADCOUNT,OSXTARGET,OSX_ARCHS,HOST_URL - global DEBVERSION,RPMRELEASE,GIT_COMMIT,P3DSUFFIX,RTDIST_VERSION + global DEBVERSION,WHLVERSION,RPMRELEASE,GIT_COMMIT,P3DSUFFIX,RTDIST_VERSION global STRDXSDKVERSION, WINDOWS_SDK, MSVC_VERSION, BOOUSEINTELCOMPILER longopts = [ "help","distributor=","verbose","runtime","osxtarget=", @@ -206,8 +207,11 @@ def parseopts(args): elif (option=="--arch"): target_arch = value.strip() elif (option=="--nocolor"): DisableColors() elif (option=="--version"): - VERSION=value - if (len(VERSION.split(".")) != 3): raise Exception + match = re.match(r'^\d+\.\d+\.\d+', value) + if not match: + usage("version requires three digits") + WHLVERSION = value + VERSION = match.group() elif (option=="--lzma"): COMPRESSOR="lzma" elif (option=="--override"): AddOverride(value.strip()) elif (option=="--static"): SetLinkAllStatic(True) @@ -7257,7 +7261,7 @@ try: if WHEEL: ProgressOutput(100.0, "Building wheel") from makewheel import makewheel - makewheel(VERSION, GetOutputDir()) + makewheel(WHLVERSION, GetOutputDir()) finally: SaveDependencyCache() From 40ea0ab7869a77093d4d60fe31f01fcf58d60089 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 4 Jan 2017 22:46:57 +0100 Subject: [PATCH 008/254] cppparser: support directives __LINE__, __FILE__, __has_include --- dtool/src/cppparser/cppPreprocessor.cxx | 247 +++++++++++++++++------- dtool/src/cppparser/cppPreprocessor.h | 3 + 2 files changed, 177 insertions(+), 73 deletions(-) diff --git a/dtool/src/cppparser/cppPreprocessor.cxx b/dtool/src/cppparser/cppPreprocessor.cxx index 83050d3c41..feda153530 100644 --- a/dtool/src/cppparser/cppPreprocessor.cxx +++ b/dtool/src/cppparser/cppPreprocessor.cxx @@ -809,6 +809,8 @@ expand_manifests(const string &input_expr, bool expand_undefined, // Here's an identifier. Is it "defined"? if (ident == "defined") { expand_defined_function(expr, q, p); + } else if (expand_undefined && ident == "__has_include") { + expand_has_include_function(expr, q, p, loc); } else { // Is it a manifest? Manifests::const_iterator mi = _manifests.find(ident); @@ -817,6 +819,20 @@ expand_manifests(const string &input_expr, bool expand_undefined, expand_manifest_inline(expr, q, p, manifest); manifest_found = true; + } else if (ident == "__FILE__") { + // Special case: this is a dynamic definition. + string file = string("\"") + loc.file._filename_as_referenced.get_fullpath() + "\""; + expr = expr.substr(0, q) + file + expr.substr(p); + p = q + file.size(); + manifest_found = true; + + } else if (ident == "__LINE__") { + // So is this. + string line = format_string(loc.first_line); + expr = expr.substr(0, q) + line + expr.substr(p); + p = q + line.size(); + manifest_found = true; + } else if (expand_undefined && ident != "true" && ident != "false") { // It is not found. Expand it to 0, but only if we are currently // parsing an #if expression. @@ -1486,14 +1502,10 @@ handle_undef_directive(const string &args, const YYLTYPE &loc) { */ void CPPPreprocessor:: handle_ifdef_directive(const string &args, const YYLTYPE &loc) { - Manifests::const_iterator mi = _manifests.find(args); - if (mi != _manifests.end()) { - // The macro is defined. We continue. - return; + if (!is_manifest_defined(args)) { + // The macro is undefined. Skip stuff. + skip_false_if_block(true); } - - // The macro is undefined. Skip stuff. - skip_false_if_block(true); } /** @@ -1501,17 +1513,12 @@ handle_ifdef_directive(const string &args, const YYLTYPE &loc) { */ void CPPPreprocessor:: handle_ifndef_directive(const string &args, const YYLTYPE &loc) { - Manifests::const_iterator mi = _manifests.find(args); - if (mi == _manifests.end()) { - // The macro is undefined. We continue. - return; + if (is_manifest_defined(args)) { + // The macro is defined. Skip stuff. + skip_false_if_block(true); } - - // The macro is defined. Skip stuff. - skip_false_if_block(true); } - /** * */ @@ -1593,6 +1600,8 @@ handle_include_directive(const string &args, const YYLTYPE &loc) { _angle_includes.insert(filename); } } + } else { + warning("Ignoring invalid #include directive", loc); } filename.set_text(); @@ -1600,71 +1609,30 @@ handle_include_directive(const string &args, const YYLTYPE &loc) { // Now look for the filename. If we didn't use angle quotes, look first in // the current directory. - bool found_file = false; CPPFile::Source source = CPPFile::S_none; - if (okflag) { - found_file = false; + if (find_include(filename, angle_quotes, source)) { + _last_c = '\0'; - // Search the current directory. - if (!angle_quotes && !found_file && filename.exists()) { - found_file = true; + // If it was explicitly named on the command-line, mark it S_local. + filename.make_canonical(); + if (_explicit_files.count(filename)) { source = CPPFile::S_local; } - // Search the same directory as the includer. - if (!angle_quotes && !found_file) { - Filename match(get_file()._filename.get_dirname(), filename); - if (match.exists()) { - filename = match; - found_file = true; - source = CPPFile::S_alternate; - } + CPPFile file(filename, filename_as_referenced, source); + + // Don't include it if we included it before and it had #pragma once. + ParsedFiles::const_iterator it = _parsed_files.find(file); + if (it != _parsed_files.end() && it->_pragma_once) { + return; } - // Now search the angle-include-path - if (angle_quotes && !found_file && filename.resolve_filename(_angle_include_path)) { - found_file = true; - source = CPPFile::S_system; - } - - // Now search the quote-include-path - if (!angle_quotes && !found_file) { - for (size_t dir=0; dir<_quote_include_path.get_num_directories(); dir++) { - Filename match(_quote_include_path.get_directory(dir), filename); - if (match.exists()) { - filename = match; - found_file = true; - source = _quote_include_kind[dir]; - } - } - } - - if (!found_file) { - warning("Cannot find " + filename.get_fullpath(), loc); - } else { - _last_c = '\0'; - - // If it was explicitly named on the command-line, mark it S_local. - filename.make_canonical(); - if (_explicit_files.count(filename)) { - source = CPPFile::S_local; - } - - CPPFile file(filename, filename_as_referenced, source); - - // Don't include it if we included it before and it had #pragma once. - ParsedFiles::const_iterator it = _parsed_files.find(file); - if (it != _parsed_files.end() && it->_pragma_once) { - return; - } - - if (!push_file(file)) { - warning("Unable to read " + filename.get_fullpath(), loc); - } + if (!push_file(file)) { + warning("Unable to read " + filename.get_fullpath(), loc); } } else { - warning("Ignoring invalid #include directive", loc); + warning("Cannot find " + filename.get_fullpath(), loc); } } @@ -1779,6 +1747,69 @@ skip_false_if_block(bool consider_elifs) { _save_comments = true; } +/** + * Returns true if the given manifest is defined. + */ +bool CPPPreprocessor:: +is_manifest_defined(const string &manifest_name) { + Manifests::const_iterator mi = _manifests.find(manifest_name); + if (mi != _manifests.end()) { + return true; + } + + if (manifest_name == "__has_include" || + manifest_name == "__FILE__" || + manifest_name == "__LINE__") { + // Special built-in directives that are considered "defined". + return true; + } + + return false; +} + +/** + * Locates the given filename. Changes the first argument to the full path. + */ +bool CPPPreprocessor:: +find_include(Filename &filename, bool angle_quotes, CPPFile::Source &source) { + // Now look for the filename. If we didn't use angle quotes, look first in + // the current directory. + if (!angle_quotes && filename.exists()) { + source = CPPFile::S_local; + return true; + } + + // Search the same directory as the includer. + if (!angle_quotes) { + Filename match(get_file()._filename.get_dirname(), filename); + if (match.exists()) { + filename = match; + source = CPPFile::S_alternate; + return true; + } + } + + // Now search the angle-include-path + if (angle_quotes && filename.resolve_filename(_angle_include_path)) { + source = CPPFile::S_system; + return true; + } + + // Now search the quote-include-path + if (!angle_quotes) { + for (size_t dir = 0; dir < _quote_include_path.get_num_directories(); ++dir) { + Filename match(_quote_include_path.get_directory(dir), filename); + if (match.exists()) { + filename = match; + source = _quote_include_kind[dir]; + return true; + } + } + } + + return false; +} + /** * */ @@ -1885,6 +1916,14 @@ get_identifier(int c) { if (mi != _manifests.end() && !should_ignore_manifest((*mi).second)) { return expand_manifest((*mi).second); } + if (name == "__FILE__") { + return get_literal(SIMPLE_STRING, loc, loc.file._filename_as_referenced); + } + if (name == "__LINE__") { + YYSTYPE result; + result.u.integer = loc.first_line; + return CPPToken(INTEGER, loc, "", result); + } // Check for keywords. int kw = check_keyword(name); @@ -2227,9 +2266,7 @@ expand_defined_function(string &expr, size_t q, size_t &p) { vector_string args; extract_manifest_args_inline("defined", 1, -1, args, expr, p); if (args.size() >= 1) { - const string &manifest_name = args[0]; - Manifests::const_iterator mi = _manifests.find(manifest_name); - if (mi != _manifests.end()) { + if (is_manifest_defined(args[0])) { // The macro is defined; the result is "1". result = "1"; } else { @@ -2242,6 +2279,70 @@ expand_defined_function(string &expr, size_t q, size_t &p) { p = q + result.size(); } +/** + * Expands the __has_include(manifest) function to either 1 or 0, depending on + * whether the include file exists. + */ +void CPPPreprocessor:: +expand_has_include_function(string &expr, size_t q, size_t &p, YYLTYPE loc) { + bool found_file = false; + + // Skip whitespace till paren. + while (p < expr.size() && isspace(expr[p])) { + p++; + } + size_t args_begin = p + 1; + + vector_string args; + extract_manifest_args_inline("__has_include", 1, -1, args, expr, p); + + if (!args.empty() && args[0].size() >= 2) { + Filename filename; + bool angle_quotes = false; + + string inc = args[0]; + + // Just to play things safe, since our manifest-expansion logic might not + // filter out quotes and angle brackets properly, we'll only expand + // manifests if we don't begin with a quote or bracket. + if (!inc.empty() && (inc[0] != '"' && inc[0] != '<')) { + inc = expand_manifests(inc, false, loc); + } + + if (inc[0] == '"' && inc[inc.size() - 1] == '"') { + filename = inc.substr(1, inc.size() - 2); + } else if (inc[0] == '<' && inc[inc.size() - 1] == '>') { + filename = inc.substr(1, inc.size() - 2); + if (!_noangles) { + // If _noangles is true, we don't make a distinction between angle + // brackets and quote marks--all #inc statements are treated the + // same, as if they used quote marks. + angle_quotes = true; + } + } else { + loc.last_column += loc.first_column + p - 2; + loc.first_column += args_begin; + warning("invalid argument for __has_include() directive", loc); + expr = expr.substr(0, q) + "0" + expr.substr(p); + p = q + 1; + return; + } + + filename.set_text(); + + CPPFile::Source source = CPPFile::S_none; + found_file = find_include(filename, angle_quotes, source); + } else { + loc.last_column += loc.first_column + p - 2; + loc.first_column += args_begin; + warning("invalid argument for __has_include() directive", loc); + } + + string result = found_file ? "1" : "0"; + expr = expr.substr(0, q) + result + expr.substr(p); + p = q + result.size(); +} + /** * */ diff --git a/dtool/src/cppparser/cppPreprocessor.h b/dtool/src/cppparser/cppPreprocessor.h index e375b259dd..e119211596 100644 --- a/dtool/src/cppparser/cppPreprocessor.h +++ b/dtool/src/cppparser/cppPreprocessor.h @@ -143,6 +143,8 @@ private: void handle_error_directive(const string &args, const YYLTYPE &loc); void skip_false_if_block(bool consider_elifs); + bool is_manifest_defined(const string &manifest_name); + bool find_include(Filename &filename, bool angle_quotes, CPPFile::Source &source); CPPToken get_quoted_char(int c); CPPToken get_quoted_string(int c); @@ -153,6 +155,7 @@ private: void extract_manifest_args(const string &name, int num_args, int va_arg, vector_string &args); void expand_defined_function(string &expr, size_t q, size_t &p); + void expand_has_include_function(string &expr, size_t q, size_t &p, YYLTYPE loc); void expand_manifest_inline(string &expr, size_t q, size_t &p, const CPPManifest *manifest); void extract_manifest_args_inline(const string &name, int num_args, From 40e981e485c383367d5f2a9bacf2b906ea90df2d Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 4 Jan 2017 22:47:58 +0100 Subject: [PATCH 009/254] makepanda: enable C++11 support by default --- makepanda/makepanda.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index c96d188bcb..92f7edb5f7 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -1194,7 +1194,7 @@ def CompileCxx(obj,src,opts): if (COMPILER=="GCC"): if (src.endswith(".c")): cmd = GetCC() +' -fPIC -c -o ' + obj - else: cmd = GetCXX()+' -ftemplate-depth-70 -fPIC -c -o ' + obj + else: cmd = GetCXX()+' -std=gnu++0x -ftemplate-depth-70 -fPIC -c -o ' + obj for (opt, dir) in INCDIRECTORIES: if (opt=="ALWAYS") or (opt in opts): cmd += ' -I' + BracketNameWithQuotes(dir) for (opt, dir) in FRAMEWORKDIRECTORIES: From 9facf874aba9b2b051b8cd1f0e62bb8baf68cda3 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 4 Jan 2017 23:53:24 +0100 Subject: [PATCH 010/254] Let compiler synthesize QuadDef move assignment operator This hopefully fixes a compile issue with older clang versions. --- panda/src/text/textAssembler.h | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/panda/src/text/textAssembler.h b/panda/src/text/textAssembler.h index 1215765bf5..64b4c7ef03 100644 --- a/panda/src/text/textAssembler.h +++ b/panda/src/text/textAssembler.h @@ -212,21 +212,6 @@ private: typedef pmap GeomCollectorMap; struct QuadDef { - // Copying this class is a performance hotspot, hence we define the move - // constructor. - ALWAYS_INLINE QuadDef() {} - ALWAYS_INLINE QuadDef(const QuadDef ©) : - _dimensions(copy._dimensions), _uvs(copy._uvs), - _slantl(copy._slantl), _slanth(copy._slanth), - _glyph(copy._glyph) {} - -#ifdef USE_MOVE_SEMANTICS - ALWAYS_INLINE QuadDef(QuadDef &&from) NOEXCEPT : - _dimensions(from._dimensions), _uvs(from._uvs), - _slantl(from._slantl), _slanth(from._slanth), - _glyph(move(from._glyph)) {} -#endif - LVecBase4 _dimensions; LVecBase4 _uvs; PN_stdfloat _slantl, _slanth; From 603f0eb3b18b72b8fe85b6710c8c63fbb80330c8 Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 4 Jan 2017 16:28:38 -0800 Subject: [PATCH 011/254] fix occasional crash in PNMImage::quick_filter_from() --- panda/src/pnmimage/pnm-image-filter.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/panda/src/pnmimage/pnm-image-filter.cxx b/panda/src/pnmimage/pnm-image-filter.cxx index ac57b20b23..63398ad3c1 100644 --- a/panda/src/pnmimage/pnm-image-filter.cxx +++ b/panda/src/pnmimage/pnm-image-filter.cxx @@ -696,7 +696,7 @@ box_filter_line(const PNMImage &image, // Get the final (partial) xel float x_contrib = x1 - (float)x_last; - if (x_contrib > 0.0001f) { + if (x_contrib > 0.0001f && x < image.get_x_size()) { box_filter_xel(image, x, y, x_contrib, y_contrib, color, pixel_count); } @@ -728,7 +728,7 @@ box_filter_region(const PNMImage &image, // Get the final (partial) row float y_contrib = y1 - (float)y_last; - if (y_contrib > 0.0001f) { + if (y_contrib > 0.0001f && y < image.get_y_size()) { box_filter_line(image, x0, y, x1, y_contrib, color, pixel_count); } From c4d232b0be9de4e64fd067d8deb3ebe7953b0da5 Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 4 Jan 2017 16:56:09 -0800 Subject: [PATCH 012/254] publish PfmVizzer destructor to fix leak --- panda/src/grutil/pfmVizzer.I | 4 ++++ panda/src/grutil/pfmVizzer.h | 1 + 2 files changed, 5 insertions(+) diff --git a/panda/src/grutil/pfmVizzer.I b/panda/src/grutil/pfmVizzer.I index 6a0a5a23bc..2185248829 100644 --- a/panda/src/grutil/pfmVizzer.I +++ b/panda/src/grutil/pfmVizzer.I @@ -19,6 +19,10 @@ get_pfm() { return _pfm; } +INLINE PfmVizzer:: +~PfmVizzer() { +} + /** * Returns the reference to the PfmFile manipulated by this PfmVizzer. */ diff --git a/panda/src/grutil/pfmVizzer.h b/panda/src/grutil/pfmVizzer.h index 7b466f0ee3..e8423f8dd1 100644 --- a/panda/src/grutil/pfmVizzer.h +++ b/panda/src/grutil/pfmVizzer.h @@ -30,6 +30,7 @@ class GeomVertexWriter; class EXPCL_PANDA_GRUTIL PfmVizzer { PUBLISHED: PfmVizzer(PfmFile &pfm); + INLINE ~PfmVizzer(); INLINE PfmFile &get_pfm(); INLINE const PfmFile &get_pfm() const; From 127cbc3b3840dace259d092353a3251aa8942693 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 5 Jan 2017 17:15:42 +0100 Subject: [PATCH 013/254] Windows installer improvements and fixes: - copy .ico file - write installer log to install.log - restore python DLL to bin directory --- makepanda/installer.nsi | 70 +++++++++++++++++++++++++++++++++++------ makepanda/makepanda.py | 17 +++++----- 2 files changed, 70 insertions(+), 17 deletions(-) diff --git a/makepanda/installer.nsi b/makepanda/installer.nsi index d934cc4ee0..d004d15006 100755 --- a/makepanda/installer.nsi +++ b/makepanda/installer.nsi @@ -141,8 +141,9 @@ SectionGroup "Panda3D Libraries" SetDetailsPrint listonly SetOutPath "$INSTDIR" - File "${BUILT}\LICENSE" - File /r /x CVS "${BUILT}\ReleaseNotes" + File /nonfatal "${BUILT}\LICENSE" + File /nonfatal "${BUILT}\ReleaseNotes" + File /nonfatal "${BUILT}\pandaIcon.ico" SetOutPath $INSTDIR\etc File /r "${BUILT}\etc\*" @@ -532,15 +533,17 @@ Section "Sample programs" SecSamples WriteINIStr $INSTDIR\Manual.url "InternetShortcut" "URL" "https://www.panda3d.org/manual/index.php" WriteINIStr $INSTDIR\Samples.url "InternetShortcut" "URL" "https://www.panda3d.org/manual/index.php/Sample_Programs_in_the_Distribution" SetOutPath $INSTDIR - CreateShortCut "$SMPROGRAMS\${TITLE}\Panda3D Manual.lnk" "$INSTDIR\Manual.url" "" "$INSTDIR\bin\eggcacher.exe" 0 "" "" "Panda3D Manual" - CreateShortCut "$SMPROGRAMS\${TITLE}\Panda3D Website.lnk" "$INSTDIR\Website.url" "" "$INSTDIR\bin\eggcacher.exe" 0 "" "" "Panda3D Website" - CreateShortCut "$SMPROGRAMS\${TITLE}\Sample Program Manual.lnk" "$INSTDIR\Samples.url" "" "$INSTDIR\bin\eggcacher.exe" 0 "" "" "Sample Program Manual" + CreateShortCut "$SMPROGRAMS\${TITLE}\Panda3D Manual.lnk" "$INSTDIR\Manual.url" "" "$INSTDIR\pandaIcon.ico" 0 "" "" "Panda3D Manual" + CreateShortCut "$SMPROGRAMS\${TITLE}\Panda3D Website.lnk" "$INSTDIR\Website.url" "" "$INSTDIR\pandaIcon.ico" 0 "" "" "Panda3D Website" + CreateShortCut "$SMPROGRAMS\${TITLE}\Sample Program Manual.lnk" "$INSTDIR\Samples.url" "" "$INSTDIR\pandaIcon.ico" 0 "" "" "Sample Program Manual" FindFirst $0 $1 $INSTDIR\samples\* loop: StrCmp $1 "" done StrCmp $1 "." next StrCmp $1 ".." next + FindFirst $2 $3 $INSTDIR\samples\$1\*.py + StrCmp $3 "" next Push $1 Push "-" Push " " @@ -557,14 +560,13 @@ Section "Sample programs" SecSamples DetailPrint "Creating shortcuts for sample program $READABLE" CreateDirectory "$SMPROGRAMS\${TITLE}\Sample Programs\$READABLE" SetOutPath $INSTDIR\samples\$1 - WriteINIStr $INSTDIR\samples\$1\ManualPage.url "InternetShortcut" "URL" "http://panda3d.org/wiki/index.php/Sample_Programs:_$MANPAGE" - CreateShortCut "$SMPROGRAMS\${TITLE}\Sample Programs\$READABLE\Manual Page.lnk" "$INSTDIR\samples\$1\ManualPage.url" "" "$INSTDIR\bin\eggcacher.exe" 0 "" "" "Manual Entry on this Sample Program" + WriteINIStr $INSTDIR\samples\$1\ManualPage.url "InternetShortcut" "URL" "https://www.panda3d.org/wiki/index.php/Sample_Programs:_$MANPAGE" + CreateShortCut "$SMPROGRAMS\${TITLE}\Sample Programs\$READABLE\Manual Page.lnk" "$INSTDIR\samples\$1\ManualPage.url" "" "$INSTDIR\pandaIcon.ico" 0 "" "" "Manual Entry on this Sample Program" CreateShortCut "$SMPROGRAMS\${TITLE}\Sample Programs\$READABLE\View Source Code.lnk" "$INSTDIR\samples\$1" - FindFirst $2 $3 $INSTDIR\samples\$1\*.py iloop: StrCmp $3 "" idone - CreateShortCut "$SMPROGRAMS\${TITLE}\Sample Programs\$READABLE\Run $3.lnk" "$INSTDIR\python\python.exe" "-E $3" "$INSTDIR\bin\eggcacher.exe" 0 SW_SHOWMINIMIZED "" "Run $3" - CreateShortCut "$INSTDIR\samples\$1\Run $3.lnk" "$INSTDIR\python\python.exe" "-E $3" "$INSTDIR\bin\eggcacher.exe" 0 SW_SHOWMINIMIZED "" "Run $3" + CreateShortCut "$SMPROGRAMS\${TITLE}\Sample Programs\$READABLE\Run $3.lnk" "$INSTDIR\python\python.exe" "-E $3" "$INSTDIR\pandaIcon.ico" 0 SW_SHOWMINIMIZED "" "Run $3" + CreateShortCut "$INSTDIR\samples\$1\Run $3.lnk" "$INSTDIR\python\python.exe" "-E $3" "$INSTDIR\pandaIcon.ico" 0 SW_SHOWMINIMIZED "" "Run $3" FindNext $2 $3 goto iloop idone: @@ -684,6 +686,10 @@ Section -post DetailPrint "Broadcasting WM_WININICHANGE message..." SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=500 + # Now dump the log to disk. + StrCpy $0 "$INSTDIR\install.log" + Push $0 + Call DumpLog SectionEnd Section Uninstall @@ -1235,3 +1241,47 @@ done: Exch $R3 FunctionEnd + +!define LVM_GETITEMCOUNT 0x1004 +!define LVM_GETITEMTEXT 0x102D + +Function DumpLog + Exch $5 + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $6 + + FindWindow $0 "#32770" "" $HWNDPARENT + GetDlgItem $0 $0 1016 + StrCmp $0 0 exit + FileOpen $5 $5 "w" + StrCmp $5 "" exit + SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6 + System::Alloc ${NSIS_MAX_STRLEN} + Pop $3 + StrCpy $2 0 + System::Call "*(i, i, i, i, i, i, i, i, i) i \ + (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1" + loop: StrCmp $2 $6 done + System::Call "User32::SendMessageA(i, i, i, i) i \ + ($0, ${LVM_GETITEMTEXT}, $2, r1)" + System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)" + FileWrite $5 "$4$\r$\n" + IntOp $2 $2 + 1 + Goto loop + done: + FileClose $5 + System::Free $1 + System::Free $3 + exit: + Pop $6 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $5 +FunctionEnd diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 92f7edb5f7..2e54cc2058 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -2871,11 +2871,13 @@ if tp_dir is not None: CopyAllFiles(GetOutputDir() + "/bin/", tp_dir + "extras/bin/") if not PkgSkip("PYTHON") and not RTDIST: - #XXX rdb I don't think we need to copy over the Python DLL, do we? - #pydll = "/" + SDK["PYTHONVERSION"].replace(".", "") - #if (GetOptimize() <= 2): pydll += "_d.dll" - #else: pydll += ".dll" - #CopyFile(GetOutputDir() + "/bin" + pydll, SDK["PYTHON"] + pydll) + # We need to copy the Python DLL to the bin directory for now. + pydll = "/" + SDK["PYTHONVERSION"].replace(".", "") + if GetOptimize() <= 2: + pydll += "_d.dll" + else: + pydll += ".dll" + CopyFile(GetOutputDir() + "/bin" + pydll, SDK["PYTHON"] + pydll) #for fn in glob.glob(SDK["PYTHON"] + "/vcruntime*.dll"): # CopyFile(GetOutputDir() + "/bin/", fn) @@ -2949,6 +2951,7 @@ if GetTarget() == 'windows': # Convert to Windows newlines so they can be opened by notepad. WriteFile(GetOutputDir() + "/LICENSE", ReadFile("doc/LICENSE"), newline='\r\n') WriteFile(GetOutputDir() + "/ReleaseNotes", ReadFile("doc/ReleaseNotes"), newline='\r\n') + CopyFile(GetOutputDir() + "/pandaIcon.ico", "panda/src/configfiles/pandaIcon.ico") else: CopyFile(GetOutputDir()+"/", "doc/LICENSE") CopyFile(GetOutputDir()+"/", "doc/ReleaseNotes") @@ -6596,7 +6599,7 @@ def MakeInstallerNSIS(file, title, installdir): AddToPathEnv("PATH", GetOutputDir() + "\\bin") AddToPathEnv("PATH", GetOutputDir() + "\\plugins") - cmd = sys.executable + " -B -u direct\\src\\plugin_installer\\make_installer.py" + cmd = sys.executable + " -B -u " + os.path.join("direct", "src", "plugin_installer", "make_installer.py") cmd += " --version %s --regview %s" % (VERSION, regview) if GetTargetArch() == 'x64': @@ -6605,7 +6608,7 @@ def MakeInstallerNSIS(file, title, installdir): cmd += " --install \"$PROGRAMFILES32\\Panda3D\" " oscmd(cmd) - shutil.move("direct\\src\\plugin_installer\\p3d-setup.exe", file) + shutil.move(os.path.join("direct", "src", "plugin_installer", "p3d-setup.exe"), file) return print("Building "+title+" installer at %s" % (file)) From 53752bd3762cd9dbe9d7ba38c14594ff058367b2 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 5 Jan 2017 17:22:11 +0100 Subject: [PATCH 014/254] Remove packpanda and eggcacher, don't require libpython on Linux --- direct/src/directbase/ppython.cxx | 106 ---- direct/src/directscripts/eggcacher.py | 11 +- direct/src/directscripts/packpanda.nsi | 831 ------------------------- direct/src/directscripts/packpanda.py | 424 ------------- makepanda/installer.nsi | 9 +- makepanda/makepanda.py | 22 +- makepanda/makepandacore.py | 2 +- makepanda/makewheel.py | 1 - 8 files changed, 20 insertions(+), 1386 deletions(-) delete mode 100644 direct/src/directbase/ppython.cxx delete mode 100755 direct/src/directscripts/packpanda.nsi delete mode 100755 direct/src/directscripts/packpanda.py diff --git a/direct/src/directbase/ppython.cxx b/direct/src/directbase/ppython.cxx deleted file mode 100644 index e460de766c..0000000000 --- a/direct/src/directbase/ppython.cxx +++ /dev/null @@ -1,106 +0,0 @@ -// This is a little wrapper to make it easy to run a python program from the -// command line. Basically, it just interfaces to the Python API and imports -// the module that was specified by the IMPORT_MODULE preprocessor definition -// when it was compiled. - -#include "dtoolbase.h" - -#undef _POSIX_C_SOURCE -#undef _XOPEN_SOURCE -#include -#if PY_MAJOR_VERSION >= 3 -#include -#endif - -#ifndef IMPORT_MODULE -#error IMPORT_MODULE must be defined when compiling ppython.cxx ! -#endif - -#define _STRINGIFY(s) #s -#define STRINGIFY(s) _STRINGIFY(s) -#define IMPORT_MODULE_STR STRINGIFY(IMPORT_MODULE) - -#if defined(_WIN32) && PY_MAJOR_VERSION >= 3 -// As Py_SetProgramName expects a wchar_t*, it's easiest to just use the wmain -// entry point. -int wmain(int argc, wchar_t *argv[]) { - Py_SetProgramName(argv[0]); - -#elif PY_MAJOR_VERSION >= 3 -// Convert from UTF-8 to wchar_t*. -int main(int argc, char *mb_argv[]) { - wchar_t **argv = new wchar_t*[argc + 1]; - for (int i = 0; i < argc; ++i) { - size_t len = mbstowcs(NULL, mb_argv[i], 0); - argv[i] = new wchar_t[len + 1]; - mbstowcs(argv[i], mb_argv[i], len); - argv[i][len] = 0; - } - // Just for good measure - argv[argc] = NULL; - - Py_SetProgramName(argv[0]); - -#else -// Python 2. -int main(int argc, char *argv[]) { - Py_SetProgramName(argv[0]); -#endif - - // On Windows, we need to set pythonhome correctly. We'll try to find - // ppython.exe on the path and set pythonhome to its location. -#ifdef _WIN32 -#if PY_MAJOR_VERSION >= 3 - // Py_SetPythonHome expects a wchar_t in Python 3. - wchar_t *path = _wgetenv(L"PATH"); - wchar_t *result = wcstok(path, L";"); - while (result != NULL) { - struct _stat st; - wchar_t *ppython = (wchar_t*) malloc(wcslen(result) * 2 + 26); - wcscpy(ppython, result); - wcscat(ppython, L"\\python.exe"); - if (_wstat(ppython, &st) == 0) { - Py_SetPythonHome(result); - free(ppython); - break; - } - result = wcstok(NULL, L";"); - free(ppython); - } -#else - char *path = getenv("PATH"); - char *result = strtok(path, ";"); - while (result != NULL) { - struct stat st; - char *ppython = (char*) malloc(strlen(result) + 13); - strcpy(ppython, result); - strcat(ppython, "\\ppython.exe"); - if (stat(ppython, &st) == 0) { - Py_SetPythonHome(result); - free(ppython); - break; - } - result = strtok(NULL, ";"); - free(ppython); - } -#endif -#endif - - Py_Initialize(); - - if (Py_VerboseFlag) { - fprintf(stderr, "Python %s\\n%s\\n", Py_GetVersion(), Py_GetCopyright()); - } - - PySys_SetArgv(argc, argv); - - int sts = 0; - PyObject* m = PyImport_ImportModule(IMPORT_MODULE_STR); - if (m <= 0) { - PyErr_Print(); - sts = 1; - } - - Py_Finalize(); - return sts; -} diff --git a/direct/src/directscripts/eggcacher.py b/direct/src/directscripts/eggcacher.py index ad11303fe0..6dcee8e2d3 100644 --- a/direct/src/directscripts/eggcacher.py +++ b/direct/src/directscripts/eggcacher.py @@ -87,8 +87,13 @@ class EggCacher: TexturePool.releaseAllTextures() progress += size -cacher = EggCacher(sys.argv[1:]) -# Dummy main function so this can be added to console_scripts. -def main(): +def main(args=None): + if args is None: + args = sys.argv[1:] + + cacher = EggCacher(args) return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/direct/src/directscripts/packpanda.nsi b/direct/src/directscripts/packpanda.nsi deleted file mode 100755 index 73c9011d9a..0000000000 --- a/direct/src/directscripts/packpanda.nsi +++ /dev/null @@ -1,831 +0,0 @@ -; Panda3D installation script for the Nullsoft Installation System (NSIS). -; Jon Parise -; with Ben Johnson -; with Jason Pratt -; mangled by Josh Yelon - -; Caller needs to define these variables: -; -; COMPRESSOR - either zlib or lzma -; NAME - name of what we're building (ie, "Panda3D" or "Airblade") -; SMDIRECTORY - where to put this in the start menu (ie, "Panda3D 1.1.0" or "Airblade 1.1.0") -; INSTALLDIR - where to install the program (ie, "C:\Program Files\Panda3D-1.1.0") -; OUTFILE - where to put the output file (ie, "..\nsis-output.exe") -; LICENSE - location of the license file (ie, "C:\Airblade\LICENSE.TXT") -; LANGUAGE - name of the Language file to use (ie, "English" or "Panda3DEnglish") -; RUNTEXT - text for run-box at end of installation (ie, "Run the Panda Greeting Card") -; IBITMAP - name of installer bitmap (ie, "C:\Airblade\Airblade.bmp") -; UBITMAP - name of uninstaller bitmap (ie, "C:\Airblade\Airblade.bmp") -; -; PANDA - location of panda install tree. -; PYVER - version of Python that Panda was built with (ie, "2.7") -; PANDACONF - name of panda config directory - usually $PANDA\etc -; PSOURCE - location of the panda source-tree if available, OR location of panda install tree. -; PYEXTRAS - directory containing python extras, if any. -; REGVIEW - either 32 or 64, depending on the build architecture. -; -; PPGAME - directory containing prepagaged game, if any (ie, "C:\My Games\Airblade") -; PPMAIN - python program containing prepackaged game, if any (ie, "Airblade.py") -; PPICON - file containing icon of prepackaged game. -; - -!include "MUI.nsh" -!include "WinMessages.nsh" -Name "${NAME}" -InstallDir "${INSTALLDIR}" -OutFile "${OUTFILE}" - -SetCompress auto -SetCompressor ${COMPRESSOR} - -!define MUI_WELCOMEFINISHPAGE_BITMAP "${IBITMAP}" -!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${UBITMAP}" - -!define MUI_ABORTWARNING -!define MUI_FINISHPAGE_NOREBOOTSUPPORT -!define MUI_FINISHPAGE_RUN -!define MUI_FINISHPAGE_RUN_FUNCTION runFunction -!define MUI_FINISHPAGE_RUN_TEXT "${RUNTEXT}" - -!insertmacro MUI_PAGE_WELCOME -!insertmacro MUI_PAGE_LICENSE "${LICENSE}" -!insertmacro MUI_PAGE_DIRECTORY -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_PAGE_FINISH - -!insertmacro MUI_UNPAGE_WELCOME -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES -!insertmacro MUI_UNPAGE_FINISH - -!insertmacro MUI_LANGUAGE "${LANGUAGE}" - -ShowInstDetails nevershow -ShowUninstDetails nevershow - -LicenseData "${LICENSE}" - -InstType "Typical" - -!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS - -var READABLE -var MANPAGE -var TUTNAME - -Function runFunction - !ifdef PPGAME - ExecShell "open" "$SMPROGRAMS\${SMDIRECTORY}\Play ${NAME}.lnk" - !else - ExecShell "open" "$SMPROGRAMS\${SMDIRECTORY}\Panda Manual.lnk" - !endif -FunctionEnd - -Section "${SMDIRECTORY}" SecCore - SectionIn 1 2 3 RO - - SetDetailsPrint none - SetOutPath $INSTDIR - SetOverwrite try - - SetOutPath $INSTDIR - File "${PANDA}\LICENSE" - SetOutPath $INSTDIR\bin - File /r "${PANDA}\bin\*.dll" - File /nonfatal /r "${PANDA}\bin\*.pyd" - File /nonfatal /r "${PANDA}\bin\Microsoft.*.manifest" - SetOutPath $INSTDIR\etc - File /r "${PANDACONF}\*" - SetOutPath $INSTDIR\direct\directscripts - File /r /x CVS /x Opt?-Win32 "${PANDA}\direct\directscripts\*" - SetOutPath $INSTDIR\direct\filter - File /r /x CVS /x Opt?-Win32 "${PANDA}\direct\filter\*.sha" - SetOutPath $INSTDIR\direct - File /r /x CVS /x Opt?-Win32 "${PANDA}\direct\*.py" - Delete "$INSTDIR\panda3d.py" - Delete "$INSTDIR\panda3d.pyc" - Delete "$INSTDIR\panda3d.pyo" - SetOutPath $INSTDIR\pandac - File /r "${PANDA}\pandac\*.py" - SetOutPath $INSTDIR\panda3d - File /r "${PANDA}\panda3d\*.py" - File /r "${PANDA}\panda3d\*.pyd" - SetOutPath $INSTDIR\python - File /r "${PANDA}\python\*" - RMDir /r "$SMPROGRAMS\${SMDIRECTORY}" - CreateDirectory "$SMPROGRAMS\${SMDIRECTORY}" - - !ifdef PPGAME - - SetOutPath $INSTDIR\models - File /r /x CVS "${PANDA}\models\*" - SetOutPath $INSTDIR\bin - File /r "${PANDA}\bin\eggcacher.exe" - SetOutpath $INSTDIR\game - File /r "${PPGAME}\*" - CreateShortCut "$SMPROGRAMS\${SMDIRECTORY}\Play ${NAME}.lnk" "$INSTDIR\python\ppython.exe" "-E ${PPMAIN}" "$INSTDIR\${PPICON}" 0 SW_SHOWMINIMIZED "" "Play ${NAME}" - # Preload all EGG files into the model-cache - SetOutPath $INSTDIR - SetDetailsPrint textonly - SetDetailsView show - nsExec::ExecToLog '"$INSTDIR\bin\eggcacher.exe" --concise game' - SetDetailsPrint none - SetDetailsView hide - - !else - - SetOutPath $INSTDIR\plugins - File /nonfatal /r "${PANDA}\plugins\*.dle" - File /nonfatal /r "${PANDA}\plugins\*.dlo" - File /nonfatal /r "${PANDA}\plugins\*.mll" - File /nonfatal /r "${PANDA}\plugins\*.mel" - File /nonfatal /r "${PANDA}\plugins\*.ms" - File "${PSOURCE}\doc\INSTALLING-PLUGINS.TXT" - SetOutPath $INSTDIR\pandac\input - File /r "${PANDA}\pandac\input\*" - SetOutPath $INSTDIR\bin - File /r "${PANDA}\bin\*.exe" - File /nonfatal /r "${PANDA}\bin\*.p3d" - SetOutPath $INSTDIR\lib - File /r /x *.exp "${PANDA}\lib\*" - SetOutPath $INSTDIR\include - File /r /x *.exp "${PANDA}\include\*" - SetOutPath $INSTDIR\Pmw - File /r /x CVS "${PANDA}\Pmw\*" - SetOutPath $INSTDIR\NSIS - File /r /x CVS "${NSISDIR}\*" - SetOutPath $INSTDIR - File /r /x CVS "${PANDA}\ReleaseNotes" - !ifdef PYEXTRAS - SetOutPath $INSTDIR\python\lib - File /nonfatal /r "${PYEXTRAS}\*" - !endif - SetOutPath $INSTDIR\models - File /r /x CVS "${PANDA}\models\*" - SetOutPath $INSTDIR\samples - File /nonfatal /r /x CVS "${PSOURCE}\samples\*" - MessageBox MB_YESNO|MB_ICONQUESTION \ - "EGG caching is about to begin.$\nThis process may take a couple minute and approximately 270 MB of RAM.$\nWARNING : It might stuck if your computer resources are low.$\n$\nDo you really want to do this optional step ?" \ - IDNO SkipCaching - # Preload all EGG files into the model-cache - SetOutPath $INSTDIR - SetDetailsPrint both - SetDetailsView show - nsExec::ExecToLog '"$INSTDIR\bin\eggcacher.exe" --concise models samples' - SetDetailsPrint none - SetDetailsView hide - SkipCaching: - - SetOutPath $INSTDIR - WriteINIStr $INSTDIR\Website.url "InternetShortcut" "URL" "http://panda3d.org/" - WriteINIStr $INSTDIR\Manual.url "InternetShortcut" "URL" "http://panda3d.org/wiki/index.php" - WriteINIStr $INSTDIR\Samples.url "InternetShortcut" "URL" "http://panda3d.org/wiki/index.php/Sample_Programs_in_the_Distribution" - SetOutPath $INSTDIR - CreateShortCut "$SMPROGRAMS\${SMDIRECTORY}\Panda Manual.lnk" "$INSTDIR\Manual.url" "" "$INSTDIR\bin\eggcacher.exe" 0 "" "" "Panda Manual" - CreateShortCut "$SMPROGRAMS\${SMDIRECTORY}\Panda Website.lnk" "$INSTDIR\Website.url" "" "$INSTDIR\bin\eggcacher.exe" 0 "" "" "Panda Website" - CreateShortCut "$SMPROGRAMS\${SMDIRECTORY}\Sample Program Manual.lnk" "$INSTDIR\Samples.url" "" "$INSTDIR\bin\eggcacher.exe" 0 "" "" "Sample Program Manual" - - FindFirst $0 $1 $INSTDIR\samples\* - loop: - StrCmp $1 "" done - StrCmp $1 "." next - StrCmp $1 ".." next - Push $1 - Push "-" - Push " " - Call StrRep - Pop $R0 - StrCpy $READABLE $R0 - Push $1 - Push "-" - Push "_" - Call StrRep - Pop $R0 - StrCpy $MANPAGE $R0 - CreateDirectory "$SMPROGRAMS\${SMDIRECTORY}\Sample Programs\$READABLE" - SetOutPath $INSTDIR\samples\$1 - WriteINIStr $INSTDIR\samples\$1\ManualPage.url "InternetShortcut" "URL" "http://panda3d.org/wiki/index.php/Sample_Programs:_$MANPAGE" - CreateShortCut "$SMPROGRAMS\${SMDIRECTORY}\Sample Programs\$READABLE\Manual Page.lnk" "$INSTDIR\samples\$1\ManualPage.url" "" "$INSTDIR\bin\eggcacher.exe" 0 "" "" "Manual Entry on this Sample Program" - CreateShortCut "$SMPROGRAMS\${SMDIRECTORY}\Sample Programs\$READABLE\View Source Code.lnk" "$INSTDIR\samples\$1" - FindFirst $2 $3 $INSTDIR\samples\$1\Tut-*.py - iloop: - StrCmp $3 "" idone - StrCpy $TUTNAME $3 -3 4 - Push $TUTNAME - Push "-" - Push " " - Call StrRep - Pop $R0 - StrCpy $TUTNAME $R0 - CreateShortCut "$SMPROGRAMS\${SMDIRECTORY}\Sample Programs\$READABLE\Run $TUTNAME.lnk" "$INSTDIR\python\python.exe" "-E $3" "$INSTDIR\bin\eggcacher.exe" 0 SW_SHOWMINIMIZED "" "Run $TUTNAME" - CreateShortCut "$INSTDIR\samples\$1\Run $TUTNAME.lnk" "$INSTDIR\python\python.exe" "-E $3" "$INSTDIR\bin\eggcacher.exe" 0 SW_SHOWMINIMIZED "" "Run $TUTNAME" - FindNext $2 $3 - goto iloop - idone: - next: - FindNext $0 $1 - Goto loop - done: - - !endif - -SectionEnd - - -Section -post - - !ifdef REGVIEW - SetRegView ${REGVIEW} - !endif - - !ifndef PPGAME - - # Add the "bin" directory to the PATH. - Push "$INSTDIR\python" - Call RemoveFromPath - Push "$INSTDIR\python\Scripts" - Call RemoveFromPath - Push "$INSTDIR\bin" - Call RemoveFromPath - Push "$INSTDIR\python" - Call AddToPath - Push "$INSTDIR\python\Scripts" - Call AddToPath - Push "$INSTDIR\bin" - Call AddToPath - - ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp $0 "$INSTDIR\python" RegPath 0 - StrCmp $0 "" RegPath 0 - - MessageBox MB_YESNO|MB_ICONQUESTION \ - "Your system already has a copy of Python installed. Panda3D installs its own copy of Python ${PYVER}, which will install alongside your existing copy. Would you like to make Panda's copy the default Python? If you choose 'No', you will have to configure your existing copy of Python to use the Panda3D libraries, keeping in mind that this version of Panda3D can only run with Python ${PYVER}." \ - IDNO SkipRegPath - - RegPath: - DetailPrint "Adding registry keys for python..." - WriteRegStr HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" "$INSTDIR\python" - SkipRegPath: - !endif - - DetailPrint "Adding the uninstaller ..." - Delete "$INSTDIR\uninst.exe" - WriteUninstaller "$INSTDIR\uninst.exe" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SMDIRECTORY}" "DisplayName" "${SMDIRECTORY}" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SMDIRECTORY}" "UninstallString" '"$INSTDIR\uninst.exe"' - SetOutPath $INSTDIR - CreateShortcut "$SMPROGRAMS\${SMDIRECTORY}\Uninstall ${NAME}.lnk" "$INSTDIR\uninst.exe" "" - -SectionEnd - -Section Uninstall - - !ifdef REGVIEW - SetRegView ${REGVIEW} - !endif - - !ifndef PPGAME - Push "$INSTDIR\python" - Call un.RemoveFromPath - Push "$INSTDIR\python\Scripts" - Call un.RemoveFromPath - Push "$INSTDIR\bin" - Call un.RemoveFromPath - - ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" "" - StrCmp $0 "$INSTDIR\python" 0 SkipUnReg - DeleteRegKey HKLM "Software\Python\PythonCore\${PYVER}" - SkipUnReg: - !endif - - Delete "$INSTDIR\uninst.exe" - RMDir /r "$SMPROGRAMS\${SMDIRECTORY}" - RMDir /r "$INSTDIR" - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SMDIRECTORY}" - -SectionEnd - -# --[ Utility Functions ]------------------------------------------------------ - -; From: http://nsis.sourceforge.net/archive/viewpage.php?pageid=91 -Function IsNT - Push $0 - ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - StrCmp $0 "" 0 IsNT_yes - ; we are not NT. - Pop $0 - Push 0 - Return - IsNT_yes: - ; NT!!! - Pop $0 - Push 1 -FunctionEnd - -; From: http://nsis.sourceforge.net/archive/viewpage.php?pageid=91 -Function un.IsNT - Push $0 - ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - StrCmp $0 "" 0 unIsNT_yes - ; we are not NT. - Pop $0 - Push 0 - Return - unIsNT_yes: - ; NT!!! - Pop $0 - Push 1 -FunctionEnd - -; From: http://nsis.sourceforge.net/archive/viewpage.php?pageid=91 -Function StrStr - Push $0 - Exch - Pop $0 ; $0 now have the string to find - Push $1 - Exch 2 - Pop $1 ; $1 now have the string to find in - Exch - Push $2 - Push $3 - Push $4 - Push $5 - StrCpy $2 -1 - StrLen $3 $0 - StrLen $4 $1 - IntOp $4 $4 - $3 - unStrStr_loop: - IntOp $2 $2 + 1 - IntCmp $2 $4 0 0 unStrStrReturn_notFound - StrCpy $5 $1 $3 $2 - StrCmp $5 $0 unStrStr_done unStrStr_loop - unStrStrReturn_notFound: - StrCpy $2 -1 - unStrStr_done: - Pop $5 - Pop $4 - Pop $3 - Exch $2 - Exch 2 - Pop $0 - Pop $1 -FunctionEnd - -; From: http://nsis.sourceforge.net/archive/viewpage.php?pageid=91 -Function un.StrStr - Push $0 - Exch - Pop $0 ; $0 now have the string to find - Push $1 - Exch 2 - Pop $1 ; $1 now have the string to find in - Exch - Push $2 - Push $3 - Push $4 - Push $5 - StrCpy $2 -1 - StrLen $3 $0 - StrLen $4 $1 - IntOp $4 $4 - $3 - unStrStr_loop: - IntOp $2 $2 + 1 - IntCmp $2 $4 0 0 unStrStrReturn_notFound - StrCpy $5 $1 $3 $2 - StrCmp $5 $0 unStrStr_done unStrStr_loop - unStrStrReturn_notFound: - StrCpy $2 -1 - unStrStr_done: - Pop $5 - Pop $4 - Pop $3 - Exch $2 - Exch 2 - Pop $0 - Pop $1 -FunctionEnd - -; From: http://nsis.sourceforge.net/archive/viewpage.php?pageid=91 -; Commentary and smarter ';' checking by Jon Parise -Function AddToPath - Exch $0 - Push $1 - Push $2 - Push $3 - Call IsNT - Pop $1 - - StrCmp $1 1 AddToPath_NT - ; We're not on NT, so modify the AUTOEXEC.BAT file. - StrCpy $1 $WINDIR 2 - FileOpen $1 "$1\autoexec.bat" a - FileSeek $1 0 END - GetFullPathName /SHORT $0 $0 - FileWrite $1 "$\r$\nSET PATH=%PATH%;$0$\r$\n" - FileClose $1 - Goto AddToPath_done - - AddToPath_NT: - ReadRegStr $1 HKCU "Environment" "PATH" - Call IsUserAdmin - Pop $3 - ; If this is an Admin user, use the System env. variable instead of the user's env. variable - StrCmp $3 1 0 +2 - ReadRegStr $1 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PATH" - - ; If the PATH string is empty, jump over the mangling routines. - StrCmp $1 "" AddToPath_NTdoIt - - ; Pull off the last character of the PATH string. If it's a semicolon, - ; we don't need to add another one, so jump to the section where we - ; append the new PATH component(s). - StrCpy $2 $1 1 -1 - StrCmp $2 ";" AddToPath_NTAddPath AddToPath_NTAddSemi - - AddToPath_NTAddSemi: - StrCpy $1 "$1;" - Goto AddToPath_NTAddPath - AddToPath_NTAddPath: - StrCpy $0 "$1$0" - Goto AddToPath_NTdoIt - AddToPath_NTdoIt: - Call IsUserAdmin - Pop $3 - StrCmp $3 1 0 NotAdmin - WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PATH" $0 - Goto AddToPath_done - - NotAdmin: - WriteRegExpandStr HKCU "Environment" "PATH" $0 - AddToPath_done: - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - Pop $3 - Pop $2 - Pop $1 - Pop $0 -FunctionEnd - -; From: http://nsis.sourceforge.net/archive/viewpage.php?pageid=91 -Function RemoveFromPath - Exch $0 - Push $1 - Push $2 - Push $3 - Push $4 - Push $5 - Call IsNT - Pop $1 - StrCmp $1 1 unRemoveFromPath_NT - ; Not on NT - StrCpy $1 $WINDIR 2 - FileOpen $1 "$1\autoexec.bat" r - GetTempFileName $4 - FileOpen $2 $4 w - GetFullPathName /SHORT $0 $0 - StrCpy $0 "SET PATH=%PATH%;$0" - SetRebootFlag true - Goto unRemoveFromPath_dosLoop - - unRemoveFromPath_dosLoop: - FileRead $1 $3 - StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoop - StrCmp $3 "$0$\n" unRemoveFromPath_dosLoop - StrCmp $3 "$0" unRemoveFromPath_dosLoop - StrCmp $3 "" unRemoveFromPath_dosLoopEnd - FileWrite $2 $3 - Goto unRemoveFromPath_dosLoop - - unRemoveFromPath_dosLoopEnd: - FileClose $2 - FileClose $1 - StrCpy $1 $WINDIR 2 - Delete "$1\autoexec.bat" - CopyFiles /SILENT $4 "$1\autoexec.bat" - Delete $4 - Goto unRemoveFromPath_done - - unRemoveFromPath_NT: - StrLen $2 $0 - Call IsUserAdmin - Pop $5 - StrCmp $5 1 0 NotAdmin - ReadRegStr $1 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PATH" - Push $1 - Push $0 - Call StrStr ; Find $0 in $1 - Pop $0 ; pos of our dir - IntCmp $0 -1 unRemoveFromPath_done - ; else, it is in path - StrCpy $3 $1 $0 ; $3 now has the part of the path before our dir - IntOp $2 $2 + $0 ; $2 now contains the pos after our dir in the path (';') - IntOp $2 $2 + 1 ; $2 now containts the pos after our dir and the semicolon. - StrLen $0 $1 - StrCpy $1 $1 $0 $2 - StrCpy $3 "$3$1" - WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PATH" $3 - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - Goto unRemoveFromPath_done - - - NotAdmin: - ReadRegStr $1 HKCU "Environment" "PATH" - Push $1 - Push $0 - Call StrStr ; Find $0 in $1 - Pop $0 ; pos of our dir - IntCmp $0 -1 unRemoveFromPath_done - ; else, it is in path - StrCpy $3 $1 $0 ; $3 now has the part of the path before our dir - IntOp $2 $2 + $0 ; $2 now contains the pos after our dir in the path (';') - IntOp $2 $2 + 1 ; $2 now containts the pos after our dir and the semicolon. - StrLen $0 $1 - StrCpy $1 $1 $0 $2 - StrCpy $3 "$3$1" - WriteRegExpandStr HKCU "Environment" "PATH" $3 - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - - unRemoveFromPath_done: - Pop $5 - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Pop $0 -FunctionEnd - -; From: http://nsis.sourceforge.net/archive/viewpage.php?pageid=91 -Function un.RemoveFromPath - Exch $0 - Push $1 - Push $2 - Push $3 - Push $4 - Push $5 - Call un.IsNT - Pop $1 - StrCmp $1 1 unRemoveFromPath_NT - ; Not on NT - StrCpy $1 $WINDIR 2 - FileOpen $1 "$1\autoexec.bat" r - GetTempFileName $4 - FileOpen $2 $4 w - GetFullPathName /SHORT $0 $0 - StrCpy $0 "SET PATH=%PATH%;$0" - SetRebootFlag true - Goto unRemoveFromPath_dosLoop - - unRemoveFromPath_dosLoop: - FileRead $1 $3 - StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoop - StrCmp $3 "$0$\n" unRemoveFromPath_dosLoop - StrCmp $3 "$0" unRemoveFromPath_dosLoop - StrCmp $3 "" unRemoveFromPath_dosLoopEnd - FileWrite $2 $3 - Goto unRemoveFromPath_dosLoop - - unRemoveFromPath_dosLoopEnd: - FileClose $2 - FileClose $1 - StrCpy $1 $WINDIR 2 - Delete "$1\autoexec.bat" - CopyFiles /SILENT $4 "$1\autoexec.bat" - Delete $4 - Goto unRemoveFromPath_done - - unRemoveFromPath_NT: - StrLen $2 $0 - Call un.IsUserAdmin - Pop $5 - StrCmp $5 1 0 NotAdmin - ReadRegStr $1 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PATH" - Push $1 - Push $0 - Call un.StrStr ; Find $0 in $1 - Pop $0 ; pos of our dir - IntCmp $0 -1 unRemoveFromPath_done - ; else, it is in path - StrCpy $3 $1 $0 ; $3 now has the part of the path before our dir - IntOp $2 $2 + $0 ; $2 now contains the pos after our dir in the path (';') - IntOp $2 $2 + 1 ; $2 now containts the pos after our dir and the semicolon. - StrLen $0 $1 - StrCpy $1 $1 $0 $2 - StrCpy $3 "$3$1" - WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PATH" $3 - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - Goto unRemoveFromPath_done - - - NotAdmin: - ReadRegStr $1 HKCU "Environment" "PATH" - Push $1 - Push $0 - Call un.StrStr ; Find $0 in $1 - Pop $0 ; pos of our dir - IntCmp $0 -1 unRemoveFromPath_done - ; else, it is in path - StrCpy $3 $1 $0 ; $3 now has the part of the path before our dir - IntOp $2 $2 + $0 ; $2 now contains the pos after our dir in the path (';') - IntOp $2 $2 + 1 ; $2 now containts the pos after our dir and the semicolon. - StrLen $0 $1 - StrCpy $1 $1 $0 $2 - StrCpy $3 "$3$1" - WriteRegExpandStr HKCU "Environment" "PATH" $3 - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - - unRemoveFromPath_done: - Pop $5 - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Pop $0 -FunctionEnd - -; From: http://nsis.sourceforge.net/archive/nsisweb.php?page=329&instances=0,11 -; Localized by Ben Johnson (bkj@andrew.cmu.edu) -Function IsUserAdmin - Push $0 - Push $1 - Push $2 - Push $3 - Call IsNT - Pop $1 - - ClearErrors - UserInfo::GetName - ;IfErrors Win9x - Pop $2 - UserInfo::GetAccountType - Pop $3 - - ; Compare results of IsNT with "1" - StrCmp $1 1 0 NotNT - ;This is NT - - - StrCmp $3 "Admin" 0 NotAdmin - ; Observation: I get here when running Win98SE. (Lilla) - ; The functions UserInfo.dll looks for are there on Win98 too, - ; but just don't work. So UserInfo.dll, knowing that admin isn't required - ; on Win98, returns admin anyway. (per kichik) - ; MessageBox MB_OK 'User "$R1" is in the Administrators group' - Pop $3 - Pop $2 - Pop $1 - Pop $0 - - Push 1 - Return - - NotAdmin: - ; You should still check for an empty string because the functions - ; UserInfo.dll looks for may not be present on Windows 95. (per kichik) - - #StrCmp $2 "" Win9x - #StrCpy $0 0 - ;MessageBox MB_OK 'User "$2" is in the "$3" group' - Pop $3 - Pop $2 - Pop $1 - Pop $0 - - Push 0 - Return - - ;Because we use IsNT, this is redundant. - #Win9x: - # ; comment/message below is by UserInfo.nsi author: - # ; This one means you don't need to care about admin or - # ; not admin because Windows 9x doesn't either - # ;MessageBox MB_OK "Error! This DLL can't run under Windows 9x!" - # StrCpy $0 0 - - NotNT: - ;We are not NT - ;Win9x doesn't have "admin" users. - ;Let the user do whatever. - Pop $3 - Pop $2 - Pop $1 - Pop $0 - - Push 1 - -FunctionEnd - -Function un.IsUserAdmin - Push $0 - Push $1 - Push $2 - Push $3 - Call un.IsNT - Pop $1 - - ClearErrors - UserInfo::GetName - ;IfErrors Win9x - Pop $2 - UserInfo::GetAccountType - Pop $3 - - ; Compare results of IsNT with "1" - StrCmp $1 1 0 NotNT - ;This is NT - - - StrCmp $3 "Admin" 0 NotAdmin - ; Observation: I get here when running Win98SE. (Lilla) - ; The functions UserInfo.dll looks for are there on Win98 too, - ; but just don't work. So UserInfo.dll, knowing that admin isn't required - ; on Win98, returns admin anyway. (per kichik) - ; MessageBox MB_OK 'User "$R1" is in the Administrators group' - Pop $3 - Pop $2 - Pop $1 - Pop $0 - - Push 1 - Return - - NotAdmin: - ; You should still check for an empty string because the functions - ; UserInfo.dll looks for may not be present on Windows 95. (per kichik) - - #StrCmp $2 "" Win9x - #StrCpy $0 0 - ;MessageBox MB_OK 'User "$2" is in the "$3" group' - Pop $3 - Pop $2 - Pop $1 - Pop $0 - - Push 0 - Return - - ;Because we use IsNT, this is redundant. - #Win9x: - # ; comment/message below is by UserInfo.nsi author: - # ; This one means you don't need to care about admin or - # ; not admin because Windows 9x doesn't either - # ;MessageBox MB_OK "Error! This DLL can't run under Windows 9x!" - # StrCpy $0 0 - - NotNT: - ;We are not NT - ;Win9x doesn't have "admin" users. - ;Let the user do whatever. - Pop $3 - Pop $2 - Pop $1 - Pop $0 - - Push 1 - -FunctionEnd - -Function StrRep - - ;Written by dirtydingus 2003-02-20 04:30:09 - ; USAGE - ;Push String to do replacement in (haystack) - ;Push String to replace (needle) - ;Push Replacement - ;Call StrRep - ;Pop $R0 result - ;StrCpy $Result STR $R0 - - Exch $R4 ; $R4 = Replacement String - Exch - Exch $R3 ; $R3 = String to replace (needle) - Exch 2 - Exch $R1 ; $R1 = String to do replacement in (haystack) - Push $R2 ; Replaced haystack - Push $R5 ; Len (needle) - Push $R6 ; len (haystack) - Push $R7 ; Scratch reg - StrCpy $R2 "" - StrLen $R5 $R3 - StrLen $R6 $R1 -loop: - StrCpy $R7 $R1 $R5 - StrCmp $R7 $R3 found - StrCpy $R7 $R1 1 ; - optimization can be removed if U know len needle=1 - StrCpy $R2 "$R2$R7" - StrCpy $R1 $R1 $R6 1 - StrCmp $R1 "" done loop -found: - StrCpy $R2 "$R2$R4" - StrCpy $R1 $R1 $R6 $R5 - StrCmp $R1 "" done loop -done: - StrCpy $R3 $R2 - Pop $R7 - Pop $R6 - Pop $R5 - Pop $R2 - Pop $R1 - Pop $R4 - Exch $R3 - -FunctionEnd - diff --git a/direct/src/directscripts/packpanda.py b/direct/src/directscripts/packpanda.py deleted file mode 100755 index c195017f04..0000000000 --- a/direct/src/directscripts/packpanda.py +++ /dev/null @@ -1,424 +0,0 @@ -############################################################################# -# -# packpanda - this is a tool that packages up a panda game into a -# convenient, easily-downloaded windows executable. Packpanda runs on linux -# and windows - on linux, it builds .debs and .rpms, on windows it relies on -# NSIS, the nullsoft scriptable install system, to do the hard work. -# -# This is intentionally a very simplistic game-packer with very -# limited options. The goal is simplicity, not feature richness. -# There are dozens of complex, powerful packaging tools already out -# there. This one is for people who just want to do it quick and -# easy. -# -############################################################################## - -import sys, os, getopt, shutil, py_compile, subprocess - -OPTIONLIST = [ -("dir", 1, "Name of directory containing game"), -("name", 1, "Human-readable name of the game"), -("version", 1, "Version number to add to game name"), -("rmdir", 2, "Delete all directories with given name"), -("rmext", 2, "Delete all files with given extension"), -("fast", 0, "Use fast compression instead of good compression"), -("bam", 0, "Generate BAM files, change default-model-extension to BAM"), -("pyc", 0, "Generate PYC files"), -] - -def ParseFailure(): - print("") - print("packpanda usage:") - print("") - for (opt, hasval, explanation) in OPTIONLIST: - if (hasval): - print(" --%-10s %s"%(opt+" x", explanation)) - else: - print(" --%-10s %s"%(opt+" ", explanation)) - sys.exit(1) - -def ParseOptions(args): - try: - options = {} - longopts = [] - for (opt, hasval, explanation) in OPTIONLIST: - if (hasval==2): - longopts.append(opt+"=") - options[opt] = [] - elif (hasval==1): - longopts.append(opt+"=") - options[opt] = "" - else: - longopts.append(opt) - options[opt] = 0 - opts, extras = getopt.getopt(args, "", longopts) - for option, value in opts: - for (opt, hasval, explanation) in OPTIONLIST: - if (option == "--"+opt): - if (hasval==2): options[opt].append(value) - elif (hasval==1): options[opt] = value - else: options[opt] = 1 - return options - except: ParseFailure(); - -OPTIONS = ParseOptions(sys.argv[1:]) - -############################################################################## -# -# Locate the relevant trees. -# -############################################################################## - -PANDA=None -for dir in sys.path: - if (dir != "") and os.path.exists(os.path.join(dir,"direct")) and os.path.exists(os.path.join(dir,"pandac")): - PANDA=os.path.abspath(dir) -if (PANDA is None): - sys.exit("Cannot locate the panda root directory in the python path (cannot locate directory containing direct and pandac).") -print("PANDA located at "+PANDA) - -if (os.path.exists(os.path.join(PANDA,"..","makepanda","makepanda.py"))) and (sys.platform != "win32" or os.path.exists(os.path.join(PANDA,"..","thirdparty","win-nsis","makensis.exe"))): - PSOURCE=os.path.abspath(os.path.join(PANDA,"..")) - if (sys.platform == "win32"): - NSIS=os.path.abspath(os.path.join(PANDA,"..","thirdparty","win-nsis")) -else: - PSOURCE=PANDA - if (sys.platform == "win32"): - NSIS=os.path.join(PANDA,"nsis") - -############################################################################## -# -# Identify the main parts of the game: DIR, NAME, MAIN, ICON, BITMAP, etc -# -############################################################################## - -VER=OPTIONS["version"] -DIR=OPTIONS["dir"] -if (DIR==""): - print("You must specify the --dir option.") - ParseFailure() -DIR=os.path.abspath(DIR) -MYDIR=os.path.abspath(os.getcwd()) -BASENAME=os.path.basename(DIR) -if (OPTIONS["name"] != ""): - NAME=OPTIONS["name"] -else: - NAME=BASENAME -SMDIRECTORY=NAME -if (VER!=""): SMDIRECTORY=SMDIRECTORY+" "+VER -PYTHONV="python"+sys.version[:3] -LICENSE=os.path.join(DIR, "license.txt") -OUTFILE=os.path.basename(DIR) -if (VER!=""): OUTFILE=OUTFILE+"-"+VER -if (sys.platform == "win32"): - ICON=os.path.join(DIR, "icon.ico") - BITMAP=os.path.join(DIR, "installer.bmp") - OUTFILE=os.path.abspath(OUTFILE+".exe") - INSTALLDIR='C:\\'+os.path.basename(DIR) - if (VER!=""): INSTALLDIR=INSTALLDIR+"-"+VER - COMPRESS="lzma" - if (OPTIONS["fast"]): COMPRESS="zlib" -if (OPTIONS["pyc"]): MAIN="main.pyc" -else: MAIN="main.py" - -def PrintFileStatus(label, file): - if (os.path.exists(file)): - print("%-15s: %s"%(label, file)) - else: - print("%-15s: %s (MISSING)"%(label, file)) - -PrintFileStatus("Dir", DIR) -print("%-15s: %s"%("Name", NAME)) -print("%-15s: %s"%("Start Menu", SMDIRECTORY)) -PrintFileStatus("Main", os.path.join(DIR, MAIN)) -if (sys.platform == "win32"): - PrintFileStatus("Icon", ICON) - PrintFileStatus("Bitmap", BITMAP) -PrintFileStatus("License", LICENSE) -print("%-15s: %s"%("Output", OUTFILE)) -if (sys.platform == "win32"): - print("%-15s: %s"%("Install Dir", INSTALLDIR)) - -if (os.path.isdir(DIR)==0): - sys.exit("Difficulty reading "+DIR+". Cannot continue.") - -if (os.path.isfile(os.path.join(DIR, "main.py"))==0): - sys.exit("Difficulty reading main.py. Cannot continue.") - -if (os.path.isfile(LICENSE)==0): - LICENSE=os.path.join(PANDA,"LICENSE") - -if (sys.platform == "win32") and (os.path.isfile(BITMAP)==0): - BITMAP=os.path.join(NSIS,"Contrib","Graphics","Wizard","nsis.bmp") - -if (sys.platform == "win32"): - if (os.path.isfile(ICON)==0): - PPICON="bin\\ppython.exe" - else: - PPICON="game\\icon.ico" - -############################################################################## -# -# Copy the game to a temporary directory, so we can modify it safely. -# -############################################################################## - -def limitedCopyTree(src, dst, rmdir): - if (os.path.isdir(src)): - if (os.path.basename(src) in rmdir): - return - if (not os.path.isdir(dst)): os.mkdir(dst) - for x in os.listdir(src): - limitedCopyTree(os.path.join(src,x), os.path.join(dst,x), rmdir) - else: - shutil.copyfile(src, dst) - - -TMPDIR=os.path.abspath("packpanda-TMP") -if (sys.platform == "win32"): - TMPGAME=os.path.join(TMPDIR,"game") - TMPETC=os.path.join(TMPDIR,"etc") -else: - TMPGAME=os.path.join(TMPDIR,"usr","share","games",BASENAME,"game") - TMPETC=os.path.join(TMPDIR,"usr","share","games",BASENAME,"etc") -print("") -print("Copying the game to "+TMPDIR+"...") -if (os.path.exists(TMPDIR)): - try: shutil.rmtree(TMPDIR) - except: sys.exit("Cannot delete "+TMPDIR) -try: - os.mkdir(TMPDIR) - rmdir = {} - for x in OPTIONS["rmdir"]: - rmdir[x] = 1 - if not os.path.isdir( TMPGAME ): - os.makedirs(TMPGAME) - limitedCopyTree(DIR, TMPGAME, rmdir) - if not os.path.isdir( TMPETC ): - os.makedirs(TMPETC) - if sys.platform == "win32": - limitedCopyTree(os.path.join(PANDA, "etc"), TMPETC, {}) - else: - shutil.copyfile("/etc/Config.prc", os.path.join(TMPETC, "Config.prc")) - shutil.copyfile("/etc/Confauto.prc", os.path.join(TMPETC, "Confauto.prc")) -except: sys.exit("Cannot copy game to "+TMPDIR) - -############################################################################## -# -# If --bam requested, change default-model-extension .egg to bam. -# -############################################################################## - -def ReadFile(wfile): - try: - srchandle = open(wfile, "rb") - data = srchandle.read() - srchandle.close() - return data - except: exit("Cannot read "+wfile) - -def WriteFile(wfile,data): - try: - dsthandle = open(wfile, "wb") - dsthandle.write(data) - dsthandle.close() - except: exit("Cannot write "+wfile) - -if OPTIONS["bam"]: - CONF=ReadFile(os.path.join(TMPETC,"Confauto.prc")) - CONF=CONF.replace("default-model-extension .egg","default-model-extension .bam") - WriteFile(os.path.join(TMPETC,"Confauto.prc"), CONF) - -############################################################################## -# -# Compile all py files, convert all egg files. -# -# We do this as a sanity check, even if the user -# hasn't requested that his files be compiled. -# -############################################################################## - -if (sys.platform == "win32"): - EGG2BAM=os.path.join(PANDA,"bin","egg2bam.exe") -else: - EGG2BAM=os.path.join(PANDA,"bin","egg2bam") - -def egg2bam(file,bam): - present = os.path.exists(bam) - if (present): bam = "packpanda-TMP.bam"; - cmd = 'egg2bam -noabs -ps rel -pd . "'+file+'" -o "'+bam+'"' - print("Executing: "+cmd) - if (sys.platform == "win32"): - res = os.spawnl(os.P_WAIT, EGG2BAM, cmd) - else: - res = os.system(cmd) - if (res != 0): sys.exit("Problem in egg file: "+file) - if (present) or (OPTIONS["bam"]==0): - os.unlink(bam) - -def py2pyc(file): - print("Compiling python "+file) - pyc = file[:-3]+'.pyc' - pyo = file[:-3]+'.pyo' - if (os.path.exists(pyc)): os.unlink(pyc) - if (os.path.exists(pyo)): os.unlink(pyo) - try: py_compile.compile(file) - except: sys.exit("Cannot compile "+file) - if (OPTIONS["pyc"]==0): - if (os.path.exists(pyc)): - os.unlink(pyc) - if (os.path.exists(pyo)): - os.unlink(pyo) - -def CompileFiles(file): - if (os.path.isfile(file)): - if (file.endswith(".egg")): - egg2bam(file, file[:-4]+'.bam') - elif (file.endswith(".egg.pz") or file.endswith(".egg.gz")): - egg2bam(file, file[:-7]+'.bam') - elif (file.endswith(".py")): - py2pyc(file) - else: pass - elif (os.path.isdir(file)): - for x in os.listdir(file): - CompileFiles(os.path.join(file, x)) - -def DeleteFiles(file): - base = os.path.basename(file).lower() - if (os.path.isdir(file)): - for pattern in OPTIONS["rmdir"]: - if pattern.lower() == base: - print("Deleting "+file) - shutil.rmtree(file) - return - for x in os.listdir(file): - DeleteFiles(os.path.join(file, x)) - else: - for ext in OPTIONS["rmext"]: - if base[-(len(ext) + 1):] == ("." + ext).lower(): - print("Deleting "+file) - os.unlink(file) - return - -print("") -print("Compiling BAM and PYC files...") -os.chdir(TMPGAME) -CompileFiles(".") -DeleteFiles(".") - -############################################################################## -# -# Now make the installer. Yay! -# -############################################################################## - -INSTALLER_DEB_FILE=""" -Package: BASENAME -Version: VERSION -Section: games -Priority: optional -Architecture: ARCH -Essential: no -Depends: PYTHONV -Provides: BASENAME -Description: NAME -Maintainer: Unknown -""" - -INSTALLER_SPEC_FILE=""" -Summary: NAME -Name: BASENAME -Version: VERSION -Release: 1 -Group: Amusement/Games -License: See license file -BuildRoot: TMPDIR -BuildRequires: PYTHONV -%description -NAME -%files -%defattr(-,root,root) -/usr/bin/BASENAME -/usr/lib/games/BASENAME -/usr/share/games/BASENAME -""" - -RUN_SCRIPT=""" -#!/bin/sh -cd /usr/share/games/BASENAME/game -PYTHONPATH=/usr/lib/games/BASENAME:/usr/share/games/BASENAME -LD_LIBRARY_PATH=/usr/lib/games/BASENAME -PYTHONV MAIN -""" - -if (sys.platform == "win32"): - CMD="\""+NSIS+"\\makensis.exe\" /V2 " - CMD=CMD+'/DCOMPRESSOR="'+COMPRESS+'" ' - CMD=CMD+'/DNAME="'+NAME+'" ' - CMD=CMD+'/DSMDIRECTORY="'+SMDIRECTORY+'" ' - CMD=CMD+'/DINSTALLDIR="'+INSTALLDIR+'" ' - CMD=CMD+'/DOUTFILE="'+OUTFILE+'" ' - CMD=CMD+'/DLICENSE="'+LICENSE+'" ' - CMD=CMD+'/DLANGUAGE="English" ' - CMD=CMD+'/DRUNTEXT="Play '+NAME+'" ' - CMD=CMD+'/DIBITMAP="'+BITMAP+'" ' - CMD=CMD+'/DUBITMAP="'+BITMAP+'" ' - CMD=CMD+'/DPANDA="'+PANDA+'" ' - CMD=CMD+'/DPANDACONF="'+TMPETC+'" ' - CMD=CMD+'/DPSOURCE="'+PSOURCE+'" ' - CMD=CMD+'/DPPGAME="'+TMPGAME+'" ' - CMD=CMD+'/DPPMAIN="'+MAIN+'" ' - CMD=CMD+'/DPPICON="'+PPICON+'" ' - CMD=CMD+'"'+PSOURCE+'\\direct\\directscripts\\packpanda.nsi"' - - print("") - print(CMD) - print("packing...") - subprocess.call(CMD) -else: - os.chdir(MYDIR) - os.system("mkdir -p %s/usr/bin" % TMPDIR) - os.system("mkdir -p %s/usr/share/games/%s" % (TMPDIR, BASENAME)) - os.system("mkdir -p %s/usr/lib/games/%s" % (TMPDIR, BASENAME)) - os.system("cp --recursive %s/direct %s/usr/share/games/%s/direct" % (PANDA, TMPDIR, BASENAME)) - os.system("cp --recursive %s/pandac %s/usr/share/games/%s/pandac" % (PANDA, TMPDIR, BASENAME)) - os.system("cp --recursive %s/models %s/usr/share/games/%s/models" % (PANDA, TMPDIR, BASENAME)) - os.system("cp --recursive %s/Pmw %s/usr/share/games/%s/Pmw" % (PANDA, TMPDIR, BASENAME)) - os.system("cp %s %s/usr/share/games/%s/LICENSE" % (LICENSE, TMPDIR, BASENAME)) - os.system("cp --recursive /usr/lib/panda3d/* %s/usr/lib/games/%s/" % (TMPDIR, BASENAME)) - - # Make the script to run the game - txt = RUN_SCRIPT[1:].replace("BASENAME",BASENAME).replace("PYTHONV",PYTHONV).replace("MAIN",MAIN) - WriteFile(TMPDIR+"/usr/bin/"+BASENAME, txt) - os.system("chmod +x "+TMPDIR+"/usr/bin/"+BASENAME) - - if (os.path.exists("/usr/bin/rpmbuild")): - os.system("rm -rf %s/DEBIAN" % TMPDIR) - os.system("rpm -E '%_target_cpu' > packpanda-TMP.txt") - ARCH=ReadFile("packpanda-TMP.txt").strip() - os.remove("packpanda-TMP.txt") - txt = INSTALLER_SPEC_FILE[1:].replace("VERSION",VER).replace("TMPDIR",TMPDIR) - txt = txt.replace("BASENAME",BASENAME).replace("NAME",NAME).replace("PYTHONV",PYTHONV) - WriteFile("packpanda-TMP.spec", txt) - os.system("rpmbuild --define '_rpmdir "+TMPDIR+"' -bb packpanda-TMP.spec") - os.system("mv "+ARCH+"/"+BASENAME+"-"+VER+"-1."+ARCH+".rpm .") - os.rmdir(ARCH) - os.remove("packpanda-TMP.spec") - - if (os.path.exists("/usr/bin/dpkg-deb")): - os.system("dpkg --print-architecture > packpanda-TMP.txt") - ARCH=ReadFile("packpanda-TMP.txt").strip() - os.remove("packpanda-TMP.txt") - txt = INSTALLER_DEB_FILE[1:].replace("VERSION",str(VER)).replace("PYTHONV",PYTHONV) - txt = txt.replace("BASENAME",BASENAME).replace("NAME",NAME).replace("ARCH",ARCH) - os.system("mkdir -p %s/DEBIAN" % TMPDIR) - os.system("cd %s ; (find usr -type f -exec md5sum {} \;) > DEBIAN/md5sums" % TMPDIR) - WriteFile(TMPDIR+"/DEBIAN/control",txt) - os.system("dpkg-deb -b "+TMPDIR+" "+BASENAME+"_"+VER+"_"+ARCH+".deb") - - if not(os.path.exists("/usr/bin/rpmbuild") or os.path.exists("/usr/bin/dpkg-deb")): - exit("To build an installer, either rpmbuild or dpkg-deb must be present on your system!") - -# Dummy main function so this can be added to console_scripts. -def main(): - return 0 diff --git a/makepanda/installer.nsi b/makepanda/installer.nsi index d004d15006..c5e76fc766 100755 --- a/makepanda/installer.nsi +++ b/makepanda/installer.nsi @@ -619,13 +619,10 @@ Section -post DetailPrint "Preloading .egg files into the model cache..." SetDetailsPrint listonly - ; We need to set the $PATH for eggcacher. SetOutPath $INSTDIR - ReadEnvStr $R0 "PATH" - StrCpy $R0 "$INSTDIR\python;$INSTDIR\bin;$R0" - System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PATH", R0).r2' - - nsExec::ExecToLog '"$INSTDIR\bin\eggcacher.exe" --concise models samples' + nsExec::ExecToLog '"$INSTDIR\python\python.exe" -m direct.directscripts.eggcacher --concise models samples' + Pop $0 + DetailPrint "Command returned exit status $0" SetDetailsPrint both DetailPrint "Writing the uninstaller ..." diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 2e54cc2058..4faa683f87 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -90,7 +90,7 @@ PkgListSet(["PYTHON", "DIRECT", # Python support "ROCKET", "AWESOMIUM", # GUI libraries "CARBON", "COCOA", # Mac OS X toolkits "X11", # Unix platform support - "PANDATOOL", "PVIEW", "DEPLOYTOOLS", "DIRECTSCRIPTS",# Toolchain + "PANDATOOL", "PVIEW", "DEPLOYTOOLS", # Toolchain "SKEL", # Example SKEL project "PANDAFX", # Some distortion special lenses "PANDAPARTICLESYSTEM", # Built in particle system @@ -172,7 +172,7 @@ def parseopts(args): "version=","lzma","no-python","threads=","outputdir=","override=", "static","host=","debversion=","rpmrelease=","p3dsuffix=","rtdist-version=", "directx-sdk=", "windows-sdk=", "msvc-version=", "clean", "use-icl", - "universal", "target=", "arch=", "git-commit=", + "universal", "target=", "arch=", "git-commit=", "no-directscripts", "use-touchinput", "no-touchinput"] anything = 0 optimize = "" @@ -224,6 +224,7 @@ def parseopts(args): # Backward compatibility, OPENGL was renamed to GL elif (option=="--use-opengl"): PkgEnable("GL") elif (option=="--no-opengl"): PkgDisable("GL") + elif (option=="--no-directscripts"): pass elif (option=="--directx-sdk"): STRDXSDKVERSION = value.strip().lower() if STRDXSDKVERSION == '': @@ -832,7 +833,11 @@ if (COMPILER=="GCC"): SmartPkgEnable("ROCKET", "", rocket_libs, "Rocket/Core.h") if not PkgSkip("PYTHON"): - SmartPkgEnable("PYTHON", "", SDK["PYTHONVERSION"], (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h"), tool = SDK["PYTHONVERSION"] + "-config") + python_lib = SDK["PYTHONVERSION"] + if not RTDIST: + # We don't link anything in the SDK with libpython. + python_lib = "" + SmartPkgEnable("PYTHON", "", python_lib, (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h"), tool = SDK["PYTHONVERSION"] + "-config") SmartPkgEnable("OPENSSL", "openssl", ("ssl", "crypto"), ("openssl/ssl.h", "openssl/crypto.h")) SmartPkgEnable("ZLIB", "zlib", ("z"), "zlib.h") @@ -4996,17 +5001,6 @@ if (PkgSkip("DIRECT")==0): OPTS=['DIR:direct/src/directbase', 'PYTHON'] TargetAdd('p3directbase_directbase.obj', opts=OPTS+['BUILDING:DIRECT'], input='directbase.cxx') - if not PkgSkip("PYTHON") and not RTDIST and not RUNTIME and not PkgSkip("DIRECTSCRIPTS"): - DefSymbol("BUILDING:PACKPANDA", "IMPORT_MODULE", "direct.directscripts.packpanda") - TargetAdd('packpanda.obj', opts=OPTS+['BUILDING:PACKPANDA'], input='ppython.cxx') - TargetAdd('packpanda.exe', input='packpanda.obj') - TargetAdd('packpanda.exe', opts=['PYTHON']) - - DefSymbol("BUILDING:EGGCACHER", "IMPORT_MODULE", "direct.directscripts.eggcacher") - TargetAdd('eggcacher.obj', opts=OPTS+['BUILDING:EGGCACHER'], input='ppython.cxx') - TargetAdd('eggcacher.exe', input='eggcacher.obj') - TargetAdd('eggcacher.exe', opts=['PYTHON']) - # # DIRECTORY: direct/src/dcparser/ # diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 2eb4342b06..ee903a3940 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -1574,7 +1574,7 @@ def SmartPkgEnable(pkg, pkgconfig = None, libs = None, incs = None, defs = None, location = os.path.join(GetOutputDir(), "lib", os.path.basename(location)) LibName(target_pkg, location) else: - print(GetColor("cyan") + "Couldn't find library lib" + libname + " in thirdparty directory " + pkg.lower() + GetColor()) + print(GetColor("cyan") + "Couldn't find library lib" + libname + " in thirdparty directory " + thirdparty_dir + GetColor()) for d, v in defs.values(): DefSymbol(target_pkg, d, v) diff --git a/makepanda/makewheel.py b/makepanda/makewheel.py index 6d3b6fdf72..56fb43133e 100644 --- a/makepanda/makewheel.py +++ b/makepanda/makewheel.py @@ -551,7 +551,6 @@ def makewheel(version, output_dir, platform=default_platform): # Add a panda3d-tools directory containing the executables. entry_points = '[console_scripts]\n' entry_points += 'eggcacher = direct.directscripts.eggcacher:main\n' - entry_points += 'packpanda = direct.directscripts.packpanda:main\n' tools_init = '' for file in os.listdir(bin_dir): basename = os.path.splitext(file)[0] From 816b2ac3ba3f35b209dfde8afe6eee40cba358b7 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 5 Jan 2017 23:24:52 +0100 Subject: [PATCH 015/254] C++11 polyfills. This should fix Snow Leopard build. --- dtool/src/dtoolbase/dtoolbase_cc.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index eb99381c01..eb7afc9048 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -75,6 +75,7 @@ typedef int ios_seekdir; #endif #include +#include #ifdef HAVE_NAMESPACE using namespace std; @@ -114,6 +115,18 @@ typedef ios::iostate ios_iostate; typedef ios::seekdir ios_seekdir; #endif +// Apple has an outdated libstdc++. Not all is lost, though, as we can fill +// in some important missing functions. +#if defined(__GLIBCXX__) && __GLIBCXX__ <= 20070719 +template struct remove_reference {typedef T type;}; +template struct remove_reference {typedef T type;}; +template struct remove_reference{typedef T type;}; + +template typename remove_reference::type &&move(T &&t) { + return static_cast::type&&>(t); +} +#endif + #ifdef _MSC_VER #define ALWAYS_INLINE __forceinline #elif defined(__GNUC__) @@ -153,7 +166,7 @@ typedef ios::seekdir ios_seekdir; #elif defined(__GNUC__) && (__cplusplus >= 201103L) // GCC // GCC defines several macros which we can query. List of all supported -// builtin macros: https:gcc.gnu.orgprojectscxx0x.html +// builtin macros: https://gcc.gnu.org/projects/cxx-status.html # if __cpp_constexpr >= 200704 # define CONSTEXPR constexpr # endif From 41d26284d75e47749c4488a948e038aea06c16e6 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 8 Jan 2017 13:40:09 -0500 Subject: [PATCH 016/254] Fix various compilation issues on Mac. Work around bugs in Apple Clang that ships with XCode 4 with C++11 by disabling constexpr Use move() instead of std::move() It also looks like we'll have to continue using pystub for tools that use libp3interrogatedb for now. --- dtool/src/dtoolbase/dtoolbase_cc.h | 6 +++- dtool/src/interrogate/interrogate.cxx | 3 ++ dtool/src/interrogate/interrogate_module.cxx | 3 ++ dtool/src/interrogate/parse_file.cxx | 3 ++ .../src/test_interrogate/test_interrogate.cxx | 3 ++ panda/src/display/displayRegion.I | 4 +-- panda/src/linmath/lvecBase2_src.I | 16 ---------- panda/src/linmath/lvecBase2_src.h | 4 +-- panda/src/linmath/lvecBase3_src.I | 16 ---------- panda/src/linmath/lvecBase3_src.h | 4 +-- panda/src/linmath/lvecBase4_src.I | 32 ------------------- panda/src/linmath/lvecBase4_src.h | 8 ++--- panda/src/putil/weakKeyHashMap.I | 2 +- 13 files changed, 28 insertions(+), 76 deletions(-) diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index eb7afc9048..486eaa00ba 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -118,6 +118,8 @@ typedef ios::seekdir ios_seekdir; // Apple has an outdated libstdc++. Not all is lost, though, as we can fill // in some important missing functions. #if defined(__GLIBCXX__) && __GLIBCXX__ <= 20070719 +typedef decltype(nullptr) nullptr_t; + template struct remove_reference {typedef T type;}; template struct remove_reference {typedef T type;}; template struct remove_reference{typedef T type;}; @@ -147,7 +149,9 @@ template typename remove_reference::type &&move(T &&t) { // Determine the availability of C++11 features. #if defined(__has_extension) // Clang magic. # if __has_extension(cxx_constexpr) -# define CONSTEXPR constexpr +# if !defined(__apple_build_version__) || __apple_build_version__ >= 5000000 +# define CONSTEXPR constexpr +# endif # endif # if __has_extension(cxx_noexcept) # define NOEXCEPT noexcept diff --git a/dtool/src/interrogate/interrogate.cxx b/dtool/src/interrogate/interrogate.cxx index 206132bb31..94175b9d2b 100644 --- a/dtool/src/interrogate/interrogate.cxx +++ b/dtool/src/interrogate/interrogate.cxx @@ -19,6 +19,7 @@ #include "pnotify.h" #include "panda_getopt_long.h" #include "preprocess_argv.h" +#include "pystub.h" #include CPPParser parser; @@ -305,6 +306,8 @@ predefine_macro(CPPParser& parser, const string& inoption) { int main(int argc, char **argv) { + pystub(); + preprocess_argv(argc, argv); string command_line; int i; diff --git a/dtool/src/interrogate/interrogate_module.cxx b/dtool/src/interrogate/interrogate_module.cxx index 8e397d8b9e..5feae341b7 100644 --- a/dtool/src/interrogate/interrogate_module.cxx +++ b/dtool/src/interrogate/interrogate_module.cxx @@ -19,6 +19,7 @@ #include "interrogate_interface.h" #include "interrogate_request.h" #include "load_dso.h" +#include "pystub.h" #include "pnotify.h" #include "panda_getopt_long.h" #include "preprocess_argv.h" @@ -379,6 +380,8 @@ int main(int argc, char *argv[]) { extern int optind; int flag; + pystub(); + preprocess_argv(argc, argv); flag = getopt_long_only(argc, argv, short_options, long_options, NULL); while (flag != EOF) { diff --git a/dtool/src/interrogate/parse_file.cxx b/dtool/src/interrogate/parse_file.cxx index 2b32f39561..6670bcbe44 100644 --- a/dtool/src/interrogate/parse_file.cxx +++ b/dtool/src/interrogate/parse_file.cxx @@ -22,6 +22,7 @@ #include "cppGlobals.h" #include "panda_getopt_long.h" #include "preprocess_argv.h" +#include "pystub.h" #include CPPParser parser; @@ -193,6 +194,8 @@ show_nested_types(const string &str) { int main(int argc, char **argv) { + pystub(); + extern char *optarg; extern int optind; const char *optstr = "I:S:D:o:l:vp"; diff --git a/dtool/src/test_interrogate/test_interrogate.cxx b/dtool/src/test_interrogate/test_interrogate.cxx index f9aa7c1ab4..6c2b961ff3 100644 --- a/dtool/src/test_interrogate/test_interrogate.cxx +++ b/dtool/src/test_interrogate/test_interrogate.cxx @@ -17,6 +17,7 @@ #include "interrogate_request.h" #include "load_dso.h" #include "filename.h" +#include "pystub.h" #include "panda_getopt.h" #include "preprocess_argv.h" @@ -520,6 +521,8 @@ main(int argc, char **argv) { extern int optind; const char *optstr = "p:ftqh"; + pystub(); + bool all_functions = false; bool all_types = false; bool quick_load = false; diff --git a/panda/src/display/displayRegion.I b/panda/src/display/displayRegion.I index 11492a3a5e..6004791d31 100644 --- a/panda/src/display/displayRegion.I +++ b/panda/src/display/displayRegion.I @@ -480,8 +480,8 @@ set_cull_result(PT(CullResult) cull_result, PT(SceneSetup) scene_setup, Thread *current_thread) { CDCullWriter cdata(_cycler_cull, true, current_thread); #ifdef USE_MOVE_SEMANTICS - cdata->_cull_result = std::move(cull_result); - cdata->_scene_setup = std::move(scene_setup); + cdata->_cull_result = move(cull_result); + cdata->_scene_setup = move(scene_setup); #else swap(cdata->_cull_result, cull_result); swap(cdata->_scene_setup, scene_setup); diff --git a/panda/src/linmath/lvecBase2_src.I b/panda/src/linmath/lvecBase2_src.I index 9ddce8966c..401e2e346a 100644 --- a/panda/src/linmath/lvecBase2_src.I +++ b/panda/src/linmath/lvecBase2_src.I @@ -72,14 +72,6 @@ operator [](int i) { return _v(i); } -/** - * Returns 2: the number of components of a LVecBase2. - */ -CONSTEXPR int FLOATNAME(LVecBase2):: -size() { - return 2; -} - /** * Returns true if any component of the vector is not-a-number, false * otherwise. @@ -178,14 +170,6 @@ get_data() const { return &_v(0); } -/** - * Returns the number of elements in the vector, two. - */ -CONSTEXPR int FLOATNAME(LVecBase2):: -get_num_components() { - return 2; -} - /** * Returns an iterator that may be used to traverse the elements of the * matrix, STL-style. diff --git a/panda/src/linmath/lvecBase2_src.h b/panda/src/linmath/lvecBase2_src.h index 0167855c65..d0c0693f55 100644 --- a/panda/src/linmath/lvecBase2_src.h +++ b/panda/src/linmath/lvecBase2_src.h @@ -50,7 +50,7 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - CONSTEXPR static int size(); + CONSTEXPR static int size() { return 2; } INLINE_LINMATH bool is_nan() const; @@ -74,7 +74,7 @@ PUBLISHED: INLINE_LINMATH void add_y(FLOATTYPE value); INLINE_LINMATH const FLOATTYPE *get_data() const; - CONSTEXPR static int get_num_components(); + CONSTEXPR static int get_num_components() { return 2; } public: INLINE_LINMATH iterator begin(); diff --git a/panda/src/linmath/lvecBase3_src.I b/panda/src/linmath/lvecBase3_src.I index b7011da0ca..eeaea584d5 100644 --- a/panda/src/linmath/lvecBase3_src.I +++ b/panda/src/linmath/lvecBase3_src.I @@ -89,14 +89,6 @@ operator [](int i) { return _v(i); } -/** - * Returns 3: the number of components of a LVecBase3. - */ -CONSTEXPR int FLOATNAME(LVecBase3):: -size() { - return 3; -} - /** * Returns true if any component of the vector is not-a-number, false * otherwise. @@ -246,14 +238,6 @@ get_data() const { return &_v(0); } -/** - * Returns the number of elements in the vector, three. - */ -CONSTEXPR int FLOATNAME(LVecBase3):: -get_num_components() { - return 3; -} - /** * Returns an iterator that may be used to traverse the elements of the * matrix, STL-style. diff --git a/panda/src/linmath/lvecBase3_src.h b/panda/src/linmath/lvecBase3_src.h index fdc39c7819..fb9b67ca27 100644 --- a/panda/src/linmath/lvecBase3_src.h +++ b/panda/src/linmath/lvecBase3_src.h @@ -52,7 +52,7 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - CONSTEXPR static int size(); + CONSTEXPR static int size() { return 3; } INLINE_LINMATH bool is_nan() const; @@ -87,7 +87,7 @@ PUBLISHED: INLINE_LINMATH void add_z(FLOATTYPE value); INLINE_LINMATH const FLOATTYPE *get_data() const; - CONSTEXPR static int get_num_components(); + CONSTEXPR static int get_num_components() { return 3; } public: INLINE_LINMATH iterator begin(); diff --git a/panda/src/linmath/lvecBase4_src.I b/panda/src/linmath/lvecBase4_src.I index 7890a6f8f0..70a376a3bf 100644 --- a/panda/src/linmath/lvecBase4_src.I +++ b/panda/src/linmath/lvecBase4_src.I @@ -118,14 +118,6 @@ operator [](int i) { return _v(i); } -/** - * Returns 4: the number of components of a LVecBase4. - */ -CONSTEXPR int FLOATNAME(LVecBase4):: -size() { - return 4; -} - /** * Returns true if any component of the vector is not-a-number, false * otherwise. @@ -288,14 +280,6 @@ get_data() const { return &_v(0); } -/** - * Returns the number of elements in the vector, four. - */ -CONSTEXPR int FLOATNAME(LVecBase4):: -get_num_components() { - return 4; -} - /** * Returns an iterator that may be used to traverse the elements of the * matrix, STL-style. @@ -958,14 +942,6 @@ operator [](int i) { return _v(i); } -/** - * Returns 4: the number of components of a LVecBase4. - */ -CONSTEXPR int FLOATNAME(UnalignedLVecBase4):: -size() { - return 4; -} - /** * Returns the address of the first of the three data elements in the vector. * The remaining elements occupy the next positions consecutively in memory. @@ -974,11 +950,3 @@ INLINE_LINMATH const FLOATTYPE *FLOATNAME(UnalignedLVecBase4):: get_data() const { return &_v(0); } - -/** - * Returns the number of elements in the vector, 4. - */ -CONSTEXPR int FLOATNAME(UnalignedLVecBase4):: -get_num_components() { - return 4; -} diff --git a/panda/src/linmath/lvecBase4_src.h b/panda/src/linmath/lvecBase4_src.h index 1d4a16e961..b6e1a4df35 100644 --- a/panda/src/linmath/lvecBase4_src.h +++ b/panda/src/linmath/lvecBase4_src.h @@ -62,7 +62,7 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - CONSTEXPR static int size(); + CONSTEXPR static int size() { return 4; } INLINE_LINMATH bool is_nan() const; @@ -100,7 +100,7 @@ PUBLISHED: INLINE_LINMATH void add_w(FLOATTYPE value); INLINE_LINMATH const FLOATTYPE *get_data() const; - CONSTEXPR static int get_num_components(); + CONSTEXPR static int get_num_components() { return 4; } INLINE_LINMATH void extract_data(float*){}; public: @@ -236,10 +236,10 @@ PUBLISHED: INLINE_LINMATH FLOATTYPE operator [](int i) const; INLINE_LINMATH FLOATTYPE &operator [](int i); - CONSTEXPR static int size(); + CONSTEXPR static int size() { return 4; } INLINE_LINMATH const FLOATTYPE *get_data() const; - CONSTEXPR static int get_num_components(); + CONSTEXPR static int get_num_components() { return 4; } public: typedef FLOATTYPE numeric_type; diff --git a/panda/src/putil/weakKeyHashMap.I b/panda/src/putil/weakKeyHashMap.I index c80e47723d..b4b007f998 100644 --- a/panda/src/putil/weakKeyHashMap.I +++ b/panda/src/putil/weakKeyHashMap.I @@ -307,7 +307,7 @@ template INLINE void WeakKeyHashMap:: set_data(int n, Value &&data) { nassertv(has_element(n)); - _table[n]._data = std::move(data); + _table[n]._data = move(data); } #endif // USE_MOVE_SEMANTICS From 58c1581c0c7520311f72ba07e908f56e99efdf33 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 8 Jan 2017 17:20:17 -0500 Subject: [PATCH 017/254] Fix .whl version when no explicit --version is specified --- makepanda/makepanda.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 4faa683f87..ac528371c7 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -368,6 +368,9 @@ if VERSION is None: else: VERSION = ParsePandaVersion("dtool/PandaVersion.pp") +if WHLVERSION is None: + WHLVERSION = VERSION + print("Version: %s" % VERSION) if RUNTIME or RTDIST: print("Core API Version: %s" % COREAPI_VERSION) From 72a1a9820baf640fc9d06d6fd73f7f4785d4ce07 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 8 Jan 2017 17:50:48 -0500 Subject: [PATCH 018/254] Fix issues in ancient ffmpeg versions (Eg. Ubuntu Precise) --- panda/src/ffmpeg/ffmpegVideoCursor.cxx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/panda/src/ffmpeg/ffmpegVideoCursor.cxx b/panda/src/ffmpeg/ffmpegVideoCursor.cxx index 8e2d0b0e47..c9cee499cd 100644 --- a/panda/src/ffmpeg/ffmpegVideoCursor.cxx +++ b/panda/src/ffmpeg/ffmpegVideoCursor.cxx @@ -40,6 +40,10 @@ PStatCollector FfmpegVideoCursor::_export_frame_pcollector("*:FFMPEG Convert Vid #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO #endif +#if LIBAVCODEC_VERSION_MAJOR < 54 +#define AV_CODEC_ID_VP8 CODEC_ID_VP8 +#endif + #if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(51, 74, 100) #define AV_PIX_FMT_NONE PIX_FMT_NONE #define AV_PIX_FMT_BGR24 PIX_FMT_BGR24 @@ -116,6 +120,7 @@ init_from(FfmpegVideo *source) { _eof_known = false; _eof_frame = 0; +#if LIBAVUTIL_VERSION_MAJOR >= 52 // Check if we got an alpha format. Please note that some video codecs // (eg. libvpx) change the pix_fmt after decoding the first frame, which is // why we didn't do this earlier. @@ -123,7 +128,9 @@ init_from(FfmpegVideo *source) { if (desc && (desc->flags & AV_PIX_FMT_FLAG_ALPHA) != 0) { _num_components = 4; _pixel_format = (int)AV_PIX_FMT_BGRA; - } else { + } else +#endif + { _num_components = 3; _pixel_format = (int)AV_PIX_FMT_BGR24; } From ba5bba42b019fdf35e34577ac839bc7a16cefa66 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 8 Jan 2017 17:51:09 -0500 Subject: [PATCH 019/254] Fix interrogate warnings, flesh out iterator header --- dtool/src/parser-inc/iterator | 72 ++++++++++++++++++++++++++++++++++- dtool/src/parser-inc/memory | 2 +- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/dtool/src/parser-inc/iterator b/dtool/src/parser-inc/iterator index 40b8e2f479..c6cdf654fa 100644 --- a/dtool/src/parser-inc/iterator +++ b/dtool/src/parser-inc/iterator @@ -1,6 +1,74 @@ #pragma once +#include +#include + namespace std { - template class iterator; - template class reverse_iterator; + // Iterator tags + struct input_iterator_tag {}; + struct output_iterator_tag {}; + struct forward_iterator_tag : public input_iterator_tag {}; + struct bidirectional_iterator_tag : public forward_iterator_tag {}; + struct random_access_iterator_tag : public bidirectional_iterator_tag {}; + + // Iterator traits + template struct iterator_traits { + typedef typename Iterator::difference_type difference_type; + typedef typename Iterator::value_type value_type; + typedef typename Iterator::pointer pointer; + typedef typename Iterator::reference reference; + typedef typename Iterator::iterator_category iterator_category; + }; + + template struct iterator_traits { + typedef ptrdiff_t difference_type; + typedef T value_type; + typedef T *pointer; + typedef T &reference; + typedef random_access_iterator_tag iterator_category; + }; + + template struct iterator_traits { + typedef ptrdiff_t difference_type; + typedef T value_type; + typedef const T *pointer; + typedef const T &reference; + typedef random_access_iterator_tag iterator_category; + }; + + // Iterators + template struct iterator { + typedef T value_type; + typedef Distance difference_type; + typedef Pointer pointer; + typedef Reference reference; + typedef Category iterator_category; + }; + + template + class reverse_iterator : public + iterator::iterator_category, + typename iterator_traits::value_type, + typename iterator_traits::difference_type, + typename iterator_traits::pointer, + typename iterator_traits::reference> { + public: + typedef Iterator iterator_type; + typedef typename iterator_traits::difference_type difference_type; + typedef typename iterator_traits::reference reference; + typedef typename iterator_traits::pointer pointer; + }; + + template, + class Distance = ptrdiff_t> + class istream_iterator; + + template> + class ostream_iterator; + + template> + class istreambuf_iterator; + template > + class ostreambuf_iterator; }; diff --git a/dtool/src/parser-inc/memory b/dtool/src/parser-inc/memory index 30a54d006a..8c3a7b1b1d 100644 --- a/dtool/src/parser-inc/memory +++ b/dtool/src/parser-inc/memory @@ -122,7 +122,7 @@ namespace std { struct is_always_equal; template using rebind_alloc = size_t; - template using rebind_traits = allocator_traits >; + //template using rebind_traits = allocator_traits >; }; template class allocator; From 4ed199cece1843453cce95205ed1f9e3affa47e6 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 9 Jan 2017 18:45:23 +0100 Subject: [PATCH 020/254] Fix various compile warnings and a few code consistency issues --- direct/src/plugin/p3dInstance.cxx | 8 ++++---- direct/src/plugin/p3dOsxSplashWindow.cxx | 16 ++++++++-------- dtool/src/dtoolbase/dlmalloc_src.cxx | 9 +++++++-- .../interrogate/interfaceMakerPythonNative.cxx | 2 +- dtool/src/parser-inc/arpa/inet.h | 4 ++++ dtool/src/parser-inc/netdb.h | 9 +++++++++ panda/src/audiotraits/fmodAudioManager.cxx | 4 ++-- panda/src/audiotraits/openalAudioManager.cxx | 1 - panda/src/collide/collisionBox.cxx | 8 ++++---- panda/src/collide/collisionFloorMesh.cxx | 4 ++-- .../src/collide/collisionHandlerFluidPusher.cxx | 2 +- panda/src/collide/collisionInvSphere.cxx | 8 ++++---- panda/src/collide/collisionPlane.cxx | 14 +++++++------- panda/src/collide/collisionPolygon.cxx | 12 ++++++------ panda/src/collide/collisionSphere.cxx | 14 +++++++------- panda/src/collide/collisionTube.cxx | 10 +++++----- panda/src/downloader/httpClient.cxx | 2 +- panda/src/gobj/texture_ext.cxx | 4 ++-- panda/src/ode/odeTriMeshData.cxx | 2 +- panda/src/ode/odeTriMeshGeom.I | 2 +- panda/src/pgraph/clipPlaneAttrib.cxx | 4 ++-- panda/src/pgraph/portalClipper.cxx | 2 +- panda/src/physx/physxControllerDesc.h | 3 ++- pandatool/src/xfile/xParser.cxx.prebuilt | 2 +- pandatool/src/xfile/xParser.yxx | 2 +- 25 files changed, 83 insertions(+), 65 deletions(-) create mode 100644 dtool/src/parser-inc/arpa/inet.h create mode 100644 dtool/src/parser-inc/netdb.h diff --git a/direct/src/plugin/p3dInstance.cxx b/direct/src/plugin/p3dInstance.cxx index b3f96b3f9c..0eabdaafd5 100644 --- a/direct/src/plugin/p3dInstance.cxx +++ b/direct/src/plugin/p3dInstance.cxx @@ -3450,8 +3450,8 @@ paint_window_osx_port() { int y_size = min(_wparams.get_win_height(), _swbuffer->get_y_size()); size_t rowsize = _swbuffer->get_row_size(); - Rect src_rect = {0, 0, y_size, x_size}; - Rect ddrc_rect = {0, 0, y_size, x_size}; + Rect src_rect = {0, 0, (short)y_size, (short)x_size}; + Rect ddrc_rect = {0, 0, (short)y_size, (short)x_size}; QDErr err; @@ -3502,7 +3502,7 @@ paint_window_osx_cgcontext(CGContextRef context) { int y_size = min(_wparams.get_win_height(), _swbuffer->get_y_size()); if (_buffer_image != NULL) { - CGRect region = { { 0, 0 }, { x_size, y_size } }; + CGRect region = { { 0, 0 }, { (CGFloat)x_size, (CGFloat)y_size } }; CGContextDrawImage(context, region, _buffer_image); } } @@ -3538,7 +3538,7 @@ handle_event_osx_event_record(const P3D_event_data &event) { // First, convert the coordinates from screen coordinates to browser // window coordinates. WindowRef window = handle._handle._osx_cgcontext._window; - CGPoint cgpt = { pt.h, pt.v }; + CGPoint cgpt = { (CGFloat)pt.h, (CGFloat)pt.v }; HIPointConvert(&cgpt, kHICoordSpaceScreenPixel, NULL, kHICoordSpaceWindow, window); diff --git a/direct/src/plugin/p3dOsxSplashWindow.cxx b/direct/src/plugin/p3dOsxSplashWindow.cxx index 2014251149..c8fc969679 100644 --- a/direct/src/plugin/p3dOsxSplashWindow.cxx +++ b/direct/src/plugin/p3dOsxSplashWindow.cxx @@ -267,7 +267,7 @@ refresh() { return; } if (_toplevel_window != NULL) { - Rect r = { 0, 0, _win_height, _win_width }; + Rect r = { 0, 0, (short)_win_height, (short)_win_width }; InvalWindowRect(_toplevel_window, &r); } else { @@ -345,7 +345,7 @@ paint_window_osx_cgcontext(CGContextRef context) { CGColorSpaceRef rgb_space = CGColorSpaceCreateDeviceRGB(); CGColorRef bg = CGColorCreate(rgb_space, bg_components); - CGRect region = { { 0, 0 }, { _win_width, _win_height } }; + CGRect region = { { 0, 0 }, { (CGFloat)_win_width, (CGFloat)_win_height } }; CGContextSetFillColorWithColor(context, bg); CGContextFillRect(context, region); @@ -407,7 +407,7 @@ handle_event_osx_event_record(const P3D_event_data &event) { // First, convert the coordinates from screen coordinates to browser // window coordinates. WindowRef window = handle._handle._osx_cgcontext._window; - CGPoint cgpt = { pt.h, pt.v }; + CGPoint cgpt = { (CGFloat)pt.h, (CGFloat)pt.v }; HIPointConvert(&cgpt, kHICoordSpaceScreenPixel, NULL, kHICoordSpaceWindow, window); @@ -617,7 +617,7 @@ paint_progress_bar(CGContextRef context) { int bar_x, bar_y, bar_width, bar_height; get_bar_placement(bar_x, bar_y, bar_width, bar_height); - CGRect bar_rect = { { bar_x, bar_y }, { bar_width, bar_height } }; + CGRect bar_rect = { { (CGFloat)bar_x, (CGFloat)bar_y }, { (CGFloat)bar_width, (CGFloat)bar_height } }; // Clear the entire progress bar to white (or the background color). CGContextSetFillColorWithColor(context, bar_bg); @@ -627,7 +627,7 @@ paint_progress_bar(CGContextRef context) { if (_progress_known) { int progress_width = (int)(bar_width * _install_progress + 0.5); if (progress_width != 0) { - CGRect prog = { { bar_x, bar_y }, { progress_width, bar_height } }; + CGRect prog = { { (CGFloat)bar_x, (CGFloat)bar_y }, { (CGFloat)progress_width, (CGFloat)bar_height } }; CGContextSetFillColorWithColor(context, bar); CGContextFillRect(context, prog); } @@ -642,7 +642,7 @@ paint_progress_bar(CGContextRef context) { progress = block_travel * 2 - progress; } - CGRect prog = { { bar_x + progress, bar_y }, { block_width, bar_height } }; + CGRect prog = { { (CGFloat)(bar_x + progress), (CGFloat)bar_y }, { (CGFloat)block_width, (CGFloat)bar_height } }; CGContextSetFillColorWithColor(context, bar); CGContextFillRect(context, prog); } @@ -652,8 +652,8 @@ paint_progress_bar(CGContextRef context) { // We offset the border by half a pixel, so we'll be drawing the one-pixel // line through the middle of a pixel, and it won't try to antialias // itself into a half-black two-pixel line. - CGRect border_rect = { { bar_x - 0.5, bar_y - 0.5 }, - { bar_width + 1, bar_height + 1 } }; + CGRect border_rect = { { (CGFloat)(bar_x - 0.5), (CGFloat)(bar_y - 0.5) }, + { (CGFloat)(bar_width + 1), (CGFloat)(bar_height + 1) } }; CGContextBeginPath(context); CGContextSetLineWidth(context, 1); diff --git a/dtool/src/dtoolbase/dlmalloc_src.cxx b/dtool/src/dtoolbase/dlmalloc_src.cxx index 008350de73..a26fcd28cd 100644 --- a/dtool/src/dtoolbase/dlmalloc_src.cxx +++ b/dtool/src/dtoolbase/dlmalloc_src.cxx @@ -587,8 +587,11 @@ MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP #define MAX_SIZE_T (~(size_t)0) #ifndef USE_LOCKS /* ensure true if spin or recursive locks set */ -#define USE_LOCKS ((defined(USE_SPIN_LOCKS) && USE_SPIN_LOCKS != 0) || \ - (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0)) +#if (defined(USE_SPIN_LOCKS) && USE_SPIN_LOCKS != 0) || (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0) +#define USE_LOCKS 1 +#else +#define USE_LOCKS 0 +#endif #endif /* USE_LOCKS */ #if USE_LOCKS /* Spin locks for gcc >= 4.1, older gcc on x86, MSC >= 1310 */ @@ -647,7 +650,9 @@ MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP #ifndef HAVE_MREMAP #ifdef linux #define HAVE_MREMAP 1 +#ifndef _GNU_SOURCE #define _GNU_SOURCE /* Turns on mremap() definition */ +#endif #else /* linux */ #define HAVE_MREMAP 0 #endif /* linux */ diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index a844771fa6..f24839d331 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -6198,7 +6198,7 @@ write_make_seq(ostream &out, Object *obj, const std::string &ClassName, // the assumption that the called method doesn't do anything with this // tuple other than unpack it (which is a fairly safe assumption to make). out << " PyTupleObject args;\n"; - out << " PyObject_INIT_VAR(&args, &PyTuple_Type, 1);\n"; + out << " (void)PyObject_INIT_VAR(&args, &PyTuple_Type, 1);\n"; } out << diff --git a/dtool/src/parser-inc/arpa/inet.h b/dtool/src/parser-inc/arpa/inet.h new file mode 100644 index 0000000000..a3ed68c461 --- /dev/null +++ b/dtool/src/parser-inc/arpa/inet.h @@ -0,0 +1,4 @@ +#pragma once + +#include +#include diff --git a/dtool/src/parser-inc/netdb.h b/dtool/src/parser-inc/netdb.h new file mode 100644 index 0000000000..367025cd3a --- /dev/null +++ b/dtool/src/parser-inc/netdb.h @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +struct hostent; +struct netent; +struct protoent; +struct servent; diff --git a/panda/src/audiotraits/fmodAudioManager.cxx b/panda/src/audiotraits/fmodAudioManager.cxx index 7d7ae246e3..dc98e76287 100644 --- a/panda/src/audiotraits/fmodAudioManager.cxx +++ b/panda/src/audiotraits/fmodAudioManager.cxx @@ -424,8 +424,8 @@ get_sound(const string &file_name, bool positional, int) { vfs->resolve_filename(path, get_model_path()); // Build a new AudioSound from the audio data. - PT(AudioSound) audioSound = 0; - PT(FmodAudioSound) fmodAudioSound = new FmodAudioSound(this, path, positional ); + PT(AudioSound) audioSound; + PT(FmodAudioSound) fmodAudioSound = new FmodAudioSound(this, path, positional); _all_sounds.insert(fmodAudioSound); diff --git a/panda/src/audiotraits/openalAudioManager.cxx b/panda/src/audiotraits/openalAudioManager.cxx index ba1b4684a3..b6d68a0ec0 100644 --- a/panda/src/audiotraits/openalAudioManager.cxx +++ b/panda/src/audiotraits/openalAudioManager.cxx @@ -1022,7 +1022,6 @@ cleanup() { OpenALAudioManager::SoundData:: SoundData() : _manager(0), - _movie(0), _sample(0), _stream(NULL), _length(0.0), diff --git a/panda/src/collide/collisionBox.cxx b/panda/src/collide/collisionBox.cxx index b358d8b359..b55988c352 100644 --- a/panda/src/collide/collisionBox.cxx +++ b/panda/src/collide/collisionBox.cxx @@ -199,7 +199,7 @@ PT(CollisionEntry) CollisionBox:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); CPT(TransformState) wrt_space = entry.get_wrt_space(); CPT(TransformState) wrt_prev_space = entry.get_wrt_prev_space(); @@ -402,7 +402,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionBox:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); LPoint3 from_origin = ray->get_origin() * wrt_mat; @@ -483,7 +483,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionBox:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *seg; - DCAST_INTO_R(seg, entry.get_from(), 0); + DCAST_INTO_R(seg, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); LPoint3 from_origin = seg->get_point_a() * wrt_mat; @@ -564,7 +564,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionBox:: test_intersection_from_box(const CollisionEntry &entry) const { const CollisionBox *box; - DCAST_INTO_R(box, entry.get_from(), 0); + DCAST_INTO_R(box, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/collide/collisionFloorMesh.cxx b/panda/src/collide/collisionFloorMesh.cxx index fcec727778..d523875727 100644 --- a/panda/src/collide/collisionFloorMesh.cxx +++ b/panda/src/collide/collisionFloorMesh.cxx @@ -125,7 +125,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionFloorMesh:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); LPoint3 from_origin = ray->get_origin() * entry.get_wrt_mat(); double fx = from_origin[0]; @@ -190,7 +190,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionFloorMesh:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); LPoint3 from_origin = sphere->get_center() * entry.get_wrt_mat(); double fx = from_origin[0]; diff --git a/panda/src/collide/collisionHandlerFluidPusher.cxx b/panda/src/collide/collisionHandlerFluidPusher.cxx index eea0cc1f22..0a48381d01 100644 --- a/panda/src/collide/collisionHandlerFluidPusher.cxx +++ b/panda/src/collide/collisionHandlerFluidPusher.cxx @@ -136,7 +136,7 @@ handle_entries() { // currently we only support spheres as the collider const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entries.front()->get_from(), 0); + DCAST_INTO_R(sphere, entries.front()->get_from(), false); from_node_path.set_pos(wrt_node, 0,0,0); LPoint3 sphere_offset = (sphere->get_center() * diff --git a/panda/src/collide/collisionInvSphere.cxx b/panda/src/collide/collisionInvSphere.cxx index 913ef32589..35a73225dd 100644 --- a/panda/src/collide/collisionInvSphere.cxx +++ b/panda/src/collide/collisionInvSphere.cxx @@ -92,7 +92,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionInvSphere:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -144,7 +144,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionInvSphere:: test_intersection_from_line(const CollisionEntry &entry) const { const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -185,7 +185,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionInvSphere:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -228,7 +228,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionInvSphere:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/collide/collisionPlane.cxx b/panda/src/collide/collisionPlane.cxx index c551464960..d722adde7b 100644 --- a/panda/src/collide/collisionPlane.cxx +++ b/panda/src/collide/collisionPlane.cxx @@ -107,7 +107,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -146,7 +146,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_line(const CollisionEntry &entry) const { const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -191,7 +191,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -243,7 +243,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -300,7 +300,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_tube(const CollisionEntry &entry) const { const CollisionTube *tube; - DCAST_INTO_R(tube, entry.get_from(), 0); + DCAST_INTO_R(tube, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -371,7 +371,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_parabola(const CollisionEntry &entry) const { const CollisionParabola *parabola; - DCAST_INTO_R(parabola, entry.get_from(), 0); + DCAST_INTO_R(parabola, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -437,7 +437,7 @@ test_intersection_from_parabola(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_box(const CollisionEntry &entry) const { const CollisionBox *box; - DCAST_INTO_R(box, entry.get_from(), 0); + DCAST_INTO_R(box, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/collide/collisionPolygon.cxx b/panda/src/collide/collisionPolygon.cxx index ff64dcc298..646a7b9439 100644 --- a/panda/src/collide/collisionPolygon.cxx +++ b/panda/src/collide/collisionPolygon.cxx @@ -364,7 +364,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { } const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); CPT(TransformState) wrt_space = entry.get_wrt_space(); CPT(TransformState) wrt_prev_space = entry.get_wrt_prev_space(); @@ -545,7 +545,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { } const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -613,7 +613,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { } const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -686,7 +686,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { } const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -761,7 +761,7 @@ test_intersection_from_parabola(const CollisionEntry &entry) const { } const CollisionParabola *parabola; - DCAST_INTO_R(parabola, entry.get_from(), 0); + DCAST_INTO_R(parabola, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -846,7 +846,7 @@ test_intersection_from_parabola(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPolygon:: test_intersection_from_box(const CollisionEntry &entry) const { const CollisionBox *box; - DCAST_INTO_R(box, entry.get_from(), 0); + DCAST_INTO_R(box, entry.get_from(), NULL); // To make things easier, transform the box into the coordinate space of the // plane. diff --git a/panda/src/collide/collisionSphere.cxx b/panda/src/collide/collisionSphere.cxx index 2e0802b350..139a39a4b1 100644 --- a/panda/src/collide/collisionSphere.cxx +++ b/panda/src/collide/collisionSphere.cxx @@ -120,7 +120,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); CPT(TransformState) wrt_space = entry.get_wrt_space(); @@ -231,7 +231,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_line(const CollisionEntry &entry) const { const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -271,7 +271,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_box(const CollisionEntry &entry) const { const CollisionBox *box; - DCAST_INTO_R(box, entry.get_from(), 0); + DCAST_INTO_R(box, entry.get_from(), NULL); // Instead of transforming the box into the sphere's coordinate space, we do // it the other way around. It's easier that way. @@ -347,7 +347,7 @@ test_intersection_from_box(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -394,7 +394,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -443,7 +443,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_tube(const CollisionEntry &entry) const { const CollisionTube *tube; - DCAST_INTO_R(tube, entry.get_from(), 0); + DCAST_INTO_R(tube, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -499,7 +499,7 @@ test_intersection_from_tube(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_parabola(const CollisionEntry &entry) const { const CollisionParabola *parabola; - DCAST_INTO_R(parabola, entry.get_from(), 0); + DCAST_INTO_R(parabola, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/collide/collisionTube.cxx b/panda/src/collide/collisionTube.cxx index cb3f24f737..8e3b188aab 100644 --- a/panda/src/collide/collisionTube.cxx +++ b/panda/src/collide/collisionTube.cxx @@ -146,7 +146,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionTube:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); CPT(TransformState) wrt_space = entry.get_wrt_space(); CPT(TransformState) wrt_prev_space = entry.get_wrt_prev_space(); @@ -224,7 +224,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionTube:: test_intersection_from_line(const CollisionEntry &entry) const { const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -272,7 +272,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionTube:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -333,7 +333,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionTube:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -397,7 +397,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionTube:: test_intersection_from_parabola(const CollisionEntry &entry) const { const CollisionParabola *parabola; - DCAST_INTO_R(parabola, entry.get_from(), 0); + DCAST_INTO_R(parabola, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/downloader/httpClient.cxx b/panda/src/downloader/httpClient.cxx index 63ba1c6258..129d5fb6be 100644 --- a/panda/src/downloader/httpClient.cxx +++ b/panda/src/downloader/httpClient.cxx @@ -807,7 +807,7 @@ load_client_certificate() { // Rewind the "file" to the beginning in order to read the public key // (which might appear first in the file). - BIO_reset(mbio); + (void)BIO_reset(mbio); ERR_clear_error(); _client_certificate_pub = diff --git a/panda/src/gobj/texture_ext.cxx b/panda/src/gobj/texture_ext.cxx index 1e661e960a..507fa41fc4 100644 --- a/panda/src/gobj/texture_ext.cxx +++ b/panda/src/gobj/texture_ext.cxx @@ -66,7 +66,7 @@ set_ram_image(PyObject *image, Texture::CompressionMode compression, if (view.len % component_width != 0) { PyErr_Format(PyExc_ValueError, - "byte buffer is not a multiple of %zu bytes", + "byte buffer is not a multiple of %d bytes", component_width); return; } @@ -131,7 +131,7 @@ set_ram_image_as(PyObject *image, const string &provided_format) { if (view.len % component_width != 0) { PyErr_Format(PyExc_ValueError, - "byte buffer is not a multiple of %zu bytes", + "byte buffer is not a multiple of %d bytes", component_width); return; } diff --git a/panda/src/ode/odeTriMeshData.cxx b/panda/src/ode/odeTriMeshData.cxx index afae75b753..5f02cefa56 100644 --- a/panda/src/ode/odeTriMeshData.cxx +++ b/panda/src/ode/odeTriMeshData.cxx @@ -29,7 +29,7 @@ get_data(dGeomID id) { if (iter != data_map.end()) { return iter->second; } - return 0; + return NULL; } void OdeTriMeshData:: diff --git a/panda/src/ode/odeTriMeshGeom.I b/panda/src/ode/odeTriMeshGeom.I index 8bfd233bbf..b0a2e6177c 100644 --- a/panda/src/ode/odeTriMeshGeom.I +++ b/panda/src/ode/odeTriMeshGeom.I @@ -34,7 +34,7 @@ set_tri_mesh_data(OdeTriMeshData &data) { INLINE PT(OdeTriMeshData) OdeTriMeshGeom:: get_tri_mesh_data() const { - nassertr(_id != 0 ,0); + nassertr(_id != 0, NULL); return OdeTriMeshData::get_data(_id); } diff --git a/panda/src/pgraph/clipPlaneAttrib.cxx b/panda/src/pgraph/clipPlaneAttrib.cxx index e62a3d6e24..c95f9437c4 100644 --- a/panda/src/pgraph/clipPlaneAttrib.cxx +++ b/panda/src/pgraph/clipPlaneAttrib.cxx @@ -487,7 +487,7 @@ filter_to_max(int max_clip_planes) const { CPT(RenderAttrib) ClipPlaneAttrib:: compose_off(const RenderAttrib *other) const { const ClipPlaneAttrib *ta; - DCAST_INTO_R(ta, other, 0); + DCAST_INTO_R(ta, other, NULL); if (_off_all_planes || (!ta->_off_all_planes && ta->_off_planes.empty())) { // If we turn off all planes, or the other turns none off, the result is @@ -701,7 +701,7 @@ get_hash_impl() const { CPT(RenderAttrib) ClipPlaneAttrib:: compose_impl(const RenderAttrib *other) const { const ClipPlaneAttrib *ta; - DCAST_INTO_R(ta, other, 0); + DCAST_INTO_R(ta, other, NULL); if (ta->_off_all_planes) { // If the other type turns off all planes, it doesn't matter what we are. diff --git a/panda/src/pgraph/portalClipper.cxx b/panda/src/pgraph/portalClipper.cxx index 7b9e55556b..f6d45aab8f 100644 --- a/panda/src/pgraph/portalClipper.cxx +++ b/panda/src/pgraph/portalClipper.cxx @@ -39,7 +39,7 @@ PortalClipper:: PortalClipper(GeometricBoundingVolume *frustum, SceneSetup *scene_setup): _reduced_viewport_min(-1,-1), _reduced_viewport_max(1,1), -_clip_state(0) +_clip_state(NULL) { _previous = new GeomNode("my_frustum"); diff --git a/panda/src/physx/physxControllerDesc.h b/panda/src/physx/physxControllerDesc.h index 7919b60118..4624938ffd 100644 --- a/panda/src/physx/physxControllerDesc.h +++ b/panda/src/physx/physxControllerDesc.h @@ -23,8 +23,9 @@ * Descriptor class for a character controller. */ class EXPCL_PANDAPHYSX PhysxControllerDesc { - PUBLISHED: + virtual ~PhysxControllerDesc() {}; + virtual void set_to_default() = 0; virtual bool is_valid() const = 0; diff --git a/pandatool/src/xfile/xParser.cxx.prebuilt b/pandatool/src/xfile/xParser.cxx.prebuilt index 606ead1db3..42c65a72a6 100644 --- a/pandatool/src/xfile/xParser.cxx.prebuilt +++ b/pandatool/src/xfile/xParser.cxx.prebuilt @@ -98,7 +98,7 @@ static XFile *x_file = (XFile *)NULL; static XFileNode *current_node = (XFileNode *)NULL; -static PT(XFileDataDef) current_data_def = (XFileDataDef *)NULL; +static PT(XFileDataDef) current_data_def; //////////////////////////////////////////////////////////////////// // Defining the interface to the parser. diff --git a/pandatool/src/xfile/xParser.yxx b/pandatool/src/xfile/xParser.yxx index 4aa8ffd3b3..a98f39d177 100644 --- a/pandatool/src/xfile/xParser.yxx +++ b/pandatool/src/xfile/xParser.yxx @@ -32,7 +32,7 @@ static XFile *x_file = (XFile *)NULL; static XFileNode *current_node = (XFileNode *)NULL; -static PT(XFileDataDef) current_data_def = (XFileDataDef *)NULL; +static PT(XFileDataDef) current_data_def; //////////////////////////////////////////////////////////////////// // Defining the interface to the parser. From 43a5f2a9f20118db9fcbeec14467c97a711d37b6 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 9 Jan 2017 20:38:33 +0100 Subject: [PATCH 021/254] Fixes for Python 3.5: - Disable conversion to Windows newlines, which is causing double Windows newlines for Config.prc - We need to copy vcruntime140.dll to the bin directory for Python 3.5+ build using MSVC 2010 to work --- makepanda/makepanda.py | 6 +++--- makepanda/makepandacore.py | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index ac528371c7..6a7d8ce521 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -2887,8 +2887,8 @@ if tp_dir is not None: pydll += ".dll" CopyFile(GetOutputDir() + "/bin" + pydll, SDK["PYTHON"] + pydll) - #for fn in glob.glob(SDK["PYTHON"] + "/vcruntime*.dll"): - # CopyFile(GetOutputDir() + "/bin/", fn) + for fn in glob.glob(SDK["PYTHON"] + "/vcruntime*.dll"): + CopyFile(GetOutputDir() + "/bin/", fn) # Copy the whole Python directory. CopyTree(GetOutputDir() + "/python", SDK["PYTHON"]) @@ -2907,7 +2907,7 @@ if tp_dir is not None: else: idents = () - for ident in tree.findall('./{urn:schemas-microsoft-com:asm.v1}dependency/{urn:schemas-microsoft-com:asm.v1}dependentAssembly/{urn:schemas-microsoft-com:asm.v1}assemblyIdentity'): + for ident in idents: sxs_name = '_'.join([ ident.get('processorArchitecture'), ident.get('name').lower(), diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index ee903a3940..24f3614337 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -980,7 +980,10 @@ def WriteFile(wfile, data, newline=None): data = data.replace('\n', newline) try: - dsthandle = open(wfile, "w") + if sys.version_info >= (3, 0): + dsthandle = open(wfile, "w", newline='') + else: + dsthandle = open(wfile, "w") dsthandle.write(data) dsthandle.close() except: From 749e09d49ecc31a5235a4af46849626b483f5936 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 9 Jan 2017 23:10:51 +0100 Subject: [PATCH 022/254] ffmpeg: don't hide last frame of video This is not quite a complete fix, since the last frame of the video won't be shown long enough for it to matter when looping the video. A more complete fix may be needed later. --- panda/src/ffmpeg/ffmpegVideoCursor.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/panda/src/ffmpeg/ffmpegVideoCursor.cxx b/panda/src/ffmpeg/ffmpegVideoCursor.cxx index c9cee499cd..8a23853811 100644 --- a/panda/src/ffmpeg/ffmpegVideoCursor.cxx +++ b/panda/src/ffmpeg/ffmpegVideoCursor.cxx @@ -327,13 +327,13 @@ set_time(double timestamp, int loop_count) { if (_eof_known) { if (loop_count == 0) { - frame = frame % _eof_frame; + frame = frame % (_eof_frame + 1); } else { - int last_frame = _eof_frame * loop_count; + int last_frame = (_eof_frame + 1) * loop_count; if (frame < last_frame) { - frame = frame % _eof_frame; + frame = frame % (_eof_frame + 1); } else { - frame = _eof_frame - 1; + frame = _eof_frame; } } } From e1a54f52a8c54c4b016680fc59d96edcc4f7102b Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 9 Jan 2017 23:29:39 +0100 Subject: [PATCH 023/254] makepanda: add --no-egg/--use-egg flags to enable/disable egg features. --- makepanda/makepanda.py | 258 +++++++++++++++++++++-------------------- 1 file changed, 135 insertions(+), 123 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 6a7d8ce521..5798259328 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -81,7 +81,7 @@ PkgListSet(["PYTHON", "DIRECT", # Python support "ODE", "PHYSX", "BULLET", "PANDAPHYSICS", # Physics "SPEEDTREE", # SpeedTree "ZLIB", "PNG", "JPEG", "TIFF", "OPENEXR", "SQUISH", "FREETYPE", # 2D Formats support - ] + MAYAVERSIONS + MAXVERSIONS + [ "FCOLLADA", "ASSIMP", # 3D Formats support + ] + MAYAVERSIONS + MAXVERSIONS + [ "FCOLLADA", "ASSIMP", "EGG", # 3D Formats support "VRPN", "OPENSSL", # Transport "FFTW", # Algorithm helpers "ARTOOLKIT", "OPENCV", "DIRECTCAM", "VISION", # Augmented Reality @@ -2235,7 +2235,6 @@ DTOOL_CONFIG=[ ("HAVE_NET", 'UNDEF', 'UNDEF'), ("WANT_NATIVE_NET", '1', '1'), ("SIMULATE_NETWORK_DELAY", 'UNDEF', 'UNDEF'), - ("HAVE_EGG", '1', '1'), ("HAVE_CG", 'UNDEF', 'UNDEF'), ("HAVE_CGGL", 'UNDEF', 'UNDEF'), ("HAVE_CGDX9", 'UNDEF', 'UNDEF'), @@ -2711,7 +2710,8 @@ if not PkgSkip("VISION"): panda_modules.append('vision') if not PkgSkip("SKEL"): panda_modules.append('skel') -panda_modules.append('egg') +if not PkgSkip("EGG"): + panda_modules.append('egg') if not PkgSkip("AWESOMIUM"): panda_modules.append('awesomium') if not PkgSkip("ODE"): @@ -3065,15 +3065,17 @@ CopyAllHeaders('panda/src/downloadertools') CopyAllHeaders('panda/src/windisplay') CopyAllHeaders('panda/src/dxgsg9') CopyAllHeaders('panda/metalibs/pandadx9') -CopyAllHeaders('panda/src/egg') -CopyAllHeaders('panda/src/egg2pg') +if not PkgSkip("EGG"): + CopyAllHeaders('panda/src/egg') + CopyAllHeaders('panda/src/egg2pg') CopyAllHeaders('panda/src/framework') CopyAllHeaders('panda/metalibs/pandafx') CopyAllHeaders('panda/src/glstuff') CopyAllHeaders('panda/src/glgsg') CopyAllHeaders('panda/src/glesgsg') CopyAllHeaders('panda/src/gles2gsg') -CopyAllHeaders('panda/metalibs/pandaegg') +if not PkgSkip("EGG"): + CopyAllHeaders('panda/metalibs/pandaegg') if GetTarget() == 'windows': CopyAllHeaders('panda/src/wgldisplay') elif GetTarget() == 'darwin': @@ -4462,7 +4464,7 @@ if GetTarget() == 'windows' and PkgSkip("DX9")==0 and not RUNTIME: # DIRECTORY: panda/src/egg/ # -if (not RUNTIME): +if not RUNTIME and not PkgSkip("EGG"): OPTS=['DIR:panda/src/egg', 'BUILDING:PANDAEGG', 'ZLIB', 'BISONPREFIX_eggyy', 'FLEXDASHI'] CreateFile(GetOutputDir()+"/include/parser.h") TargetAdd('p3egg_parser.obj', opts=OPTS, input='parser.yxx') @@ -4483,7 +4485,7 @@ if (not RUNTIME): # DIRECTORY: panda/src/egg2pg/ # -if (not RUNTIME): +if not RUNTIME and not PkgSkip("EGG"): OPTS=['DIR:panda/src/egg2pg', 'BUILDING:PANDAEGG'] TargetAdd('p3egg2pg_composite1.obj', opts=OPTS, input='p3egg2pg_composite1.cxx') TargetAdd('p3egg2pg_composite2.obj', opts=OPTS, input='p3egg2pg_composite2.cxx') @@ -4502,11 +4504,13 @@ if (not RUNTIME): deps = [] # Framework wants to link in a renderer when building statically, so tell it what is available. if GetLinkAllStatic(): - deps = ['dtool_have_gl.dat', 'dtool_have_tinydisplay.dat'] + deps = ['dtool_have_gl.dat', 'dtool_have_tinydisplay.dat', 'dtool_have_egg.dat'] if not PkgSkip("GL"): DefSymbol("FRAMEWORK", "HAVE_GL") if not PkgSkip("TINYDISPLAY"): DefSymbol("FRAMEWORK", "HAVE_TINYDISPLAY") + if not PkgSkip("EGG"): + DefSymbol("FRAMEWORK", "HAVE_EGG") OPTS=['DIR:panda/src/framework', 'BUILDING:FRAMEWORK', 'FRAMEWORK'] TargetAdd('p3framework_composite1.obj', opts=OPTS, input='p3framework_composite1.cxx', dep=deps) @@ -4545,7 +4549,7 @@ if (not RUNTIME and PkgSkip("GLES2")==0): # DIRECTORY: panda/metalibs/pandaegg/ # -if (not RUNTIME): +if not RUNTIME and not PkgSkip("EGG"): OPTS=['DIR:panda/metalibs/pandaegg', 'DIR:panda/src/egg', 'BUILDING:PANDAEGG'] TargetAdd('pandaegg_pandaegg.obj', opts=OPTS, input='pandaegg.cxx') @@ -4915,7 +4919,8 @@ if (not RTDIST and not RUNTIME and PkgSkip("PVIEW")==0 and GetTarget() != 'andro TargetAdd('pview_pview.obj', opts=OPTS, input='pview.cxx') TargetAdd('pview.exe', input='pview_pview.obj') TargetAdd('pview.exe', input='libp3framework.dll') - TargetAdd('pview.exe', input='libpandaegg.dll') + if not PkgSkip("EGG"): + TargetAdd('pview.exe', input='libpandaegg.dll') TargetAdd('pview.exe', input=COMMON_PANDA_LIBS) TargetAdd('pview.exe', opts=['ADVAPI', 'WINSOCK2', 'WINSHELL']) @@ -4941,7 +4946,8 @@ if (not RUNTIME and GetTarget() == 'android'): TargetAdd('pview.exe', input='android_main.obj') TargetAdd('pview.exe', input='pview_pview.obj') TargetAdd('pview.exe', input='libp3framework.dll') - TargetAdd('pview.exe', input='libpandaegg.dll') + if not PkgSkip("EGG"): + TargetAdd('pview.exe', input='libpandaegg.dll') TargetAdd('pview.exe', input='libp3android.dll') TargetAdd('pview.exe', input=COMMON_PANDA_LIBS) TargetAdd('AndroidManifest.xml', opts=OPTS, input='pview_manifest.xml') @@ -5495,7 +5501,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/converter/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/converter'] TargetAdd('p3converter_somethingToEggConverter.obj', opts=OPTS, input='somethingToEggConverter.cxx') TargetAdd('p3converter_eggToSomethingConverter.obj', opts=OPTS, input='eggToSomethingConverter.cxx') @@ -5506,7 +5512,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/progbase/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/progbase', 'ZLIB'] TargetAdd('p3progbase_composite1.obj', opts=OPTS, input='p3progbase_composite1.cxx') TargetAdd('libp3progbase.lib', input='p3progbase_composite1.obj') @@ -5515,7 +5521,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/eggbase/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/eggbase'] TargetAdd('p3eggbase_composite1.obj', opts=OPTS, input='p3eggbase_composite1.cxx') TargetAdd('libp3eggbase.lib', input='p3eggbase_composite1.obj') @@ -5524,31 +5530,31 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/bam/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/bam'] TargetAdd('bam-info_bamInfo.obj', opts=OPTS, input='bamInfo.cxx') TargetAdd('bam-info.exe', input='bam-info_bamInfo.obj') TargetAdd('bam-info.exe', input='libp3progbase.lib') TargetAdd('bam-info.exe', input='libp3pandatoolbase.lib') - TargetAdd('bam-info.exe', input='libpandaegg.dll') TargetAdd('bam-info.exe', input=COMMON_PANDA_LIBS) TargetAdd('bam-info.exe', opts=['ADVAPI', 'FFTW']) - TargetAdd('bam2egg_bamToEgg.obj', opts=OPTS, input='bamToEgg.cxx') - TargetAdd('bam2egg.exe', input='bam2egg_bamToEgg.obj') - TargetAdd('bam2egg.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('bam2egg.exe', opts=['ADVAPI', 'FFTW']) + if not PkgSkip("EGG"): + TargetAdd('bam2egg_bamToEgg.obj', opts=OPTS, input='bamToEgg.cxx') + TargetAdd('bam2egg.exe', input='bam2egg_bamToEgg.obj') + TargetAdd('bam2egg.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('bam2egg.exe', opts=['ADVAPI', 'FFTW']) - TargetAdd('egg2bam_eggToBam.obj', opts=OPTS, input='eggToBam.cxx') - TargetAdd('egg2bam.exe', input='egg2bam_eggToBam.obj') - TargetAdd('egg2bam.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('egg2bam.exe', opts=['ADVAPI', 'FFTW']) + TargetAdd('egg2bam_eggToBam.obj', opts=OPTS, input='eggToBam.cxx') + TargetAdd('egg2bam.exe', input='egg2bam_eggToBam.obj') + TargetAdd('egg2bam.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('egg2bam.exe', opts=['ADVAPI', 'FFTW']) # # DIRECTORY: pandatool/src/cvscopy/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/cvscopy'] TargetAdd('p3cvscopy_composite1.obj', opts=OPTS, input='p3cvscopy_composite1.cxx') TargetAdd('libp3cvscopy.lib', input='p3cvscopy_composite1.obj') @@ -5556,7 +5562,7 @@ if (PkgSkip("PANDATOOL")==0): # # DIRECTORY: pandatool/src/daeegg/ # -if (PkgSkip("PANDATOOL")==0 and PkgSkip("FCOLLADA")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("FCOLLADA") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/daeegg', 'FCOLLADA'] TargetAdd('p3daeegg_composite1.obj', opts=OPTS, input='p3daeegg_composite1.cxx') TargetAdd('libp3daeegg.lib', input='p3daeegg_composite1.obj') @@ -5565,7 +5571,7 @@ if (PkgSkip("PANDATOOL")==0 and PkgSkip("FCOLLADA")==0): # # DIRECTORY: pandatool/src/assimp # -if (PkgSkip("PANDATOOL") == 0 and PkgSkip("ASSIMP")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("ASSIMP"): OPTS=['DIR:pandatool/src/assimp', 'BUILDING:ASSIMP', 'ASSIMP', 'MODULE'] TargetAdd('p3assimp_composite1.obj', opts=OPTS, input='p3assimp_composite1.cxx') TargetAdd('libp3assimp.dll', input='p3assimp_composite1.obj') @@ -5575,7 +5581,7 @@ if (PkgSkip("PANDATOOL") == 0 and PkgSkip("ASSIMP")==0): # # DIRECTORY: pandatool/src/daeprogs/ # -if (PkgSkip("PANDATOOL")==0 and PkgSkip("FCOLLADA")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("FCOLLADA") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/daeprogs', 'FCOLLADA'] TargetAdd('dae2egg_daeToEgg.obj', opts=OPTS, input='daeToEgg.cxx') TargetAdd('dae2egg.exe', input='dae2egg_daeToEgg.obj') @@ -5587,7 +5593,7 @@ if (PkgSkip("PANDATOOL")==0 and PkgSkip("FCOLLADA")==0): # DIRECTORY: pandatool/src/dxf/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/dxf'] TargetAdd('p3dxf_composite1.obj', opts=OPTS, input='p3dxf_composite1.cxx') TargetAdd('libp3dxf.lib', input='p3dxf_composite1.obj') @@ -5596,7 +5602,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/dxfegg/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/dxfegg'] TargetAdd('p3dxfegg_dxfToEggConverter.obj', opts=OPTS, input='dxfToEggConverter.cxx') TargetAdd('p3dxfegg_dxfToEggLayer.obj', opts=OPTS, input='dxfToEggLayer.cxx') @@ -5607,7 +5613,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/dxfprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/dxfprogs'] TargetAdd('dxf-points_dxfPoints.obj', opts=OPTS, input='dxfPoints.cxx') TargetAdd('dxf-points.exe', input='dxf-points_dxfPoints.obj') @@ -5617,26 +5623,27 @@ if (PkgSkip("PANDATOOL")==0): TargetAdd('dxf-points.exe', input=COMMON_PANDA_LIBS) TargetAdd('dxf-points.exe', opts=['ADVAPI', 'FFTW']) - TargetAdd('dxf2egg_dxfToEgg.obj', opts=OPTS, input='dxfToEgg.cxx') - TargetAdd('dxf2egg.exe', input='dxf2egg_dxfToEgg.obj') - TargetAdd('dxf2egg.exe', input='libp3dxfegg.lib') - TargetAdd('dxf2egg.exe', input='libp3dxf.lib') - TargetAdd('dxf2egg.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('dxf2egg.exe', opts=['ADVAPI', 'FFTW']) + if not PkgSkip("EGG"): + TargetAdd('dxf2egg_dxfToEgg.obj', opts=OPTS, input='dxfToEgg.cxx') + TargetAdd('dxf2egg.exe', input='dxf2egg_dxfToEgg.obj') + TargetAdd('dxf2egg.exe', input='libp3dxfegg.lib') + TargetAdd('dxf2egg.exe', input='libp3dxf.lib') + TargetAdd('dxf2egg.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('dxf2egg.exe', opts=['ADVAPI', 'FFTW']) - TargetAdd('egg2dxf_eggToDXF.obj', opts=OPTS, input='eggToDXF.cxx') - TargetAdd('egg2dxf_eggToDXFLayer.obj', opts=OPTS, input='eggToDXFLayer.cxx') - TargetAdd('egg2dxf.exe', input='egg2dxf_eggToDXF.obj') - TargetAdd('egg2dxf.exe', input='egg2dxf_eggToDXFLayer.obj') - TargetAdd('egg2dxf.exe', input='libp3dxf.lib') - TargetAdd('egg2dxf.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('egg2dxf.exe', opts=['ADVAPI', 'FFTW']) + TargetAdd('egg2dxf_eggToDXF.obj', opts=OPTS, input='eggToDXF.cxx') + TargetAdd('egg2dxf_eggToDXFLayer.obj', opts=OPTS, input='eggToDXFLayer.cxx') + TargetAdd('egg2dxf.exe', input='egg2dxf_eggToDXF.obj') + TargetAdd('egg2dxf.exe', input='egg2dxf_eggToDXFLayer.obj') + TargetAdd('egg2dxf.exe', input='libp3dxf.lib') + TargetAdd('egg2dxf.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('egg2dxf.exe', opts=['ADVAPI', 'FFTW']) # # DIRECTORY: pandatool/src/objegg/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/objegg'] TargetAdd('p3objegg_objToEggConverter.obj', opts=OPTS, input='objToEggConverter.cxx') TargetAdd('p3objegg_eggToObjConverter.obj', opts=OPTS, input='eggToObjConverter.cxx') @@ -5649,7 +5656,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/objprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/objprogs'] TargetAdd('obj2egg_objToEgg.obj', opts=OPTS, input='objToEgg.cxx') TargetAdd('obj2egg.exe', input='obj2egg_objToEgg.obj') @@ -5665,7 +5672,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/palettizer/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/palettizer'] TargetAdd('p3palettizer_composite1.obj', opts=OPTS, input='p3palettizer_composite1.cxx') TargetAdd('libp3palettizer.lib', input='p3palettizer_composite1.obj') @@ -5674,7 +5681,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/egg-mkfont/ # -if (PkgSkip("FREETYPE")==0) and (PkgSkip("PANDATOOL")==0): +if not PkgSkip("FREETYPE") and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/egg-mkfont', 'DIR:pandatool/src/palettizer', 'FREETYPE'] TargetAdd('egg-mkfont_eggMakeFont.obj', opts=OPTS, input='eggMakeFont.cxx') TargetAdd('egg-mkfont_rangeDescription.obj', opts=OPTS, input='rangeDescription.cxx') @@ -5690,7 +5697,7 @@ if (PkgSkip("FREETYPE")==0) and (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/eggcharbase/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/eggcharbase', 'ZLIB'] TargetAdd('p3eggcharbase_composite1.obj', opts=OPTS, input='p3eggcharbase_composite1.cxx') TargetAdd('libp3eggcharbase.lib', input='p3eggcharbase_composite1.obj') @@ -5699,7 +5706,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/egg-optchar/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/egg-optchar'] TargetAdd('egg-optchar_config_egg_optchar.obj', opts=OPTS, input='config_egg_optchar.cxx') TargetAdd('egg-optchar_eggOptchar.obj', opts=OPTS, input='eggOptchar.cxx') @@ -5717,7 +5724,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/egg-palettize/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/egg-palettize', 'DIR:pandatool/src/palettizer'] TargetAdd('egg-palettize_eggPalettize.obj', opts=OPTS, input='eggPalettize.cxx') TargetAdd('egg-palettize.exe', input='egg-palettize_eggPalettize.obj') @@ -5729,7 +5736,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/egg-qtess/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/egg-qtess'] TargetAdd('egg-qtess_composite1.obj', opts=OPTS, input='egg-qtess_composite1.cxx') TargetAdd('egg-qtess.exe', input='egg-qtess_composite1.obj') @@ -5743,7 +5750,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/eggprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/eggprogs'] TargetAdd('egg-crop_eggCrop.obj', opts=OPTS, input='eggCrop.cxx') TargetAdd('egg-crop.exe', input='egg-crop_eggCrop.obj') @@ -5796,7 +5803,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/flt/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/flt', 'ZLIB'] TargetAdd('p3flt_composite1.obj', opts=OPTS, input='p3flt_composite1.cxx') TargetAdd('libp3flt.lib', input=['p3flt_composite1.obj']) @@ -5805,7 +5812,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/fltegg/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/fltegg'] TargetAdd('p3fltegg_fltToEggConverter.obj', opts=OPTS, input='fltToEggConverter.cxx') TargetAdd('p3fltegg_fltToEggLevelState.obj', opts=OPTS, input='fltToEggLevelState.cxx') @@ -5815,46 +5822,52 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/fltprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/fltprogs', 'DIR:pandatool/src/flt', 'DIR:pandatool/src/cvscopy'] - TargetAdd('egg2flt_eggToFlt.obj', opts=OPTS, input='eggToFlt.cxx') - TargetAdd('egg2flt.exe', input='egg2flt_eggToFlt.obj') - TargetAdd('egg2flt.exe', input='libp3flt.lib') - TargetAdd('egg2flt.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('egg2flt.exe', opts=['ADVAPI']) - TargetAdd('flt-info_fltInfo.obj', opts=OPTS, input='fltInfo.cxx') TargetAdd('flt-info.exe', input='flt-info_fltInfo.obj') TargetAdd('flt-info.exe', input='libp3flt.lib') - TargetAdd('flt-info.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('flt-info.exe', input='libp3progbase.lib') + TargetAdd('flt-info.exe', input='libp3pandatoolbase.lib') + TargetAdd('flt-info.exe', input=COMMON_PANDA_LIBS) TargetAdd('flt-info.exe', opts=['ADVAPI']) TargetAdd('flt-trans_fltTrans.obj', opts=OPTS, input='fltTrans.cxx') TargetAdd('flt-trans.exe', input='flt-trans_fltTrans.obj') TargetAdd('flt-trans.exe', input='libp3flt.lib') - TargetAdd('flt-trans.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('flt-trans.exe', input='libp3progbase.lib') + TargetAdd('flt-trans.exe', input='libp3pandatoolbase.lib') + TargetAdd('flt-trans.exe', input=COMMON_PANDA_LIBS) TargetAdd('flt-trans.exe', opts=['ADVAPI']) - TargetAdd('flt2egg_fltToEgg.obj', opts=OPTS, input='fltToEgg.cxx') - TargetAdd('flt2egg.exe', input='flt2egg_fltToEgg.obj') - TargetAdd('flt2egg.exe', input='libp3flt.lib') - TargetAdd('flt2egg.exe', input='libp3fltegg.lib') - TargetAdd('flt2egg.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('flt2egg.exe', opts=['ADVAPI']) - TargetAdd('fltcopy_fltCopy.obj', opts=OPTS, input='fltCopy.cxx') TargetAdd('fltcopy.exe', input='fltcopy_fltCopy.obj') TargetAdd('fltcopy.exe', input='libp3cvscopy.lib') TargetAdd('fltcopy.exe', input='libp3flt.lib') - TargetAdd('fltcopy.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('fltcopy.exe', input='libp3progbase.lib') + TargetAdd('fltcopy.exe', input='libp3pandatoolbase.lib') + TargetAdd('fltcopy.exe', input=COMMON_PANDA_LIBS) TargetAdd('fltcopy.exe', opts=['ADVAPI']) + if not PkgSkip("EGG"): + TargetAdd('egg2flt_eggToFlt.obj', opts=OPTS, input='eggToFlt.cxx') + TargetAdd('egg2flt.exe', input='egg2flt_eggToFlt.obj') + TargetAdd('egg2flt.exe', input='libp3flt.lib') + TargetAdd('egg2flt.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('egg2flt.exe', opts=['ADVAPI']) + + TargetAdd('flt2egg_fltToEgg.obj', opts=OPTS, input='fltToEgg.cxx') + TargetAdd('flt2egg.exe', input='flt2egg_fltToEgg.obj') + TargetAdd('flt2egg.exe', input='libp3flt.lib') + TargetAdd('flt2egg.exe', input='libp3fltegg.lib') + TargetAdd('flt2egg.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('flt2egg.exe', opts=['ADVAPI']) # # DIRECTORY: pandatool/src/imagebase/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/imagebase'] TargetAdd('p3imagebase_composite1.obj', opts=OPTS, input='p3imagebase_composite1.cxx') TargetAdd('libp3imagebase.lib', input='p3imagebase_composite1.obj') @@ -5863,14 +5876,13 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/imageprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/imageprogs'] TargetAdd('image-info_imageInfo.obj', opts=OPTS, input='imageInfo.cxx') TargetAdd('image-info.exe', input='image-info_imageInfo.obj') TargetAdd('image-info.exe', input='libp3imagebase.lib') TargetAdd('image-info.exe', input='libp3progbase.lib') TargetAdd('image-info.exe', input='libp3pandatoolbase.lib') - TargetAdd('image-info.exe', input='libpandaegg.dll') TargetAdd('image-info.exe', input=COMMON_PANDA_LIBS) TargetAdd('image-info.exe', opts=['ADVAPI']) @@ -5879,7 +5891,6 @@ if (PkgSkip("PANDATOOL")==0): TargetAdd('image-resize.exe', input='libp3imagebase.lib') TargetAdd('image-resize.exe', input='libp3progbase.lib') TargetAdd('image-resize.exe', input='libp3pandatoolbase.lib') - TargetAdd('image-resize.exe', input='libpandaegg.dll') TargetAdd('image-resize.exe', input=COMMON_PANDA_LIBS) TargetAdd('image-resize.exe', opts=['ADVAPI']) @@ -5888,7 +5899,6 @@ if (PkgSkip("PANDATOOL")==0): TargetAdd('image-trans.exe', input='libp3imagebase.lib') TargetAdd('image-trans.exe', input='libp3progbase.lib') TargetAdd('image-trans.exe', input='libp3pandatoolbase.lib') - TargetAdd('image-trans.exe', input='libpandaegg.dll') TargetAdd('image-trans.exe', input=COMMON_PANDA_LIBS) TargetAdd('image-trans.exe', opts=['ADVAPI']) @@ -5896,7 +5906,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/pfmprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/pfmprogs'] TargetAdd('pfm-trans_pfmTrans.obj', opts=OPTS, input='pfmTrans.cxx') TargetAdd('pfm-trans.exe', input='pfm-trans_pfmTrans.obj') @@ -5918,7 +5928,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/lwo/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/lwo'] TargetAdd('p3lwo_composite1.obj', opts=OPTS, input='p3lwo_composite1.cxx') TargetAdd('libp3lwo.lib', input='p3lwo_composite1.obj') @@ -5927,7 +5937,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/lwoegg/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/lwoegg'] TargetAdd('p3lwoegg_composite1.obj', opts=OPTS, input='p3lwoegg_composite1.cxx') TargetAdd('libp3lwoegg.lib', input='p3lwoegg_composite1.obj') @@ -5936,23 +5946,23 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/lwoprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/lwoprogs', 'DIR:pandatool/src/lwo'] TargetAdd('lwo-scan_lwoScan.obj', opts=OPTS, input='lwoScan.cxx') TargetAdd('lwo-scan.exe', input='lwo-scan_lwoScan.obj') TargetAdd('lwo-scan.exe', input='libp3lwo.lib') TargetAdd('lwo-scan.exe', input='libp3progbase.lib') TargetAdd('lwo-scan.exe', input='libp3pandatoolbase.lib') - TargetAdd('lwo-scan.exe', input='libpandaegg.dll') TargetAdd('lwo-scan.exe', input=COMMON_PANDA_LIBS) TargetAdd('lwo-scan.exe', opts=['ADVAPI']) - TargetAdd('lwo2egg_lwoToEgg.obj', opts=OPTS, input='lwoToEgg.cxx') - TargetAdd('lwo2egg.exe', input='lwo2egg_lwoToEgg.obj') - TargetAdd('lwo2egg.exe', input='libp3lwo.lib') - TargetAdd('lwo2egg.exe', input='libp3lwoegg.lib') - TargetAdd('lwo2egg.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('lwo2egg.exe', opts=['ADVAPI']) + if not PkgSkip("EGG"): + TargetAdd('lwo2egg_lwoToEgg.obj', opts=OPTS, input='lwoToEgg.cxx') + TargetAdd('lwo2egg.exe', input='lwo2egg_lwoToEgg.obj') + TargetAdd('lwo2egg.exe', input='libp3lwo.lib') + TargetAdd('lwo2egg.exe', input='libp3lwoegg.lib') + TargetAdd('lwo2egg.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('lwo2egg.exe', opts=['ADVAPI']) # # DIRECTORY: pandatool/src/maya/ @@ -5960,7 +5970,7 @@ if (PkgSkip("PANDATOOL")==0): for VER in MAYAVERSIONS: VNUM=VER[4:] - if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0): + if not PkgSkip(VER) and not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/maya', VER] TargetAdd('maya'+VNUM+'_composite1.obj', opts=OPTS, input='p3maya_composite1.cxx') TargetAdd('libmaya'+VNUM+'.lib', input='maya'+VNUM+'_composite1.obj') @@ -5971,7 +5981,7 @@ for VER in MAYAVERSIONS: for VER in MAYAVERSIONS: VNUM=VER[4:] - if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0): + if not PkgSkip(VER) and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/mayaegg', 'DIR:pandatool/src/maya', VER] TargetAdd('mayaegg'+VNUM+'_loader.obj', opts=OPTS, input='mayaEggLoader.cxx') TargetAdd('mayaegg'+VNUM+'_composite1.obj', opts=OPTS, input='p3mayaegg_composite1.cxx') @@ -5984,7 +5994,7 @@ for VER in MAYAVERSIONS: for VER in MAXVERSIONS: VNUM=VER[3:] - if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0): + if not PkgSkip(VER) and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/maxegg', VER, "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE", "RTTI"] TargetAdd('maxEgg'+VNUM+'.res', opts=OPTS, input='maxEgg.rc') TargetAdd('maxegg'+VNUM+'_loader.obj', opts=OPTS, input='maxEggLoader.cxx') @@ -6001,7 +6011,7 @@ for VER in MAXVERSIONS: for VER in MAXVERSIONS: VNUM=VER[3:] - if (PkgSkip(VER)==0) and (PkgSkip("PANDATOOL")==0): + if not PkgSkip(VER) and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/maxprogs', VER, "WINCOMCTL", "WINCOMDLG", "WINUSER", "MSFORSCOPE", "RTTI"] TargetAdd('maxImportRes.res', opts=OPTS, input='maxImportRes.rc') TargetAdd('maxprogs'+VNUM+'_maxeggimport.obj', opts=OPTS, input='maxEggImport.cxx') @@ -6019,7 +6029,7 @@ for VER in MAXVERSIONS: # DIRECTORY: pandatool/src/vrml/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/vrml', 'ZLIB', 'BISONPREFIX_vrmlyy'] CreateFile(GetOutputDir()+"/include/vrmlParser.h") TargetAdd('p3vrml_vrmlParser.obj', opts=OPTS, input='vrmlParser.yxx') @@ -6040,7 +6050,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/vrmlegg/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/vrmlegg', 'DIR:pandatool/src/vrml'] TargetAdd('p3vrmlegg_indexedFaceSet.obj', opts=OPTS, input='indexedFaceSet.cxx') TargetAdd('p3vrmlegg_vrmlAppearance.obj', opts=OPTS, input='vrmlAppearance.cxx') @@ -6053,7 +6063,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/xfile/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/xfile', 'ZLIB', 'BISONPREFIX_xyy', 'FLEXDASHI'] CreateFile(GetOutputDir()+"/include/xParser.h") TargetAdd('p3xfile_xParser.obj', opts=OPTS, input='xParser.yxx') @@ -6068,7 +6078,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/xfileegg/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): OPTS=['DIR:pandatool/src/xfileegg', 'DIR:pandatool/src/xfile'] TargetAdd('p3xfileegg_composite1.obj', opts=OPTS, input='p3xfileegg_composite1.cxx') TargetAdd('libp3xfileegg.lib', input='p3xfileegg_composite1.obj') @@ -6077,7 +6087,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/ptloader/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): if not PkgSkip("FCOLLADA"): DefSymbol("FCOLLADA", "HAVE_FCOLLADA") @@ -6143,7 +6153,6 @@ if (PkgSkip("PANDATOOL")==0): TargetAdd('softcvs.exe', input='softcvs_softFilename.obj') TargetAdd('softcvs.exe', input='libp3progbase.lib') TargetAdd('softcvs.exe', input='libp3pandatoolbase.lib') - TargetAdd('softcvs.exe', input='libpandaegg.dll') TargetAdd('softcvs.exe', input=COMMON_PANDA_LIBS) TargetAdd('softcvs.exe', opts=['ADVAPI']) @@ -6160,7 +6169,6 @@ if (PkgSkip("PANDATOOL")==0): TargetAdd('text-stats.exe', input='libp3progbase.lib') TargetAdd('text-stats.exe', input='libp3pstatserver.lib') TargetAdd('text-stats.exe', input='libp3pandatoolbase.lib') - TargetAdd('text-stats.exe', input='libpandaegg.dll') TargetAdd('text-stats.exe', input=COMMON_PANDA_LIBS) TargetAdd('text-stats.exe', opts=['ADVAPI']) @@ -6168,7 +6176,7 @@ if (PkgSkip("PANDATOOL")==0): # DIRECTORY: pandatool/src/vrmlprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/vrmlprogs', 'DIR:pandatool/src/vrml', 'DIR:pandatool/src/vrmlegg'] TargetAdd('vrml-trans_vrmlTrans.obj', opts=OPTS, input='vrmlTrans.cxx') TargetAdd('vrml-trans.exe', input='vrml-trans_vrmlTrans.obj') @@ -6178,12 +6186,13 @@ if (PkgSkip("PANDATOOL")==0): TargetAdd('vrml-trans.exe', input=COMMON_PANDA_LIBS) TargetAdd('vrml-trans.exe', opts=['ADVAPI']) - TargetAdd('vrml2egg_vrmlToEgg.obj', opts=OPTS, input='vrmlToEgg.cxx') - TargetAdd('vrml2egg.exe', input='vrml2egg_vrmlToEgg.obj') - TargetAdd('vrml2egg.exe', input='libp3vrmlegg.lib') - TargetAdd('vrml2egg.exe', input='libp3vrml.lib') - TargetAdd('vrml2egg.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('vrml2egg.exe', opts=['ADVAPI']) + if not PkgSkip("EGG"): + TargetAdd('vrml2egg_vrmlToEgg.obj', opts=OPTS, input='vrmlToEgg.cxx') + TargetAdd('vrml2egg.exe', input='vrml2egg_vrmlToEgg.obj') + TargetAdd('vrml2egg.exe', input='libp3vrmlegg.lib') + TargetAdd('vrml2egg.exe', input='libp3vrml.lib') + TargetAdd('vrml2egg.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('vrml2egg.exe', opts=['ADVAPI']) # # DIRECTORY: pandatool/src/win-stats/ @@ -6208,15 +6217,8 @@ if (PkgSkip("PANDATOOL")==0 and (GetTarget() == 'windows' or PkgSkip("GTK2")==0) # DIRECTORY: pandatool/src/xfileprogs/ # -if (PkgSkip("PANDATOOL")==0): +if not PkgSkip("PANDATOOL"): OPTS=['DIR:pandatool/src/xfileprogs', 'DIR:pandatool/src/xfile', 'DIR:pandatool/src/xfileegg'] - TargetAdd('egg2x_eggToX.obj', opts=OPTS, input='eggToX.cxx') - TargetAdd('egg2x.exe', input='egg2x_eggToX.obj') - TargetAdd('egg2x.exe', input='libp3xfileegg.lib') - TargetAdd('egg2x.exe', input='libp3xfile.lib') - TargetAdd('egg2x.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('egg2x.exe', opts=['ADVAPI']) - TargetAdd('x-trans_xFileTrans.obj', opts=OPTS, input='xFileTrans.cxx') TargetAdd('x-trans.exe', input='x-trans_xFileTrans.obj') TargetAdd('x-trans.exe', input='libp3progbase.lib') @@ -6225,12 +6227,20 @@ if (PkgSkip("PANDATOOL")==0): TargetAdd('x-trans.exe', input=COMMON_PANDA_LIBS) TargetAdd('x-trans.exe', opts=['ADVAPI']) - TargetAdd('x2egg_xFileToEgg.obj', opts=OPTS, input='xFileToEgg.cxx') - TargetAdd('x2egg.exe', input='x2egg_xFileToEgg.obj') - TargetAdd('x2egg.exe', input='libp3xfileegg.lib') - TargetAdd('x2egg.exe', input='libp3xfile.lib') - TargetAdd('x2egg.exe', input=COMMON_EGG2X_LIBS) - TargetAdd('x2egg.exe', opts=['ADVAPI']) + if not PkgSkip("EGG"): + TargetAdd('egg2x_eggToX.obj', opts=OPTS, input='eggToX.cxx') + TargetAdd('egg2x.exe', input='egg2x_eggToX.obj') + TargetAdd('egg2x.exe', input='libp3xfileegg.lib') + TargetAdd('egg2x.exe', input='libp3xfile.lib') + TargetAdd('egg2x.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('egg2x.exe', opts=['ADVAPI']) + + TargetAdd('x2egg_xFileToEgg.obj', opts=OPTS, input='xFileToEgg.cxx') + TargetAdd('x2egg.exe', input='x2egg_xFileToEgg.obj') + TargetAdd('x2egg.exe', input='libp3xfileegg.lib') + TargetAdd('x2egg.exe', input='libp3xfile.lib') + TargetAdd('x2egg.exe', input=COMMON_EGG2X_LIBS) + TargetAdd('x2egg.exe', opts=['ADVAPI']) # # DIRECTORY: pandatool/src/mayaprogs/ @@ -6238,7 +6248,7 @@ if (PkgSkip("PANDATOOL")==0): for VER in MAYAVERSIONS: VNUM = VER[4:] - if not PkgSkip(VER) and not PkgSkip("PANDATOOL"): + if not PkgSkip(VER) and not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): if GetTarget() == 'darwin' and int(VNUM) >= 2012: ARCH_OPTS = ['NOARCH:PPC', 'NOARCH:I386'] if len(OSX_ARCHS) != 0 and 'x86_64' not in OSX_ARCHS: @@ -6374,8 +6384,9 @@ if (PkgSkip("CONTRIB")==0 and not RUNTIME): # Generate the models directory and samples directory # -if (PkgSkip("DIRECT")==0 and not RUNTIME): +if not PkgSkip("DIRECT") and not RUNTIME and not PkgSkip("EGG"): model_extensions = ["*.egg"] + # Check if we have access to an flt2egg utility, either self-compiled or on the system. if ((PkgSkip("PANDATOOL")==0 and GetHost()==GetTarget()) or LocateBinary('flt2egg')): model_extensions.append("*.flt") @@ -6401,6 +6412,7 @@ if (PkgSkip("DIRECT")==0 and not RUNTIME): newname = model[:-4] + ".egg" TargetAdd(GetOutputDir()+"/models/"+newname, input="models/"+model) +if not PkgSkip("DIRECT") and not RUNTIME: CopyAllFiles(GetOutputDir()+"/models/audio/sfx/", "dmodels/src/audio/sfx/", ".wav") CopyAllFiles(GetOutputDir()+"/models/icons/", "dmodels/src/icons/", ".gif") From 2de6c85fc9cde12d5877f18fc62d9937ac527e11 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 10 Jan 2017 19:36:03 +0100 Subject: [PATCH 024/254] glsl: fix shadowMatrix for point lights --- panda/src/display/graphicsStateGuardian.cxx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index d5b2f769a0..7f87e87d8e 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -1684,8 +1684,11 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) t = get_external_transform()->get_mat() * get_scene()->get_camera_transform()->get_mat() * np.get_net_transform()->get_inverse()->get_mat() * - LMatrix4::convert_mat(_coordinate_system, lens->get_coordinate_system()) * - lens->get_projection_mat() * biasmat; + LMatrix4::convert_mat(_coordinate_system, lens->get_coordinate_system()); + + if (!node->is_of_type(PointLight::get_class_type())) { + t *= lens->get_projection_mat() * biasmat; + } return &t; } else { From 92dab31d8011437986cc6fb7af20c25d52ea906f Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 10 Jan 2017 20:46:09 +0100 Subject: [PATCH 025/254] makepanda: improve Python location code on Linux and macOS, support Python 3.x builds on macOS, drop use of pythonX-config --- makepanda/makepanda.py | 15 ++++++++++----- makepanda/makepandacore.py | 38 +++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 5798259328..564ee8e4e9 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -840,7 +840,7 @@ if (COMPILER=="GCC"): if not RTDIST: # We don't link anything in the SDK with libpython. python_lib = "" - SmartPkgEnable("PYTHON", "", python_lib, (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h"), tool = SDK["PYTHONVERSION"] + "-config") + SmartPkgEnable("PYTHON", "", python_lib, (SDK["PYTHONVERSION"], SDK["PYTHONVERSION"] + "/Python.h")) SmartPkgEnable("OPENSSL", "openssl", ("ssl", "crypto"), ("openssl/ssl.h", "openssl/crypto.h")) SmartPkgEnable("ZLIB", "zlib", ("z"), "zlib.h") @@ -6825,7 +6825,7 @@ deps: {DEPENDS} def MakeInstallerLinux(): if not RUNTIME and not PkgSkip("PYTHON"): - PYTHONV = SDK["PYTHONVERSION"] + PYTHONV = SDK["PYTHONVERSION"].rstrip('dmu') else: PYTHONV = "python" PV = PYTHONV.replace("python", "") @@ -6980,8 +6980,13 @@ def MakeInstallerOSX(): oscmd(cmdstr) return + dmg_name = "Panda3D-" + VERSION + if not SDK["PYTHONVERSION"].startswith("python2."): + dmg_name += '-py' + SDK["PYTHONVERSION"][6:9] + dmg_name += ".dmg" + import compileall - if (os.path.isfile("Panda3D-%s.dmg" % VERSION)): oscmd("rm -f Panda3D-%s.dmg" % VERSION) + if (os.path.isfile(dmg_name)): oscmd("rm -f %s" % dmg_name) if (os.path.exists("dstroot")): oscmd("rm -rf dstroot") if (os.path.exists("Panda3D-rw.dmg")): oscmd('rm -f Panda3D-rw.dmg') @@ -7022,7 +7027,7 @@ def MakeInstallerOSX(): oscmd("cp -R " + GetOutputDir() + "/bin/" + base + " " + binname) if PkgSkip("PYTHON")==0: - PV = SDK["PYTHONVERSION"].replace("python", "") + PV = SDK["PYTHONVERSION"][6:9] oscmd("mkdir -p dstroot/pythoncode/usr/local/bin") oscmd("mkdir -p dstroot/pythoncode/Developer/Panda3D/panda3d") oscmd("mkdir -p dstroot/pythoncode/Library/Python/%s/site-packages" % PV) @@ -7177,7 +7182,7 @@ def MakeInstallerOSX(): dist.close() oscmd('hdiutil create Panda3D-rw.dmg -volname "Panda3D SDK %s" -srcfolder dstroot/Panda3D' % (VERSION)) - oscmd('hdiutil convert Panda3D-rw.dmg -format UDBZ -o Panda3D-%s.dmg' % (VERSION)) + oscmd('hdiutil convert Panda3D-rw.dmg -format UDBZ -o %s' % (dmg_name)) oscmd('rm -f Panda3D-rw.dmg') def MakeInstallerFreeBSD(): diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 24f3614337..60b38927d4 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -1928,6 +1928,8 @@ def SdkLocatePython(prefer_thirdparty_python=False): SDK["PYTHONEXEC"] = os.path.realpath(sys.executable) return + abiflags = getattr(sys, 'abiflags', '') + if GetTarget() == 'windows': sdkdir = GetThirdpartyBase() + "/win-python" @@ -1992,26 +1994,28 @@ def SdkLocatePython(prefer_thirdparty_python=False): SDK["PYTHON"] = tp_python + "/include/" + SDK["PYTHONVERSION"] elif GetTarget() == 'darwin': - # On Mac OS X, use the system Python framework. - py_fwx = SDK.get("MACOSX", "") + "/System/Library/Frameworks/Python.framework/Versions/Current" + # On macOS, search for the Python framework directory matching the + # version number of our current Python version. + sysroot = SDK.get("MACOSX", "") + version = sysconfig.get_python_version() - if not os.path.islink(py_fwx): - exit("Could not locate Python installation at %s" % (py_fwx)) + py_fwx = "{0}/System/Library/Frameworks/Python.framework/Versions/{1}".format(sysroot, version) - ver = os.path.basename(os.readlink(py_fwx)) - py_fwx = SDK.get("MACOSX", "") + "/System/Library/Frameworks/Python.framework/Versions/%s" % ver + if not os.path.exists(py_fwx): + # Fall back to looking on the system. + py_fwx = "/Library/Frameworks/Python.framework/Versions/" + version - SDK["PYTHON"] = py_fwx + "/Headers" - SDK["PYTHONVERSION"] = "python" + ver - SDK["PYTHONEXEC"] = "/System/Library/Frameworks/Python.framework/Versions/" + ver + "/bin/python" + ver + if not os.path.exists(py_fwx): + exit("Could not locate Python installation at %s" % (py_fwx)) - # Avoid choosing the one in the thirdparty package dir. - PkgSetCustomLocation("PYTHON") - IncDirectory("PYTHON", py_fwx + "/include") - LibDirectory("PYTHON", "%s/usr/lib" % (SDK.get("MACOSX", ""))) + SDK["PYTHON"] = py_fwx + "/Headers" + SDK["PYTHONVERSION"] = "python" + version + abiflags + SDK["PYTHONEXEC"] = py_fwx + "/bin/python" + version - if sys.version[:3] != ver: - print("Warning: building with Python %s instead of %s since you targeted a specific Mac OS X version." % (ver, sys.version[:3])) + # Avoid choosing the one in the thirdparty package dir. + PkgSetCustomLocation("PYTHON") + IncDirectory("PYTHON", py_fwx + "/include") + LibDirectory("PYTHON", "%s/usr/lib" % (sysroot)) #elif GetTarget() == 'windows': # SDK["PYTHON"] = os.path.dirname(sysconfig.get_python_inc()) @@ -2020,13 +2024,13 @@ def SdkLocatePython(prefer_thirdparty_python=False): else: SDK["PYTHON"] = sysconfig.get_python_inc() - SDK["PYTHONVERSION"] = "python" + sysconfig.get_python_version() + SDK["PYTHONVERSION"] = "python" + sysconfig.get_python_version() + abiflags SDK["PYTHONEXEC"] = os.path.realpath(sys.executable) if CrossCompiling(): # We need a version of Python we can run. SDK["PYTHONEXEC"] = sys.executable - host_version = "python" + sysconfig.get_python_version() + host_version = "python" + sysconfig.get_python_version() + abiflags if SDK["PYTHONVERSION"] != host_version: exit("Host Python version (%s) must be the same as target Python version (%s)!" % (host_version, SDK["PYTHONVERSION"])) From 0ae87e6781330e893f25b2d71624bae20ec93737 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 11 Jan 2017 19:28:28 +0100 Subject: [PATCH 026/254] makepanda: on macOS, use Python lib from framework dir if needed --- makepanda/makepandacore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 60b38927d4..2f6482c68f 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -2015,7 +2015,7 @@ def SdkLocatePython(prefer_thirdparty_python=False): # Avoid choosing the one in the thirdparty package dir. PkgSetCustomLocation("PYTHON") IncDirectory("PYTHON", py_fwx + "/include") - LibDirectory("PYTHON", "%s/usr/lib" % (sysroot)) + LibDirectory("PYTHON", py_fwx + "/lib") #elif GetTarget() == 'windows': # SDK["PYTHON"] = os.path.dirname(sysconfig.get_python_inc()) From e60d1e292eaf78ad2e70f6b16fce3b9c94a0d2fe Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 12 Jan 2017 00:21:06 +0100 Subject: [PATCH 027/254] Make better use of C++ rules for implicit generation; allow PointerTo and some mutex impls to be static initialised --- dtool/src/dtoolbase/dtoolbase_cc.h | 21 +++++- dtool/src/dtoolbase/mutexDummyImpl.I | 20 +----- dtool/src/dtoolbase/mutexDummyImpl.h | 14 ++-- dtool/src/dtoolbase/mutexPosixImpl.I | 18 +++-- dtool/src/dtoolbase/mutexPosixImpl.h | 16 ++++- dtool/src/dtoolbase/mutexSpinlockImpl.I | 12 +--- dtool/src/dtoolbase/mutexSpinlockImpl.h | 8 ++- dtool/src/dtoolbase/mutexWin32Impl.h | 5 ++ dtool/src/dtoolbase/pallocator.T | 4 +- dtool/src/dtoolbase/pallocator.h | 8 +-- dtool/src/dtoolbase/pdeque.h | 1 - dtool/src/dtoolbase/plist.h | 1 - dtool/src/dtoolbase/pmap.h | 4 -- dtool/src/dtoolbase/pset.h | 4 -- dtool/src/dtoolbase/pvector.h | 15 ---- dtool/src/dtoolbase/typedObject.I | 21 ------ dtool/src/dtoolbase/typedObject.h | 54 +++++++++----- dtool/src/prc/streamWrapper.h | 3 + panda/src/express/datagramIterator.I | 31 ++------ panda/src/express/datagramIterator.h | 3 - panda/src/express/hashGeneratorBase.I | 7 -- panda/src/express/hashGeneratorBase.h | 1 - panda/src/express/namable.I | 29 -------- panda/src/express/namable.h | 6 -- panda/src/express/nodePointerTo.I | 20 ------ panda/src/express/nodePointerTo.h | 2 - panda/src/express/ordered_vector.I | 70 ------------------ panda/src/express/ordered_vector.h | 7 -- panda/src/express/pointerTo.I | 52 +++++--------- panda/src/express/pointerTo.h | 96 ++++++++++++++----------- panda/src/express/pointerToArray.I | 22 ++++++ panda/src/express/pointerToArray.h | 2 + panda/src/express/pointerToArrayBase.I | 17 ++--- panda/src/express/pointerToArrayBase.h | 3 +- panda/src/express/pointerToBase.h | 2 +- panda/src/express/pointerToVoid.I | 25 +++---- panda/src/express/pointerToVoid.h | 8 +-- panda/src/express/weakPointerToVoid.I | 13 +--- panda/src/express/weakPointerToVoid.h | 1 - panda/src/putil/bitArray.I | 27 ------- panda/src/putil/bitArray.h | 4 -- panda/src/putil/bitMask.I | 28 -------- panda/src/putil/bitMask.h | 4 -- panda/src/putil/buttonHandle.I | 7 -- panda/src/putil/buttonHandle.h | 1 - panda/src/putil/iterator_types.h | 10 ++- panda/src/putil/sparseArray.I | 31 +------- panda/src/putil/sparseArray.h | 4 -- panda/src/putil/writableParam.I | 16 ----- panda/src/putil/writableParam.h | 3 +- 50 files changed, 244 insertions(+), 537 deletions(-) diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index 486eaa00ba..400ed7919a 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -39,6 +39,8 @@ using namespace std; #define OVERRIDE override #define MOVE(x) x #define DEFAULT_CTOR = default +#define DEFAULT_DTOR = default +#define DELETED = delete #define EXPORT_TEMPLATE_CLASS(expcl, exptp, classname) @@ -166,6 +168,10 @@ template typename remove_reference::type &&move(T &&t) { # endif # if __has_extension(cxx_defaulted_functions) # define DEFAULT_CTOR = default +# define DEFAULT_DTOR = default +# endif +# if __has_extension(cxx_deleted_functions) +# define DELETED = delete # endif #elif defined(__GNUC__) && (__cplusplus >= 201103L) // GCC @@ -178,6 +184,8 @@ template typename remove_reference::type &&move(T &&t) { // Starting at GCC 4.4 # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) # define DEFAULT_CTOR = default +# define DEFAULT_DTOR = default +# define DELETED = delete # endif // Starting at GCC 4.6 @@ -200,7 +208,6 @@ template typename remove_reference::type &&move(T &&t) { # define FINAL final # define OVERRIDE override # define MOVE(x) move(x) -# define DEFAULT_CTOR = default #elif defined(_MSC_VER) && _MSC_VER >= 1600 // Visual Studio 2010 # define NOEXCEPT throw() # define OVERRIDE override @@ -209,6 +216,12 @@ template typename remove_reference::type &&move(T &&t) { # define MOVE(x) move(x) #endif +#if defined(_MSC_VER) && _MSC_VER >= 1800 // Visual Studio 2013 +# define DEFAULT_CTOR = default +# define DEFAULT_DTOR = default +# define DELETED = delete +#endif + // Fallbacks if features are not supported #ifndef CONSTEXPR # define CONSTEXPR INLINE @@ -228,6 +241,12 @@ template typename remove_reference::type &&move(T &&t) { #ifndef DEFAULT_CTOR # define DEFAULT_CTOR {} #endif +#ifndef DEFAULT_DTOR +# define DEFAULT_DTOR {} +#endif +#ifndef DELETED +# define DELETED {assert(false);} +#endif #if !defined(LINK_ALL_STATIC) && defined(EXPORT_TEMPLATES) diff --git a/dtool/src/dtoolbase/mutexDummyImpl.I b/dtool/src/dtoolbase/mutexDummyImpl.I index 9c0bbc01d2..94afaa2cc5 100644 --- a/dtool/src/dtoolbase/mutexDummyImpl.I +++ b/dtool/src/dtoolbase/mutexDummyImpl.I @@ -14,28 +14,14 @@ /** * */ -INLINE MutexDummyImpl:: -MutexDummyImpl() { -} - -/** - * - */ -INLINE MutexDummyImpl:: -~MutexDummyImpl() { -} - -/** - * - */ -INLINE void MutexDummyImpl:: +ALWAYS_INLINE void MutexDummyImpl:: acquire() { } /** * */ -INLINE bool MutexDummyImpl:: +ALWAYS_INLINE bool MutexDummyImpl:: try_acquire() { return true; } @@ -43,6 +29,6 @@ try_acquire() { /** * */ -INLINE void MutexDummyImpl:: +ALWAYS_INLINE void MutexDummyImpl:: release() { } diff --git a/dtool/src/dtoolbase/mutexDummyImpl.h b/dtool/src/dtoolbase/mutexDummyImpl.h index 703fb81803..2dc61f0989 100644 --- a/dtool/src/dtoolbase/mutexDummyImpl.h +++ b/dtool/src/dtoolbase/mutexDummyImpl.h @@ -23,12 +23,16 @@ */ class EXPCL_DTOOL MutexDummyImpl { public: - INLINE MutexDummyImpl(); - INLINE ~MutexDummyImpl(); + CONSTEXPR MutexDummyImpl() DEFAULT_CTOR; - INLINE void acquire(); - INLINE bool try_acquire(); - INLINE void release(); +private: + MutexDummyImpl(const MutexDummyImpl ©) DELETED; + MutexDummyImpl &operator = (const MutexDummyImpl ©) DELETED; + +public: + ALWAYS_INLINE void acquire(); + ALWAYS_INLINE bool try_acquire(); + ALWAYS_INLINE void release(); }; #include "mutexDummyImpl.I" diff --git a/dtool/src/dtoolbase/mutexPosixImpl.I b/dtool/src/dtoolbase/mutexPosixImpl.I index 9b86139b41..05acfae1c2 100644 --- a/dtool/src/dtoolbase/mutexPosixImpl.I +++ b/dtool/src/dtoolbase/mutexPosixImpl.I @@ -14,16 +14,8 @@ /** * */ -INLINE MutexPosixImpl:: -MutexPosixImpl() { - TAU_PROFILE("MutexPosixImpl::MutexPosixImpl", " ", TAU_USER); - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - // The symbol PTHREAD_MUTEX_DEFAULT isn't always available? - // pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT); - int result = pthread_mutex_init(&_lock, &attr); - pthread_mutexattr_destroy(&attr); - assert(result == 0); +CONSTEXPR MutexPosixImpl:: +MutexPosixImpl() NOEXCEPT : _lock(PTHREAD_MUTEX_INITIALIZER) { } /** @@ -78,6 +70,11 @@ get_posix_lock() { /** * */ +#ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP +CONSTEXPR ReMutexPosixImpl:: +ReMutexPosixImpl() NOEXCEPT : _lock(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) { +} +#else INLINE ReMutexPosixImpl:: ReMutexPosixImpl() { TAU_PROFILE("ReMutexPosixImpl::ReMutexPosixImpl", " ", TAU_USER); @@ -88,6 +85,7 @@ ReMutexPosixImpl() { pthread_mutexattr_destroy(&attr); assert(result == 0); } +#endif /** * diff --git a/dtool/src/dtoolbase/mutexPosixImpl.h b/dtool/src/dtoolbase/mutexPosixImpl.h index e4f684de52..c8ff5dac8f 100644 --- a/dtool/src/dtoolbase/mutexPosixImpl.h +++ b/dtool/src/dtoolbase/mutexPosixImpl.h @@ -28,9 +28,14 @@ */ class EXPCL_DTOOL MutexPosixImpl { public: - INLINE MutexPosixImpl(); + CONSTEXPR MutexPosixImpl() NOEXCEPT; INLINE ~MutexPosixImpl(); +private: + MutexPosixImpl(const MutexPosixImpl ©) DELETED; + MutexPosixImpl &operator = (const MutexPosixImpl ©) DELETED; + +public: INLINE void acquire(); INLINE bool try_acquire(); INLINE void release(); @@ -47,9 +52,18 @@ private: */ class EXPCL_DTOOL ReMutexPosixImpl { public: +#ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP + CONSTEXPR ReMutexPosixImpl() NOEXCEPT; +#else INLINE ReMutexPosixImpl(); +#endif INLINE ~ReMutexPosixImpl(); +private: + ReMutexPosixImpl(const ReMutexPosixImpl ©) DELETED; + ReMutexPosixImpl &operator = (const ReMutexPosixImpl ©) DELETED; + +public: INLINE void acquire(); INLINE bool try_acquire(); INLINE void release(); diff --git a/dtool/src/dtoolbase/mutexSpinlockImpl.I b/dtool/src/dtoolbase/mutexSpinlockImpl.I index 5b62bf4f55..9fca1e9bf6 100644 --- a/dtool/src/dtoolbase/mutexSpinlockImpl.I +++ b/dtool/src/dtoolbase/mutexSpinlockImpl.I @@ -14,16 +14,8 @@ /** * */ -INLINE MutexSpinlockImpl:: -MutexSpinlockImpl() { - _lock = 0; -} - -/** - * - */ -INLINE MutexSpinlockImpl:: -~MutexSpinlockImpl() { +CONSTEXPR MutexSpinlockImpl:: +MutexSpinlockImpl() : _lock(0) { } /** diff --git a/dtool/src/dtoolbase/mutexSpinlockImpl.h b/dtool/src/dtoolbase/mutexSpinlockImpl.h index 19a8d1802c..75adf85dc1 100644 --- a/dtool/src/dtoolbase/mutexSpinlockImpl.h +++ b/dtool/src/dtoolbase/mutexSpinlockImpl.h @@ -29,9 +29,13 @@ */ class EXPCL_DTOOL MutexSpinlockImpl { public: - INLINE MutexSpinlockImpl(); - INLINE ~MutexSpinlockImpl(); + CONSTEXPR MutexSpinlockImpl(); +private: + MutexSpinlockImpl(const MutexSpinlockImpl ©) DELETED; + MutexSpinlockImpl &operator = (const MutexSpinlockImpl ©) DELETED; + +public: INLINE void acquire(); INLINE bool try_acquire(); INLINE void release(); diff --git a/dtool/src/dtoolbase/mutexWin32Impl.h b/dtool/src/dtoolbase/mutexWin32Impl.h index 0407d5a883..f9c1bf5437 100644 --- a/dtool/src/dtoolbase/mutexWin32Impl.h +++ b/dtool/src/dtoolbase/mutexWin32Impl.h @@ -31,6 +31,11 @@ public: MutexWin32Impl(); INLINE ~MutexWin32Impl(); +private: + MutexWin32Impl(const MutexWin32Impl ©) DELETED; + MutexWin32Impl &operator = (const MutexWin32Impl ©) DELETED; + +public: INLINE void acquire(); INLINE bool try_acquire(); INLINE void release(); diff --git a/dtool/src/dtoolbase/pallocator.T b/dtool/src/dtoolbase/pallocator.T index b8a2fe73be..ebfb8dbafd 100644 --- a/dtool/src/dtoolbase/pallocator.T +++ b/dtool/src/dtoolbase/pallocator.T @@ -14,7 +14,7 @@ template INLINE pallocator_single:: -pallocator_single(TypeHandle type_handle) throw() : +pallocator_single(TypeHandle type_handle) NOEXCEPT : _type_handle(type_handle) { } @@ -37,7 +37,7 @@ deallocate(TYPENAME pallocator_single::pointer p, TYPENAME pallocator_sing template INLINE pallocator_array:: -pallocator_array(TypeHandle type_handle) throw() : +pallocator_array(TypeHandle type_handle) NOEXCEPT : _type_handle(type_handle) { } diff --git a/dtool/src/dtoolbase/pallocator.h b/dtool/src/dtoolbase/pallocator.h index deddc2abfc..b735bb7b3e 100644 --- a/dtool/src/dtoolbase/pallocator.h +++ b/dtool/src/dtoolbase/pallocator.h @@ -52,11 +52,11 @@ public: typedef TYPENAME allocator::const_reference const_reference; typedef TYPENAME allocator::size_type size_type; - INLINE pallocator_single(TypeHandle type_handle) throw(); + INLINE pallocator_single(TypeHandle type_handle) NOEXCEPT; // template member functions in VC++ can only be defined in-class. template - INLINE pallocator_single(const pallocator_single ©) throw() : + INLINE pallocator_single(const pallocator_single ©) NOEXCEPT : _type_handle(copy._type_handle) { } INLINE pointer allocate(size_type n, allocator::const_pointer hint = 0); @@ -80,11 +80,11 @@ public: typedef TYPENAME allocator::const_reference const_reference; typedef TYPENAME allocator::size_type size_type; - INLINE pallocator_array(TypeHandle type_handle = TypeHandle::none()) throw(); + INLINE pallocator_array(TypeHandle type_handle = TypeHandle::none()) NOEXCEPT; // template member functions in VC++ can only be defined in-class. template - INLINE pallocator_array(const pallocator_array ©) throw() : + INLINE pallocator_array(const pallocator_array ©) NOEXCEPT : _type_handle(copy._type_handle) { } INLINE pointer allocate(size_type n, allocator::const_pointer hint = 0); diff --git a/dtool/src/dtoolbase/pdeque.h b/dtool/src/dtoolbase/pdeque.h index 245f7e299a..96cf319e77 100644 --- a/dtool/src/dtoolbase/pdeque.h +++ b/dtool/src/dtoolbase/pdeque.h @@ -37,7 +37,6 @@ public: typedef pallocator_array allocator; typedef TYPENAME deque::size_type size_type; pdeque(TypeHandle type_handle = pdeque_type_handle) : deque >(allocator(type_handle)) { } - pdeque(const pdeque ©) : deque >(copy) { } pdeque(size_type n, TypeHandle type_handle = pdeque_type_handle) : deque >(n, Type(), allocator(type_handle)) { } pdeque(size_type n, const Type &value, TypeHandle type_handle = pdeque_type_handle) : deque >(n, value, allocator(type_handle)) { } }; diff --git a/dtool/src/dtoolbase/plist.h b/dtool/src/dtoolbase/plist.h index 9effd8db6a..bbb9e55089 100644 --- a/dtool/src/dtoolbase/plist.h +++ b/dtool/src/dtoolbase/plist.h @@ -38,7 +38,6 @@ public: typedef list base_class; typedef TYPENAME base_class::size_type size_type; plist(TypeHandle type_handle = plist_type_handle) : base_class(allocator(type_handle)) { } - plist(const plist ©) : base_class(copy) { } plist(size_type n, TypeHandle type_handle = plist_type_handle) : base_class(n, Type(), allocator(type_handle)) { } plist(size_type n, const Type &value, TypeHandle type_handle = plist_type_handle) : base_class(n, value, allocator(type_handle)) { } diff --git a/dtool/src/dtoolbase/pmap.h b/dtool/src/dtoolbase/pmap.h index e9b318c36b..e115191b45 100644 --- a/dtool/src/dtoolbase/pmap.h +++ b/dtool/src/dtoolbase/pmap.h @@ -52,7 +52,6 @@ public: typedef map base_class; pmap(TypeHandle type_handle = pmap_type_handle) : base_class(Compare(), allocator(type_handle)) { } - pmap(const pmap ©) : base_class(copy) { } pmap(const Compare &comp, TypeHandle type_handle = pmap_type_handle) : base_class(comp, allocator(type_handle)) { } #ifdef USE_TAU @@ -118,7 +117,6 @@ class pmultimap : public multimap > allocator; pmultimap(TypeHandle type_handle = pmap_type_handle) : multimap(Compare(), allocator(type_handle)) { } - pmultimap(const pmultimap ©) : multimap(copy) { } pmultimap(const Compare &comp, TypeHandle type_handle = pmap_type_handle) : multimap(comp, allocator(type_handle)) { } }; @@ -132,7 +130,6 @@ template > > class phash_map : public stdext::hash_map > > { public: phash_map() : stdext::hash_map > >() { } - phash_map(const phash_map ©) : stdext::hash_map > >(copy) { } phash_map(const Compare &comp) : stdext::hash_map > >(comp) { } }; @@ -145,7 +142,6 @@ template > > class phash_multimap : public stdext::hash_multimap > > { public: phash_multimap() : stdext::hash_multimap > >() { } - phash_multimap(const phash_multimap ©) : stdext::hash_multimap > >(copy) { } phash_multimap(const Compare &comp) : stdext::hash_multimap > >(comp) { } }; diff --git a/dtool/src/dtoolbase/pset.h b/dtool/src/dtoolbase/pset.h index 4b1ca1617c..b7990ad671 100644 --- a/dtool/src/dtoolbase/pset.h +++ b/dtool/src/dtoolbase/pset.h @@ -51,7 +51,6 @@ public: typedef pallocator_single allocator; typedef set base_class; pset(TypeHandle type_handle = pset_type_handle) : base_class(Compare(), allocator(type_handle)) { } - pset(const pset ©) : base_class(copy) { } pset(const Compare &comp, TypeHandle type_handle = pset_type_handle) : base_class(comp, type_handle) { } #ifdef USE_TAU @@ -110,7 +109,6 @@ class pmultiset : public multiset > { public: typedef pallocator_single allocator; pmultiset(TypeHandle type_handle = pset_type_handle) : multiset(Compare(), allocator(type_handle)) { } - pmultiset(const pmultiset ©) : multiset(copy) { } pmultiset(const Compare &comp, TypeHandle type_handle = pset_type_handle) : multiset(comp, type_handle) { } }; @@ -124,7 +122,6 @@ template > > class phash_set : public stdext::hash_set > { public: phash_set() : stdext::hash_set >() { } - phash_set(const phash_set ©) : stdext::hash_set >(copy) { } phash_set(const Compare &comp) : stdext::hash_set >(comp) { } }; @@ -137,7 +134,6 @@ template > > class phash_multiset : public stdext::hash_multiset > { public: phash_multiset() : stdext::hash_multiset >() { } - phash_multiset(const phash_multiset ©) : stdext::hash_multiset >(copy) { } phash_multiset(const Compare &comp) : stdext::hash_multiset >(comp) { } }; diff --git a/dtool/src/dtoolbase/pvector.h b/dtool/src/dtoolbase/pvector.h index 14bd542f37..b146947543 100644 --- a/dtool/src/dtoolbase/pvector.h +++ b/dtool/src/dtoolbase/pvector.h @@ -46,24 +46,9 @@ public: typedef TYPENAME base_class::size_type size_type; explicit pvector(TypeHandle type_handle = pvector_type_handle) : base_class(allocator(type_handle)) { } - pvector(const pvector ©) : base_class(copy) { } explicit pvector(size_type n, TypeHandle type_handle = pvector_type_handle) : base_class(n, Type(), allocator(type_handle)) { } explicit pvector(size_type n, const Type &value, TypeHandle type_handle = pvector_type_handle) : base_class(n, value, allocator(type_handle)) { } pvector(const Type *begin, const Type *end, TypeHandle type_handle = pvector_type_handle) : base_class(begin, end, allocator(type_handle)) { } - -#ifdef USE_MOVE_SEMANTICS - pvector(pvector &&from) NOEXCEPT : base_class(move(from)) {}; - - pvector &operator =(pvector &&from) NOEXCEPT { - base_class::operator =(move(from)); - return *this; - } -#endif - - pvector &operator =(const pvector ©) { - base_class::operator =(copy); - return *this; - } }; #endif // USE_STL_ALLOCATOR diff --git a/dtool/src/dtoolbase/typedObject.I b/dtool/src/dtoolbase/typedObject.I index 68776b7c13..37bb183781 100644 --- a/dtool/src/dtoolbase/typedObject.I +++ b/dtool/src/dtoolbase/typedObject.I @@ -11,27 +11,6 @@ * @date 2001-05-11 */ -/** - * - */ -INLINE TypedObject:: -TypedObject() { -} - -/** - * - */ -INLINE TypedObject:: -TypedObject(const TypedObject &) { -} - -/** - * - */ -INLINE void TypedObject:: -operator = (const TypedObject &) { -} - /** * Returns the internal index number associated with this object's TypeHandle, * a unique number for each different type. This is equivalent to diff --git a/dtool/src/dtoolbase/typedObject.h b/dtool/src/dtoolbase/typedObject.h index 37b0bd67f4..5fff8e2ff8 100644 --- a/dtool/src/dtoolbase/typedObject.h +++ b/dtool/src/dtoolbase/typedObject.h @@ -47,29 +47,49 @@ * What follows are some examples that can be used in new classes that you * create. * - * @par In the class definition (.h file): @code public: static TypeHandle - * get_class_type() { return _type_handle; } static void init_type() { - * <<>>::init_type(); <<>>::init_type(); - * <<>>::init_type(); register_type(_type_handle, - * "<<>>", <<>>::get_class_type(), - * <<>>::get_class_type(), <<>>::get_class_type()); - * } virtual TypeHandle get_type() const { return get_class_type(); } virtual - * TypeHandle force_init_type() {init_type(); return get_class_type();} + * @par In the class definition (.h file): + * @code + * public: + * static TypeHandle get_class_type() { + * return _type_handle; + * } + * static void init_type() { + * <<>>::init_type(); + * <<>>::init_type(); + * <<>>::init_type(); + * register_type(_type_handle, "<<>>", + * <<>>::get_class_type(), + * <<>>::get_class_type(), + * <<>>::get_class_type()); + * } + * virtual TypeHandle get_type() const { + * return get_class_type(); + * } + * virtual TypeHandle force_init_type() {init_type(); return get_class_type();} * - * private: static TypeHandle _type_handle; @endcode + * private: + * static TypeHandle _type_handle; + * @endcode * - * @par In the class .cxx file: @code TypeHandle - * <<>>::_type_handle; @endcode + * @par In the class .cxx file: + * @code + * TypeHandle <<>>::_type_handle; + * @endcode * - * @par In the class config_<<>>.cxx file: @code - * ConfigureFn(config_<<>>) { <<>>::init_type(); - * <<>>::init_type(); <<>>::init_type(); } @endcode + * @par In the class config_<<>>.cxx file: + * @code + * ConfigureFn(config_<<>>) { + * <<>>::init_type(); + * <<>>::init_type(); + * <<>>::init_type(); + * } + * @endcode */ class EXPCL_DTOOL TypedObject : public MemoryBase { public: - INLINE TypedObject(); - INLINE TypedObject(const TypedObject ©); - INLINE void operator = (const TypedObject ©); + INLINE TypedObject() DEFAULT_CTOR; + INLINE TypedObject(const TypedObject ©) DEFAULT_CTOR; + INLINE TypedObject &operator = (const TypedObject ©) DEFAULT_CTOR; PUBLISHED: // A virtual destructor is just a good idea. diff --git a/dtool/src/prc/streamWrapper.h b/dtool/src/prc/streamWrapper.h index 97d391a894..13a564f226 100644 --- a/dtool/src/prc/streamWrapper.h +++ b/dtool/src/prc/streamWrapper.h @@ -25,6 +25,9 @@ class EXPCL_DTOOLCONFIG StreamWrapperBase { protected: INLINE StreamWrapperBase(); +private: + INLINE StreamWrapperBase(const StreamWrapperBase ©) DELETED; + PUBLISHED: INLINE void acquire(); INLINE void release(); diff --git a/panda/src/express/datagramIterator.I b/panda/src/express/datagramIterator.I index 6f85656b47..cefde399f2 100644 --- a/panda/src/express/datagramIterator.I +++ b/panda/src/express/datagramIterator.I @@ -30,36 +30,13 @@ DatagramIterator(const Datagram &datagram, size_t offset) : nassertv(_current_index <= _datagram->get_length()); } -/** - * - */ -INLINE DatagramIterator:: -DatagramIterator(const DatagramIterator ©) : - _datagram(copy._datagram), - _current_index(copy._current_index) { -} - -/** - * - */ -INLINE void DatagramIterator:: -operator = (const DatagramIterator ©) { - _datagram = copy._datagram; - _current_index = copy._current_index; -} /** * direct Assignment to a Datagram */ -INLINE void DatagramIterator::assign(Datagram &datagram, size_t offset) -{ - _datagram =&datagram; - _current_index = offset; -} -/** - * - */ -INLINE DatagramIterator:: -~DatagramIterator() { +INLINE void DatagramIterator:: +assign(Datagram &datagram, size_t offset) { + _datagram = &datagram; + _current_index = offset; } // Various ways to get data and increment the iterator... Cut-and-paste-orama diff --git a/panda/src/express/datagramIterator.h b/panda/src/express/datagramIterator.h index b3a94c6670..7126901324 100644 --- a/panda/src/express/datagramIterator.h +++ b/panda/src/express/datagramIterator.h @@ -31,9 +31,6 @@ public: PUBLISHED: INLINE DatagramIterator(); INLINE DatagramIterator(const Datagram &datagram, size_t offset = 0); - INLINE DatagramIterator(const DatagramIterator ©); - INLINE void operator = (const DatagramIterator ©); - INLINE ~DatagramIterator(); INLINE bool get_bool(); INLINE int8_t get_int8(); diff --git a/panda/src/express/hashGeneratorBase.I b/panda/src/express/hashGeneratorBase.I index f6a65c756b..58bf0b8344 100644 --- a/panda/src/express/hashGeneratorBase.I +++ b/panda/src/express/hashGeneratorBase.I @@ -19,13 +19,6 @@ HashGeneratorBase() { _hash = 0; } -/** - * - */ -INLINE HashGeneratorBase:: -~HashGeneratorBase() { -} - /** * Returns the hash number generated. */ diff --git a/panda/src/express/hashGeneratorBase.h b/panda/src/express/hashGeneratorBase.h index 97ddb7fe08..86145a74df 100644 --- a/panda/src/express/hashGeneratorBase.h +++ b/panda/src/express/hashGeneratorBase.h @@ -30,7 +30,6 @@ class EXPCL_PANDAEXPRESS HashGeneratorBase { public: INLINE HashGeneratorBase(); - INLINE ~HashGeneratorBase(); INLINE size_t get_hash() const; diff --git a/panda/src/express/namable.I b/panda/src/express/namable.I index e1be80d872..75aa846087 100644 --- a/panda/src/express/namable.I +++ b/panda/src/express/namable.I @@ -20,35 +20,6 @@ Namable(const string &initial_name) : { } -/** - * - */ -INLINE Namable:: -Namable(const Namable ©) : - _name(copy._name) -{ -} - -/** - * - */ -INLINE Namable &Namable:: -operator = (const Namable &other) { - _name = other._name; - return *this; -} - -#ifdef USE_MOVE_SEMANTICS -/** - * - */ -INLINE Namable &Namable:: -operator = (Namable &&other) NOEXCEPT { - _name = MOVE(other._name); - return *this; -} -#endif - /** * */ diff --git a/panda/src/express/namable.h b/panda/src/express/namable.h index 435426fc1b..19a712d9d3 100644 --- a/panda/src/express/namable.h +++ b/panda/src/express/namable.h @@ -26,12 +26,6 @@ class EXPCL_PANDAEXPRESS Namable : public MemoryBase { PUBLISHED: INLINE explicit Namable(const string &initial_name = ""); - INLINE Namable(const Namable ©); - INLINE Namable &operator = (const Namable &other); - -#ifdef USE_MOVE_SEMANTICS - INLINE Namable &operator = (Namable &&other) NOEXCEPT; -#endif INLINE void set_name(const string &name); INLINE void clear_name(); diff --git a/panda/src/express/nodePointerTo.I b/panda/src/express/nodePointerTo.I index e56dd902b6..5485adcaaa 100644 --- a/panda/src/express/nodePointerTo.I +++ b/panda/src/express/nodePointerTo.I @@ -33,16 +33,6 @@ NodePointerTo(const NodePointerTo ©) : } #endif // CPPPARSER -#ifndef CPPPARSER -/** - * - */ -template -INLINE NodePointerTo:: -~NodePointerTo() { -} -#endif // CPPPARSER - #ifdef USE_MOVE_SEMANTICS #ifndef CPPPARSER /** @@ -177,16 +167,6 @@ NodeConstPointerTo(const NodeConstPointerTo ©) : } #endif // CPPPARSER -#ifndef CPPPARSER -/** - * - */ -template -INLINE NodeConstPointerTo:: -~NodeConstPointerTo() { -} -#endif // CPPPARSER - #ifdef USE_MOVE_SEMANTICS #ifndef CPPPARSER /** diff --git a/panda/src/express/nodePointerTo.h b/panda/src/express/nodePointerTo.h index 7fc773852d..ca9832d424 100644 --- a/panda/src/express/nodePointerTo.h +++ b/panda/src/express/nodePointerTo.h @@ -31,7 +31,6 @@ public: typedef TYPENAME NodePointerToBase::To To; INLINE NodePointerTo(To *ptr = (To *)NULL); INLINE NodePointerTo(const NodePointerTo ©); - INLINE ~NodePointerTo(); #ifdef USE_MOVE_SEMANTICS INLINE NodePointerTo(NodePointerTo &&from) NOEXCEPT; @@ -66,7 +65,6 @@ public: INLINE NodeConstPointerTo(const To *ptr = (const To *)NULL); INLINE NodeConstPointerTo(const NodePointerTo ©); INLINE NodeConstPointerTo(const NodeConstPointerTo ©); - INLINE ~NodeConstPointerTo(); #ifdef USE_MOVE_SEMANTICS INLINE NodeConstPointerTo(NodePointerTo &&from) NOEXCEPT; diff --git a/panda/src/express/ordered_vector.I b/panda/src/express/ordered_vector.I index 68a70b39a3..24a74c6a45 100644 --- a/panda/src/express/ordered_vector.I +++ b/panda/src/express/ordered_vector.I @@ -33,36 +33,6 @@ ordered_vector(const Compare &compare, TypeHandle type_handle) : { } -/** - * - */ -template -INLINE ordered_vector:: -ordered_vector(const ordered_vector ©) : - _compare(copy._compare), - _vector(copy._vector) -{ -} - -/** - * - */ -template -INLINE ordered_vector &ordered_vector:: -operator = (const ordered_vector ©) { - _compare = copy._compare; - _vector = copy._vector; - return *this; -} - -/** - * - */ -template -INLINE ordered_vector:: -~ordered_vector() { -} - /** * Returns the iterator that marks the first element in the ordered vector. */ @@ -636,26 +606,6 @@ ov_set(const Compare &compare, TypeHandle type_handle) : { } -/** - * - */ -template -INLINE ov_set:: -ov_set(const ov_set ©) : - ordered_vector(copy) -{ -} - -/** - * - */ -template -INLINE ov_set &ov_set:: -operator = (const ov_set ©) { - ordered_vector::operator = (copy); - return *this; -} - /** * Maps to insert_unique(). */ @@ -713,26 +663,6 @@ ov_multiset(const Compare &compare, TypeHandle type_handle) : { } -/** - * - */ -template -INLINE ov_multiset:: -ov_multiset(const ov_multiset ©) : - ordered_vector(copy) -{ -} - -/** - * - */ -template -INLINE ov_multiset &ov_multiset:: -operator = (const ov_multiset ©) { - ordered_vector::operator = (copy); - return *this; -} - /** * Maps to insert_nonunique(). */ diff --git a/panda/src/express/ordered_vector.h b/panda/src/express/ordered_vector.h index aa84cc4511..7eacfc375e 100644 --- a/panda/src/express/ordered_vector.h +++ b/panda/src/express/ordered_vector.h @@ -135,9 +135,6 @@ public: INLINE ordered_vector(TypeHandle type_handle = ov_set_type_handle); INLINE ordered_vector(const Compare &compare, TypeHandle type_handle = ov_set_type_handle); - INLINE ordered_vector(const ordered_vector ©); - INLINE ordered_vector &operator = (const ordered_vector ©); - INLINE ~ordered_vector(); // Iterator access. INLINE ITERATOR begin(); @@ -265,8 +262,6 @@ public: INLINE ov_set(TypeHandle type_handle = ov_set_type_handle); INLINE ov_set(const Compare &compare, TypeHandle type_handle = ov_set_type_handle); - INLINE ov_set(const ov_set ©); - INLINE ov_set &operator = (const ov_set ©); INLINE ITERATOR insert(ITERATOR position, const VALUE_TYPE &key0); INLINE pair insert(const VALUE_TYPE &key0); @@ -288,8 +283,6 @@ public: INLINE ov_multiset(TypeHandle type_handle = ov_set_type_handle); INLINE ov_multiset(const Compare &compare, TypeHandle type_handle = ov_set_type_handle); - INLINE ov_multiset(const ov_multiset ©); - INLINE ov_multiset &operator = (const ov_multiset ©); INLINE ITERATOR insert(ITERATOR position, const VALUE_TYPE &key); INLINE ITERATOR insert(const VALUE_TYPE &key); diff --git a/panda/src/express/pointerTo.I b/panda/src/express/pointerTo.I index a3d842e374..62962a83e3 100644 --- a/panda/src/express/pointerTo.I +++ b/panda/src/express/pointerTo.I @@ -16,7 +16,7 @@ */ template ALWAYS_INLINE PointerTo:: -PointerTo(To *ptr) : PointerToBase(ptr) { +PointerTo(To *ptr) NOEXCEPT : PointerToBase(ptr) { } /** @@ -55,16 +55,8 @@ operator = (PointerTo &&from) NOEXCEPT { * */ template -INLINE PointerTo:: -~PointerTo() { -} - -/** - * - */ -template -INLINE TYPENAME PointerTo::To &PointerTo:: -operator *() const { +CONSTEXPR TYPENAME PointerTo::To &PointerTo:: +operator *() const NOEXCEPT { return *((To *)(this->_void_ptr)); } @@ -72,8 +64,8 @@ operator *() const { * */ template -INLINE TYPENAME PointerTo::To *PointerTo:: -operator -> () const { +CONSTEXPR TYPENAME PointerTo::To *PointerTo:: +operator -> () const NOEXCEPT { return (To *)(this->_void_ptr); } @@ -84,8 +76,8 @@ operator -> () const { * goes because either will be correct. */ template -INLINE PointerTo:: -operator T * () const { +CONSTEXPR PointerTo:: +operator T * () const NOEXCEPT { return (To *)(this->_void_ptr); } @@ -107,8 +99,8 @@ cheat() { * compiler problems, particularly for implicit upcasts. */ template -INLINE TYPENAME PointerTo::To *PointerTo:: -p() const { +CONSTEXPR TYPENAME PointerTo::To *PointerTo:: +p() const NOEXCEPT { return (To *)(this->_void_ptr); } @@ -137,7 +129,7 @@ operator = (const PointerTo ©) { */ template ALWAYS_INLINE ConstPointerTo:: -ConstPointerTo(const TYPENAME ConstPointerTo::To *ptr) : +ConstPointerTo(const TYPENAME ConstPointerTo::To *ptr) NOEXCEPT : PointerToBase((TYPENAME ConstPointerTo::To *)ptr) { } @@ -152,14 +144,6 @@ ConstPointerTo(const PointerTo ©) : { } -/** - * - */ -template -INLINE ConstPointerTo:: -~ConstPointerTo() { -} - /** * */ @@ -216,8 +200,8 @@ operator = (ConstPointerTo &&from) NOEXCEPT { * */ template -INLINE const TYPENAME ConstPointerTo::To &ConstPointerTo:: -operator *() const { +CONSTEXPR const TYPENAME ConstPointerTo::To &ConstPointerTo:: +operator *() const NOEXCEPT { return *((To *)(this->_void_ptr)); } @@ -225,8 +209,8 @@ operator *() const { * */ template -INLINE const TYPENAME ConstPointerTo::To *ConstPointerTo:: -operator -> () const { +CONSTEXPR const TYPENAME ConstPointerTo::To *ConstPointerTo:: +operator -> () const NOEXCEPT { return (To *)(this->_void_ptr); } @@ -237,8 +221,8 @@ operator -> () const { * don't care which way it goes because either will be correct. */ template -INLINE ConstPointerTo:: -operator const T * () const { +CONSTEXPR ConstPointerTo:: +operator const T * () const NOEXCEPT { return (To *)(this->_void_ptr); } @@ -260,8 +244,8 @@ cheat() { * around compiler problems, particularly for implicit upcasts. */ template -INLINE const TYPENAME ConstPointerTo::To *ConstPointerTo:: -p() const { +CONSTEXPR const TYPENAME ConstPointerTo::To *ConstPointerTo:: +p() const NOEXCEPT { return (To *)(this->_void_ptr); } diff --git a/panda/src/express/pointerTo.h b/panda/src/express/pointerTo.h index 50634f6473..15dbcdefb0 100644 --- a/panda/src/express/pointerTo.h +++ b/panda/src/express/pointerTo.h @@ -14,35 +14,47 @@ #ifndef POINTERTO_H #define POINTERTO_H -/* +/** * This file defines the classes PointerTo and ConstPointerTo (and their * abbreviations, PT and CPT). These should be used in place of traditional - * C-style pointers wherever implicit reference counting is desired. The - * syntax is: instead of: PointerTo p; - * MyClass *p; PT(MyClass) p; ConstPointerTo p; const MyClass - * *p; CPT(MyClass) p; PointerTo and ConstPointerTo will automatically - * increment the object's reference count while the pointer is kept. When the - * PointerTo object is reassigned or goes out of scope, the reference count is - * automatically decremented. If the reference count reaches zero, the object - * is freed. Note that const PointerTo is different from + * C-style pointers wherever implicit reference counting is desired. + * + * The syntax is: instead of: + * + * PointerTo p; MyClass *p; + * PT(MyClass) p; + * + * ConstPointerTo p; const MyClass *p; + * CPT(MyClass) p; + * + * PointerTo and ConstPointerTo will automatically increment the object's + * reference count while the pointer is kept. When the PointerTo object is + * reassigned or goes out of scope, the reference count is automatically + * decremented. If the reference count reaches zero, the object is freed. + * + * Note that const PointerTo is different from * ConstPointerTo. A const PointerTo may not reassign its pointer, * but it may still modify the contents at that address. On the other hand, a * ConstPointerTo may reassign its pointer at will, but may not modify the - * contents. It is like the difference between (MyClass * const) and (const - * MyClass *). In order to use PointerTo, it is necessary that the thing - * pointed to--MyClass in the above example--either inherits from - * ReferenceCount, or is a proxy built with RefCountProxy or RefCountObj (see - * referenceCount.h). However, also see PointerToArray, which does not have - * this restriction. It is crucial that the PointerTo object is only used to - * refer to objects allocated from the free store, for which delete is a - * sensible thing to do. If you assign a PointerTo to an automatic variable - * (allocated from the stack, for instance), bad things will certainly happen - * when the reference count reaches zero and it tries to delete it. It's also - * important to remember that, as always, a virtual destructor is required if - * you plan to support polymorphism. That is, if you define a PointerTo to - * some base type, and assign to it instances of a class derived from that - * base class, the base class must have a virtual destructor in order to - * properly destruct the derived object when it is deleted. + * contents. It is like the difference between (MyClass * const) and + * (const MyClass *). + * + * In order to use PointerTo, it is necessary that the thing pointed to + * --MyClass in the above example--either inherits from ReferenceCount, or is + * a proxy built with RefCountProxy or RefCountObj (see referenceCount.h). + * However, also see PointerToArray, which does not have this restriction. + * + * It is crucial that the PointerTo object is only used to refer to objects + * allocated from the free store, for which delete is a sensible thing to do. + * If you assign a PointerTo to an automatic variable (allocated from the + * stack, for instance), bad things will certainly happen when the reference + * count reaches zero and it tries to delete it. + * + * It's also important to remember that, as always, a virtual destructor is + * required if you plan to support polymorphism. That is, if you define a + * PointerTo to some base type, and assign to it instances of a class derived + * from that base class, the base class must have a virtual destructor in + * order to properly destruct the derived object when it is deleted. */ #include "pandabase.h" @@ -58,10 +70,9 @@ class PointerTo : public PointerToBase { public: typedef TYPENAME PointerToBase::To To; PUBLISHED: - ALWAYS_INLINE PointerTo() DEFAULT_CTOR; - ALWAYS_INLINE PointerTo(To *ptr); + ALWAYS_INLINE CONSTEXPR PointerTo() NOEXCEPT DEFAULT_CTOR; + ALWAYS_INLINE PointerTo(To *ptr) NOEXCEPT; INLINE PointerTo(const PointerTo ©); - INLINE ~PointerTo(); public: #ifdef USE_MOVE_SEMANTICS @@ -69,10 +80,10 @@ public: INLINE PointerTo &operator = (PointerTo &&from) NOEXCEPT; #endif - INLINE To &operator *() const; - INLINE To *operator -> () const; + CONSTEXPR To &operator *() const NOEXCEPT; + CONSTEXPR To *operator -> () const NOEXCEPT; // MSVC.NET 2005 insists that we use T *, and not To *, here. - INLINE operator T *() const; + CONSTEXPR operator T *() const NOEXCEPT; INLINE T *&cheat(); @@ -89,7 +100,7 @@ PUBLISHED: // the DCAST macro defined in typedObject.h instead, e.g. DCAST(MyType, // ptr). This provides a clean downcast that doesn't require .p() or any // double-casting, and it can be run-time checked for correctness. - INLINE To *p() const; + CONSTEXPR To *p() const NOEXCEPT; INLINE PointerTo &operator = (To *ptr); INLINE PointerTo &operator = (const PointerTo ©); @@ -98,8 +109,10 @@ PUBLISHED: // anyway just to help out interrogate (which doesn't seem to want to // automatically export the PointerToBase class). When this works again in // interrogate, we can remove these. - INLINE bool is_null() const { return PointerToBase::is_null(); } - INLINE void clear() { PointerToBase::clear(); } +#ifdef CPPPARSER + INLINE bool is_null() const; + INLINE void clear(); +#endif }; @@ -120,11 +133,10 @@ class ConstPointerTo : public PointerToBase { public: typedef TYPENAME PointerToBase::To To; PUBLISHED: - ALWAYS_INLINE ConstPointerTo() DEFAULT_CTOR; - ALWAYS_INLINE ConstPointerTo(const To *ptr); + ALWAYS_INLINE CONSTEXPR ConstPointerTo() NOEXCEPT DEFAULT_CTOR; + ALWAYS_INLINE ConstPointerTo(const To *ptr) NOEXCEPT; INLINE ConstPointerTo(const PointerTo ©); INLINE ConstPointerTo(const ConstPointerTo ©); - INLINE ~ConstPointerTo(); public: #ifdef USE_MOVE_SEMANTICS @@ -134,14 +146,14 @@ public: INLINE ConstPointerTo &operator = (ConstPointerTo &&from) NOEXCEPT; #endif - INLINE const To &operator *() const; - INLINE const To *operator -> () const; - INLINE operator const T *() const; + CONSTEXPR const To &operator *() const NOEXCEPT; + CONSTEXPR const To *operator -> () const NOEXCEPT; + CONSTEXPR operator const T *() const NOEXCEPT; INLINE const T *&cheat(); PUBLISHED: - INLINE const To *p() const; + CONSTEXPR const To *p() const NOEXCEPT; INLINE ConstPointerTo &operator = (const To *ptr); INLINE ConstPointerTo &operator = (const PointerTo ©); @@ -151,7 +163,9 @@ PUBLISHED: // anyway just to help out interrogate (which doesn't seem to want to // automatically export the PointerToBase class). When this works again in // interrogate, we can remove this. - INLINE void clear() { PointerToBase::clear(); } +#ifdef CPPPARSER + INLINE void clear(); +#endif }; diff --git a/panda/src/express/pointerToArray.I b/panda/src/express/pointerToArray.I index 568b379105..7bf8b89d4e 100644 --- a/panda/src/express/pointerToArray.I +++ b/panda/src/express/pointerToArray.I @@ -68,6 +68,17 @@ PointerToArray(const PointerToArray ©) : { } +/** + * Initializes a PointerToArray by copying existing elements. + */ +template +INLINE PointerToArray:: +PointerToArray(const Element *begin, const Element *end, TypeHandle type_handle) : + PointerToArrayBase(new ReferenceCountedVector(begin, end, type_handle)), + _type_handle(type_handle) +{ +} + #ifdef USE_MOVE_SEMANTICS /** * @@ -627,6 +638,17 @@ ConstPointerToArray(TypeHandle type_handle) : { } +/** + * Initializes a ConstPointerToArray by copying existing elements. + */ +template +INLINE ConstPointerToArray:: +ConstPointerToArray(const Element *begin, const Element *end, TypeHandle type_handle) : + PointerToArrayBase(new ReferenceCountedVector(begin, end, type_handle)), + _type_handle(type_handle) +{ +} + /** * */ diff --git a/panda/src/express/pointerToArray.h b/panda/src/express/pointerToArray.h index 004e15fdea..d486f1b00f 100644 --- a/panda/src/express/pointerToArray.h +++ b/panda/src/express/pointerToArray.h @@ -134,6 +134,7 @@ public: INLINE PointerToArray(TypeHandle type_handle = get_type_handle(Element)); INLINE static PointerToArray empty_array(size_type n, TypeHandle type_handle = get_type_handle(Element)); INLINE PointerToArray(size_type n, const Element &value, TypeHandle type_handle = get_type_handle(Element)); + INLINE PointerToArray(const Element *begin, const Element *end, TypeHandle type_handle = get_type_handle(Element)); INLINE PointerToArray(const PointerToArray ©); #ifdef USE_MOVE_SEMANTICS @@ -289,6 +290,7 @@ PUBLISHED: typedef TYPENAME pvector::size_type size_type; INLINE ConstPointerToArray(TypeHandle type_handle = get_type_handle(Element)); + INLINE ConstPointerToArray(const Element *begin, const Element *end, TypeHandle type_handle = get_type_handle(Element)); INLINE ConstPointerToArray(const PointerToArray ©); INLINE ConstPointerToArray(const ConstPointerToArray ©); diff --git a/panda/src/express/pointerToArrayBase.I b/panda/src/express/pointerToArrayBase.I index 885d759aed..89acba1206 100644 --- a/panda/src/express/pointerToArrayBase.I +++ b/panda/src/express/pointerToArrayBase.I @@ -19,17 +19,6 @@ INLINE ReferenceCountedVector:: ReferenceCountedVector(TypeHandle type_handle) : pvector(type_handle) { } -/** - * - */ -template -INLINE ReferenceCountedVector:: -ReferenceCountedVector(const ReferenceCountedVector ©) : - NodeReferenceCount(copy), - pvector(copy) -{ -} - /** * Creates an array of initial_size elements. */ @@ -41,11 +30,13 @@ ReferenceCountedVector(TYPENAME ReferenceCountedVector::size_type initi } /** - * + * Creates an array with all elements from begin up to but not including end. */ template INLINE ReferenceCountedVector:: -~ReferenceCountedVector() { +ReferenceCountedVector(const Element *begin, const Element *end, TypeHandle type_handle) : + pvector(begin, end, type_handle) +{ } /** diff --git a/panda/src/express/pointerToArrayBase.h b/panda/src/express/pointerToArrayBase.h index 291ffed656..3220ca4c70 100644 --- a/panda/src/express/pointerToArrayBase.h +++ b/panda/src/express/pointerToArrayBase.h @@ -41,9 +41,8 @@ public: typedef TYPENAME pvector::size_type size_type; INLINE ReferenceCountedVector(TypeHandle type_handle); - INLINE ReferenceCountedVector(const ReferenceCountedVector ©); INLINE ReferenceCountedVector(size_type initial_size, TypeHandle type_handle); - INLINE ~ReferenceCountedVector(); + INLINE ReferenceCountedVector(const Element *begin, const Element *end, TypeHandle type_handle); ALLOC_DELETED_CHAIN(ReferenceCountedVector); INLINE size_type size() const; diff --git a/panda/src/express/pointerToBase.h b/panda/src/express/pointerToBase.h index cbafa5587b..6c20aceb6a 100644 --- a/panda/src/express/pointerToBase.h +++ b/panda/src/express/pointerToBase.h @@ -31,7 +31,7 @@ public: typedef T To; protected: - ALWAYS_INLINE PointerToBase() DEFAULT_CTOR; + ALWAYS_INLINE CONSTEXPR PointerToBase() NOEXCEPT DEFAULT_CTOR; INLINE PointerToBase(To *ptr); INLINE PointerToBase(const PointerToBase ©); INLINE ~PointerToBase(); diff --git a/panda/src/express/pointerToVoid.I b/panda/src/express/pointerToVoid.I index 6ae942b645..2f3cad1aba 100644 --- a/panda/src/express/pointerToVoid.I +++ b/panda/src/express/pointerToVoid.I @@ -14,34 +14,25 @@ /** * */ -INLINE PointerToVoid:: -PointerToVoid() { - _void_ptr = (void *)NULL; +INLINE CONSTEXPR PointerToVoid:: +PointerToVoid() NOEXCEPT : _void_ptr(nullptr) { } /** * */ -INLINE PointerToVoid:: -~PointerToVoid() { - nassertv(_void_ptr == (void *)NULL); -} - -/** - * Don't use this constructor. - */ -INLINE PointerToVoid:: -PointerToVoid(const PointerToVoid &) { - nassertv(false); -} +//INLINE PointerToVoid:: +//~PointerToVoid() { +// nassertv(_void_ptr == nullptr); +//} /** * Returns true if the PointerTo is a NULL pointer, false otherwise. (Direct * comparison to a NULL pointer also works.) */ -ALWAYS_INLINE bool PointerToVoid:: +ALWAYS_INLINE CONSTEXPR bool PointerToVoid:: is_null() const { - return (_void_ptr == (void *)NULL); + return _void_ptr == nullptr; } /** diff --git a/panda/src/express/pointerToVoid.h b/panda/src/express/pointerToVoid.h index 25189a4e0a..9503084999 100644 --- a/panda/src/express/pointerToVoid.h +++ b/panda/src/express/pointerToVoid.h @@ -32,14 +32,14 @@ */ class EXPCL_PANDAEXPRESS PointerToVoid : public MemoryBase { protected: - INLINE PointerToVoid(); - INLINE ~PointerToVoid(); + ALWAYS_INLINE CONSTEXPR PointerToVoid() NOEXCEPT; + //INLINE ~PointerToVoid(); private: - INLINE PointerToVoid(const PointerToVoid ©); + PointerToVoid(const PointerToVoid ©) DELETED; PUBLISHED: - ALWAYS_INLINE bool is_null() const; + ALWAYS_INLINE CONSTEXPR bool is_null() const; INLINE size_t get_hash() const; public: diff --git a/panda/src/express/weakPointerToVoid.I b/panda/src/express/weakPointerToVoid.I index f55cf499cc..bc778630b7 100644 --- a/panda/src/express/weakPointerToVoid.I +++ b/panda/src/express/weakPointerToVoid.I @@ -15,16 +15,9 @@ * */ INLINE WeakPointerToVoid:: -WeakPointerToVoid() { - _ptr_was_deleted = false; - _callback = NULL; -} - -/** - * - */ -INLINE WeakPointerToVoid:: -~WeakPointerToVoid() { +WeakPointerToVoid() : + _ptr_was_deleted(false), + _callback(NULL) { } /** diff --git a/panda/src/express/weakPointerToVoid.h b/panda/src/express/weakPointerToVoid.h index e82ec63420..98a481e49e 100644 --- a/panda/src/express/weakPointerToVoid.h +++ b/panda/src/express/weakPointerToVoid.h @@ -25,7 +25,6 @@ class EXPCL_PANDAEXPRESS WeakPointerToVoid : public PointerToVoid { protected: INLINE WeakPointerToVoid(); - INLINE ~WeakPointerToVoid(); public: INLINE void mark_deleted(); diff --git a/panda/src/putil/bitArray.I b/panda/src/putil/bitArray.I index 6c16a549d0..f746a9ba77 100644 --- a/panda/src/putil/bitArray.I +++ b/panda/src/putil/bitArray.I @@ -30,26 +30,6 @@ BitArray(WordType init_value) { _highest_bits = 0; } -/** - * - */ -INLINE BitArray:: -BitArray(const BitArray ©) : - _array(copy._array), - _highest_bits(copy._highest_bits) -{ -} - -/** - * - */ -INLINE BitArray &BitArray:: -operator = (const BitArray ©) { - _array = copy._array; - _highest_bits = copy._highest_bits; - return *this; -} - /** * Returns a BitArray with an infinite array of bits, all on. */ @@ -98,13 +78,6 @@ range(int low_bit, int size) { return result; } -/** - * - */ -INLINE BitArray:: -~BitArray() { -} - /** * Returns true if there is a maximum number of bits that may be stored in * this structure, false otherwise. If this returns true, the number may be diff --git a/panda/src/putil/bitArray.h b/panda/src/putil/bitArray.h index 3a4a4b16d2..72ef1f656d 100644 --- a/panda/src/putil/bitArray.h +++ b/panda/src/putil/bitArray.h @@ -46,8 +46,6 @@ PUBLISHED: INLINE BitArray(); INLINE BitArray(WordType init_value); - INLINE BitArray(const BitArray ©); - INLINE BitArray &operator = (const BitArray ©); BitArray(const SparseArray &from); INLINE static BitArray all_on(); @@ -56,8 +54,6 @@ PUBLISHED: INLINE static BitArray bit(int index); INLINE static BitArray range(int low_bit, int size); - INLINE ~BitArray(); - CONSTEXPR static bool has_max_num_bits(); CONSTEXPR static int get_max_num_bits(); diff --git a/panda/src/putil/bitMask.I b/panda/src/putil/bitMask.I index dca29c5b6a..0411d06042 100644 --- a/panda/src/putil/bitMask.I +++ b/panda/src/putil/bitMask.I @@ -34,26 +34,6 @@ BitMask(WordType init_value) : { } -/** - * - */ -template -INLINE BitMask:: -BitMask(const BitMask ©) : - _word(copy._word) -{ -} - -/** - * - */ -template -INLINE BitMask &BitMask:: -operator = (const BitMask ©) { - _word = copy._word; - return *this; -} - /** * Returns a BitMask whose bits are all on. */ @@ -121,14 +101,6 @@ range(int low_bit, int size) { return result; } -/** - * - */ -template -INLINE BitMask:: -~BitMask() { -} - /** * Returns true if there is a maximum number of bits that may be stored in * this structure, false otherwise. If this returns true, the number may be diff --git a/panda/src/putil/bitMask.h b/panda/src/putil/bitMask.h index 17c1c9f69d..ff9b15db97 100644 --- a/panda/src/putil/bitMask.h +++ b/panda/src/putil/bitMask.h @@ -38,8 +38,6 @@ PUBLISHED: INLINE BitMask(); INLINE BitMask(WordType init_value); - INLINE BitMask(const BitMask ©); - INLINE BitMask &operator = (const BitMask ©); INLINE static BitMask all_on(); INLINE static BitMask all_off(); @@ -47,8 +45,6 @@ PUBLISHED: INLINE static BitMask bit(int index); INLINE static BitMask range(int low_bit, int size); - INLINE ~BitMask(); - CONSTEXPR static bool has_max_num_bits(); CONSTEXPR static int get_max_num_bits(); diff --git a/panda/src/putil/buttonHandle.I b/panda/src/putil/buttonHandle.I index 5701ccb395..2353b01689 100644 --- a/panda/src/putil/buttonHandle.I +++ b/panda/src/putil/buttonHandle.I @@ -19,13 +19,6 @@ CONSTEXPR ButtonHandle:: ButtonHandle(int index) : _index(index) { } -/** - * - */ -INLINE ButtonHandle:: -ButtonHandle(const ButtonHandle ©) : _index(copy._index) { -} - /** * */ diff --git a/panda/src/putil/buttonHandle.h b/panda/src/putil/buttonHandle.h index d2b97be36a..429108249f 100644 --- a/panda/src/putil/buttonHandle.h +++ b/panda/src/putil/buttonHandle.h @@ -31,7 +31,6 @@ PUBLISHED: // previously by another static initializer! INLINE ButtonHandle() DEFAULT_CTOR; CONSTEXPR ButtonHandle(int index); - INLINE ButtonHandle(const ButtonHandle ©); ButtonHandle(const string &name); PUBLISHED: diff --git a/panda/src/putil/iterator_types.h b/panda/src/putil/iterator_types.h index cb405ce18c..2f2966cde7 100644 --- a/panda/src/putil/iterator_types.h +++ b/panda/src/putil/iterator_types.h @@ -14,6 +14,7 @@ #ifndef ITERATOR_TYPES_H #define ITERATOR_TYPES_H +#include "dtoolbase.h" /** * This is an iterator adaptor that converts any iterator that returns a pair @@ -25,9 +26,8 @@ class first_of_pair_iterator : public pair_iterator { public: typedef TYPENAME pair_iterator::value_type::first_type value_type; - first_of_pair_iterator() { } + first_of_pair_iterator() DEFAULT_CTOR; first_of_pair_iterator(const pair_iterator &init) : pair_iterator(init) { } - first_of_pair_iterator(const first_of_pair_iterator ©) : pair_iterator(copy) { } value_type operator *() { return pair_iterator::operator *().first; @@ -44,9 +44,8 @@ class second_of_pair_iterator : public pair_iterator { public: typedef TYPENAME pair_iterator::value_type::second_type value_type; - second_of_pair_iterator() { } + second_of_pair_iterator() DEFAULT_CTOR; second_of_pair_iterator(const pair_iterator &init) : pair_iterator(init) { } - second_of_pair_iterator(const second_of_pair_iterator ©) : pair_iterator(copy) { } value_type operator *() { return pair_iterator::operator *().second; @@ -62,9 +61,8 @@ class typecast_iterator : public base_iterator { public: typedef new_type value_type; - typecast_iterator() { } + typecast_iterator() DEFAULT_CTOR; typecast_iterator(const base_iterator &init) : base_iterator(init) { } - typecast_iterator(const typecast_iterator ©) : base_iterator(copy) { } value_type operator *() { return (new_type)base_iterator::operator *(); diff --git a/panda/src/putil/sparseArray.I b/panda/src/putil/sparseArray.I index fb459806d0..682d5f93be 100644 --- a/panda/src/putil/sparseArray.I +++ b/panda/src/putil/sparseArray.I @@ -18,26 +18,6 @@ INLINE SparseArray:: SparseArray() : _inverse(false) { } -/** - * - */ -INLINE SparseArray:: -SparseArray(const SparseArray ©) : - _subranges(copy._subranges), - _inverse(copy._inverse) -{ -} - -/** - * - */ -INLINE SparseArray &SparseArray:: -operator = (const SparseArray ©) { - _subranges = copy._subranges; - _inverse = copy._inverse; - return *this; -} - /** * Returns a SparseArray with an infinite array of bits, all on. */ @@ -62,7 +42,9 @@ all_off() { INLINE SparseArray SparseArray:: lower_on(int on_bits) { SparseArray result; - result.set_range(0, on_bits); + if (on_bits > 0) { + result._subranges.push_back(Subrange(0, on_bits)); + } return result; } @@ -86,13 +68,6 @@ range(int low_bit, int size) { return result; } -/** - * - */ -INLINE SparseArray:: -~SparseArray() { -} - /** * Returns true if there is a maximum number of bits that may be stored in * this structure, false otherwise. If this returns true, the number may be diff --git a/panda/src/putil/sparseArray.h b/panda/src/putil/sparseArray.h index 9ebd205bac..a372fc240e 100644 --- a/panda/src/putil/sparseArray.h +++ b/panda/src/putil/sparseArray.h @@ -42,8 +42,6 @@ class DatagramIterator; class EXPCL_PANDA_PUTIL SparseArray { PUBLISHED: INLINE SparseArray(); - INLINE SparseArray(const SparseArray ©); - INLINE SparseArray &operator = (const SparseArray ©); SparseArray(const BitArray &from); INLINE static SparseArray all_on(); @@ -52,8 +50,6 @@ PUBLISHED: INLINE static SparseArray bit(int index); INLINE static SparseArray range(int low_bit, int size); - INLINE ~SparseArray(); - INLINE static bool has_max_num_bits(); INLINE static int get_max_num_bits(); diff --git a/panda/src/putil/writableParam.I b/panda/src/putil/writableParam.I index 49b75bf0f9..878820379a 100644 --- a/panda/src/putil/writableParam.I +++ b/panda/src/putil/writableParam.I @@ -30,22 +30,6 @@ WritableParam(const WritableParam ©) : { } -/** - * - */ -INLINE WritableParam:: -~WritableParam() { -} - -/** - * - */ -INLINE void WritableParam:: -operator = (const WritableParam &) { - // The assignment operator cannot be used for this class. - nassertv(false); -} - /** * */ diff --git a/panda/src/putil/writableParam.h b/panda/src/putil/writableParam.h index beefff5b8a..372613fc99 100644 --- a/panda/src/putil/writableParam.h +++ b/panda/src/putil/writableParam.h @@ -36,11 +36,10 @@ private: public: INLINE WritableParam(const Datagram &datagram); INLINE WritableParam(const WritableParam &other); - INLINE ~WritableParam(); private: // The assignment operator cannot be used for this class. - INLINE void operator = (const WritableParam &other); + INLINE void operator = (const WritableParam &other) DELETED; public: virtual TypeHandle get_type() const { From a15d84dbeb3a908c12d50bbc8e8aa82fea7c7f8e Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 12 Jan 2017 15:18:48 +0100 Subject: [PATCH 028/254] Fix compile errors and warnings in MSVC 2010 / GCC 4.6 --- dtool/src/dtoolbase/dtoolbase_cc.h | 11 +++++++++++ dtool/src/dtoolbase/mutexDummyImpl.h | 2 +- dtool/src/dtoolbase/mutexPosixImpl.h | 2 +- dtool/src/dtoolbase/mutexSpinlockImpl.h | 2 +- dtool/src/dtoolbase/mutexWin32Impl.h | 2 +- dtool/src/dtoolbase/typedObject.h | 2 +- dtool/src/prckeys/makePrcKey.cxx | 2 +- panda/src/express/pointerTo.h | 4 ++-- panda/src/express/pointerToBase.h | 2 +- panda/src/express/pointerToVoid.I | 4 ++-- panda/src/express/pointerToVoid.h | 4 ++-- panda/src/putil/writableParam.h | 2 +- 12 files changed, 25 insertions(+), 14 deletions(-) diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index 400ed7919a..3d374748b6 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -40,7 +40,9 @@ using namespace std; #define MOVE(x) x #define DEFAULT_CTOR = default #define DEFAULT_DTOR = default +#define DEFAULT_ASSIGN = default #define DELETED = delete +#define DELETED_ASSIGN = delete #define EXPORT_TEMPLATE_CLASS(expcl, exptp, classname) @@ -169,6 +171,7 @@ template typename remove_reference::type &&move(T &&t) { # if __has_extension(cxx_defaulted_functions) # define DEFAULT_CTOR = default # define DEFAULT_DTOR = default +# define DEFAULT_ASSIGN = default # endif # if __has_extension(cxx_deleted_functions) # define DELETED = delete @@ -185,6 +188,7 @@ template typename remove_reference::type &&move(T &&t) { # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) # define DEFAULT_CTOR = default # define DEFAULT_DTOR = default +# define DEFAULT_ASSIGN = default # define DELETED = delete # endif @@ -219,6 +223,7 @@ template typename remove_reference::type &&move(T &&t) { #if defined(_MSC_VER) && _MSC_VER >= 1800 // Visual Studio 2013 # define DEFAULT_CTOR = default # define DEFAULT_DTOR = default +# define DEFAULT_ASSIGN = default # define DELETED = delete #endif @@ -244,8 +249,14 @@ template typename remove_reference::type &&move(T &&t) { #ifndef DEFAULT_DTOR # define DEFAULT_DTOR {} #endif +#ifndef DEFAULT_ASSIGN +# define DEFAULT_ASSIGN {return *this;} +#endif #ifndef DELETED # define DELETED {assert(false);} +# define DELETED_ASSIGN {assert(false);return *this;} +#else +# define DELETED_ASSIGN DELETED #endif diff --git a/dtool/src/dtoolbase/mutexDummyImpl.h b/dtool/src/dtoolbase/mutexDummyImpl.h index 2dc61f0989..d88eaed1aa 100644 --- a/dtool/src/dtoolbase/mutexDummyImpl.h +++ b/dtool/src/dtoolbase/mutexDummyImpl.h @@ -27,7 +27,7 @@ public: private: MutexDummyImpl(const MutexDummyImpl ©) DELETED; - MutexDummyImpl &operator = (const MutexDummyImpl ©) DELETED; + MutexDummyImpl &operator = (const MutexDummyImpl ©) DELETED_ASSIGN; public: ALWAYS_INLINE void acquire(); diff --git a/dtool/src/dtoolbase/mutexPosixImpl.h b/dtool/src/dtoolbase/mutexPosixImpl.h index c8ff5dac8f..4d4fb3c11b 100644 --- a/dtool/src/dtoolbase/mutexPosixImpl.h +++ b/dtool/src/dtoolbase/mutexPosixImpl.h @@ -33,7 +33,7 @@ public: private: MutexPosixImpl(const MutexPosixImpl ©) DELETED; - MutexPosixImpl &operator = (const MutexPosixImpl ©) DELETED; + MutexPosixImpl &operator = (const MutexPosixImpl ©) DELETED_ASSIGN; public: INLINE void acquire(); diff --git a/dtool/src/dtoolbase/mutexSpinlockImpl.h b/dtool/src/dtoolbase/mutexSpinlockImpl.h index 75adf85dc1..06853a1af9 100644 --- a/dtool/src/dtoolbase/mutexSpinlockImpl.h +++ b/dtool/src/dtoolbase/mutexSpinlockImpl.h @@ -33,7 +33,7 @@ public: private: MutexSpinlockImpl(const MutexSpinlockImpl ©) DELETED; - MutexSpinlockImpl &operator = (const MutexSpinlockImpl ©) DELETED; + MutexSpinlockImpl &operator = (const MutexSpinlockImpl ©) DELETED_ASSIGN; public: INLINE void acquire(); diff --git a/dtool/src/dtoolbase/mutexWin32Impl.h b/dtool/src/dtoolbase/mutexWin32Impl.h index f9c1bf5437..31a4539e01 100644 --- a/dtool/src/dtoolbase/mutexWin32Impl.h +++ b/dtool/src/dtoolbase/mutexWin32Impl.h @@ -33,7 +33,7 @@ public: private: MutexWin32Impl(const MutexWin32Impl ©) DELETED; - MutexWin32Impl &operator = (const MutexWin32Impl ©) DELETED; + MutexWin32Impl &operator = (const MutexWin32Impl ©) DELETED_ASSIGN; public: INLINE void acquire(); diff --git a/dtool/src/dtoolbase/typedObject.h b/dtool/src/dtoolbase/typedObject.h index 5fff8e2ff8..789e47110c 100644 --- a/dtool/src/dtoolbase/typedObject.h +++ b/dtool/src/dtoolbase/typedObject.h @@ -89,7 +89,7 @@ class EXPCL_DTOOL TypedObject : public MemoryBase { public: INLINE TypedObject() DEFAULT_CTOR; INLINE TypedObject(const TypedObject ©) DEFAULT_CTOR; - INLINE TypedObject &operator = (const TypedObject ©) DEFAULT_CTOR; + INLINE TypedObject &operator = (const TypedObject ©) DEFAULT_ASSIGN; PUBLISHED: // A virtual destructor is just a good idea. diff --git a/dtool/src/prckeys/makePrcKey.cxx b/dtool/src/prckeys/makePrcKey.cxx index 57672e5c8a..f1d9046108 100644 --- a/dtool/src/prckeys/makePrcKey.cxx +++ b/dtool/src/prckeys/makePrcKey.cxx @@ -161,7 +161,7 @@ write_public_keys(Filename outfile) { } output_c_string(out, "prc_pubkey", i, mbio); - BIO_reset(mbio); + (void)BIO_reset(mbio); out << "\n"; } } diff --git a/panda/src/express/pointerTo.h b/panda/src/express/pointerTo.h index 15dbcdefb0..1c4db74bea 100644 --- a/panda/src/express/pointerTo.h +++ b/panda/src/express/pointerTo.h @@ -70,7 +70,7 @@ class PointerTo : public PointerToBase { public: typedef TYPENAME PointerToBase::To To; PUBLISHED: - ALWAYS_INLINE CONSTEXPR PointerTo() NOEXCEPT DEFAULT_CTOR; + CONSTEXPR PointerTo() NOEXCEPT DEFAULT_CTOR; ALWAYS_INLINE PointerTo(To *ptr) NOEXCEPT; INLINE PointerTo(const PointerTo ©); @@ -133,7 +133,7 @@ class ConstPointerTo : public PointerToBase { public: typedef TYPENAME PointerToBase::To To; PUBLISHED: - ALWAYS_INLINE CONSTEXPR ConstPointerTo() NOEXCEPT DEFAULT_CTOR; + CONSTEXPR ConstPointerTo() NOEXCEPT DEFAULT_CTOR; ALWAYS_INLINE ConstPointerTo(const To *ptr) NOEXCEPT; INLINE ConstPointerTo(const PointerTo ©); INLINE ConstPointerTo(const ConstPointerTo ©); diff --git a/panda/src/express/pointerToBase.h b/panda/src/express/pointerToBase.h index 6c20aceb6a..b85e6ec856 100644 --- a/panda/src/express/pointerToBase.h +++ b/panda/src/express/pointerToBase.h @@ -31,7 +31,7 @@ public: typedef T To; protected: - ALWAYS_INLINE CONSTEXPR PointerToBase() NOEXCEPT DEFAULT_CTOR; + CONSTEXPR PointerToBase() NOEXCEPT DEFAULT_CTOR; INLINE PointerToBase(To *ptr); INLINE PointerToBase(const PointerToBase ©); INLINE ~PointerToBase(); diff --git a/panda/src/express/pointerToVoid.I b/panda/src/express/pointerToVoid.I index 2f3cad1aba..ee3a36e303 100644 --- a/panda/src/express/pointerToVoid.I +++ b/panda/src/express/pointerToVoid.I @@ -14,7 +14,7 @@ /** * */ -INLINE CONSTEXPR PointerToVoid:: +CONSTEXPR PointerToVoid:: PointerToVoid() NOEXCEPT : _void_ptr(nullptr) { } @@ -30,7 +30,7 @@ PointerToVoid() NOEXCEPT : _void_ptr(nullptr) { * Returns true if the PointerTo is a NULL pointer, false otherwise. (Direct * comparison to a NULL pointer also works.) */ -ALWAYS_INLINE CONSTEXPR bool PointerToVoid:: +CONSTEXPR bool PointerToVoid:: is_null() const { return _void_ptr == nullptr; } diff --git a/panda/src/express/pointerToVoid.h b/panda/src/express/pointerToVoid.h index 9503084999..0d2c1d33e9 100644 --- a/panda/src/express/pointerToVoid.h +++ b/panda/src/express/pointerToVoid.h @@ -32,14 +32,14 @@ */ class EXPCL_PANDAEXPRESS PointerToVoid : public MemoryBase { protected: - ALWAYS_INLINE CONSTEXPR PointerToVoid() NOEXCEPT; + CONSTEXPR PointerToVoid() NOEXCEPT; //INLINE ~PointerToVoid(); private: PointerToVoid(const PointerToVoid ©) DELETED; PUBLISHED: - ALWAYS_INLINE CONSTEXPR bool is_null() const; + CONSTEXPR bool is_null() const; INLINE size_t get_hash() const; public: diff --git a/panda/src/putil/writableParam.h b/panda/src/putil/writableParam.h index 372613fc99..7bd49ebd30 100644 --- a/panda/src/putil/writableParam.h +++ b/panda/src/putil/writableParam.h @@ -39,7 +39,7 @@ public: private: // The assignment operator cannot be used for this class. - INLINE void operator = (const WritableParam &other) DELETED; + WritableParam &operator = (const WritableParam &other) DELETED_ASSIGN; public: virtual TypeHandle get_type() const { From 5aabd5669716786d6f09caec5b7ede803b042228 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 14 Jan 2017 22:35:38 +0100 Subject: [PATCH 029/254] cppparser: support C++11 raw string literals --- dtool/src/cppparser/cppExpression.cxx | 4 ++ dtool/src/cppparser/cppPreprocessor.cxx | 53 ++++++++++++++++++++++--- dtool/src/cppparser/cppPreprocessor.h | 1 + 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/dtool/src/cppparser/cppExpression.cxx b/dtool/src/cppparser/cppExpression.cxx index f185514de4..13248847a6 100644 --- a/dtool/src/cppparser/cppExpression.cxx +++ b/dtool/src/cppparser/cppExpression.cxx @@ -1558,6 +1558,10 @@ output(ostream &out, int indent_level, CPPScope *scope, bool) const { out << "\\\""; break; + case '\\': + out << "\\\\"; + break; + default: if (isprint(*si)) { out << *si; diff --git a/dtool/src/cppparser/cppPreprocessor.cxx b/dtool/src/cppparser/cppPreprocessor.cxx index feda153530..c6a7dd0b07 100644 --- a/dtool/src/cppparser/cppPreprocessor.cxx +++ b/dtool/src/cppparser/cppPreprocessor.cxx @@ -1870,11 +1870,19 @@ get_identifier(int c) { loc.last_column = get_col_number(); if ((c == '\'' || c == '"') && - (name == "L" || name == "u8" || - name == "u" || name == "U")) { + (name == "L" || name == "u8" || name == "u" || name == "U" || + name == "R" || name == "LR" || name == "u8R" || name == "uR" || name == "UR")) { // This is actually a wide-character or wide-string literal or some such. - // Figure out the correct character type to use. + get(); + string str; + if (name[name.size() - 1] == 'R') { + name.resize(name.size() - 1); + str = scan_raw(c); + } else { + str = scan_quoted(c); + } + // Figure out the correct character type to use. CPPExpression::Type type; if (name == "L") { type = CPPExpression::T_wstring; @@ -1887,8 +1895,6 @@ get_identifier(int c) { } else { type = CPPExpression::T_string; } - get(); - string str = scan_quoted(c); loc.last_line = get_line_number(); loc.last_column = get_col_number(); @@ -2772,6 +2778,43 @@ scan_quoted(int c) { return str; } +/** + * Parses a C++11 raw string. + */ +string CPPPreprocessor:: +scan_raw(int c) { + int quote_mark = c; + + string delimiter = ")"; + + string str; + c = get(); + while (c != EOF && c != '(') { + delimiter += c; + c = get(); + } + + // OK, now start parsing the string, until we see the delimiter again. + c = get(); + while (c != EOF) { + if (c == quote_mark) { + // We encountered a quote mark - did the last part of the string end + // with the given delimiter? If so, we've reached the end. + if (str.compare(str.size() - delimiter.size(), delimiter.size(), delimiter) == 0) { + str.resize(str.size() - delimiter.size()); + break; + } + } + str += c; + c = get(); + } + + if (c != quote_mark) { + warning("Unclosed string"); + } + return str; +} + /** * Returns true if the manifest is one that is being ignored right now * (presumably because we are presently expanding it). diff --git a/dtool/src/cppparser/cppPreprocessor.h b/dtool/src/cppparser/cppPreprocessor.h index e119211596..20f313758a 100644 --- a/dtool/src/cppparser/cppPreprocessor.h +++ b/dtool/src/cppparser/cppPreprocessor.h @@ -166,6 +166,7 @@ private: static int check_keyword(const string &name); int scan_escape_sequence(int c); string scan_quoted(int c); + string scan_raw(int c); bool should_ignore_manifest(const CPPManifest *manifest) const; bool should_ignore_preprocessor() const; From e12420571b898b4481d64e38336a7909bffd4814 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 14 Jan 2017 22:36:31 +0100 Subject: [PATCH 030/254] cppparser: support C++11 lambda expressions --- dtool/src/cppparser/cppBison.yxx | 83 +++++++- dtool/src/cppparser/cppBisonDefs.h | 4 + dtool/src/cppparser/cppClosureType.cxx | 188 ++++++++++++++++++ dtool/src/cppparser/cppClosureType.h | 64 ++++++ dtool/src/cppparser/cppDeclaration.cxx | 8 + dtool/src/cppparser/cppDeclaration.h | 6 + dtool/src/cppparser/cppExpression.cxx | 31 +++ dtool/src/cppparser/cppExpression.h | 3 + dtool/src/cppparser/cppFunctionType.cxx | 36 +++- .../src/cppparser/p3cppParser_composite1.cxx | 1 + 10 files changed, 410 insertions(+), 14 deletions(-) create mode 100755 dtool/src/cppparser/cppClosureType.cxx create mode 100755 dtool/src/cppparser/cppClosureType.h diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 04cdb53a4b..655432c8dc 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -8,6 +8,7 @@ #include "cppBisonDefs.h" #include "cppParser.h" +#include "cppClosureType.h" #include "cppExpression.h" #include "cppSimpleType.h" #include "cppExtensionType.h" @@ -44,6 +45,7 @@ static CPPEnumType *current_enum = NULL; static int current_storage_class = 0; static CPPType *current_type = NULL; static CPPExpression *current_expr = NULL; +static CPPClosureType *current_closure = NULL; static int publish_nest_level = 0; static CPPVisibility publish_previous; static YYLTYPE publish_loc; @@ -363,6 +365,8 @@ pop_struct() { %type function_parameters %type formal_parameter_list %type formal_parameters +%type capture_list +%type capture %type template_parameter_maybe_initialize %type maybe_initialize %type maybe_initialize_or_constructor_body @@ -1221,6 +1225,15 @@ function_post: { $$ = $1 | (int)CPPFunctionType::F_noexcept; } +/* | function_post KW_NOEXCEPT '(' const_expr ')' +{ + CPPExpression::Result result = $4->evaluate(); + if (result._type == CPPExpression::RT_error) { + yywarning("noexcept requires a constant expression", @4); + } else if (result.as_boolean()) { + $$ = $1 | (int)CPPFunctionType::F_noexcept; + } +}*/ | function_post KW_FINAL { $$ = $1 | (int)CPPFunctionType::F_final; @@ -1241,6 +1254,11 @@ function_post: { // Used for lambdas, currently ignored. $$ = $1; +} + | function_post KW_CONSTEXPR +{ + // Used for lambdas in C++17, currently ignored. + $$ = $1; } | function_post KW_THROW '(' ')' { @@ -3468,11 +3486,16 @@ const_operand: } | '[' capture_list ']' function_post maybe_trailing_return_type '{' code '}' { - $$ = NULL; + $2->_flags = $4; + $2->_return_type = $5; + $$ = new CPPExpression(CPPExpression::lambda($2)); } | '[' capture_list ']' '(' function_parameter_list ')' function_post maybe_trailing_return_type '{' code '}' { - $$ = NULL; + $2->_parameters = $5; + $2->_flags = $7; + $2->_return_type = $8; + $$ = new CPPExpression(CPPExpression::lambda($2)); } | KW_HAS_VIRTUAL_DESTRUCTOR '(' full_type ')' { @@ -3794,15 +3817,63 @@ formal_const_operand: /* The contents of the [] list preceding a lambda expression. */ capture_list: empty +{ + $$ = new CPPClosureType(); +} + | '=' +{ + $$ = new CPPClosureType(CPPClosureType::CT_by_value); +} + | '&' +{ + $$ = new CPPClosureType(CPPClosureType::CT_by_reference); +} | capture - | capture ',' capture_list +{ + $$ = new CPPClosureType(); + $$->_captures.push_back(*$1); + delete $1; +} + | capture_list ',' capture +{ + $$ = $1; + $$->_captures.push_back(*$3); + delete $3; +} ; capture: - '&' - | '=' - | '&' name + '&' name +{ + $$ = new CPPClosureType::Capture; + $$->_name = $2->get_simple_name(); + $$->_type = CPPClosureType::CT_by_reference; +} + | '&' name ELLIPSIS +{ + $$ = new CPPClosureType::Capture; + $$->_name = $2->get_simple_name(); + $$->_type = CPPClosureType::CT_by_reference; +} | name +{ + $$ = new CPPClosureType::Capture; + $$->_name = $1->get_simple_name(); + if ($$->_name == "this") { + $$->_type = CPPClosureType::CT_by_reference; + } else { + $$->_type = CPPClosureType::CT_by_value; + } +} + | '*' name +{ + $$ = new CPPClosureType::Capture; + $$->_name = $2->get_simple_name(); + $$->_type = CPPClosureType::CT_by_value; + if ($$->_name != "this") { + yywarning("only capture name 'this' may be preceded by an asterisk", @2); + } +} ; class_derivation_name: diff --git a/dtool/src/cppparser/cppBisonDefs.h b/dtool/src/cppparser/cppBisonDefs.h index b90c47cc20..1ae1caece8 100644 --- a/dtool/src/cppparser/cppBisonDefs.h +++ b/dtool/src/cppparser/cppBisonDefs.h @@ -23,6 +23,7 @@ #include +#include "cppClosureType.h" #include "cppExtensionType.h" #include "cppFile.h" @@ -42,6 +43,7 @@ class CPPParameterList; class CPPTemplateParameterList; class CPPScope; class CPPIdentifier; +class CPPCaptureType; void parse_cpp(CPPParser *cp); CPPExpression *parse_const_expr(CPPPreprocessor *pp, @@ -81,6 +83,8 @@ public: CPPExtensionType::Type extension_enum; CPPExpression *expr; CPPIdentifier *identifier; + CPPClosureType *closure_type; + CPPClosureType::Capture *capture; } u; }; #define YYSTYPE cppyystype diff --git a/dtool/src/cppparser/cppClosureType.cxx b/dtool/src/cppparser/cppClosureType.cxx new file mode 100755 index 0000000000..fe5d99b5ad --- /dev/null +++ b/dtool/src/cppparser/cppClosureType.cxx @@ -0,0 +1,188 @@ +/** + * 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 cppClosureType.cxx + * @author rdb + * @date 2017-01-14 + */ + +#include "cppClosureType.h" + +/** + * + */ +CPPClosureType:: +CPPClosureType(CaptureType default_capture) : + CPPFunctionType(NULL, NULL, 0), + _default_capture(default_capture) { +} + +/** + * + */ +CPPClosureType:: +CPPClosureType(const CPPClosureType ©) : + CPPFunctionType(copy), + _captures(copy._captures), + _default_capture(copy._default_capture) +{ +} + +/** + * + */ +void CPPClosureType:: +operator = (const CPPClosureType ©) { + CPPFunctionType::operator = (copy); + _captures = copy._captures; + _default_capture = copy._default_capture; +} + +/** + * Adds a new capture to the beginning of the capture list. + */ +void CPPClosureType:: +add_capture(string name, CaptureType type) { + if (type == CT_none) { + if (name == "this") { + type = CT_by_reference; + } else { + type = CT_by_value; + } + } + + Capture capture = {move(name), type}; + _captures.insert(_captures.begin(), move(capture)); +} + +/** + * Returns true if this declaration is an actual, factual declaration, or + * false if some part of the declaration depends on a template parameter which + * has not yet been instantiated. + */ +bool CPPClosureType:: +is_fully_specified() const { + return CPPFunctionType::is_fully_specified(); +} + +/** + * Returns true if the type is default-constructible. + */ +bool CPPClosureType:: +is_default_constructible() const { + return false; +} + +/** + * Returns true if the type is copy-constructible. + */ +bool CPPClosureType:: +is_copy_constructible() const { + return true; +} + +/** + * Returns true if the type is destructible. + */ +bool CPPClosureType:: +is_destructible() const { + return true; +} + +/** + * + */ +void CPPClosureType:: +output(ostream &out, int indent_level, CPPScope *scope, bool complete) const { + out.put('['); + + bool have_capture = false; + switch (_default_capture) { + case CT_none: + break; + case CT_by_reference: + out.put('&'); + have_capture = true; + break; + case CT_by_value: + out.put('='); + have_capture = true; + break; + } + + Captures::const_iterator it; + for (it = _captures.begin(); it != _captures.end(); ++it) { + if (have_capture) { + out << ", "; + } + if ((*it)._name == "this") { + if ((*it)._type == CT_by_value) { + out.put('*'); + } + } else { + if ((*it)._type == CT_by_reference) { + out.put('&'); + } + } + out << (*it)._name; + have_capture = true; + } + out.put(']'); + + if (_parameters != NULL) { + out.put('('); + _parameters->output(out, scope, true, -1); + out.put(')'); + } + + if (_flags & F_noexcept) { + out << " noexcept"; + } + + if (_return_type != NULL) { + out << " -> "; + _return_type->output(out, indent_level, scope, false); + } + + out << " {}"; +} + +/** + * + */ +CPPDeclaration::SubType CPPClosureType:: +get_subtype() const { + return ST_closure; +} + +/** + * + */ +CPPClosureType *CPPClosureType:: +as_closure_type() { + return this; +} + +/** + * Called by CPPDeclaration() to determine whether this type is equivalent to + * another type of the same type. + */ +bool CPPClosureType:: +is_equal(const CPPDeclaration *other) const { + return (this == other); +} + + +/** + * Called by CPPDeclaration() to determine whether this type should be ordered + * before another type of the same type, in an arbitrary but fixed ordering. + */ +bool CPPClosureType:: +is_less(const CPPDeclaration *other) const { + return (this < other); +} diff --git a/dtool/src/cppparser/cppClosureType.h b/dtool/src/cppparser/cppClosureType.h new file mode 100755 index 0000000000..c682c6adca --- /dev/null +++ b/dtool/src/cppparser/cppClosureType.h @@ -0,0 +1,64 @@ +/** + * 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 cppClosureType.h + * @author rdb + * @date 2017-01-14 + */ + +#ifndef CPPCLOSURETYPE_H +#define CPPCLOSURETYPE_H + +#include "dtoolbase.h" + +#include "cppFunctionType.h" + +/** + * The type of a lambda expression. This is like a function, but with + * additional captures defined. + */ +class CPPClosureType : public CPPFunctionType { +public: + enum CaptureType { + CT_none, + CT_by_reference, + CT_by_value, + }; + + CPPClosureType(CaptureType default_capture = CT_none); + CPPClosureType(const CPPClosureType ©); + void operator = (const CPPClosureType ©); + + struct Capture { + string _name; + CaptureType _type; + }; + typedef vector Captures; + Captures _captures; + + CaptureType _default_capture; + + void add_capture(string name, CaptureType type); + + virtual bool is_fully_specified() const; + + virtual bool is_default_constructible() const; + virtual bool is_copy_constructible() const; + virtual bool is_destructible() const; + + virtual void output(ostream &out, int indent_level, CPPScope *scope, + bool complete) const; + virtual SubType get_subtype() const; + virtual CPPClosureType *as_closure_type(); + +protected: + virtual bool is_equal(const CPPDeclaration *other) const; + virtual bool is_less(const CPPDeclaration *other) const; +}; + +#endif diff --git a/dtool/src/cppparser/cppDeclaration.cxx b/dtool/src/cppparser/cppDeclaration.cxx index 76f72c43e0..3d2e5e68f5 100644 --- a/dtool/src/cppparser/cppDeclaration.cxx +++ b/dtool/src/cppparser/cppDeclaration.cxx @@ -311,6 +311,14 @@ as_make_seq() { return (CPPMakeSeq *)NULL; } +/** + * + */ +CPPClosureType *CPPDeclaration:: +as_closure_type() { + return (CPPClosureType *)NULL; +} + /** * Called by CPPDeclaration to determine whether this type is equivalent to * another type of the same type. diff --git a/dtool/src/cppparser/cppDeclaration.h b/dtool/src/cppparser/cppDeclaration.h index a06baa3123..8acaf6e50c 100644 --- a/dtool/src/cppparser/cppDeclaration.h +++ b/dtool/src/cppparser/cppDeclaration.h @@ -48,6 +48,7 @@ class CPPEnumType; class CPPTypeProxy; class CPPMakeProperty; class CPPMakeSeq; +class CPPClosureType; class CPPClassTemplateParameter; class CPPTBDType; class CPPScope; @@ -85,6 +86,7 @@ public: ST_tbd, ST_type_proxy, ST_typedef, + ST_closure, }; CPPDeclaration(const CPPFile &file); @@ -140,6 +142,7 @@ public: virtual CPPTypeProxy *as_type_proxy(); virtual CPPMakeProperty *as_make_property(); virtual CPPMakeSeq *as_make_seq(); + virtual CPPClosureType *as_closure_type(); inline const CPPInstance *as_instance() const { return ((CPPDeclaration *)this)->as_instance(); @@ -207,6 +210,9 @@ public: inline const CPPMakeSeq *as_make_seq() const { return ((CPPDeclaration *)this)->as_make_seq(); } + inline const CPPClosureType *as_closure_type() const { + return ((CPPDeclaration *)this)->as_closure_type(); + } CPPVisibility _vis; CPPTemplateScope *_template_scope; diff --git a/dtool/src/cppparser/cppExpression.cxx b/dtool/src/cppparser/cppExpression.cxx index 13248847a6..a891f4ecf6 100644 --- a/dtool/src/cppparser/cppExpression.cxx +++ b/dtool/src/cppparser/cppExpression.cxx @@ -24,6 +24,7 @@ #include "cppInstance.h" #include "cppFunctionGroup.h" #include "cppFunctionType.h" +#include "cppClosureType.h" #include "cppStructType.h" #include "cppBison.h" #include "pdtoa.h" @@ -438,6 +439,17 @@ alignof_func(CPPType *type) { return expr; } +/** + * + */ +CPPExpression CPPExpression:: +lambda(CPPClosureType *type) { + CPPExpression expr(0); + expr._type = T_lambda; + expr._u._closure_type = type; + return expr; +} + /** * */ @@ -1169,6 +1181,9 @@ determine_type() const { case T_type_trait: return bool_type; + case T_lambda: + return _u._closure_type; + default: cerr << "**invalid operand**\n"; abort(); @@ -1259,6 +1274,9 @@ is_fully_specified() const { case T_type_trait: return _u._type_trait._type->is_fully_specified(); + case T_lambda: + return _u._closure_type->is_fully_specified(); + default: return true; } @@ -1478,6 +1496,9 @@ is_tbd() const { case T_type_trait: return _u._type_trait._type->is_tbd(); + case T_lambda: + return _u._closure_type->is_tbd(); + default: return false; } @@ -1950,6 +1971,10 @@ output(ostream &out, int indent_level, CPPScope *scope, bool) const { out << ')'; break; + case T_lambda: + _u._closure_type->output(out, indent_level, scope, false); + break; + default: out << "(** invalid operand type " << (int)_type << " **)"; } @@ -2109,6 +2134,9 @@ is_equal(const CPPDeclaration *other) const { return _u._type_trait._trait == ot->_u._type_trait._trait && _u._type_trait._type == ot->_u._type_trait._type; + case T_lambda: + return _u._closure_type == ot->_u._closure_type; + default: cerr << "(** invalid operand type " << (int)_type << " **)"; } @@ -2216,6 +2244,9 @@ is_less(const CPPDeclaration *other) const { } return *_u._type_trait._type < *ot->_u._type_trait._type; + case T_lambda: + return _u._closure_type < ot->_u._closure_type; + default: cerr << "(** invalid operand type " << (int)_type << " **)"; } diff --git a/dtool/src/cppparser/cppExpression.h b/dtool/src/cppparser/cppExpression.h index c3483ef3e9..2cdb297c36 100644 --- a/dtool/src/cppparser/cppExpression.h +++ b/dtool/src/cppparser/cppExpression.h @@ -61,6 +61,7 @@ public: T_typeid_type, T_typeid_expr, T_type_trait, + T_lambda, // These are used when parsing =default and =delete methods. T_default, @@ -87,6 +88,7 @@ public: static CPPExpression sizeof_func(CPPType *type); static CPPExpression sizeof_ellipsis_func(CPPIdentifier *ident); static CPPExpression alignof_func(CPPType *type); + static CPPExpression lambda(CPPClosureType *type); static CPPExpression literal(unsigned long long value, CPPInstance *lit_op); static CPPExpression literal(long double value, CPPInstance *lit_op); @@ -150,6 +152,7 @@ public: CPPInstance *_variable; CPPFunctionGroup *_fgroup; CPPIdentifier *_ident; + CPPClosureType *_closure_type; struct { union { CPPType *_type; diff --git a/dtool/src/cppparser/cppFunctionType.cxx b/dtool/src/cppparser/cppFunctionType.cxx index 1872ea11f5..d016695bf8 100644 --- a/dtool/src/cppparser/cppFunctionType.cxx +++ b/dtool/src/cppparser/cppFunctionType.cxx @@ -31,7 +31,8 @@ CPPFunctionType(CPPType *return_type, CPPParameterList *parameters, // If the parameter list contains just the token "void", it means no // parameters. - if (_parameters->_parameters.size() == 1 && + if (_parameters != NULL && + _parameters->_parameters.size() == 1 && _parameters->_parameters.front()->_type->as_simple_type() != NULL && _parameters->_parameters.front()->_type->as_simple_type()->_type == CPPSimpleType::T_void && @@ -95,8 +96,10 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, ->as_type(); } - rep->_parameters = - _parameters->substitute_decl(subst, current_scope, global_scope); + if (_parameters != NULL) { + rep->_parameters = + _parameters->substitute_decl(subst, current_scope, global_scope); + } if (rep->_return_type == _return_type && rep->_parameters == _parameters) { @@ -117,8 +120,12 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, CPPType *CPPFunctionType:: resolve_type(CPPScope *current_scope, CPPScope *global_scope) { CPPType *rtype = _return_type->resolve_type(current_scope, global_scope); - CPPParameterList *params = - _parameters->resolve_type(current_scope, global_scope); + CPPParameterList *params; + if (_parameters == NULL) { + params = NULL; + } else { + params = _parameters->resolve_type(current_scope, global_scope); + } if (rtype != _return_type || params != _parameters) { CPPFunctionType *rep = new CPPFunctionType(*this); @@ -139,7 +146,7 @@ is_tbd() const { if (_return_type->is_tbd()) { return true; } - return _parameters->is_tbd(); + return _parameters == NULL || _parameters->is_tbd(); } /** @@ -294,6 +301,10 @@ get_num_default_parameters() const { // The trick is just to count, beginning from the end and working towards // the front, the number of parameters that have some initializer. + if (_parameters == NULL) { + return 0; + } + const CPPParameterList::Parameters ¶ms = _parameters->_parameters; CPPParameterList::Parameters::const_reverse_iterator pi; int count = 0; @@ -362,7 +373,11 @@ is_equal(const CPPDeclaration *other) const { if (_flags != ot->_flags) { return false; } - if (*_parameters != *ot->_parameters) { + if (_parameters == ot->_parameters) { + return true; + } + if (_parameters == NULL || ot->_parameters == NULL || + *_parameters != *ot->_parameters) { return false; } return true; @@ -384,6 +399,11 @@ is_less(const CPPDeclaration *other) const { if (_flags != ot->_flags) { return _flags < ot->_flags; } - + if (_parameters == ot->_parameters) { + return 0; + } + if (_parameters == NULL || ot->_parameters == NULL) { + return _parameters < ot->_parameters; + } return *_parameters < *ot->_parameters; } diff --git a/dtool/src/cppparser/p3cppParser_composite1.cxx b/dtool/src/cppparser/p3cppParser_composite1.cxx index 8b60e60a17..e8020dd64d 100644 --- a/dtool/src/cppparser/p3cppParser_composite1.cxx +++ b/dtool/src/cppparser/p3cppParser_composite1.cxx @@ -2,6 +2,7 @@ #include "cppFunctionType.cxx" #include "cppGlobals.cxx" #include "cppCommentBlock.cxx" +#include "cppClosureType.cxx" #include "cppConstType.cxx" #include "cppDeclaration.cxx" #include "cppMakeProperty.cxx" From e2771d39a95915c7e9a64470a3b610516569f3a9 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 15 Jan 2017 15:39:34 +0100 Subject: [PATCH 031/254] cppparser: support for various C++11/C++14/C++17 features: - decltype(auto) - attributes (ie. [[deprecated]]), incl. with C++17 "using" - extern template class (parses) - sizeof struct members - aggregate initialization - initializers in capture lists - alignas (parses) --- dtool/src/cppparser/cppBison.yxx | 138 ++++++++++++++++++------ dtool/src/cppparser/cppClosureType.cxx | 19 ++-- dtool/src/cppparser/cppClosureType.h | 3 +- dtool/src/cppparser/cppExpression.cxx | 65 ++++++++++- dtool/src/cppparser/cppExpression.h | 3 + dtool/src/cppparser/cppFunctionType.cxx | 25 +++++ dtool/src/cppparser/cppFunctionType.h | 2 + dtool/src/cppparser/cppPreprocessor.cxx | 22 ++++ dtool/src/cppparser/cppPreprocessor.h | 1 + dtool/src/cppparser/cppToken.cxx | 8 ++ 10 files changed, 243 insertions(+), 43 deletions(-) diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 655432c8dc..8c0e9bf982 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -249,6 +249,8 @@ pop_struct() { %token XOREQUAL %token LSHIFTEQUAL %token RSHIFTEQUAL +%token ATTR_LEFT +%token ATTR_RIGHT %token KW_ALIGNAS %token KW_ALIGNOF @@ -874,10 +876,18 @@ storage_class: { $$ = $2 | (int)CPPInstance::SC_thread_local; } - | '[' '[' attribute_specifiers ']' ']' storage_class + | ATTR_LEFT attribute_specifiers ATTR_RIGHT storage_class { // Ignore attribute specifiers for now. - $$ = $6; + $$ = $4; +} + | KW_ALIGNAS '(' const_expr ')' storage_class +{ + $$ = $5; +} + | KW_ALIGNAS '(' type_decl ')' storage_class +{ + $$ = $5; } ; @@ -889,6 +899,7 @@ attribute_specifiers: attribute_specifier: name | name '(' formal_parameter_list ')' + | KW_USING name ':' attribute_specifier ; type_like_declaration: @@ -1272,10 +1283,10 @@ function_post: { $$ = $1; } -/* | function_post '[' '[' attribute_specifiers ']' ']' + | function_post ATTR_LEFT attribute_specifiers ATTR_RIGHT { $$ = $1; -}*/ +} ; function_operator: @@ -1443,7 +1454,8 @@ more_template_declaration: ; template_declaration: - KW_TEMPLATE + KW_EXTERN template_declaration + | KW_TEMPLATE { push_scope(new CPPTemplateScope(current_scope)); } @@ -1451,7 +1463,7 @@ template_declaration: { pop_scope(); } - | KW_TEMPLATE type_like_declaration + | KW_TEMPLATE type_like_declaration ; template_formal_parameters: @@ -1903,6 +1915,10 @@ function_parameter: | KW_REGISTER function_parameter { $$ = $2; +} + | ATTR_LEFT attribute_specifiers ATTR_RIGHT function_parameter +{ + $$ = $4; } ; @@ -2246,16 +2262,16 @@ type: { $$ = CPPType::new_type($1); } - | struct_keyword name + | struct_keyword struct_attributes name { - CPPType *type = $2->find_type(current_scope, global_scope, false, current_lexer); + CPPType *type = $3->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { $$ = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType($1, $2, current_scope, @1.file)) + CPPType::new_type(new CPPExtensionType($1, $3, current_scope, @1.file)) ->as_extension_type(); - CPPScope *scope = $2->get_scope(current_scope, global_scope); + CPPScope *scope = $3->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } @@ -2286,6 +2302,10 @@ type: str << *$3; yyerror("could not determine type of " + str.str(), @3); } +} + | KW_DECLTYPE '(' KW_AUTO ')' +{ + $$ = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } | KW_UNDERLYING_TYPE '(' full_type ')' { @@ -2343,16 +2363,16 @@ type_decl: { $$ = new CPPTypeDeclaration(CPPType::new_type($1)); } - | struct_keyword name + | struct_keyword struct_attributes name { - CPPType *type = $2->find_type(current_scope, global_scope, false, current_lexer); + CPPType *type = $3->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { $$ = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType($1, $2, current_scope, @1.file)) + CPPType::new_type(new CPPExtensionType($1, $3, current_scope, @1.file)) ->as_extension_type(); - CPPScope *scope = $2->get_scope(current_scope, global_scope); + CPPScope *scope = $3->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } @@ -2401,6 +2421,10 @@ type_decl: str << *$3; yyerror("could not determine type of " + str.str(), @3); } +} + | KW_DECLTYPE '(' KW_AUTO ')' +{ + $$ = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } | KW_UNDERLYING_TYPE '(' full_type ')' { @@ -2435,16 +2459,16 @@ predefined_type: { $$ = CPPType::new_type(new CPPTBDType($2)); } - | struct_keyword name + | struct_keyword struct_attributes name { - CPPType *type = $2->find_type(current_scope, global_scope, false, current_lexer); + CPPType *type = $3->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { $$ = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType($1, $2, current_scope, @1.file)) + CPPType::new_type(new CPPExtensionType($1, $3, current_scope, @1.file)) ->as_extension_type(); - CPPScope *scope = $2->get_scope(current_scope, global_scope); + CPPScope *scope = $3->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } @@ -2525,8 +2549,15 @@ full_type: } ; +struct_attributes: + empty + | struct_attributes ATTR_LEFT attribute_specifiers ATTR_RIGHT + | struct_attributes KW_ALIGNAS '(' const_expr ')' + | struct_attributes KW_ALIGNAS '(' type_decl ')' + ; + anonymous_struct: - struct_keyword '{' + struct_keyword struct_attributes '{' { CPPVisibility starting_vis = ($1 == CPPExtensionType::T_class) ? V_private : V_public; @@ -2550,19 +2581,19 @@ anonymous_struct: ; named_struct: - struct_keyword name_no_final + struct_keyword struct_attributes name_no_final { CPPVisibility starting_vis = ($1 == CPPExtensionType::T_class) ? V_private : V_public; - CPPScope *scope = $2->get_scope(current_scope, global_scope, current_lexer); + CPPScope *scope = $3->get_scope(current_scope, global_scope, current_lexer); if (scope == NULL) { scope = current_scope; } - CPPScope *new_scope = new CPPScope(scope, $2->_names.back(), + CPPScope *new_scope = new CPPScope(scope, $3->_names.back(), starting_vis); - CPPStructType *st = new CPPStructType($1, $2, current_scope, + CPPStructType *st = new CPPStructType($1, $3, current_scope, new_scope, @1.file); new_scope->set_struct_type(st); current_scope->define_extension_type(st); @@ -2945,6 +2976,7 @@ element: | SCOPE | PLUSPLUS | MINUSMINUS | TIMESEQUAL | DIVIDEEQUAL | MODEQUAL | PLUSEQUAL | MINUSEQUAL | OREQUAL | ANDEQUAL | XOREQUAL | LSHIFTEQUAL | RSHIFTEQUAL + | ATTR_LEFT | ATTR_RIGHT | KW_ALIGNAS | KW_ALIGNOF | KW_AUTO | KW_BOOL | KW_CATCH | KW_CHAR | KW_CHAR16_T | KW_CHAR32_T | KW_CLASS | KW_CONST | KW_CONSTEXPR | KW_CONST_CAST | KW_DECLTYPE | KW_DEFAULT @@ -3028,6 +3060,18 @@ no_angle_bracket_const_expr: | KW_SIZEOF '(' full_type ')' %prec UNARY { $$ = new CPPExpression(CPPExpression::sizeof_func($3)); +} + | KW_SIZEOF '(' IDENTIFIER ')' %prec UNARY +{ + CPPDeclaration *arg = $3->find_symbol(current_scope, global_scope, current_lexer); + if (arg == (CPPDeclaration *)NULL) { + yyerror("undefined sizeof argument: " + $3->get_fully_scoped_name(), @3); + } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { + CPPInstance *inst = arg->as_instance(); + $$ = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); + } else { + $$ = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); + } } | KW_SIZEOF ELLIPSIS '(' name ')' %prec UNARY { @@ -3190,6 +3234,16 @@ const_expr: } assert(type != NULL); $$ = new CPPExpression(CPPExpression::construct_op(type, $3)); +} + | TYPENAME_IDENTIFIER '{' optional_const_expr_comma '}' +{ + // Aggregate initialization. + CPPType *type = $1->find_type(current_scope, global_scope, false, current_lexer); + if (type == NULL) { + yyerror(string("internal error resolving type ") + $1->get_fully_scoped_name(), @1); + } + assert(type != NULL); + $$ = new CPPExpression(CPPExpression::aggregate_init_op(type, $3)); } | KW_INT '(' optional_const_expr_comma ')' { @@ -3270,6 +3324,18 @@ const_expr: | KW_SIZEOF '(' full_type ')' %prec UNARY { $$ = new CPPExpression(CPPExpression::sizeof_func($3)); +} + | KW_SIZEOF '(' IDENTIFIER ')' %prec UNARY +{ + CPPDeclaration *arg = $3->find_symbol(current_scope, global_scope, current_lexer); + if (arg == (CPPDeclaration *)NULL) { + yyerror("undefined sizeof argument: " + $3->get_fully_scoped_name(), @3); + } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { + CPPInstance *inst = arg->as_instance(); + $$ = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); + } else { + $$ = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); + } } | KW_SIZEOF ELLIPSIS '(' name ')' %prec UNARY { @@ -3602,6 +3668,18 @@ formal_const_expr: | KW_SIZEOF '(' full_type ')' %prec UNARY { $$ = new CPPExpression(CPPExpression::sizeof_func($3)); +} + | KW_SIZEOF '(' IDENTIFIER ')' %prec UNARY +{ + CPPDeclaration *arg = $3->find_symbol(current_scope, global_scope, current_lexer); + if (arg == (CPPDeclaration *)NULL) { + yyerror("undefined sizeof argument: " + $3->get_fully_scoped_name(), @3); + } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { + CPPInstance *inst = arg->as_instance(); + $$ = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); + } else { + $$ = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); + } } | KW_SIZEOF ELLIPSIS '(' name ')' %prec UNARY { @@ -3828,15 +3906,17 @@ capture_list: { $$ = new CPPClosureType(CPPClosureType::CT_by_reference); } - | capture + | capture maybe_initialize { $$ = new CPPClosureType(); + $1->_initializer = $2; $$->_captures.push_back(*$1); delete $1; } - | capture_list ',' capture + | capture_list ',' capture maybe_initialize { $$ = $1; + $3->_initializer = $4; $$->_captures.push_back(*$3); delete $3; } @@ -3884,14 +3964,6 @@ class_derivation_name: type = CPPType::new_type(new CPPTBDType($1)); } $$ = type; -} - | struct_keyword name -{ - CPPType *type = $2->find_type(current_scope, global_scope, true, current_lexer); - if (type == NULL) { - type = CPPType::new_type(new CPPTBDType($2)); - } - $$ = type; } | KW_TYPENAME name { diff --git a/dtool/src/cppparser/cppClosureType.cxx b/dtool/src/cppparser/cppClosureType.cxx index fe5d99b5ad..cf8ec31143 100755 --- a/dtool/src/cppparser/cppClosureType.cxx +++ b/dtool/src/cppparser/cppClosureType.cxx @@ -12,6 +12,7 @@ */ #include "cppClosureType.h" +#include "cppExpression.h" /** * @@ -47,7 +48,7 @@ operator = (const CPPClosureType ©) { * Adds a new capture to the beginning of the capture list. */ void CPPClosureType:: -add_capture(string name, CaptureType type) { +add_capture(string name, CaptureType type, CPPExpression *initializer) { if (type == CT_none) { if (name == "this") { type = CT_by_reference; @@ -56,7 +57,7 @@ add_capture(string name, CaptureType type) { } } - Capture capture = {move(name), type}; + Capture capture = {move(name), type, initializer}; _captures.insert(_captures.begin(), move(capture)); } @@ -117,19 +118,25 @@ output(ostream &out, int indent_level, CPPScope *scope, bool complete) const { Captures::const_iterator it; for (it = _captures.begin(); it != _captures.end(); ++it) { + const Capture &capture = *it; if (have_capture) { out << ", "; } - if ((*it)._name == "this") { - if ((*it)._type == CT_by_value) { + if (capture._name == "this") { + if (capture._type == CT_by_value) { out.put('*'); } } else { - if ((*it)._type == CT_by_reference) { + if (capture._type == CT_by_reference) { out.put('&'); } } - out << (*it)._name; + out << capture._name; + + if (capture._initializer != NULL) { + out << " = " << *capture._initializer; + } + have_capture = true; } out.put(']'); diff --git a/dtool/src/cppparser/cppClosureType.h b/dtool/src/cppparser/cppClosureType.h index c682c6adca..9c3533ad4a 100755 --- a/dtool/src/cppparser/cppClosureType.h +++ b/dtool/src/cppparser/cppClosureType.h @@ -37,13 +37,14 @@ public: struct Capture { string _name; CaptureType _type; + CPPExpression *_initializer; }; typedef vector Captures; Captures _captures; CaptureType _default_capture; - void add_capture(string name, CaptureType type); + void add_capture(string name, CaptureType type, CPPExpression *initializer = NULL); virtual bool is_fully_specified() const; diff --git a/dtool/src/cppparser/cppExpression.cxx b/dtool/src/cppparser/cppExpression.cxx index a891f4ecf6..0dff4f64b8 100644 --- a/dtool/src/cppparser/cppExpression.cxx +++ b/dtool/src/cppparser/cppExpression.cxx @@ -257,13 +257,12 @@ CPPExpression(CPPIdentifier *ident, CPPScope *current_scope, _u._variable = inst; return; } - // Actually, we can't scope function groups. - /*CPPFunctionGroup *fgroup = decl->as_function_group(); + CPPFunctionGroup *fgroup = decl->as_function_group(); if (fgroup != NULL) { _type = T_function; _u._fgroup = fgroup; return; - }*/ + } } _type = T_unknown_ident; @@ -347,6 +346,22 @@ construct_op(CPPType *type, CPPExpression *op1) { return expr; } +/** + * Creates an expression that represents an aggregate initialization. + */ +CPPExpression CPPExpression:: +aggregate_init_op(CPPType *type, CPPExpression *op1) { + CPPExpression expr(0); + if (op1 == NULL) { + expr._type = T_empty_aggregate_init; + } else { + expr._type = T_aggregate_init; + } + expr._u._typecast._to = type; + expr._u._typecast._op1 = op1; + return expr; +} + /** * Creates an expression that represents a use of the new operator. */ @@ -606,6 +621,8 @@ evaluate() const { case T_construct: case T_default_construct: + case T_aggregate_init: + case T_empty_aggregate_init: case T_new: case T_default_new: case T_sizeof: @@ -1029,6 +1046,8 @@ determine_type() const { case T_reinterpret_cast: case T_construct: case T_default_construct: + case T_aggregate_init: + case T_empty_aggregate_init: return _u._typecast._to; case T_new: @@ -1147,10 +1166,28 @@ determine_type() const { case 'f': // Function evaluation if (t1 != NULL) { + // Easy case, function with only a single overload. CPPFunctionType *ftype = t1->as_function_type(); if (ftype != (CPPFunctionType *)NULL) { return ftype->_return_type; } + } else if (_u._op._op1->_type == T_function) { + CPPFunctionGroup *fgroup = _u._op._op1->_u._fgroup; + if (_u._op._op2 == NULL) { + // If we are passing no args, look for an overload that has takes no + // args. + for (auto it = fgroup->_instances.begin(); it != fgroup->_instances.end(); ++it) { + CPPInstance *inst = *it; + if (inst != NULL && inst->_type != NULL) { + CPPFunctionType *type = inst->_type->as_function_type(); + if (type != NULL && type->accepts_num_parameters(0)) { + return type->_return_type; + } + } + } + } else { + //TODO + } } return NULL; @@ -1230,11 +1267,13 @@ is_fully_specified() const { case T_const_cast: case T_reinterpret_cast: case T_construct: + case T_aggregate_init: case T_new: return (_u._typecast._to->is_fully_specified() && _u._typecast._op1->is_fully_specified()); case T_default_construct: + case T_empty_aggregate_init: case T_default_new: case T_sizeof: case T_alignof: @@ -1360,6 +1399,7 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, case T_const_cast: case T_reinterpret_cast: case T_construct: + case T_aggregate_init: case T_new: rep->_u._typecast._op1 = _u._typecast._op1->substitute_decl(subst, current_scope, global_scope) @@ -1368,6 +1408,7 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, // fall through case T_default_construct: + case T_empty_aggregate_init: case T_default_new: case T_sizeof: case T_alignof: @@ -1462,6 +1503,8 @@ is_tbd() const { case T_const_cast: case T_reinterpret_cast: case T_construct: + case T_aggregate_init: + case T_empty_aggregate_init: case T_new: case T_default_construct: case T_default_new: @@ -1674,6 +1717,18 @@ output(ostream &out, int indent_level, CPPScope *scope, bool) const { out << "()"; break; + case T_aggregate_init: + _u._typecast._to->output(out, indent_level, scope, false); + out << "{"; + _u._typecast._op1->output(out, indent_level, scope, false); + out << "}"; + break; + + case T_empty_aggregate_init: + _u._typecast._to->output(out, indent_level, scope, false); + out << "{}"; + break; + case T_new: out << "(new "; _u._typecast._to->output(out, indent_level, scope, false); @@ -2095,11 +2150,13 @@ is_equal(const CPPDeclaration *other) const { case T_const_cast: case T_reinterpret_cast: case T_construct: + case T_aggregate_init: case T_new: return _u._typecast._to == ot->_u._typecast._to && *_u._typecast._op1 == *ot->_u._typecast._op1; case T_default_construct: + case T_empty_aggregate_init: case T_default_new: case T_sizeof: case T_alignof: @@ -2193,6 +2250,7 @@ is_less(const CPPDeclaration *other) const { case T_const_cast: case T_reinterpret_cast: case T_construct: + case T_aggregate_init: case T_new: if (_u._typecast._to != ot->_u._typecast._to) { return _u._typecast._to < ot->_u._typecast._to; @@ -2200,6 +2258,7 @@ is_less(const CPPDeclaration *other) const { return *_u._typecast._op1 < *ot->_u._typecast._op1; case T_default_construct: + case T_empty_aggregate_init: case T_default_new: case T_sizeof: case T_alignof: diff --git a/dtool/src/cppparser/cppExpression.h b/dtool/src/cppparser/cppExpression.h index 2cdb297c36..3178d4d178 100644 --- a/dtool/src/cppparser/cppExpression.h +++ b/dtool/src/cppparser/cppExpression.h @@ -48,6 +48,8 @@ public: T_reinterpret_cast, T_construct, T_default_construct, + T_aggregate_init, + T_empty_aggregate_init, T_new, T_default_new, T_sizeof, @@ -81,6 +83,7 @@ public: static CPPExpression typecast_op(CPPType *type, CPPExpression *op1, Type cast_type = T_typecast); static CPPExpression construct_op(CPPType *type, CPPExpression *op1); + static CPPExpression aggregate_init_op(CPPType *type, CPPExpression *op1); static CPPExpression new_op(CPPType *type, CPPExpression *op1 = NULL); static CPPExpression typeid_op(CPPType *type, CPPType *std_type_info); static CPPExpression typeid_op(CPPExpression *op1, CPPType *std_type_info); diff --git a/dtool/src/cppparser/cppFunctionType.cxx b/dtool/src/cppparser/cppFunctionType.cxx index d016695bf8..38eb3d98ba 100644 --- a/dtool/src/cppparser/cppFunctionType.cxx +++ b/dtool/src/cppparser/cppFunctionType.cxx @@ -66,6 +66,31 @@ operator = (const CPPFunctionType ©) { _class_owner = copy._class_owner; } +/** + * Returns true if the function accepts the given number of parameters. + */ +bool CPPFunctionType:: +accepts_num_parameters(int num_parameters) { + if (_parameters == NULL) { + return (num_parameters == 0); + } + size_t actual_num_parameters = _parameters->_parameters.size(); + // If we passed too many parameters, it must have an ellipsis. + if (num_parameters > actual_num_parameters) { + return _parameters->_includes_ellipsis; + } + + // Make sure all superfluous parameters have a default value. + for (size_t i = num_parameters; i < actual_num_parameters; ++i) { + CPPInstance *param = _parameters->_parameters[i]; + if (param->_initializer == NULL) { + return false; + } + } + + return true; +} + /** * Returns true if this declaration is an actual, factual declaration, or * false if some part of the declaration depends on a template parameter which diff --git a/dtool/src/cppparser/cppFunctionType.h b/dtool/src/cppparser/cppFunctionType.h index 1e44681f13..a5a66976b0 100644 --- a/dtool/src/cppparser/cppFunctionType.h +++ b/dtool/src/cppparser/cppFunctionType.h @@ -50,6 +50,8 @@ public: CPPFunctionType(const CPPFunctionType ©); void operator = (const CPPFunctionType ©); + bool accepts_num_parameters(int num_parameters); + CPPType *_return_type; CPPParameterList *_parameters; int _flags; diff --git a/dtool/src/cppparser/cppPreprocessor.cxx b/dtool/src/cppparser/cppPreprocessor.cxx index c6a7dd0b07..6a24d9eb69 100644 --- a/dtool/src/cppparser/cppPreprocessor.cxx +++ b/dtool/src/cppparser/cppPreprocessor.cxx @@ -209,6 +209,7 @@ CPPPreprocessor() { _state = S_eof; _paren_nesting = 0; _parsing_template_params = false; + _parsing_attribute = false; _unget = '\0'; _last_c = '\0'; _start_of_line = true; @@ -986,6 +987,13 @@ internal_get_next_token() { return CPPToken(0, loc); } } + } else if (_parsing_attribute) { + // If we're parsing an attribute, also keep track of the paren nesting. + if (c == '[' || c == '(') { + ++_paren_nesting; + } else if (c == ']' || c == ')') { + --_paren_nesting; + } } // Look for an end-of-line comment, and parse it before we finish this @@ -1090,6 +1098,20 @@ check_digraph(int c) { if (next_c == '=') return MODEQUAL; if (next_c == '>') return '}'; break; + + case '[': + if (next_c == '[' && !_parsing_attribute) { + _parsing_attribute = true; + return ATTR_LEFT; + } + break; + + case ']': + if (next_c == ']' && _parsing_attribute && _paren_nesting == 0) { + _parsing_attribute = false; + return ATTR_RIGHT; + } + break; } return 0; diff --git a/dtool/src/cppparser/cppPreprocessor.h b/dtool/src/cppparser/cppPreprocessor.h index 20f313758a..02f3715339 100644 --- a/dtool/src/cppparser/cppPreprocessor.h +++ b/dtool/src/cppparser/cppPreprocessor.h @@ -213,6 +213,7 @@ private: State _state; int _paren_nesting; bool _parsing_template_params; + bool _parsing_attribute; bool _start_of_line; int _unget; diff --git a/dtool/src/cppparser/cppToken.cxx b/dtool/src/cppparser/cppToken.cxx index 025590113a..d2e00982dc 100644 --- a/dtool/src/cppparser/cppToken.cxx +++ b/dtool/src/cppparser/cppToken.cxx @@ -252,6 +252,14 @@ output(ostream &out) const { out << "RSHIFTEQUAL"; break; + case ATTR_LEFT: + out << "ATTR_LEFT"; + break; + + case ATTR_RIGHT: + out << "ATTR_RIGHT"; + break; + case KW_BOOL: out << "KW_BOOL"; break; From c0191a3126ee00dccf4fca5287180e123eb736c4 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 17 Jan 2017 22:51:04 +0100 Subject: [PATCH 032/254] cppparser: update cppBison prebuilt files --- dtool/src/cppparser/cppBison.cxx.prebuilt | 11855 +++++++++++--------- dtool/src/cppparser/cppBison.h.prebuilt | 529 +- 2 files changed, 6647 insertions(+), 5737 deletions(-) diff --git a/dtool/src/cppparser/cppBison.cxx.prebuilt b/dtool/src/cppparser/cppBison.cxx.prebuilt index 877a9636e1..63f0b0ea17 100644 --- a/dtool/src/cppparser/cppBison.cxx.prebuilt +++ b/dtool/src/cppparser/cppBison.cxx.prebuilt @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 2.7. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. 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 @@ -44,13 +44,13 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.0.4" +#define YYBISON_VERSION "2.7" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ -#define YYPURE 2 +#define YYPURE 1 /* Push parsers. */ #define YYPUSH 0 @@ -63,16 +63,20 @@ #define yyparse cppyyparse #define yylex cppyylex #define yyerror cppyyerror +#define yylval cppyylval +#define yychar cppyychar #define yydebug cppyydebug #define yynerrs cppyynerrs - +#define yylloc cppyylloc /* Copy the first part of user declarations. */ -#line 7 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:339 */ +/* Line 371 of yacc.c */ +#line 7 "dtool/src/cppparser/cppBison.yxx" #include "cppBisonDefs.h" #include "cppParser.h" +#include "cppClosureType.h" #include "cppExpression.h" #include "cppSimpleType.h" #include "cppExtensionType.h" @@ -109,6 +113,7 @@ static CPPEnumType *current_enum = NULL; static int current_storage_class = 0; static CPPType *current_type = NULL; static CPPExpression *current_expr = NULL; +static CPPClosureType *current_closure = NULL; static int publish_nest_level = 0; static CPPVisibility publish_previous; static YYLTYPE publish_loc; @@ -262,13 +267,14 @@ pop_struct() { } -#line 266 "built/tmp/cppBison.yxx.c" /* yacc.c:339 */ +/* Line 371 of yacc.c */ +#line 272 "built_x64/tmp/cppBison.yxx.c" -# ifndef YY_NULLPTR +# ifndef YY_NULL # if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULLPTR nullptr +# define YY_NULL nullptr # else -# define YY_NULLPTR 0 +# define YY_NULL 0 # endif # endif @@ -282,9 +288,9 @@ pop_struct() { /* In a future release of Bison, this section will be replaced by #include "cppBison.yxx.h". */ -#ifndef YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED -# define YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED -/* Debug traces. */ +#ifndef YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED +# define YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED +/* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif @@ -292,153 +298,156 @@ pop_struct() { extern int cppyydebug; #endif -/* Token type. */ +/* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - 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, - TYPEPACK_IDENTIFIER = 267, - SCOPING = 268, - TYPEDEFNAME = 269, - ELLIPSIS = 270, - OROR = 271, - ANDAND = 272, - EQCOMPARE = 273, - NECOMPARE = 274, - LECOMPARE = 275, - GECOMPARE = 276, - LSHIFT = 277, - RSHIFT = 278, - POINTSAT_STAR = 279, - DOT_STAR = 280, - UNARY = 281, - UNARY_NOT = 282, - UNARY_NEGATE = 283, - UNARY_MINUS = 284, - UNARY_PLUS = 285, - UNARY_STAR = 286, - UNARY_REF = 287, - POINTSAT = 288, - SCOPE = 289, - PLUSPLUS = 290, - MINUSMINUS = 291, - TIMESEQUAL = 292, - DIVIDEEQUAL = 293, - MODEQUAL = 294, - PLUSEQUAL = 295, - MINUSEQUAL = 296, - OREQUAL = 297, - ANDEQUAL = 298, - XOREQUAL = 299, - LSHIFTEQUAL = 300, - RSHIFTEQUAL = 301, - KW_ALIGNAS = 302, - KW_ALIGNOF = 303, - KW_AUTO = 304, - KW_BEGIN_PUBLISH = 305, - KW_BLOCKING = 306, - KW_BOOL = 307, - KW_CATCH = 308, - KW_CHAR = 309, - KW_CHAR16_T = 310, - KW_CHAR32_T = 311, - KW_CLASS = 312, - KW_CONST = 313, - KW_CONSTEXPR = 314, - KW_CONST_CAST = 315, - KW_DECLTYPE = 316, - KW_DEFAULT = 317, - KW_DELETE = 318, - KW_DOUBLE = 319, - KW_DYNAMIC_CAST = 320, - KW_ELSE = 321, - KW_END_PUBLISH = 322, - KW_ENUM = 323, - KW_EXTENSION = 324, - KW_EXTERN = 325, - KW_EXPLICIT = 326, - KW_PUBLISHED = 327, - KW_FALSE = 328, - KW_FINAL = 329, - KW_FLOAT = 330, - KW_FRIEND = 331, - KW_FOR = 332, - KW_GOTO = 333, - KW_HAS_VIRTUAL_DESTRUCTOR = 334, - KW_IF = 335, - KW_INLINE = 336, - KW_INT = 337, - KW_IS_ABSTRACT = 338, - KW_IS_BASE_OF = 339, - KW_IS_CLASS = 340, - KW_IS_CONSTRUCTIBLE = 341, - KW_IS_CONVERTIBLE_TO = 342, - KW_IS_DESTRUCTIBLE = 343, - KW_IS_EMPTY = 344, - KW_IS_ENUM = 345, - KW_IS_FINAL = 346, - KW_IS_FUNDAMENTAL = 347, - KW_IS_POD = 348, - KW_IS_POLYMORPHIC = 349, - KW_IS_STANDARD_LAYOUT = 350, - KW_IS_TRIVIAL = 351, - KW_IS_UNION = 352, - KW_LONG = 353, - KW_MAKE_MAP_PROPERTY = 354, - KW_MAKE_PROPERTY = 355, - KW_MAKE_PROPERTY2 = 356, - KW_MAKE_SEQ = 357, - KW_MAKE_SEQ_PROPERTY = 358, - KW_MUTABLE = 359, - KW_NAMESPACE = 360, - KW_NEW = 361, - KW_NOEXCEPT = 362, - KW_NULLPTR = 363, - KW_OPERATOR = 364, - KW_OVERRIDE = 365, - KW_PRIVATE = 366, - KW_PROTECTED = 367, - KW_PUBLIC = 368, - KW_REGISTER = 369, - KW_REINTERPRET_CAST = 370, - KW_RETURN = 371, - KW_SHORT = 372, - KW_SIGNED = 373, - KW_SIZEOF = 374, - KW_STATIC = 375, - KW_STATIC_ASSERT = 376, - KW_STATIC_CAST = 377, - KW_STRUCT = 378, - KW_TEMPLATE = 379, - KW_THREAD_LOCAL = 380, - KW_THROW = 381, - KW_TRUE = 382, - KW_TRY = 383, - KW_TYPEDEF = 384, - KW_TYPEID = 385, - KW_TYPENAME = 386, - KW_UNDERLYING_TYPE = 387, - KW_UNION = 388, - KW_UNSIGNED = 389, - KW_USING = 390, - KW_VIRTUAL = 391, - KW_VOID = 392, - KW_VOLATILE = 393, - KW_WCHAR_T = 394, - KW_WHILE = 395, - START_CPP = 396, - START_CONST_EXPR = 397, - START_TYPE = 398 - }; + /* 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, + TYPEPACK_IDENTIFIER = 267, + SCOPING = 268, + TYPEDEFNAME = 269, + ELLIPSIS = 270, + OROR = 271, + ANDAND = 272, + EQCOMPARE = 273, + NECOMPARE = 274, + LECOMPARE = 275, + GECOMPARE = 276, + LSHIFT = 277, + RSHIFT = 278, + POINTSAT_STAR = 279, + DOT_STAR = 280, + UNARY = 281, + UNARY_NOT = 282, + UNARY_NEGATE = 283, + UNARY_MINUS = 284, + UNARY_PLUS = 285, + UNARY_STAR = 286, + UNARY_REF = 287, + POINTSAT = 288, + SCOPE = 289, + PLUSPLUS = 290, + MINUSMINUS = 291, + TIMESEQUAL = 292, + DIVIDEEQUAL = 293, + MODEQUAL = 294, + PLUSEQUAL = 295, + MINUSEQUAL = 296, + OREQUAL = 297, + ANDEQUAL = 298, + XOREQUAL = 299, + LSHIFTEQUAL = 300, + RSHIFTEQUAL = 301, + ATTR_LEFT = 302, + ATTR_RIGHT = 303, + KW_ALIGNAS = 304, + KW_ALIGNOF = 305, + KW_AUTO = 306, + KW_BEGIN_PUBLISH = 307, + KW_BLOCKING = 308, + KW_BOOL = 309, + KW_CATCH = 310, + KW_CHAR = 311, + KW_CHAR16_T = 312, + KW_CHAR32_T = 313, + KW_CLASS = 314, + KW_CONST = 315, + KW_CONSTEXPR = 316, + KW_CONST_CAST = 317, + KW_DECLTYPE = 318, + KW_DEFAULT = 319, + KW_DELETE = 320, + KW_DOUBLE = 321, + KW_DYNAMIC_CAST = 322, + KW_ELSE = 323, + KW_END_PUBLISH = 324, + KW_ENUM = 325, + KW_EXTENSION = 326, + KW_EXTERN = 327, + KW_EXPLICIT = 328, + KW_PUBLISHED = 329, + KW_FALSE = 330, + KW_FINAL = 331, + KW_FLOAT = 332, + KW_FRIEND = 333, + KW_FOR = 334, + KW_GOTO = 335, + KW_HAS_VIRTUAL_DESTRUCTOR = 336, + KW_IF = 337, + KW_INLINE = 338, + KW_INT = 339, + KW_IS_ABSTRACT = 340, + KW_IS_BASE_OF = 341, + KW_IS_CLASS = 342, + KW_IS_CONSTRUCTIBLE = 343, + KW_IS_CONVERTIBLE_TO = 344, + KW_IS_DESTRUCTIBLE = 345, + KW_IS_EMPTY = 346, + KW_IS_ENUM = 347, + KW_IS_FINAL = 348, + KW_IS_FUNDAMENTAL = 349, + KW_IS_POD = 350, + KW_IS_POLYMORPHIC = 351, + KW_IS_STANDARD_LAYOUT = 352, + KW_IS_TRIVIAL = 353, + KW_IS_UNION = 354, + KW_LONG = 355, + KW_MAKE_MAP_PROPERTY = 356, + KW_MAKE_PROPERTY = 357, + KW_MAKE_PROPERTY2 = 358, + KW_MAKE_SEQ = 359, + KW_MAKE_SEQ_PROPERTY = 360, + KW_MUTABLE = 361, + KW_NAMESPACE = 362, + KW_NEW = 363, + KW_NOEXCEPT = 364, + KW_NULLPTR = 365, + KW_OPERATOR = 366, + KW_OVERRIDE = 367, + KW_PRIVATE = 368, + KW_PROTECTED = 369, + KW_PUBLIC = 370, + KW_REGISTER = 371, + KW_REINTERPRET_CAST = 372, + KW_RETURN = 373, + KW_SHORT = 374, + KW_SIGNED = 375, + KW_SIZEOF = 376, + KW_STATIC = 377, + KW_STATIC_ASSERT = 378, + KW_STATIC_CAST = 379, + KW_STRUCT = 380, + KW_TEMPLATE = 381, + KW_THREAD_LOCAL = 382, + KW_THROW = 383, + KW_TRUE = 384, + KW_TRY = 385, + KW_TYPEDEF = 386, + KW_TYPEID = 387, + KW_TYPENAME = 388, + KW_UNDERLYING_TYPE = 389, + KW_UNION = 390, + KW_UNSIGNED = 391, + KW_USING = 392, + KW_VIRTUAL = 393, + KW_VOID = 394, + KW_VOLATILE = 395, + KW_WCHAR_T = 396, + KW_WHILE = 397, + START_CPP = 398, + START_CONST_EXPR = 399, + START_TYPE = 400 + }; #endif /* Tokens. */ #define REAL 258 @@ -485,129 +494,148 @@ extern int cppyydebug; #define XOREQUAL 299 #define LSHIFTEQUAL 300 #define RSHIFTEQUAL 301 -#define KW_ALIGNAS 302 -#define KW_ALIGNOF 303 -#define KW_AUTO 304 -#define KW_BEGIN_PUBLISH 305 -#define KW_BLOCKING 306 -#define KW_BOOL 307 -#define KW_CATCH 308 -#define KW_CHAR 309 -#define KW_CHAR16_T 310 -#define KW_CHAR32_T 311 -#define KW_CLASS 312 -#define KW_CONST 313 -#define KW_CONSTEXPR 314 -#define KW_CONST_CAST 315 -#define KW_DECLTYPE 316 -#define KW_DEFAULT 317 -#define KW_DELETE 318 -#define KW_DOUBLE 319 -#define KW_DYNAMIC_CAST 320 -#define KW_ELSE 321 -#define KW_END_PUBLISH 322 -#define KW_ENUM 323 -#define KW_EXTENSION 324 -#define KW_EXTERN 325 -#define KW_EXPLICIT 326 -#define KW_PUBLISHED 327 -#define KW_FALSE 328 -#define KW_FINAL 329 -#define KW_FLOAT 330 -#define KW_FRIEND 331 -#define KW_FOR 332 -#define KW_GOTO 333 -#define KW_HAS_VIRTUAL_DESTRUCTOR 334 -#define KW_IF 335 -#define KW_INLINE 336 -#define KW_INT 337 -#define KW_IS_ABSTRACT 338 -#define KW_IS_BASE_OF 339 -#define KW_IS_CLASS 340 -#define KW_IS_CONSTRUCTIBLE 341 -#define KW_IS_CONVERTIBLE_TO 342 -#define KW_IS_DESTRUCTIBLE 343 -#define KW_IS_EMPTY 344 -#define KW_IS_ENUM 345 -#define KW_IS_FINAL 346 -#define KW_IS_FUNDAMENTAL 347 -#define KW_IS_POD 348 -#define KW_IS_POLYMORPHIC 349 -#define KW_IS_STANDARD_LAYOUT 350 -#define KW_IS_TRIVIAL 351 -#define KW_IS_UNION 352 -#define KW_LONG 353 -#define KW_MAKE_MAP_PROPERTY 354 -#define KW_MAKE_PROPERTY 355 -#define KW_MAKE_PROPERTY2 356 -#define KW_MAKE_SEQ 357 -#define KW_MAKE_SEQ_PROPERTY 358 -#define KW_MUTABLE 359 -#define KW_NAMESPACE 360 -#define KW_NEW 361 -#define KW_NOEXCEPT 362 -#define KW_NULLPTR 363 -#define KW_OPERATOR 364 -#define KW_OVERRIDE 365 -#define KW_PRIVATE 366 -#define KW_PROTECTED 367 -#define KW_PUBLIC 368 -#define KW_REGISTER 369 -#define KW_REINTERPRET_CAST 370 -#define KW_RETURN 371 -#define KW_SHORT 372 -#define KW_SIGNED 373 -#define KW_SIZEOF 374 -#define KW_STATIC 375 -#define KW_STATIC_ASSERT 376 -#define KW_STATIC_CAST 377 -#define KW_STRUCT 378 -#define KW_TEMPLATE 379 -#define KW_THREAD_LOCAL 380 -#define KW_THROW 381 -#define KW_TRUE 382 -#define KW_TRY 383 -#define KW_TYPEDEF 384 -#define KW_TYPEID 385 -#define KW_TYPENAME 386 -#define KW_UNDERLYING_TYPE 387 -#define KW_UNION 388 -#define KW_UNSIGNED 389 -#define KW_USING 390 -#define KW_VIRTUAL 391 -#define KW_VOID 392 -#define KW_VOLATILE 393 -#define KW_WCHAR_T 394 -#define KW_WHILE 395 -#define START_CPP 396 -#define START_CONST_EXPR 397 -#define START_TYPE 398 +#define ATTR_LEFT 302 +#define ATTR_RIGHT 303 +#define KW_ALIGNAS 304 +#define KW_ALIGNOF 305 +#define KW_AUTO 306 +#define KW_BEGIN_PUBLISH 307 +#define KW_BLOCKING 308 +#define KW_BOOL 309 +#define KW_CATCH 310 +#define KW_CHAR 311 +#define KW_CHAR16_T 312 +#define KW_CHAR32_T 313 +#define KW_CLASS 314 +#define KW_CONST 315 +#define KW_CONSTEXPR 316 +#define KW_CONST_CAST 317 +#define KW_DECLTYPE 318 +#define KW_DEFAULT 319 +#define KW_DELETE 320 +#define KW_DOUBLE 321 +#define KW_DYNAMIC_CAST 322 +#define KW_ELSE 323 +#define KW_END_PUBLISH 324 +#define KW_ENUM 325 +#define KW_EXTENSION 326 +#define KW_EXTERN 327 +#define KW_EXPLICIT 328 +#define KW_PUBLISHED 329 +#define KW_FALSE 330 +#define KW_FINAL 331 +#define KW_FLOAT 332 +#define KW_FRIEND 333 +#define KW_FOR 334 +#define KW_GOTO 335 +#define KW_HAS_VIRTUAL_DESTRUCTOR 336 +#define KW_IF 337 +#define KW_INLINE 338 +#define KW_INT 339 +#define KW_IS_ABSTRACT 340 +#define KW_IS_BASE_OF 341 +#define KW_IS_CLASS 342 +#define KW_IS_CONSTRUCTIBLE 343 +#define KW_IS_CONVERTIBLE_TO 344 +#define KW_IS_DESTRUCTIBLE 345 +#define KW_IS_EMPTY 346 +#define KW_IS_ENUM 347 +#define KW_IS_FINAL 348 +#define KW_IS_FUNDAMENTAL 349 +#define KW_IS_POD 350 +#define KW_IS_POLYMORPHIC 351 +#define KW_IS_STANDARD_LAYOUT 352 +#define KW_IS_TRIVIAL 353 +#define KW_IS_UNION 354 +#define KW_LONG 355 +#define KW_MAKE_MAP_PROPERTY 356 +#define KW_MAKE_PROPERTY 357 +#define KW_MAKE_PROPERTY2 358 +#define KW_MAKE_SEQ 359 +#define KW_MAKE_SEQ_PROPERTY 360 +#define KW_MUTABLE 361 +#define KW_NAMESPACE 362 +#define KW_NEW 363 +#define KW_NOEXCEPT 364 +#define KW_NULLPTR 365 +#define KW_OPERATOR 366 +#define KW_OVERRIDE 367 +#define KW_PRIVATE 368 +#define KW_PROTECTED 369 +#define KW_PUBLIC 370 +#define KW_REGISTER 371 +#define KW_REINTERPRET_CAST 372 +#define KW_RETURN 373 +#define KW_SHORT 374 +#define KW_SIGNED 375 +#define KW_SIZEOF 376 +#define KW_STATIC 377 +#define KW_STATIC_ASSERT 378 +#define KW_STATIC_CAST 379 +#define KW_STRUCT 380 +#define KW_TEMPLATE 381 +#define KW_THREAD_LOCAL 382 +#define KW_THROW 383 +#define KW_TRUE 384 +#define KW_TRY 385 +#define KW_TYPEDEF 386 +#define KW_TYPEID 387 +#define KW_TYPENAME 388 +#define KW_UNDERLYING_TYPE 389 +#define KW_UNION 390 +#define KW_UNSIGNED 391 +#define KW_USING 392 +#define KW_VIRTUAL 393 +#define KW_VOID 394 +#define KW_VOLATILE 395 +#define KW_WCHAR_T 396 +#define KW_WHILE 397 +#define START_CPP 398 +#define START_CONST_EXPR 399 +#define START_TYPE 400 -/* Value type. */ -/* Location type. */ + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE YYLTYPE; -struct YYLTYPE +typedef struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; -}; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #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); +#else +int cppyyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ -#endif /* !YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED */ +#endif /* !YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED */ /* Copy the second part of user declarations. */ -#line 611 "built/tmp/cppBison.yxx.c" /* yacc.c:358 */ +/* Line 390 of yacc.c */ +#line 639 "built_x64/tmp/cppBison.yxx.c" #ifdef short # undef short @@ -621,8 +649,11 @@ typedef unsigned char yytype_uint8; #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; -#else +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; +#else +typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 @@ -642,7 +673,8 @@ typedef short int yytype_int16; # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else @@ -664,33 +696,6 @@ typedef short int yytype_int16; # endif #endif -#ifndef YY_ATTRIBUTE -# if (defined __GNUC__ \ - && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ - || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C -# define YY_ATTRIBUTE(Spec) __attribute__(Spec) -# else -# define YY_ATTRIBUTE(Spec) /* empty */ -# endif -#endif - -#ifndef YY_ATTRIBUTE_PURE -# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) -#endif - -#if !defined _Noreturn \ - && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) -# if defined _MSC_VER && 1200 <= _MSC_VER -# define _Noreturn __declspec (noreturn) -# else -# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) -# endif -#endif - /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) @@ -698,25 +703,23 @@ typedef short int yytype_int16; # define YYUSE(E) /* empty */ #endif -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(N) (N) #else -# define YY_INITIAL_VALUE(Value) Value +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; #endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END +{ + return yyi; +} #endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - #if ! defined yyoverflow || YYERROR_VERBOSE @@ -735,7 +738,8 @@ typedef short int yytype_int16; # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS @@ -747,8 +751,8 @@ typedef short int yytype_int16; # endif # ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -764,7 +768,7 @@ typedef short int yytype_int16; # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 @@ -772,13 +776,15 @@ typedef short int yytype_int16; # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS +# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS +# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif @@ -788,8 +794,8 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ - && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ + && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc @@ -815,16 +821,16 @@ union yyalloc elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) #endif @@ -843,7 +849,7 @@ union yyalloc for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ - while (0) + while (YYID (0)) # endif # endif #endif /* !YYCOPY_NEEDED */ @@ -851,42 +857,40 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 104 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 6206 +#define YYLAST 7002 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 168 +#define YYNTOKENS 170 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 107 +#define YYNNTS 108 /* YYNRULES -- Number of rules. */ -#define YYNRULES 733 -/* YYNSTATES -- Number of states. */ -#define YYNSTATES 1482 +#define YYNRULES 753 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 1535 -/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned - by yylex, with out-of-bounds checking. */ +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 398 +#define YYMAXUTOK 400 -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, without out-of-bounds checking. */ +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 167, 2, 2, 2, 159, 152, 2, - 162, 164, 157, 155, 145, 156, 161, 158, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 147, 146, - 153, 148, 154, 149, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 168, 2, 2, 2, 161, 154, 2, + 164, 166, 159, 157, 147, 158, 163, 160, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 149, 148, + 155, 150, 156, 151, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 163, 2, 166, 151, 2, 2, 2, 2, 2, + 2, 165, 2, 169, 153, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 144, 150, 165, 160, 2, 2, 2, + 2, 2, 2, 146, 152, 167, 162, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -913,87 +917,432 @@ static const yytype_uint8 yytranslate[] = 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143 + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145 }; #if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 6, 9, 12, 14, 17, 20, 22, + 26, 31, 37, 42, 43, 49, 51, 53, 55, 57, + 59, 62, 64, 66, 69, 72, 75, 78, 86, 96, + 108, 118, 130, 144, 154, 168, 178, 186, 192, 193, + 197, 199, 202, 205, 209, 212, 215, 218, 221, 224, + 227, 230, 233, 236, 239, 242, 247, 253, 259, 261, + 265, 267, 272, 277, 278, 283, 287, 291, 295, 297, + 300, 305, 306, 311, 315, 318, 323, 324, 331, 332, + 339, 340, 348, 349, 361, 362, 375, 376, 385, 386, + 396, 398, 400, 403, 406, 409, 412, 415, 418, 421, + 424, 427, 432, 438, 445, 450, 452, 454, 456, 458, + 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, + 480, 482, 484, 486, 488, 490, 492, 494, 496, 498, + 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, + 520, 523, 526, 528, 530, 532, 534, 537, 538, 545, + 548, 550, 552, 554, 558, 560, 562, 564, 567, 572, + 575, 579, 583, 588, 591, 595, 597, 599, 601, 603, + 605, 608, 612, 615, 618, 621, 624, 627, 631, 636, + 640, 641, 648, 651, 655, 657, 661, 666, 668, 670, + 672, 676, 679, 681, 685, 687, 689, 691, 695, 698, + 700, 704, 706, 709, 711, 714, 716, 720, 726, 730, + 734, 736, 740, 744, 748, 752, 757, 759, 761, 764, + 766, 770, 774, 780, 784, 789, 795, 799, 804, 810, + 813, 818, 820, 822, 824, 826, 829, 832, 835, 838, + 841, 845, 850, 852, 854, 857, 860, 863, 866, 869, + 873, 878, 886, 890, 892, 895, 898, 901, 904, 907, + 910, 914, 919, 927, 931, 933, 935, 938, 941, 944, + 947, 950, 953, 957, 962, 964, 966, 969, 972, 975, + 978, 981, 984, 988, 993, 999, 1009, 1019, 1029, 1031, + 1033, 1036, 1038, 1040, 1042, 1046, 1051, 1056, 1061, 1066, + 1068, 1070, 1072, 1074, 1077, 1079, 1081, 1083, 1087, 1092, + 1095, 1100, 1105, 1110, 1112, 1114, 1116, 1119, 1123, 1126, + 1131, 1136, 1138, 1140, 1142, 1145, 1149, 1152, 1156, 1158, + 1163, 1169, 1175, 1176, 1183, 1184, 1194, 1196, 1198, 1200, + 1202, 1205, 1209, 1211, 1214, 1217, 1220, 1224, 1228, 1232, + 1236, 1240, 1244, 1249, 1253, 1255, 1260, 1263, 1265, 1267, + 1269, 1273, 1279, 1281, 1284, 1289, 1291, 1294, 1297, 1299, + 1301, 1303, 1304, 1311, 1312, 1320, 1325, 1331, 1335, 1341, + 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, + 1366, 1368, 1370, 1372, 1375, 1378, 1381, 1384, 1386, 1388, + 1391, 1393, 1394, 1397, 1399, 1402, 1404, 1406, 1408, 1410, + 1412, 1414, 1416, 1418, 1420, 1422, 1424, 1426, 1428, 1430, + 1432, 1434, 1436, 1438, 1440, 1442, 1444, 1446, 1448, 1450, + 1452, 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 1470, + 1472, 1474, 1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, + 1492, 1494, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510, + 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, + 1532, 1534, 1536, 1538, 1540, 1542, 1544, 1546, 1548, 1550, + 1552, 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568, 1570, + 1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, + 1592, 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, + 1612, 1614, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, + 1632, 1634, 1636, 1638, 1640, 1642, 1644, 1646, 1648, 1650, + 1652, 1654, 1656, 1658, 1662, 1664, 1666, 1668, 1670, 1672, + 1676, 1678, 1683, 1691, 1699, 1707, 1715, 1720, 1725, 1731, + 1736, 1739, 1742, 1745, 1748, 1751, 1754, 1758, 1762, 1766, + 1770, 1774, 1778, 1782, 1786, 1790, 1794, 1798, 1802, 1806, + 1810, 1814, 1818, 1824, 1829, 1834, 1838, 1842, 1846, 1850, + 1852, 1857, 1865, 1873, 1881, 1889, 1894, 1899, 1904, 1909, + 1914, 1919, 1924, 1929, 1934, 1939, 1944, 1949, 1954, 1959, + 1964, 1969, 1975, 1980, 1983, 1989, 1994, 1999, 2002, 2005, + 2008, 2011, 2014, 2017, 2021, 2025, 2029, 2033, 2037, 2041, + 2045, 2049, 2053, 2057, 2061, 2065, 2069, 2073, 2077, 2081, + 2085, 2089, 2095, 2100, 2105, 2109, 2113, 2117, 2121, 2123, + 2125, 2127, 2129, 2131, 2133, 2135, 2137, 2139, 2141, 2143, + 2152, 2164, 2169, 2174, 2181, 2186, 2191, 2198, 2205, 2210, + 2215, 2220, 2225, 2230, 2235, 2240, 2245, 2250, 2255, 2257, + 2262, 2270, 2278, 2286, 2294, 2299, 2304, 2310, 2315, 2318, + 2324, 2329, 2334, 2337, 2340, 2343, 2346, 2349, 2353, 2357, + 2361, 2365, 2369, 2373, 2377, 2381, 2385, 2389, 2393, 2397, + 2401, 2405, 2409, 2413, 2417, 2421, 2427, 2432, 2437, 2441, + 2445, 2449, 2453, 2455, 2457, 2459, 2461, 2463, 2465, 2467, + 2469, 2471, 2473, 2475, 2477, 2479, 2481, 2484, 2489, 2492, + 2496, 2498, 2501, 2503, 2506, 2509, 2511, 2513, 2515, 2517, + 2519, 2521, 2523, 2525, 2527, 2529, 2531, 2533, 2535, 2537, + 2539, 2541, 2544, 2547 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int16 yyrhs[] = +{ + 171, 0, -1, 143, 172, -1, 144, 267, -1, 145, + 234, -1, 277, -1, 172, 148, -1, 172, 177, -1, + 174, -1, 173, 147, 174, -1, 274, 164, 264, 166, + -1, 274, 164, 264, 166, 15, -1, 274, 146, 264, + 167, -1, -1, 180, 146, 176, 172, 167, -1, 183, + -1, 201, -1, 175, -1, 251, -1, 178, -1, 131, + 186, -1, 52, -1, 69, -1, 74, 149, -1, 115, + 149, -1, 114, 149, -1, 113, 149, -1, 102, 164, + 274, 147, 10, 166, 148, -1, 102, 164, 274, 147, + 10, 147, 10, 166, 148, -1, 102, 164, 274, 147, + 10, 147, 10, 147, 10, 166, 148, -1, 105, 164, + 274, 147, 10, 147, 10, 166, 148, -1, 105, 164, + 274, 147, 10, 147, 10, 147, 10, 166, 148, -1, + 105, 164, 274, 147, 10, 147, 10, 147, 10, 147, + 10, 166, 148, -1, 103, 164, 274, 147, 10, 147, + 10, 166, 148, -1, 103, 164, 274, 147, 10, 147, + 10, 147, 10, 147, 10, 166, 148, -1, 104, 164, + 274, 147, 10, 147, 10, 166, 148, -1, 123, 164, + 267, 147, 276, 166, 148, -1, 123, 164, 267, 166, + 148, -1, -1, 78, 179, 177, -1, 277, -1, 60, + 180, -1, 72, 180, -1, 72, 6, 180, -1, 122, + 180, -1, 83, 180, -1, 138, 180, -1, 73, 180, + -1, 116, 180, -1, 140, 180, -1, 106, 180, -1, + 61, 180, -1, 53, 180, -1, 71, 180, -1, 127, + 180, -1, 47, 181, 48, 180, -1, 49, 164, 267, + 166, 180, -1, 49, 164, 231, 166, 180, -1, 182, + -1, 182, 147, 181, -1, 274, -1, 274, 164, 214, + 166, -1, 137, 274, 149, 182, -1, -1, 180, 233, + 184, 185, -1, 180, 231, 148, -1, 180, 189, 218, + -1, 180, 192, 219, -1, 254, -1, 210, 219, -1, + 210, 217, 147, 185, -1, -1, 180, 233, 187, 188, + -1, 180, 192, 219, -1, 210, 219, -1, 210, 217, + 147, 188, -1, -1, 10, 164, 190, 212, 166, 198, + -1, -1, 11, 164, 191, 212, 166, 198, -1, -1, + 162, 274, 164, 193, 212, 166, 198, -1, -1, 11, + 164, 159, 208, 166, 164, 194, 212, 166, 198, 211, + -1, -1, 11, 164, 13, 159, 208, 166, 164, 195, + 212, 166, 198, 211, -1, -1, 111, 229, 224, 164, + 196, 212, 166, 198, -1, -1, 111, 60, 229, 224, + 164, 197, 212, 166, 198, -1, 10, -1, 277, -1, + 198, 60, -1, 198, 140, -1, 198, 109, -1, 198, + 76, -1, 198, 112, -1, 198, 154, -1, 198, 17, + -1, 198, 106, -1, 198, 61, -1, 198, 128, 164, + 166, -1, 198, 128, 164, 274, 166, -1, 198, 128, + 164, 274, 15, 166, -1, 198, 47, 181, 48, -1, + 168, -1, 162, -1, 159, -1, 160, -1, 161, -1, + 157, -1, 158, -1, 152, -1, 154, -1, 153, -1, + 16, -1, 17, -1, 18, -1, 19, -1, 20, -1, + 21, -1, 155, -1, 156, -1, 22, -1, 23, -1, + 150, -1, 147, -1, 35, -1, 36, -1, 37, -1, + 38, -1, 39, -1, 40, -1, 41, -1, 42, -1, + 43, -1, 44, -1, 45, -1, 46, -1, 33, -1, + 165, 169, -1, 164, 166, -1, 108, -1, 65, -1, + 183, -1, 201, -1, 72, 201, -1, -1, 126, 202, + 155, 203, 156, 200, -1, 126, 183, -1, 277, -1, + 204, -1, 206, -1, 204, 147, 206, -1, 59, -1, + 133, -1, 205, -1, 205, 274, -1, 205, 274, 150, + 234, -1, 205, 15, -1, 205, 15, 274, -1, 207, + 225, 216, -1, 60, 207, 225, 216, -1, 207, 226, + -1, 60, 207, 226, -1, 255, -1, 10, -1, 11, + -1, 12, -1, 275, -1, 111, 199, -1, 111, 6, + 10, -1, 60, 208, -1, 140, 208, -1, 159, 208, + -1, 154, 208, -1, 17, 208, -1, 13, 159, 208, + -1, 208, 165, 263, 169, -1, 164, 208, 166, -1, + -1, 208, 164, 209, 214, 166, 198, -1, 208, 211, + -1, 208, 149, 4, -1, 277, -1, 33, 232, 228, + -1, 33, 60, 232, 228, -1, 277, -1, 15, -1, + 213, -1, 213, 147, 15, -1, 213, 15, -1, 222, + -1, 213, 147, 222, -1, 277, -1, 15, -1, 215, + -1, 215, 147, 15, -1, 215, 15, -1, 223, -1, + 215, 147, 223, -1, 277, -1, 150, 266, -1, 277, + -1, 150, 267, -1, 148, -1, 146, 259, 167, -1, + 149, 173, 146, 259, 167, -1, 150, 64, 148, -1, + 150, 65, 148, -1, 148, -1, 146, 259, 167, -1, + 150, 267, 148, -1, 150, 64, 148, -1, 150, 65, + 148, -1, 150, 146, 220, 167, -1, 277, -1, 221, + -1, 221, 147, -1, 267, -1, 146, 220, 167, -1, + 221, 147, 267, -1, 221, 147, 146, 220, 167, -1, + 229, 225, 217, -1, 60, 229, 225, 217, -1, 60, + 116, 229, 225, 217, -1, 230, 226, 217, -1, 60, + 230, 226, 217, -1, 60, 116, 230, 226, 217, -1, + 116, 222, -1, 47, 181, 48, 222, -1, 222, -1, + 269, -1, 277, -1, 275, -1, 60, 224, -1, 140, + 224, -1, 159, 224, -1, 154, 224, -1, 17, 224, + -1, 13, 159, 224, -1, 224, 165, 263, 169, -1, + 277, -1, 275, -1, 60, 225, -1, 140, 225, -1, + 159, 225, -1, 154, 225, -1, 17, 225, -1, 13, + 159, 225, -1, 225, 165, 263, 169, -1, 164, 225, + 166, 164, 212, 166, 198, -1, 164, 225, 166, -1, + 15, -1, 15, 274, -1, 60, 226, -1, 140, 226, + -1, 159, 226, -1, 154, 226, -1, 17, 226, -1, + 13, 159, 226, -1, 226, 165, 263, 169, -1, 164, + 226, 166, 164, 212, 166, 198, -1, 164, 226, 166, + -1, 277, -1, 15, -1, 15, 274, -1, 60, 227, + -1, 140, 227, -1, 159, 227, -1, 154, 227, -1, + 17, 227, -1, 13, 159, 227, -1, 227, 165, 263, + 169, -1, 277, -1, 15, -1, 15, 274, -1, 60, + 228, -1, 140, 228, -1, 159, 227, -1, 154, 227, + -1, 17, 227, -1, 13, 159, 227, -1, 227, 165, + 263, 169, -1, 164, 212, 166, 198, 211, -1, 164, + 159, 227, 166, 164, 212, 166, 198, 211, -1, 164, + 154, 227, 166, 164, 212, 166, 198, 211, -1, 164, + 17, 227, 166, 164, 212, 166, 198, 211, -1, 255, + -1, 11, -1, 133, 274, -1, 236, -1, 238, -1, + 244, -1, 250, 235, 274, -1, 249, 275, 149, 246, + -1, 63, 164, 267, 166, -1, 63, 164, 51, 166, + -1, 134, 164, 234, 166, -1, 51, -1, 12, -1, + 255, -1, 11, -1, 133, 274, -1, 236, -1, 238, + -1, 244, -1, 250, 235, 274, -1, 249, 275, 149, + 246, -1, 249, 274, -1, 63, 164, 267, 166, -1, + 63, 164, 51, 166, -1, 134, 164, 234, 166, -1, + 51, -1, 255, -1, 11, -1, 133, 274, -1, 250, + 235, 274, -1, 249, 274, -1, 63, 164, 267, 166, + -1, 134, 164, 234, 166, -1, 51, -1, 231, -1, + 10, -1, 229, 228, -1, 60, 229, 228, -1, 230, + 228, -1, 60, 230, 228, -1, 277, -1, 235, 47, + 181, 48, -1, 235, 49, 164, 267, 166, -1, 235, + 49, 164, 231, 166, -1, -1, 250, 235, 146, 237, + 172, 167, -1, -1, 250, 235, 275, 239, 240, 241, + 146, 172, 167, -1, 277, -1, 76, -1, 277, -1, + 242, -1, 149, 243, -1, 242, 147, 243, -1, 273, + -1, 115, 273, -1, 114, 273, -1, 113, 273, -1, + 138, 115, 273, -1, 138, 114, 273, -1, 138, 113, + 273, -1, 115, 138, 273, -1, 114, 138, 273, -1, + 113, 138, 273, -1, 245, 146, 248, 167, -1, 249, + 149, 246, -1, 249, -1, 249, 275, 149, 246, -1, + 249, 275, -1, 256, -1, 11, -1, 277, -1, 247, + 274, 147, -1, 247, 274, 150, 267, 147, -1, 247, + -1, 247, 274, -1, 247, 274, 150, 267, -1, 70, + -1, 70, 59, -1, 70, 125, -1, 59, -1, 125, + -1, 135, -1, -1, 107, 274, 146, 252, 172, 167, + -1, -1, 83, 107, 274, 146, 253, 172, 167, -1, + 107, 146, 172, 167, -1, 83, 107, 146, 172, 167, + -1, 137, 274, 148, -1, 137, 274, 150, 234, 148, + -1, 137, 107, 274, 148, -1, 256, -1, 257, -1, + 258, -1, 54, -1, 56, -1, 141, -1, 57, -1, + 58, -1, 119, -1, 100, -1, 136, -1, 120, -1, + 84, -1, 119, 256, -1, 100, 256, -1, 136, 256, + -1, 120, 256, -1, 77, -1, 66, -1, 100, 66, + -1, 139, -1, -1, 260, 261, -1, 277, -1, 261, + 262, -1, 3, -1, 4, -1, 6, -1, 8, -1, + 9, -1, 5, -1, 10, -1, 11, -1, 12, -1, + 13, -1, 7, -1, 15, -1, 16, -1, 17, -1, + 18, -1, 19, -1, 20, -1, 21, -1, 22, -1, + 23, -1, 24, -1, 25, -1, 33, -1, 34, -1, + 35, -1, 36, -1, 37, -1, 38, -1, 39, -1, + 40, -1, 41, -1, 42, -1, 43, -1, 44, -1, + 45, -1, 46, -1, 47, -1, 48, -1, 49, -1, + 50, -1, 51, -1, 54, -1, 55, -1, 56, -1, + 57, -1, 58, -1, 59, -1, 60, -1, 61, -1, + 62, -1, 63, -1, 64, -1, 65, -1, 66, -1, + 67, -1, 68, -1, 70, -1, 72, -1, 73, -1, + 75, -1, 76, -1, 77, -1, 78, -1, 79, -1, + 80, -1, 82, -1, 83, -1, 84, -1, 100, -1, + 106, -1, 107, -1, 108, -1, 110, -1, 111, -1, + 112, -1, 113, -1, 114, -1, 115, -1, 74, -1, + 116, -1, 117, -1, 118, -1, 119, -1, 120, -1, + 121, -1, 122, -1, 123, -1, 124, -1, 125, -1, + 126, -1, 127, -1, 128, -1, 129, -1, 130, -1, + 131, -1, 132, -1, 133, -1, 134, -1, 135, -1, + 136, -1, 137, -1, 138, -1, 139, -1, 140, -1, + 141, -1, 142, -1, 157, -1, 158, -1, 159, -1, + 160, -1, 154, -1, 152, -1, 153, -1, 168, -1, + 162, -1, 150, -1, 161, -1, 155, -1, 156, -1, + 164, -1, 166, -1, 163, -1, 147, -1, 148, -1, + 149, -1, 165, -1, 169, -1, 151, -1, 146, 261, + 167, -1, 277, -1, 267, -1, 277, -1, 265, -1, + 267, -1, 265, 147, 267, -1, 268, -1, 164, 234, + 166, 266, -1, 124, 155, 234, 156, 164, 265, 166, + -1, 67, 155, 234, 156, 164, 265, 166, -1, 62, + 155, 234, 156, 164, 265, 166, -1, 117, 155, 234, + 156, 164, 265, 166, -1, 121, 164, 234, 166, -1, + 121, 164, 10, 166, -1, 121, 15, 164, 274, 166, + -1, 50, 164, 234, 166, -1, 168, 266, -1, 162, + 266, -1, 158, 266, -1, 157, 266, -1, 159, 266, + -1, 154, 266, -1, 266, 159, 266, -1, 266, 160, + 266, -1, 266, 161, 266, -1, 266, 157, 266, -1, + 266, 158, 266, -1, 266, 152, 266, -1, 266, 153, + 266, -1, 266, 154, 266, -1, 266, 16, 266, -1, + 266, 17, 266, -1, 266, 18, 266, -1, 266, 19, + 266, -1, 266, 20, 266, -1, 266, 21, 266, -1, + 266, 22, 266, -1, 266, 23, 266, -1, 266, 151, + 266, 149, 266, -1, 266, 165, 267, 169, -1, 266, + 164, 265, 166, -1, 266, 164, 166, -1, 266, 163, + 266, -1, 266, 33, 266, -1, 164, 265, 166, -1, + 268, -1, 164, 234, 166, 267, -1, 124, 155, 234, + 156, 164, 265, 166, -1, 67, 155, 234, 156, 164, + 265, 166, -1, 62, 155, 234, 156, 164, 265, 166, + -1, 117, 155, 234, 156, 164, 265, 166, -1, 11, + 164, 264, 166, -1, 11, 146, 264, 167, -1, 84, + 164, 264, 166, -1, 56, 164, 264, 166, -1, 141, + 164, 264, 166, -1, 57, 164, 264, 166, -1, 58, + 164, 264, 166, -1, 54, 164, 264, 166, -1, 119, + 164, 264, 166, -1, 100, 164, 264, 166, -1, 136, + 164, 264, 166, -1, 120, 164, 264, 166, -1, 77, + 164, 264, 166, -1, 66, 164, 264, 166, -1, 121, + 164, 234, 166, -1, 121, 164, 10, 166, -1, 121, + 15, 164, 274, 166, -1, 50, 164, 234, 166, -1, + 108, 232, -1, 108, 232, 164, 264, 166, -1, 132, + 164, 234, 166, -1, 132, 164, 267, 166, -1, 168, + 267, -1, 162, 267, -1, 158, 267, -1, 157, 267, + -1, 159, 267, -1, 154, 267, -1, 267, 159, 267, + -1, 267, 160, 267, -1, 267, 161, 267, -1, 267, + 157, 267, -1, 267, 158, 267, -1, 267, 152, 267, + -1, 267, 153, 267, -1, 267, 154, 267, -1, 267, + 16, 267, -1, 267, 17, 267, -1, 267, 18, 267, + -1, 267, 19, 267, -1, 267, 20, 267, -1, 267, + 21, 267, -1, 267, 155, 267, -1, 267, 156, 267, + -1, 267, 22, 267, -1, 267, 23, 267, -1, 267, + 151, 267, 149, 267, -1, 267, 165, 267, 169, -1, + 267, 164, 265, 166, -1, 267, 164, 166, -1, 267, + 163, 267, -1, 267, 33, 267, -1, 164, 265, 166, + -1, 4, -1, 129, -1, 75, -1, 5, -1, 3, + -1, 276, -1, 9, -1, 10, -1, 76, -1, 112, + -1, 110, -1, 165, 271, 169, 198, 211, 146, 259, + 167, -1, 165, 271, 169, 164, 212, 166, 198, 211, + 146, 259, 167, -1, 81, 164, 234, 166, -1, 85, + 164, 234, 166, -1, 86, 164, 234, 147, 234, 166, + -1, 87, 164, 234, 166, -1, 88, 164, 234, 166, + -1, 88, 164, 234, 147, 234, 166, -1, 89, 164, + 234, 147, 234, 166, -1, 90, 164, 234, 166, -1, + 91, 164, 234, 166, -1, 92, 164, 234, 166, -1, + 93, 164, 234, 166, -1, 94, 164, 234, 166, -1, + 95, 164, 234, 166, -1, 96, 164, 234, 166, -1, + 97, 164, 234, 166, -1, 98, 164, 234, 166, -1, + 99, 164, 234, 166, -1, 270, -1, 164, 234, 166, + 267, -1, 124, 155, 234, 156, 164, 265, 166, -1, + 67, 155, 234, 156, 164, 265, 166, -1, 62, 155, + 234, 156, 164, 265, 166, -1, 117, 155, 234, 156, + 164, 265, 166, -1, 121, 164, 234, 166, -1, 121, + 164, 10, 166, -1, 121, 15, 164, 274, 166, -1, + 50, 164, 234, 166, -1, 108, 232, -1, 108, 232, + 164, 264, 166, -1, 132, 164, 234, 166, -1, 132, + 164, 267, 166, -1, 168, 267, -1, 162, 267, -1, + 158, 267, -1, 157, 267, -1, 154, 267, -1, 269, + 159, 267, -1, 269, 160, 267, -1, 269, 161, 267, + -1, 269, 157, 267, -1, 269, 158, 267, -1, 269, + 152, 267, -1, 269, 153, 267, -1, 269, 154, 267, + -1, 269, 16, 267, -1, 269, 17, 267, -1, 269, + 18, 267, -1, 269, 19, 267, -1, 269, 20, 267, + -1, 269, 21, 267, -1, 269, 155, 267, -1, 269, + 156, 267, -1, 269, 22, 267, -1, 269, 23, 267, + -1, 269, 151, 267, 149, 267, -1, 269, 165, 267, + 169, -1, 269, 164, 265, 166, -1, 269, 164, 166, + -1, 269, 163, 267, -1, 269, 33, 267, -1, 164, + 265, 166, -1, 4, -1, 129, -1, 75, -1, 5, + -1, 3, -1, 276, -1, 9, -1, 10, -1, 76, + -1, 112, -1, 110, -1, 277, -1, 150, -1, 154, + -1, 272, 217, -1, 271, 147, 272, 217, -1, 154, + 274, -1, 154, 274, 15, -1, 274, -1, 159, 274, + -1, 274, -1, 133, 274, -1, 274, 15, -1, 10, + -1, 11, -1, 12, -1, 76, -1, 112, -1, 120, + -1, 77, -1, 115, -1, 113, -1, 122, -1, 10, + -1, 11, -1, 12, -1, 112, -1, 6, -1, 8, + -1, 276, 6, -1, 276, 8, -1, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 442, 442, 443, 447, 454, 455, 456, 460, 461, - 465, 469, 473, 486, 485, 497, 498, 499, 500, 501, - 502, 503, 516, 525, 529, 537, 541, 545, 556, 577, - 607, 624, 652, 689, 711, 744, 766, 777, 791, 790, - 805, 809, 814, 818, 829, 833, 837, 841, 845, 849, - 853, 857, 861, 865, 869, 873, 881, 882, 886, 887, - 892, 891, 907, 916, 924, 932, 940, 951, 967, 966, - 981, 996, 1005, 1020, 1019, 1044, 1043, 1071, 1070, 1101, - 1100, 1119, 1118, 1139, 1138, 1170, 1169, 1195, 1208, 1212, - 1216, 1220, 1224, 1228, 1232, 1236, 1240, 1245, 1249, 1253, - 1264, 1268, 1272, 1276, 1280, 1284, 1288, 1292, 1296, 1300, - 1304, 1308, 1312, 1316, 1320, 1324, 1328, 1332, 1336, 1340, - 1344, 1348, 1352, 1356, 1360, 1364, 1368, 1372, 1376, 1380, - 1384, 1388, 1392, 1396, 1400, 1404, 1408, 1412, 1416, 1423, - 1424, 1429, 1428, 1436, 1440, 1441, 1445, 1451, 1460, 1461, - 1465, 1469, 1473, 1477, 1483, 1489, 1495, 1502, 1507, 1516, - 1520, 1525, 1533, 1545, 1549, 1563, 1578, 1583, 1588, 1593, - 1598, 1603, 1608, 1613, 1619, 1618, 1640, 1650, 1660, 1664, - 1668, 1677, 1681, 1686, 1690, 1695, 1703, 1708, 1716, 1720, - 1725, 1729, 1734, 1742, 1747, 1755, 1759, 1766, 1770, 1777, - 1781, 1785, 1789, 1793, 1800, 1804, 1808, 1812, 1816, 1820, - 1827, 1828, 1829, 1833, 1836, 1837, 1838, 1842, 1847, 1853, - 1859, 1864, 1870, 1876, 1887, 1891, 1901, 1905, 1909, 1914, - 1919, 1924, 1929, 1934, 1939, 1947, 1951, 1955, 1960, 1965, - 1970, 1975, 1980, 1985, 1990, 1996, 2004, 2009, 2014, 2019, - 2024, 2029, 2034, 2039, 2044, 2049, 2055, 2063, 2067, 2072, - 2077, 2082, 2087, 2092, 2097, 2102, 2107, 2115, 2119, 2124, - 2129, 2134, 2139, 2144, 2149, 2154, 2159, 2164, 2170, 2177, - 2184, 2194, 2198, 2206, 2210, 2214, 2218, 2222, 2238, 2254, - 2263, 2273, 2280, 2291, 2295, 2303, 2307, 2311, 2315, 2319, - 2335, 2351, 2369, 2378, 2388, 2395, 2399, 2407, 2411, 2427, - 2443, 2452, 2462, 2469, 2473, 2481, 2485, 2490, 2494, 2503, - 2502, 2527, 2526, 2556, 2557, 2564, 2565, 2569, 2570, 2574, - 2578, 2582, 2586, 2590, 2594, 2598, 2602, 2606, 2610, 2617, - 2625, 2629, 2633, 2638, 2646, 2650, 2657, 2658, 2663, 2670, - 2671, 2676, 2684, 2688, 2692, 2699, 2703, 2707, 2715, 2714, - 2737, 2736, 2759, 2760, 2764, 2770, 2777, 2786, 2787, 2788, - 2792, 2796, 2800, 2804, 2808, 2812, 2817, 2822, 2827, 2832, - 2836, 2841, 2850, 2855, 2863, 2867, 2871, 2879, 2889, 2889, - 2899, 2900, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, - 2912, 2913, 2914, 2915, 2915, 2915, 2916, 2916, 2916, 2916, - 2917, 2917, 2917, 2917, 2917, 2918, 2918, 2918, 2919, 2919, - 2919, 2919, 2919, 2920, 2920, 2920, 2920, 2920, 2921, 2921, - 2921, 2921, 2921, 2922, 2922, 2922, 2922, 2922, 2923, 2923, - 2923, 2923, 2924, 2924, 2924, 2924, 2924, 2925, 2925, 2925, - 2925, 2925, 2926, 2926, 2926, 2926, 2926, 2926, 2927, 2927, - 2927, 2927, 2927, 2928, 2928, 2928, 2928, 2929, 2929, 2929, - 2929, 2930, 2930, 2930, 2930, 2930, 2931, 2931, 2931, 2931, - 2932, 2932, 2932, 2932, 2932, 2933, 2933, 2933, 2933, 2934, - 2934, 2934, 2934, 2934, 2935, 2935, 2938, 2938, 2938, 2938, - 2938, 2938, 2938, 2938, 2938, 2938, 2938, 2939, 2939, 2939, - 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2940, 2940, 2944, - 2948, 2955, 2959, 2966, 2970, 2977, 2981, 2985, 2989, 2993, - 2997, 3001, 3005, 3009, 3013, 3017, 3021, 3025, 3029, 3033, - 3037, 3041, 3045, 3049, 3053, 3057, 3061, 3065, 3069, 3073, - 3077, 3081, 3085, 3089, 3093, 3097, 3101, 3105, 3109, 3113, - 3117, 3121, 3125, 3133, 3137, 3141, 3145, 3149, 3153, 3157, - 3167, 3173, 3179, 3185, 3191, 3197, 3203, 3210, 3217, 3224, - 3231, 3237, 3243, 3247, 3251, 3255, 3259, 3263, 3274, 3285, - 3289, 3293, 3297, 3301, 3305, 3309, 3313, 3317, 3321, 3325, - 3329, 3333, 3337, 3341, 3345, 3349, 3353, 3357, 3361, 3365, - 3369, 3373, 3377, 3381, 3385, 3389, 3393, 3397, 3401, 3405, - 3412, 3416, 3420, 3424, 3428, 3432, 3436, 3440, 3444, 3450, - 3456, 3460, 3464, 3468, 3472, 3476, 3480, 3484, 3488, 3492, - 3496, 3500, 3504, 3508, 3512, 3516, 3520, 3524, 3528, 3532, - 3546, 3550, 3554, 3558, 3562, 3566, 3570, 3574, 3578, 3582, - 3586, 3590, 3601, 3612, 3616, 3620, 3624, 3628, 3632, 3636, - 3640, 3644, 3648, 3652, 3656, 3660, 3664, 3668, 3672, 3676, - 3680, 3684, 3688, 3692, 3696, 3700, 3704, 3708, 3712, 3716, - 3720, 3724, 3728, 3735, 3739, 3743, 3747, 3751, 3755, 3759, - 3763, 3767, 3773, 3779, 3787, 3788, 3789, 3793, 3794, 3795, - 3796, 3800, 3808, 3816, 3820, 3850, 3854, 3858, 3862, 3866, - 3870, 3876, 3880, 3884, 3888, 3899, 3903, 3907, 3911, 3919, - 3923, 3927, 3933, 3944 + 0, 448, 448, 449, 453, 460, 461, 462, 466, 467, + 471, 475, 479, 492, 491, 503, 504, 505, 506, 507, + 508, 509, 522, 531, 535, 543, 547, 551, 562, 583, + 613, 630, 658, 695, 717, 750, 772, 783, 797, 796, + 811, 815, 820, 824, 835, 839, 843, 847, 851, 855, + 859, 863, 867, 871, 875, 879, 884, 888, 895, 896, + 900, 901, 902, 907, 906, 922, 931, 939, 947, 955, + 966, 982, 981, 996, 1011, 1020, 1035, 1034, 1059, 1058, + 1086, 1085, 1116, 1115, 1134, 1133, 1154, 1153, 1185, 1184, + 1210, 1223, 1227, 1231, 1235, 1248, 1252, 1256, 1260, 1264, + 1269, 1274, 1278, 1282, 1286, 1293, 1297, 1301, 1305, 1309, + 1313, 1317, 1321, 1325, 1329, 1333, 1337, 1341, 1345, 1349, + 1353, 1357, 1361, 1365, 1369, 1373, 1377, 1381, 1385, 1389, + 1393, 1397, 1401, 1405, 1409, 1413, 1417, 1421, 1425, 1429, + 1433, 1437, 1441, 1445, 1452, 1453, 1457, 1459, 1458, 1466, + 1470, 1471, 1475, 1481, 1490, 1491, 1495, 1499, 1503, 1507, + 1513, 1519, 1525, 1532, 1537, 1546, 1550, 1555, 1563, 1575, + 1579, 1593, 1608, 1613, 1618, 1623, 1628, 1633, 1638, 1643, + 1649, 1648, 1679, 1689, 1699, 1703, 1707, 1716, 1720, 1725, + 1729, 1734, 1742, 1747, 1755, 1759, 1764, 1768, 1773, 1781, + 1786, 1794, 1798, 1805, 1809, 1816, 1820, 1824, 1828, 1832, + 1839, 1843, 1847, 1851, 1855, 1859, 1866, 1867, 1868, 1872, + 1875, 1876, 1877, 1881, 1886, 1892, 1898, 1903, 1909, 1915, + 1919, 1930, 1934, 1944, 1948, 1952, 1957, 1962, 1967, 1972, + 1977, 1982, 1990, 1994, 1998, 2003, 2008, 2013, 2018, 2023, + 2028, 2033, 2039, 2047, 2052, 2057, 2062, 2067, 2072, 2077, + 2082, 2087, 2092, 2098, 2106, 2110, 2115, 2120, 2125, 2130, + 2135, 2140, 2145, 2150, 2158, 2162, 2167, 2172, 2177, 2182, + 2187, 2192, 2197, 2202, 2207, 2213, 2220, 2227, 2237, 2241, + 2249, 2253, 2257, 2261, 2265, 2281, 2297, 2306, 2310, 2320, + 2327, 2338, 2342, 2350, 2354, 2358, 2362, 2366, 2382, 2398, + 2416, 2425, 2429, 2439, 2446, 2450, 2458, 2462, 2478, 2494, + 2503, 2513, 2520, 2524, 2532, 2536, 2541, 2545, 2553, 2554, + 2555, 2556, 2561, 2560, 2585, 2584, 2614, 2615, 2622, 2623, + 2627, 2628, 2632, 2636, 2640, 2644, 2648, 2652, 2656, 2660, + 2664, 2668, 2675, 2683, 2687, 2691, 2696, 2704, 2708, 2715, + 2716, 2721, 2728, 2729, 2734, 2742, 2746, 2750, 2757, 2761, + 2765, 2773, 2772, 2795, 2794, 2817, 2818, 2822, 2828, 2835, + 2844, 2845, 2846, 2850, 2854, 2858, 2862, 2866, 2870, 2875, + 2880, 2885, 2890, 2894, 2899, 2908, 2913, 2921, 2925, 2929, + 2937, 2947, 2947, 2957, 2958, 2962, 2963, 2964, 2965, 2966, + 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2973, 2973, 2974, + 2974, 2974, 2974, 2975, 2975, 2975, 2975, 2975, 2976, 2976, + 2976, 2977, 2977, 2977, 2977, 2977, 2978, 2978, 2978, 2978, + 2978, 2979, 2979, 2980, 2980, 2980, 2980, 2980, 2981, 2981, + 2981, 2981, 2981, 2982, 2982, 2982, 2982, 2983, 2983, 2983, + 2983, 2983, 2984, 2984, 2984, 2984, 2984, 2985, 2985, 2985, + 2985, 2985, 2985, 2986, 2986, 2986, 2986, 2986, 2987, 2987, + 2987, 2987, 2988, 2988, 2988, 2988, 2989, 2989, 2989, 2989, + 2989, 2990, 2990, 2990, 2990, 2991, 2991, 2991, 2991, 2991, + 2992, 2992, 2992, 2992, 2993, 2993, 2993, 2993, 2993, 2994, + 2994, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, + 2997, 2997, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, + 2998, 2998, 2999, 2999, 3003, 3007, 3014, 3018, 3025, 3029, + 3036, 3040, 3044, 3048, 3052, 3056, 3060, 3064, 3076, 3080, + 3084, 3088, 3092, 3096, 3100, 3104, 3108, 3112, 3116, 3120, + 3124, 3128, 3132, 3136, 3140, 3144, 3148, 3152, 3156, 3160, + 3164, 3168, 3172, 3176, 3180, 3184, 3188, 3192, 3196, 3204, + 3208, 3212, 3216, 3220, 3224, 3228, 3238, 3248, 3254, 3260, + 3266, 3272, 3278, 3284, 3291, 3298, 3305, 3312, 3318, 3324, + 3328, 3340, 3344, 3348, 3352, 3356, 3367, 3378, 3382, 3386, + 3390, 3394, 3398, 3402, 3406, 3410, 3414, 3418, 3422, 3426, + 3430, 3434, 3438, 3442, 3446, 3450, 3454, 3458, 3462, 3466, + 3470, 3474, 3478, 3482, 3486, 3490, 3494, 3498, 3505, 3509, + 3513, 3517, 3521, 3525, 3529, 3533, 3537, 3543, 3549, 3553, + 3559, 3566, 3570, 3574, 3578, 3582, 3586, 3590, 3594, 3598, + 3602, 3606, 3610, 3614, 3618, 3622, 3626, 3630, 3644, 3648, + 3652, 3656, 3660, 3664, 3668, 3672, 3684, 3688, 3692, 3696, + 3700, 3711, 3722, 3726, 3730, 3734, 3738, 3742, 3746, 3750, + 3754, 3758, 3762, 3766, 3770, 3774, 3778, 3782, 3786, 3790, + 3794, 3798, 3802, 3806, 3810, 3814, 3818, 3822, 3826, 3830, + 3834, 3838, 3845, 3849, 3853, 3857, 3861, 3865, 3869, 3873, + 3877, 3883, 3889, 3897, 3901, 3905, 3909, 3916, 3926, 3932, + 3938, 3948, 3960, 3968, 3972, 4002, 4006, 4010, 4014, 4018, + 4022, 4028, 4032, 4036, 4040, 4051, 4055, 4059, 4063, 4071, + 4075, 4079, 4085, 4096 }; #endif @@ -1011,31 +1360,31 @@ static const char *const yytname[] = "UNARY_PLUS", "UNARY_STAR", "UNARY_REF", "POINTSAT", "SCOPE", "PLUSPLUS", "MINUSMINUS", "TIMESEQUAL", "DIVIDEEQUAL", "MODEQUAL", "PLUSEQUAL", "MINUSEQUAL", "OREQUAL", "ANDEQUAL", "XOREQUAL", "LSHIFTEQUAL", - "RSHIFTEQUAL", "KW_ALIGNAS", "KW_ALIGNOF", "KW_AUTO", "KW_BEGIN_PUBLISH", - "KW_BLOCKING", "KW_BOOL", "KW_CATCH", "KW_CHAR", "KW_CHAR16_T", - "KW_CHAR32_T", "KW_CLASS", "KW_CONST", "KW_CONSTEXPR", "KW_CONST_CAST", - "KW_DECLTYPE", "KW_DEFAULT", "KW_DELETE", "KW_DOUBLE", "KW_DYNAMIC_CAST", - "KW_ELSE", "KW_END_PUBLISH", "KW_ENUM", "KW_EXTENSION", "KW_EXTERN", - "KW_EXPLICIT", "KW_PUBLISHED", "KW_FALSE", "KW_FINAL", "KW_FLOAT", - "KW_FRIEND", "KW_FOR", "KW_GOTO", "KW_HAS_VIRTUAL_DESTRUCTOR", "KW_IF", - "KW_INLINE", "KW_INT", "KW_IS_ABSTRACT", "KW_IS_BASE_OF", "KW_IS_CLASS", - "KW_IS_CONSTRUCTIBLE", "KW_IS_CONVERTIBLE_TO", "KW_IS_DESTRUCTIBLE", - "KW_IS_EMPTY", "KW_IS_ENUM", "KW_IS_FINAL", "KW_IS_FUNDAMENTAL", - "KW_IS_POD", "KW_IS_POLYMORPHIC", "KW_IS_STANDARD_LAYOUT", - "KW_IS_TRIVIAL", "KW_IS_UNION", "KW_LONG", "KW_MAKE_MAP_PROPERTY", - "KW_MAKE_PROPERTY", "KW_MAKE_PROPERTY2", "KW_MAKE_SEQ", - "KW_MAKE_SEQ_PROPERTY", "KW_MUTABLE", "KW_NAMESPACE", "KW_NEW", - "KW_NOEXCEPT", "KW_NULLPTR", "KW_OPERATOR", "KW_OVERRIDE", "KW_PRIVATE", - "KW_PROTECTED", "KW_PUBLIC", "KW_REGISTER", "KW_REINTERPRET_CAST", - "KW_RETURN", "KW_SHORT", "KW_SIGNED", "KW_SIZEOF", "KW_STATIC", - "KW_STATIC_ASSERT", "KW_STATIC_CAST", "KW_STRUCT", "KW_TEMPLATE", - "KW_THREAD_LOCAL", "KW_THROW", "KW_TRUE", "KW_TRY", "KW_TYPEDEF", - "KW_TYPEID", "KW_TYPENAME", "KW_UNDERLYING_TYPE", "KW_UNION", - "KW_UNSIGNED", "KW_USING", "KW_VIRTUAL", "KW_VOID", "KW_VOLATILE", - "KW_WCHAR_T", "KW_WHILE", "START_CPP", "START_CONST_EXPR", "START_TYPE", - "'{'", "','", "';'", "':'", "'='", "'?'", "'|'", "'^'", "'&'", "'<'", - "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", "'.'", "'('", "'['", - "')'", "'}'", "']'", "'!'", "$accept", "grammar", "cpp", + "RSHIFTEQUAL", "ATTR_LEFT", "ATTR_RIGHT", "KW_ALIGNAS", "KW_ALIGNOF", + "KW_AUTO", "KW_BEGIN_PUBLISH", "KW_BLOCKING", "KW_BOOL", "KW_CATCH", + "KW_CHAR", "KW_CHAR16_T", "KW_CHAR32_T", "KW_CLASS", "KW_CONST", + "KW_CONSTEXPR", "KW_CONST_CAST", "KW_DECLTYPE", "KW_DEFAULT", + "KW_DELETE", "KW_DOUBLE", "KW_DYNAMIC_CAST", "KW_ELSE", "KW_END_PUBLISH", + "KW_ENUM", "KW_EXTENSION", "KW_EXTERN", "KW_EXPLICIT", "KW_PUBLISHED", + "KW_FALSE", "KW_FINAL", "KW_FLOAT", "KW_FRIEND", "KW_FOR", "KW_GOTO", + "KW_HAS_VIRTUAL_DESTRUCTOR", "KW_IF", "KW_INLINE", "KW_INT", + "KW_IS_ABSTRACT", "KW_IS_BASE_OF", "KW_IS_CLASS", "KW_IS_CONSTRUCTIBLE", + "KW_IS_CONVERTIBLE_TO", "KW_IS_DESTRUCTIBLE", "KW_IS_EMPTY", + "KW_IS_ENUM", "KW_IS_FINAL", "KW_IS_FUNDAMENTAL", "KW_IS_POD", + "KW_IS_POLYMORPHIC", "KW_IS_STANDARD_LAYOUT", "KW_IS_TRIVIAL", + "KW_IS_UNION", "KW_LONG", "KW_MAKE_MAP_PROPERTY", "KW_MAKE_PROPERTY", + "KW_MAKE_PROPERTY2", "KW_MAKE_SEQ", "KW_MAKE_SEQ_PROPERTY", "KW_MUTABLE", + "KW_NAMESPACE", "KW_NEW", "KW_NOEXCEPT", "KW_NULLPTR", "KW_OPERATOR", + "KW_OVERRIDE", "KW_PRIVATE", "KW_PROTECTED", "KW_PUBLIC", "KW_REGISTER", + "KW_REINTERPRET_CAST", "KW_RETURN", "KW_SHORT", "KW_SIGNED", "KW_SIZEOF", + "KW_STATIC", "KW_STATIC_ASSERT", "KW_STATIC_CAST", "KW_STRUCT", + "KW_TEMPLATE", "KW_THREAD_LOCAL", "KW_THROW", "KW_TRUE", "KW_TRY", + "KW_TYPEDEF", "KW_TYPEID", "KW_TYPENAME", "KW_UNDERLYING_TYPE", + "KW_UNION", "KW_UNSIGNED", "KW_USING", "KW_VIRTUAL", "KW_VOID", + "KW_VOLATILE", "KW_WCHAR_T", "KW_WHILE", "START_CPP", "START_CONST_EXPR", + "START_TYPE", "'{'", "','", "';'", "':'", "'='", "'?'", "'|'", "'^'", + "'&'", "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'~'", "'.'", + "'('", "'['", "')'", "'}'", "'!'", "']'", "$accept", "grammar", "cpp", "constructor_inits", "constructor_init", "extern_c", "$@1", "declaration", "friend_declaration", "$@2", "storage_class", "attribute_specifiers", "attribute_specifier", "type_like_declaration", @@ -1057,24 +1406,24 @@ static const char *const yytname[] = "not_paren_formal_parameter_identifier", "formal_parameter_identifier", "parameter_pack_identifier", "not_paren_empty_instance_identifier", "empty_instance_identifier", "type", "type_pack", "type_decl", - "predefined_type", "var_type_decl", "full_type", "anonymous_struct", - "$@14", "named_struct", "$@15", "maybe_final", "maybe_class_derivation", - "class_derivation", "base_specification", "enum", "enum_decl", - "enum_element_type", "enum_body_trailing_comma", "enum_body", - "enum_keyword", "struct_keyword", "namespace_declaration", "$@16", - "$@17", "using_declaration", "simple_type", "simple_int_type", + "predefined_type", "var_type_decl", "full_type", "struct_attributes", + "anonymous_struct", "$@14", "named_struct", "$@15", "maybe_final", + "maybe_class_derivation", "class_derivation", "base_specification", + "enum", "enum_decl", "enum_element_type", "enum_body_trailing_comma", + "enum_body", "enum_keyword", "struct_keyword", "namespace_declaration", + "$@16", "$@17", "using_declaration", "simple_type", "simple_int_type", "simple_float_type", "simple_void_type", "code", "$@18", "code_block", "element", "optional_const_expr", "optional_const_expr_comma", "const_expr_comma", "no_angle_bracket_const_expr", "const_expr", "const_operand", "formal_const_expr", "formal_const_operand", "capture_list", "capture", "class_derivation_name", "name", - "name_no_final", "string_literal", "empty", YY_NULLPTR + "name_no_final", "string_literal", "empty", YY_NULL }; #endif # ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, @@ -1091,1853 +1440,94 @@ static const yytype_uint16 yytoknum[] = 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 123, 44, 59, 58, 61, 63, - 124, 94, 38, 60, 62, 43, 45, 42, 47, 37, - 126, 46, 40, 91, 41, 125, 93, 33 + 395, 396, 397, 398, 399, 400, 123, 44, 59, 58, + 61, 63, 124, 94, 38, 60, 62, 43, 45, 42, + 47, 37, 126, 46, 40, 91, 41, 125, 33, 93 }; # endif -#define YYPACT_NINF -868 - -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-868))) - -#define YYTABLE_NINF -729 - -#define yytable_value_is_error(Yytable_value) \ - 0 - - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int16 yypact[] = -{ - 347, -868, 2997, 4826, 28, 3474, -868, -868, -868, -868, - -868, -868, -868, -868, -138, -102, -81, -45, -31, -27, - 9, 23, 52, -868, -868, 66, 89, 100, 114, 117, - 123, 131, 134, 144, 172, 199, 210, 213, 239, 243, - 252, 254, 266, 274, 5078, -868, -868, 60, 292, 293, - 7, 164, -868, 304, 305, 308, 2997, 2997, 2997, 2997, - 2997, 2040, 1052, 2997, 2753, -868, 185, -868, -868, -868, - -868, -868, -868, -868, -868, 4939, 310, -868, 27, -868, - -868, 1717, 4467, 4467, -868, 2604, 311, -868, 4467, -868, - -868, 16, 16, -868, -868, -868, -868, 334, 276, 464, - -868, -868, -868, -868, -868, -868, 5981, 5981, 5981, -868, - 5981, 3092, 5981, 152, -868, 5972, 317, 321, 329, 332, - 5981, 2208, 357, 358, 360, 5981, 5981, 336, 5884, 5981, - 5981, 2823, 5981, 5981, -868, 345, -868, -868, -868, 3672, - -868, -868, -868, -868, -868, 2997, 4826, 2997, 2997, 2997, - 2997, 4826, 2997, 4826, 2997, 4826, 2997, 4826, 4826, 4826, - 4826, 4826, 4826, 4826, 4826, 4826, 4826, 4826, 4826, 4826, - 4826, 4826, 2997, -868, -868, 353, 2604, 355, 370, 2604, - 2604, -868, 4826, 2997, 2997, 372, 4826, 4826, 2040, 2997, - 2997, 73, 73, 73, 73, 73, -138, -81, -45, -31, - -27, 23, 66, 100, 6011, 4837, 5211, 6044, 308, 373, - -93, 2753, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, 2604, 356, 374, -868, -868, 73, 2997, - 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, - 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, - 2337, 2997, -868, -868, 16, 16, 2997, -868, -868, -868, - 4467, -868, -868, -868, -868, 4826, -868, 379, 560, 354, - 16, 16, 354, 354, 4375, 377, -868, 378, -868, -868, - -868, -868, -868, -868, 3578, 400, -26, -10, 33, 130, - -868, -868, -868, 5981, -868, -868, -868, -868, 5981, -868, - -868, -868, 5858, 2295, -868, 2604, 2604, 2604, 2604, -868, - -868, 406, -868, -868, -868, -868, -868, 2997, 3763, -868, - 396, -868, 3803, -868, 2604, 83, -868, -868, 2604, 338, - 389, -868, 390, 4968, 2604, 391, -868, 2604, -6, 314, - 409, -868, -868, -868, -868, 2065, 464, -868, 394, 414, - -868, 397, 398, 399, 401, 403, 425, 404, 426, 419, - 428, 429, 430, 415, 432, -82, 452, 434, 436, 437, - 441, 442, 445, 446, 453, 455, 458, 466, 2997, -868, - 4826, 2997, -868, -868, 477, 468, 473, 2604, 475, 487, - 478, 3948, 481, 482, 2997, 2997, -868, -868, 486, 1052, - 1325, 4243, 3013, 3013, 1096, 1096, 579, 579, -868, 4038, - 1056, 4259, 3516, 1096, 1096, 233, 233, 73, 73, 73, - -868, -868, -79, 1807, -868, -868, 3966, 492, 354, 498, - 493, 2604, 354, 354, 354, 354, 354, 502, -868, 377, - -868, 377, -868, 502, 502, -868, 354, 4850, 4737, 354, - 354, 503, 31, -868, 821, 85, -868, 2997, 2604, 501, - -868, -868, -868, -868, 3578, -868, 595, -868, -868, -868, - 530, 531, 532, 534, 537, 5354, -868, 1433, 4571, 315, - 513, 314, -868, -868, 539, -868, 4826, 520, 546, 533, - -868, 4, 2997, 5164, 247, -868, 4826, -868, 541, -868, - -868, 2604, -22, -868, -868, -868, 2205, -868, -868, 371, - -868, 557, -868, -868, -868, -868, -868, -868, -868, 544, - -868, 545, -868, -868, -868, -868, 4826, -868, 4826, -868, - 4826, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, 3984, 529, 548, 547, -868, -868, 549, -868, - 552, -868, -868, -868, -868, 73, 2753, 4619, 3321, -868, - -868, 2997, -868, -868, -868, -868, 502, 354, -868, 502, - 502, 502, 502, 502, 2997, -68, 4939, 821, 85, -868, - 34, 75, -868, -868, 4708, 551, 821, 821, 821, 821, - 821, 821, -44, -868, -868, 553, 2604, 85, 85, 85, - 85, 85, 85, -18, 554, 2753, -868, -40, -868, 578, - 5426, -868, 581, -868, 5498, -868, 715, 716, 719, 720, - -868, -868, 405, 593, -868, -868, -868, -868, 3877, -868, - 590, 601, 2472, -868, 647, -868, -868, 4, -868, 371, - -868, 602, 583, 2604, 3129, 4619, 603, 371, 4619, 4002, - 247, 604, 247, 247, 247, 247, 247, 93, -868, -868, - 599, 5570, -868, 582, -868, 179, -868, -61, 613, 618, - 610, 620, 621, 2469, 2225, 624, 371, 371, 3605, 371, - 371, 371, 371, -868, 151, 351, -868, 3578, 2997, 2997, - 614, 619, 623, -868, -868, -868, 2997, -868, 2997, 631, - -868, 5054, -868, -868, -868, -868, -868, 622, -868, -868, - 638, -868, 2753, 502, 636, 635, 821, 85, -44, -18, - 641, 644, 3321, -868, -868, 821, 645, 645, 645, 645, - 645, 262, 2997, 2997, -868, -868, 85, -868, 648, 648, - 648, 648, 648, 275, 2997, -868, 649, -868, 2997, -868, - 5194, 672, 673, -868, -868, -868, -67, 676, 677, 681, - 5642, 15, -868, 647, 5944, 4571, 2604, 669, 666, 647, - 647, 647, 647, 647, 647, 39, 648, -868, 351, -868, - 5981, -868, -868, -868, -868, -868, -868, -868, 667, 675, - 682, -868, -868, 5078, -868, -868, 688, 10, 691, -868, - 683, 2997, 2997, 2997, 2997, 2040, 2997, 685, 36, -868, - -868, 4204, -868, 185, -868, 686, 371, 202, 689, -868, - 284, 247, 684, 684, 684, 684, 684, -868, 2997, -868, - -868, 4619, -868, 1873, -868, -868, 2604, 2997, 2997, -868, - -868, -868, -868, -868, 2469, 687, 701, 2753, -868, -868, - 371, 288, 288, 844, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - 692, 693, -868, -868, 288, 288, 288, 350, 854, -868, - 2997, -868, 2205, 718, -868, 578, -42, -12, -868, -868, - -868, 51, 58, -868, 5078, 16, 678, -868, -868, 4619, - -44, -18, -868, -868, 4619, 4619, -868, 645, 698, 2753, - 700, 648, 702, 703, 2489, 5245, 5264, 5278, 2604, 413, - -868, 2604, -868, 852, -868, 5194, 5714, 858, 725, 862, - 863, 864, -868, 729, 39, 648, -868, -868, -868, -868, - -868, 4826, 647, 3404, -868, -868, 735, -868, -868, 4826, - 4826, 4826, 723, 4826, 724, 4826, 4826, 2040, 73, 73, - 73, 73, 717, 82, 73, -868, -868, 3267, 2997, 2997, - 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, - 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2601, - 2997, -868, 367, 726, -868, -868, 684, 4619, 721, 727, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, -868, -868, - -868, -868, -868, -868, -868, -868, -868, -868, 728, -868, - 731, 733, 736, -868, 2733, 288, -868, -868, -868, -868, - -868, 3129, 732, 2225, 371, -868, -868, -868, -868, 3321, - 16, -868, -868, 11, 738, 740, -868, -868, 741, 742, - 4619, -868, 4619, -868, -868, 4456, -868, 4456, -868, 4456, - -868, -868, 4456, 4456, 4456, -868, -868, 5786, -868, -868, - 116, -868, 137, 751, 138, -868, -868, -868, 730, 737, - 763, 768, 24, 769, 3404, 3404, 3404, 3404, 3404, 2040, - 3404, 3685, -868, 371, 762, 773, 774, 2997, 775, 2604, - 766, 778, 770, 4020, 2997, -868, -868, -868, 1325, 4243, - 3013, 3013, 1096, 1096, 579, 579, -868, 4186, 1056, 4259, - 3516, 1096, 1096, 233, 233, 73, 73, 73, -868, -868, - 139, 3287, 2124, 771, -868, 2124, 4619, 772, -868, -868, - 1596, -868, -868, 867, -868, 2469, 2753, 780, -868, -868, - 794, -868, 783, -868, -868, -868, -868, -868, 784, 786, - -868, -868, -868, -868, -868, -868, -868, 942, 808, 946, - 814, 817, 954, 819, 4826, 4826, 4826, 4826, 804, 4826, - 4826, 87, 87, 87, 87, 87, 803, 146, 87, 3404, - 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, - 3404, 3404, 3404, 3404, 3404, 3404, 3404, 3404, 2865, 2997, - -868, -868, 812, 813, 806, 815, 818, -868, 822, -868, - -868, 73, 2997, -868, -868, -868, 4619, 824, -868, 2124, - -868, -868, 816, -868, -868, -868, 3321, 3321, 3321, -868, - -868, 825, -868, 840, -868, -868, 155, -868, 829, 832, - 841, 842, 2604, 830, 845, 3404, -868, 3201, 4290, 1525, - 1525, 1338, 1338, 1374, 1374, -868, 4222, 4441, 4457, 4482, - 975, 975, 87, 87, 87, -868, -868, 171, 3927, 2997, - 2997, -868, 2997, -868, 2997, 2753, 4619, 837, -868, 2124, - -868, 2124, 838, -868, -868, -868, 2124, 2124, 856, 994, - 995, 860, -868, 849, 850, 853, 855, -868, 861, 87, - 3404, -868, -868, 214, 215, 223, 229, 868, -868, 2124, - -868, -868, 870, 872, -868, 2997, 2997, 2997, -868, 2997, - 3685, -868, -868, -868, -868, -868, 3321, 871, 874, 244, - 255, 257, 258, 3321, -868, -868, -868, -868, -868, -868, - -868, -868 -}; - - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ -static const yytype_uint16 yydefact[] = -{ - 0, 733, 0, 0, 0, 733, 5, 624, 620, 623, - 729, 730, 626, 627, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 622, 628, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 630, 629, 0, 0, 0, - 0, 0, 621, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 733, 0, 3, 563, 625, 282, 292, 291, - 370, 371, 373, 374, 355, 0, 0, 385, 352, 384, - 379, 376, 375, 378, 356, 0, 0, 357, 377, 387, - 372, 733, 733, 4, 284, 285, 286, 0, 341, 0, - 281, 367, 368, 369, 1, 21, 733, 733, 733, 22, - 733, 733, 733, 0, 38, 733, 0, 0, 0, 0, - 733, 0, 0, 0, 0, 733, 733, 0, 733, 733, - 733, 0, 733, 733, 6, 0, 17, 7, 19, 0, - 15, 16, 18, 65, 40, 733, 0, 733, 733, 733, - 733, 0, 733, 0, 733, 0, 733, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 733, 306, 312, 0, 0, 0, 585, 0, - 0, 305, 0, 733, 733, 0, 0, 0, 0, 733, - 733, 594, 592, 591, 593, 590, 282, 370, 371, 373, - 374, 385, 384, 379, 376, 375, 378, 377, 372, 0, - 0, 523, 715, 716, 717, 718, 721, 719, 723, 722, - 720, 724, 708, 707, 0, 705, 710, 704, 589, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 731, 732, 733, 733, 0, 353, 354, 386, - 376, 381, 380, 383, 283, 0, 382, 0, 268, 733, - 733, 733, 733, 733, 733, 0, 315, 267, 317, 733, - 725, 726, 727, 728, 0, 343, 715, 716, 717, 719, - 319, 287, 321, 733, 52, 41, 51, 53, 733, 42, - 47, 23, 733, 0, 45, 0, 0, 0, 0, 50, - 733, 0, 26, 25, 24, 48, 44, 0, 0, 143, - 0, 54, 0, 20, 0, 0, 46, 49, 0, 314, - 294, 304, 0, 0, 0, 0, 13, 0, 0, 0, - 313, 60, 296, 297, 298, 341, 0, 293, 0, 522, - 521, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 307, - 0, 733, 309, 308, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 619, 709, 733, 733, - 603, 604, 605, 606, 607, 608, 611, 612, 618, 0, - 600, 601, 602, 609, 610, 598, 599, 595, 596, 597, - 617, 616, 0, 0, 316, 318, 0, 0, 733, 269, - 0, 258, 733, 733, 733, 733, 733, 274, 257, 0, - 270, 0, 271, 273, 272, 182, 733, 0, 0, 733, - 733, 0, 183, 186, 733, 0, 181, 733, 349, 0, - 346, 345, 340, 344, 0, 733, 733, 43, 39, 733, - 0, 0, 0, 0, 0, 733, 358, 0, 733, 314, - 294, 0, 313, 68, 0, 364, 0, 0, 56, 58, - 73, 75, 0, 0, 733, 295, 0, 733, 0, 388, - 199, 0, 0, 63, 388, 204, 0, 64, 62, 0, - 301, 343, 299, 569, 584, 575, 571, 573, 574, 0, - 581, 0, 580, 633, 570, 634, 0, 636, 0, 637, - 0, 640, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 577, 0, 0, 0, 0, 576, 579, 0, 582, - 0, 587, 588, 578, 572, 564, 524, 733, 733, 88, - 706, 0, 615, 614, 289, 290, 275, 733, 259, 264, - 260, 261, 263, 262, 733, 0, 0, 733, 0, 223, - 0, 0, 733, 185, 0, 0, 733, 733, 733, 733, - 733, 733, 733, 236, 235, 0, 246, 0, 0, 0, - 0, 0, 0, 733, 0, 520, 519, 350, 339, 288, - 733, 324, 733, 323, 733, 360, 0, 0, 0, 0, - 362, 733, 0, 0, 160, 161, 162, 148, 0, 149, - 0, 145, 150, 146, 733, 159, 144, 0, 70, 0, - 366, 0, 0, 0, 733, 733, 0, 0, 733, 0, - 733, 0, 733, 733, 733, 733, 733, 0, 227, 226, - 0, 733, 77, 0, 733, 0, 8, 0, 0, 0, - 0, 0, 0, 733, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 61, 733, 733, 163, 0, 0, 0, - 0, 0, 0, 310, 311, 586, 0, 583, 0, 0, - 95, 0, 89, 92, 96, 91, 93, 0, 90, 94, - 0, 178, 613, 265, 0, 0, 733, 0, 733, 733, - 0, 0, 733, 184, 187, 733, 241, 237, 238, 240, - 239, 0, 0, 733, 217, 197, 0, 247, 252, 248, - 249, 251, 250, 0, 733, 220, 276, 347, 0, 320, - 0, 0, 326, 325, 363, 733, 0, 0, 0, 0, - 733, 0, 37, 733, 733, 0, 153, 151, 0, 733, - 733, 733, 733, 733, 733, 733, 157, 69, 733, 365, - 733, 57, 697, 693, 696, 699, 700, 189, 0, 0, - 0, 695, 701, 0, 703, 702, 0, 0, 0, 694, - 0, 0, 0, 0, 0, 0, 0, 0, 190, 224, - 193, 225, 650, 698, 188, 0, 0, 0, 0, 302, - 0, 733, 232, 228, 229, 231, 230, 83, 733, 303, - 14, 733, 200, 389, 390, 388, 0, 733, 733, 202, - 203, 205, 207, 208, 733, 0, 211, 213, 210, 206, - 0, 170, 166, 0, 110, 111, 112, 113, 114, 115, - 118, 119, 134, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 138, 137, 121, 120, 107, - 109, 108, 116, 117, 105, 106, 102, 103, 104, 101, - 0, 0, 100, 164, 167, 169, 168, 0, 0, 174, - 733, 176, 0, 0, 66, 300, 0, 0, 635, 638, - 639, 0, 0, 733, 0, 733, 0, 388, 266, 733, - 733, 733, 218, 221, 733, 733, 277, 242, 245, 198, - 0, 253, 256, 0, 351, 723, 0, 722, 0, 0, - 327, 0, 329, 711, 733, 0, 733, 0, 0, 0, - 0, 0, 359, 0, 733, 158, 139, 142, 140, 147, - 154, 0, 733, 0, 155, 195, 0, 71, 55, 0, - 0, 0, 659, 0, 0, 0, 0, 0, 667, 666, - 665, 664, 0, 0, 663, 59, 192, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 733, 0, 0, 733, 85, 233, 733, 0, 0, - 392, 393, 397, 394, 402, 395, 396, 398, 399, 400, - 401, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 445, 446, 447, 448, 468, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 461, 462, 463, 464, 465, 466, 467, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 733, 512, 513, 514, 505, 517, - 501, 502, 500, 507, 508, 496, 497, 498, 499, 506, - 504, 511, 509, 515, 510, 516, 503, 391, 0, 9, - 0, 0, 0, 209, 212, 171, 165, 136, 135, 173, - 177, 733, 0, 198, 0, 567, 566, 568, 565, 733, - 733, 179, 97, 0, 0, 0, 219, 222, 0, 0, - 733, 243, 733, 254, 348, 0, 332, 0, 331, 0, - 330, 713, 0, 0, 0, 712, 714, 733, 328, 361, - 0, 27, 0, 0, 0, 36, 156, 152, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 196, 525, 0, 0, 0, 0, 733, 0, 0, - 0, 0, 0, 0, 0, 692, 191, 194, 676, 677, - 678, 679, 680, 681, 684, 685, 691, 0, 673, 674, - 675, 682, 683, 671, 672, 668, 669, 670, 690, 689, - 0, 0, 74, 0, 79, 76, 733, 0, 234, 733, - 0, 201, 12, 10, 214, 733, 215, 0, 172, 67, - 0, 180, 0, 98, 631, 733, 733, 733, 0, 0, - 338, 337, 336, 335, 334, 333, 322, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 539, 537, 536, 538, 535, 0, 0, 534, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 658, 0, 0, 0, 0, 0, 656, 0, 661, - 662, 651, 0, 688, 687, 81, 733, 0, 733, 78, - 518, 11, 0, 733, 388, 99, 733, 733, 733, 733, - 733, 0, 28, 0, 33, 35, 0, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 562, 548, 549, 550, - 551, 552, 553, 554, 555, 561, 0, 545, 546, 547, - 543, 544, 540, 541, 542, 560, 559, 0, 0, 0, - 0, 660, 0, 657, 0, 686, 733, 0, 733, 84, - 216, 175, 0, 280, 279, 278, 244, 255, 0, 0, - 0, 0, 533, 0, 0, 0, 0, 531, 0, 526, - 0, 558, 557, 0, 0, 0, 0, 0, 733, 86, - 632, 29, 0, 0, 31, 0, 0, 0, 532, 0, - 556, 654, 653, 655, 652, 733, 733, 0, 0, 0, - 0, 0, 0, 733, 80, 34, 32, 529, 528, 530, - 527, 82 -}; - - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -868, -868, -245, -868, 178, -868, -868, 722, -868, -868, - -53, 375, -868, -124, -868, -142, -868, -868, -192, -868, - -868, -868, 734, -868, -868, -868, -868, -868, -493, -868, - -868, 294, -868, -868, -868, -868, 273, 412, -553, -868, - -628, -666, -100, -868, -101, -868, 103, -511, -868, -466, - -838, -868, -445, 72, -540, -147, -442, 756, -54, -41, - -30, 739, -682, 746, 884, -104, -868, -97, -868, -868, - -868, -868, 124, -92, -868, -444, -868, -868, -14, 55, - -868, -868, -868, -868, -7, 5, -868, -868, -502, -868, - -51, -868, -538, -140, -60, 188, 107, 104, -868, -868, - 694, -868, -867, 634, 652, -617, -1 -}; - - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 4, 5, 665, 666, 136, 497, 137, 138, 302, - 139, 487, 488, 140, 509, 683, 323, 639, 777, 338, - 645, 648, 339, 831, 1356, 1416, 1017, 1266, 558, 893, - 957, 141, 320, 630, 631, 632, 633, 634, 684, 1161, - 685, 710, 451, 452, 807, 808, 964, 734, 503, 507, - 845, 846, 453, 810, 657, 726, 738, 275, 276, 91, - 92, 340, 178, 341, 93, 94, 465, 95, 466, 612, - 751, 752, 940, 96, 97, 462, 458, 459, 98, 99, - 142, 621, 755, 143, 100, 101, 102, 103, 663, 664, - 833, 1147, 604, 348, 349, 1221, 211, 65, 811, 812, - 224, 225, 942, 943, 593, 66, 144 -}; - - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_int16 yytable[] = -{ - 6, 210, 670, 579, 319, 761, 1152, 352, 353, 354, - 355, 778, 357, 603, 359, 638, 361, 646, 901, 915, - 609, 252, 185, 253, 145, 974, 1282, 813, 104, 267, - 179, 268, 377, 269, 254, 342, 714, 181, 278, 1308, - 668, 669, 343, 385, 386, 255, 583, 344, -725, 392, - 393, 986, 395, 294, 295, 296, 926, 297, 299, 300, - 146, 227, 304, 528, -726, 475, 395, 309, 1186, 1188, - 1190, 396, 315, 316, 270, 318, 321, 322, 947, 326, - 327, 147, 529, 837, 257, 562, 261, 262, 263, 722, - 277, 277, 745, 266, 817, 574, 715, 948, 595, 180, - 596, 838, 597, 395, 732, 747, 237, -727, 748, 64, - 820, 972, 822, 823, 824, 825, 826, 148, -725, 733, - 1327, -725, 1165, 851, 852, 345, 894, 895, 896, 897, - 732, 149, 347, 395, -726, 150, 719, -726, 499, 724, - 500, 501, 502, 598, 350, 744, 350, 350, 350, 350, - 258, 350, 1166, 350, 271, 350, 739, 740, 741, 742, - 743, 647, 151, 191, 192, 193, 194, 195, 272, 186, - 228, 350, 975, 273, 903, 1283, 584, -727, 274, 953, - -727, 987, 350, 350, 701, 152, 1309, 963, 350, 350, - 422, 252, 776, 253, 346, 930, 395, 574, 720, 809, - 424, 425, 733, 395, -728, 153, 933, 922, 923, 261, - 262, 263, 266, 182, 342, 1167, 440, 442, 342, 904, - 610, 343, 1168, 599, 614, 343, 344, 395, 154, 485, - 344, 486, 1170, 454, 249, 250, 251, 600, 574, 721, - 304, 544, 601, 905, 455, 467, 1235, 602, 1337, 1338, - 1339, 155, 661, 277, 277, 827, 828, 280, 281, 282, - 651, 1297, 156, 1012, 652, 261, 237, 966, 438, 277, - 277, 438, 438, 456, -728, 921, 157, -728, 460, 158, - 1298, 1016, 1299, 1302, 395, 159, 280, 281, 282, 463, - 1018, 395, 494, 160, 931, 391, 161, 1155, 898, 301, - 1430, 1300, 1303, 1353, 345, 653, 162, 592, 345, 6, - 1386, 347, 967, 899, 900, 347, 395, 187, 1290, 1431, - 1291, 955, 1292, 835, 836, 1293, 1294, 1295, 739, 740, - 741, 742, 743, 1148, 163, 1441, 400, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 283, 423, 395, - 395, 164, 1162, 426, 899, 900, 1013, 430, 395, 431, - 813, 432, 165, 346, 395, 166, 760, 346, 1461, 1462, - 350, 280, 281, 282, 675, 654, 283, 1463, 676, 395, - 246, 247, 248, 1464, 249, 250, 251, 559, 227, 655, - 395, 167, 395, 395, 656, 168, 577, 454, 1477, 1176, - 1177, 10, 433, 11, 169, 1174, 170, 578, 455, 1478, - 1169, 1479, 1480, 284, 477, 733, 928, 438, 171, 677, - 718, 438, 438, 438, 438, 438, 172, 1362, 744, 932, - 727, 728, 729, 730, 731, 438, 1015, 828, 438, 438, - 899, 900, 650, 594, 183, 184, 606, 699, 504, -87, - 505, -87, 506, -87, 6, 613, 188, 189, 6, 463, - 190, 635, 256, 265, 286, 287, 288, 636, 279, 305, - 678, 283, -87, 306, -87, 542, -87, 775, 1, 2, - 3, 307, 434, 659, 308, 504, 6, 505, 317, 902, - 490, 555, 556, 1280, 312, 313, 435, 314, 328, 679, - 946, 436, 899, 900, 1159, 378, 454, 380, 1262, 399, - 931, 1265, 398, 680, 1192, 1193, 1194, 455, 681, 899, - 900, 1263, 381, 682, 387, 716, 428, 394, 215, 216, - 457, -257, 809, 454, 813, 815, 717, 464, 818, 478, - 476, 491, 492, 496, 455, 508, 456, 711, 513, 395, - 526, 514, 515, 516, 605, 517, 438, 518, 520, 920, - 212, 213, 214, 606, 289, 218, 594, 219, 927, 519, - 521, 559, 220, 522, 221, 594, 594, 594, 594, 594, - 594, 735, 523, 524, 525, 778, 527, 530, 531, 649, - 532, 533, 735, 454, 454, 534, 535, 454, 290, 536, - 537, 753, 237, 674, 455, 455, 954, 538, 455, 539, - 6, 635, 540, 727, 728, 729, 730, 731, 906, 907, - 541, 545, 546, 594, 215, 216, 911, 547, 912, 549, - 956, 550, 551, 814, 456, 553, 554, 456, 557, 659, - 567, 659, 659, 659, 659, 659, 565, 280, 281, 282, - 768, -259, 596, 834, 769, 574, 608, 582, 712, 611, - 217, 218, 848, 219, 615, 637, 616, 617, 220, 618, - 221, 605, 619, 711, 735, 640, 642, 179, 212, 213, - 214, 643, 463, 694, 181, 644, 226, 1150, 1151, 1197, - 1423, 1424, 1425, 662, 687, 770, 688, 689, 725, 696, - 736, 318, 695, 697, 698, 594, 809, 735, 735, 264, - 746, 711, -342, -258, 594, 756, 757, 968, 750, 758, - 759, 1019, 606, 291, 244, 245, 246, 247, 248, 762, - 249, 250, 251, 606, 764, 983, 765, 832, 779, 780, - 285, 292, 215, 216, 6, 311, 180, 283, 635, 839, - 816, 821, 594, 829, 840, 325, 842, 843, 594, 594, - 594, 594, 594, 594, 965, 841, 1359, 735, 908, 179, - 847, 850, 917, 909, 916, 771, 181, 910, 217, 218, - 454, 219, 1366, 1367, 1368, 913, 220, 919, 221, 772, - 1474, 455, 918, 924, 773, 941, 925, 1481, 733, 774, - 379, 744, -266, 382, 383, 927, 944, 961, 945, 1175, - 659, 949, 950, 962, 1178, 1179, 951, 606, 970, 969, - 456, 280, 281, 282, 585, 971, 350, 350, 586, 929, - 605, 973, 1172, 848, 976, 977, 1154, 828, 180, 985, - 1011, 605, 1153, 1014, 1156, 934, 1157, 397, 1160, 1158, - 1180, 1171, 1422, 1164, 1182, 1419, 1181, 1196, 1200, 1183, - 1421, 1201, 1202, 1203, 1204, 1205, 1426, 1427, 454, 587, - 1223, 1234, 1361, 454, 454, 1227, 1229, 1268, 1264, 455, - 1305, 1269, 1304, 1271, 455, 455, 1272, 1273, 1278, 606, - 179, 1274, 429, 1284, 1285, 1286, 1287, 181, 978, 979, - 980, 981, 559, 984, 277, 1301, 1306, 1267, 456, 735, - 735, 1307, 1310, 456, 456, 1449, 1341, 1342, 1343, 1345, - 1347, 283, 1348, 1355, 1349, 605, 1358, 470, 1364, 471, - 472, 473, 474, 6, 1363, 209, 454, 1365, 1369, 1260, - 1370, 847, 1371, 965, 1372, 1466, 1373, 455, 484, 588, - 1374, 594, 489, 1375, 1376, 1377, 1382, 1385, 495, 180, - 1411, 498, 1473, 589, 1409, 1410, 454, 1412, 590, 510, - 512, 1420, 1413, 591, 1414, 1429, 1433, 455, 1418, 1428, - 941, 941, 941, 1432, 1437, 1434, 1435, 511, 292, 1438, - 941, 1448, 1451, 1450, 1452, 1453, 1454, 605, 1327, 1163, - 559, 1455, 1456, 559, 1149, 1457, 456, 1475, 781, 1458, - 1476, 548, 1279, 1459, 468, 437, 439, 441, 443, 444, - 351, 1340, 1465, 226, 1467, 356, 1468, 358, 959, 360, - 763, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 481, 1206, 958, 1237, - 1277, 482, 212, 213, 214, 568, 384, 1222, 483, 1198, - 388, 389, 390, 1270, 231, 232, 233, 234, 235, 236, - 1288, 0, 1289, 0, 1233, 0, 0, 1344, 0, 237, - 0, 0, 607, 560, 0, 1238, 1239, 1240, 1241, 1242, - 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, - 1253, 1254, 1255, 1256, 1257, 1258, 1281, 1261, 235, 236, - 454, 0, 0, 834, 0, 0, 215, 216, 0, 237, - 0, 455, 1334, 1335, 1336, 667, 1337, 1338, 1339, 454, - 0, 454, 0, 0, 0, 0, 658, 0, 0, 427, - 455, 0, 455, 0, 0, 0, 0, 0, 0, 1317, - 814, 686, 217, 218, 0, 219, 1357, 0, 711, 277, - 220, 0, 221, 0, 0, 0, 0, 0, 0, 456, - 0, 456, 0, 0, 566, 0, 0, 0, 569, 570, - 571, 572, 573, 0, 0, 0, 0, 0, 0, 0, - 222, 0, 575, 0, 223, 580, 581, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 0, 249, 250, 251, - 0, 0, 0, 0, 0, 454, 350, 0, 0, 0, - 737, 0, 0, 0, 0, 0, 455, 0, 0, 0, - 941, 0, 941, 0, 941, 0, 0, 941, 941, 941, - 0, 244, 245, 246, 247, 248, 1417, 249, 250, 251, - 0, 1276, 0, 0, 543, 456, 767, 0, 559, 0, - 0, 0, 0, 0, 848, 0, 0, 489, 1407, 0, - 0, 0, 0, 0, 559, 559, 559, 0, 0, 0, - 0, 686, 0, 0, 0, 0, 0, 0, 0, 686, - 0, 0, 658, 0, 658, 658, 658, 658, 658, 0, - 0, 0, 0, 0, 0, 454, 1447, 0, 1222, 1222, - 1222, 1222, 1222, 713, 1222, 0, 455, 0, 686, 686, - 0, 686, 686, 686, 686, 0, 0, 0, 0, 0, - 0, 1351, 230, 231, 232, 233, 234, 235, 236, 1443, - 1444, 0, 1445, 0, 1446, 456, 0, 559, 237, 0, - 1325, 1326, 559, 0, 0, 711, 711, 711, 559, 559, - 641, 1327, 0, 0, 0, 454, 0, 0, 0, 0, - 660, 0, 847, 0, 0, 0, 455, 0, 0, 0, - 0, 0, 0, 0, 0, 1469, 1470, 1471, 0, 1472, - 960, 0, 1311, 1312, 1313, 1314, 1315, 1327, 1318, 0, - 690, 0, 691, 0, 692, 456, 0, 559, 0, 0, - 0, 0, 0, 1222, 1222, 1222, 1222, 1222, 1222, 1222, - 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, - 1222, 1222, 0, 0, 0, 0, 1408, 559, 0, 229, - 230, 231, 232, 233, 234, 235, 236, 0, 0, 1415, - 0, 0, 0, 0, 559, 711, 237, 0, 686, 0, - 667, 0, 711, 658, 0, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 0, 249, 250, 251, 1222, - 0, 0, 0, 1332, 1333, 1334, 1335, 1336, 0, 1337, - 1338, 1339, 686, 0, 0, 0, 0, 1387, 1388, 1389, - 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, - 1400, 1401, 1402, 1403, 1404, 1405, 0, 0, 0, 1332, - 1333, 1334, 1335, 1336, 0, 1337, 1338, 1339, 0, 0, - 0, 0, 0, 0, 1222, 1323, 1324, 1325, 1326, 0, - 1173, 0, 0, 0, 0, 0, 0, 0, 1327, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1191, 1439, 0, 1195, 0, 0, 622, 0, - 0, 0, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 0, 249, 250, 251, 623, 0, 1020, - 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, - 0, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, - 1040, 1041, 0, 0, 0, 0, 0, 0, 1460, 1042, - 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, - 1053, 1054, 1055, 1056, 1057, 1058, 0, 0, 1059, 1060, - 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, - 1071, 1072, 1073, 0, 1074, 0, 1075, 1076, 1077, 1078, - 1079, 1080, 1081, 1082, 1083, 0, 1084, 1085, 1086, 0, - 1332, 1333, 1334, 1335, 1336, 0, 1337, 1338, 1339, 982, - 0, 0, 0, 0, 1087, 0, 0, 0, 0, 0, - 1088, 1089, 1090, 0, 1091, 1092, 1093, 1094, 1095, 1096, - 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, - 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, - 1117, 1118, 1119, 1120, 1121, 1122, 1123, 0, 0, 0, - 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, - 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, - 1144, 1360, 1145, 1146, 0, 0, 0, 0, 0, 70, - 0, 71, 72, 73, 0, 0, 0, 0, 0, 0, - 0, 259, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 686, 0, 0, 0, - 0, 0, 0, 229, 230, 231, 232, 233, 234, 235, - 236, 0, 0, 0, 82, 83, 0, 0, 0, 0, - 237, 0, 0, 0, 0, 1207, 0, 0, 0, 0, - 0, 88, 0, 1224, 1225, 1226, 90, 1228, 0, 1230, - 1231, 1232, 0, 1346, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 686, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 1027, 1028, 1029, 1030, 0, 1031, 1032, - 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 0, - 0, 0, 0, 0, 0, 0, 1042, 1043, 1044, 1045, - 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, - 1056, 1057, 1058, 0, 0, 1059, 1060, 1061, 1062, 1063, - 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, - 0, 1074, 0, 1075, 1076, 1077, 1078, 1079, 1080, 1081, - 1082, 1083, 0, 1084, 1085, 1086, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 0, 249, 250, - 251, 1087, 0, 563, 0, 0, 0, 1088, 1089, 1090, - 0, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, - 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, - 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, - 1120, 1121, 1122, 1123, 0, 0, 1436, 1124, 1125, 1126, - 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, - 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 0, 1145, - 1146, 0, 0, 7, 8, 9, 10, 0, 11, 12, - 13, 196, 68, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 286, 287, 288, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 69, - 0, 0, 197, 0, 198, 199, 200, 74, 75, 0, - 20, 76, 0, 1316, 201, 22, 0, 0, 78, 0, - 0, 0, 0, 23, 24, 202, 0, 0, 0, 26, - 0, 0, 203, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 204, 215, - 216, 700, 0, 0, 0, 0, 44, 0, 45, 0, - 46, 0, 0, 0, 0, 47, 0, 205, 206, 50, - 0, 0, 51, 84, 0, 0, 0, 52, 0, 0, - 53, 85, 86, 87, 207, 289, 218, 89, 219, 208, - 0, 0, 702, 220, 0, 221, 0, 0, 1378, 1379, - 1380, 1381, 56, 1383, 1384, 57, 58, 59, 703, 0, - 60, 0, 61, 62, 0, 0, 0, 63, 7, 8, - 9, 10, 284, 11, 12, 13, 14, 0, 212, 213, - 214, 0, 0, 0, 0, 0, 0, 0, 704, 0, - 0, 705, 0, 0, 706, 0, 0, 0, 0, 0, - 0, 229, 230, 231, 232, 233, 234, 235, 236, 0, - 707, 0, 0, 15, 0, 0, 0, 16, 237, 17, - 18, 19, 708, 0, 0, 20, 0, 671, 672, 21, - 22, 0, 0, 0, 0, 0, 709, 0, 23, 24, - 25, 0, 215, 216, 26, 0, 0, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 0, 212, 213, 214, 0, 0, - 0, 44, 0, 45, 0, 46, 0, 0, 217, 218, - 47, 219, 48, 49, 50, 0, 220, 51, 221, 0, - 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, - 7, 8, 9, 10, 55, 11, 12, 13, 14, 673, - 0, 0, 310, 0, 0, 0, 0, 56, 0, 0, - 57, 58, 59, 0, 0, 60, 0, 61, 62, 215, - 216, 849, 63, 0, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 15, 249, 250, 251, 16, - 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, - 0, 21, 22, 0, 0, 217, 218, 0, 219, 0, - 23, 24, 25, 220, 0, 221, 26, 0, 0, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 0, 0, 0, 469, - 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, - 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, - 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, - 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, - 14, 0, 212, 213, 214, 0, 0, 766, 0, 56, - 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, - 62, 421, 0, 0, 63, 229, 230, 231, 232, 233, - 234, 235, 236, 0, 0, 0, 0, 15, 0, 0, - 0, 16, 237, 17, 18, 19, 0, 0, 0, 20, - 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, - 0, 0, 23, 24, 25, 0, 215, 216, 26, 0, - 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, - 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, - 0, 0, 217, 218, 47, 219, 48, 49, 50, 0, - 220, 51, 221, 0, 0, 0, 52, 0, 0, 53, - 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, - 12, 13, 14, 844, 212, 213, 214, 0, 0, 0, - 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, - 0, 61, 62, 0, 1184, 0, 63, 0, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 15, - 249, 250, 251, 16, 0, 17, 18, 19, 0, 0, - 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, - 0, 0, 0, 0, 23, 24, 25, 0, 215, 216, - 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, - 0, 46, 0, 0, 217, 218, 47, 219, 48, 49, - 50, 0, 220, 51, 221, 0, 0, 0, 52, 0, - 0, 53, 0, 0, 0, 54, 7, 8, 9, 10, - 55, 11, 12, 13, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, - 0, 60, 0, 61, 62, 1259, 0, 0, 63, 229, - 230, 231, 232, 233, 234, 235, 236, 0, 0, 0, - 0, 15, 0, 0, 0, 16, 237, 17, 18, 19, - 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, - 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, - 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 0, 212, 213, 214, 0, 0, 0, 44, - 0, 45, 0, 46, 0, 0, 0, 0, 47, 0, - 48, 49, 50, 0, 0, 51, 0, 0, 0, 0, - 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, - 9, 10, 55, 11, 12, 13, 14, 1275, 0, 0, - 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, - 59, 0, 0, 60, 0, 61, 62, 215, 216, 0, - 63, 0, 238, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 15, 249, 250, 251, 16, 0, 17, - 18, 19, 0, 0, 0, 20, 0, 0, 324, 21, - 22, 0, 0, 217, 218, 0, 219, 0, 23, 24, - 25, 220, 0, 221, 26, 0, 0, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, - 0, 44, 0, 45, 0, 46, 0, 0, 0, 0, - 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, - 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, - 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, - 57, 58, 59, 0, 0, 60, 0, 61, 62, 1406, - 0, 0, 63, 233, 234, 235, 236, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 237, 0, 0, 16, - 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, - 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, - 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 0, 0, 298, 0, - 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, - 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, - 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, - 0, 54, 782, 783, 784, 10, 55, 11, 785, 786, - 67, 68, 0, 106, 787, 0, 0, 0, 0, 56, - 107, 108, 57, 58, 59, 0, 0, 60, 0, 61, - 62, 110, 111, 112, 63, 0, 242, 243, 244, 245, - 246, 247, 248, 293, 249, 250, 251, 788, 69, 0, - 0, 70, 0, 71, 72, 73, 74, 447, 0, 789, - 76, 0, 0, 77, 790, 0, 120, 78, 0, 0, - 0, 0, 791, 792, 79, 0, 125, 0, 0, 0, - 0, 80, 126, 0, 0, 0, 0, 129, 1320, 1321, - 1322, 1323, 1324, 1325, 1326, 0, 0, 81, 132, 0, - 133, 0, 0, 0, 1327, 793, 0, 794, 0, 795, - 0, 0, 0, 448, 796, 0, 82, 83, 797, 0, - 0, 798, 84, 0, 0, 135, 799, 0, 0, 800, - 85, 86, 87, 88, 0, 0, 89, 0, 90, 0, - 782, 783, 784, 10, 0, 11, 785, 786, 67, 68, - 0, 801, 1236, 0, 802, 803, 0, 0, 0, 804, - 0, 805, 0, 0, 0, 0, 806, 0, 0, 0, - 0, 0, 0, 229, 230, 231, 232, 233, 234, 235, - 236, 0, 0, 0, 0, 788, 69, 0, 0, 70, - 237, 71, 72, 73, 74, 447, 0, 789, 76, 0, - 0, 77, 790, 0, 0, 78, 0, 0, 700, 0, - 791, 792, 79, 0, 0, 0, 0, 0, 0, 80, - 0, 1329, 1330, 1331, 701, 0, 1332, 1333, 1334, 1335, - 1336, 0, 1337, 1338, 1339, 81, 0, 0, 0, 0, - 0, 0, 0, 793, 0, 794, 0, 795, 0, 702, - 0, 448, 796, 0, 82, 83, 797, 0, 0, 798, - 84, 0, 0, 0, 799, 703, 0, 800, 85, 86, - 87, 88, 0, 0, 89, 0, 90, 7, 8, 9, - 10, 0, 11, 12, 13, 0, 0, 0, 0, 801, - 0, 0, 802, 803, 0, 704, 0, 804, 705, 805, - 0, 706, 0, 0, 806, 0, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 707, 249, 250, - 251, 0, 1208, 1354, 0, 0, 0, 0, 0, 708, - 0, 0, 0, 0, 1209, 0, 0, 0, 0, 1210, - 0, 0, 0, 709, -2, 0, 0, 23, 24, 0, - 0, 0, 0, 26, 0, 0, 0, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 45, 0, 46, 0, 0, 0, 0, 1211, - 0, 0, 0, 1212, 105, 106, 1213, 0, 0, 0, - 0, 52, 107, 108, 231, 232, 233, 234, 235, 236, - 0, 109, 0, 110, 111, 112, 113, 0, 0, 237, - 114, 0, 0, 0, 0, 115, 1214, 0, 0, 1215, - 1216, 1217, 0, 0, 1218, 0, 1219, 62, 0, 0, - 0, 1220, 0, 0, 116, 117, 118, 119, 120, 121, - 0, 0, 0, 0, 0, 122, 123, 124, 125, 461, - 0, 0, 0, 0, 126, 127, 0, 0, 128, 129, - 0, 0, 0, 130, 0, 0, 0, 0, 0, 131, - 132, 853, 133, 0, 0, 0, 0, 0, 0, 0, - 134, 854, 855, 856, 857, 858, 859, 860, 861, 0, - 70, 0, 71, 72, 73, 0, 0, 135, 862, 0, - 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, - 873, 874, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 875, 242, - 243, 244, 245, 246, 247, 248, 260, 249, 250, 251, - 0, 0, 329, 330, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, 83, 0, 0, 0, - 0, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 0, - 0, 876, 88, 0, 0, 0, 0, 90, 1327, 0, - 0, 331, 0, 0, 70, 0, 71, 72, 73, 74, - 0, 0, 0, 332, 0, 0, 77, 0, 0, 0, - 78, 0, 0, 0, 0, 0, 0, 79, 0, 0, - 877, 0, 0, 878, 80, 879, 880, 881, 882, 883, - 884, 885, 886, 887, 888, 889, 0, 890, 891, 0, - 81, 0, 892, 329, 330, 0, 0, 0, 0, 0, - 0, 333, 0, 0, 0, 0, 0, 0, 0, 82, - 83, 0, 0, 0, 0, 84, 0, 0, 0, 0, - 0, 0, 0, 334, 335, 87, 88, 0, 0, 89, - 0, 90, 331, 479, 480, 70, 336, 71, 72, 73, - 74, 0, 0, 0, 332, 0, 0, 77, 0, 0, - 0, 78, 337, 0, 1328, 1329, 1330, 1331, 79, 0, - 1332, 1333, 1334, 1335, 1336, 80, 1337, 1338, 1339, 0, - 0, 0, 331, 0, 0, 70, 0, 71, 72, 73, - 74, 81, 0, 0, 332, 0, 0, 77, 0, 0, - 0, 78, 333, 0, 0, 0, 0, 0, 79, 0, - 82, 83, 0, 0, 0, 80, 84, 624, 625, 626, - 0, 0, 0, 0, 334, 335, 87, 88, 0, 0, - 89, 81, 90, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 333, 0, 0, 0, 0, 0, 0, 0, - 82, 83, 0, 337, 0, 0, 84, 0, 0, 70, - 0, 71, 72, 73, 334, 335, 87, 88, 0, 0, - 89, 77, 90, 229, 230, 231, 232, 233, 234, 235, - 236, 0, 79, 0, 0, 0, 0, 0, 0, 80, - 237, 0, 0, 337, 229, 230, 231, 232, 233, 234, - 235, 236, 0, 0, 0, 81, 0, 0, 0, 0, - 0, 237, 229, 230, 231, 232, 233, 234, 235, 236, - 0, 0, 0, 0, 82, 83, 0, 0, 0, 237, - 229, 230, 231, 232, 233, 234, 235, 236, 0, 0, - 0, 88, 0, 0, 89, 0, 90, 237, 229, 230, - 231, 232, 233, 234, 235, 236, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 229, 230, 231, 232, - 233, 234, 235, 236, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 229, 230, 231, 232, 233, 234, - 235, 236, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 0, 0, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 0, 249, 250, - 251, 0, 0, 1442, 0, 0, 0, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 0, 249, - 250, 251, 552, 0, 0, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 0, 249, 250, 251, - 564, 0, 0, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 0, 249, 250, 251, 693, 0, - 0, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 0, 249, 250, 251, 819, 0, 0, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 0, 249, 250, 251, 1350, 561, 0, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 0, 249, - 250, 251, 229, 230, 231, 232, 233, 234, 235, 236, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 988, 989, 990, 991, 992, 993, 994, 995, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 996, 1319, 1320, - 1321, 1322, 1323, 1324, 1325, 1326, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1327, 0, 0, 0, 0, - 0, 231, 232, 233, 234, 235, 236, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 231, 232, 233, - 234, 235, 236, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1321, 1322, - 1323, 1324, 1325, 1326, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1352, 0, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 0, 249, 250, 251, - 0, 0, 0, 997, 998, 999, 1000, 1001, 1002, 1003, - 1004, 1005, 1006, 1007, 0, 1008, 1009, 1010, 0, 1440, - 0, 1328, 1329, 1330, 1331, 0, 0, 1332, 1333, 1334, - 1335, 1336, 0, 1337, 1338, 1339, 67, 68, 0, 0, - 445, 0, 446, 239, 240, 241, 242, 243, 244, 245, - 246, 247, 248, 0, 249, 250, 251, 0, 0, 0, - 0, 241, 242, 243, 244, 245, 246, 247, 248, 0, - 249, 250, 251, 0, 69, 0, 0, 70, 0, 71, - 72, 73, 74, 447, 0, 0, 76, 0, 0, 77, - 1329, 1330, 1331, 78, 0, 1332, 1333, 1334, 1335, 1336, - 79, 1337, 1338, 1339, 0, 0, 0, 80, 0, 1321, - 1322, 1323, 1324, 1325, 1326, 0, 212, 213, 214, 0, - 0, 0, 0, 81, 1327, 1321, 1322, 1323, 1324, 1325, - 1326, 0, 0, 0, 0, 0, 0, 0, 0, 448, - 1327, 0, 82, 83, 0, 0, 0, 0, 84, 0, - 1321, 1322, 1323, 1324, 1325, 1326, 85, 86, 87, 88, - 0, 0, 89, 74, 90, 1327, 0, 0, 0, 70, - 0, 71, 72, 73, 0, 0, 0, 449, 0, 0, - 215, 216, 450, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 260, 217, 218, 0, 219, - 0, 0, 0, 0, 220, 0, 221, 0, 0, 84, - 0, 624, 625, 626, 82, 83, 0, 938, 0, 87, - 0, 0, 1330, 1331, 0, 0, 1332, 1333, 1334, 1335, - 1336, 88, 1337, 1338, 1339, 0, 90, 0, 0, 1331, - 0, 0, 1332, 1333, 1334, 1335, 1336, 0, 1337, 1338, - 1339, 0, 0, 70, 0, 71, 72, 73, 627, 628, - 67, 68, 0, 0, 445, 77, 0, 1332, 1333, 1334, - 1335, 1336, 0, 1337, 1338, 1339, 79, 0, 0, 0, - 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 69, 81, - 0, 70, 0, 71, 72, 73, 74, 447, 0, 0, - 76, 0, 0, 77, 0, 0, 0, 78, 82, 83, - 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, - 0, 80, 629, 0, 0, 88, 0, 0, 89, 0, - 90, 0, 0, 0, 0, 0, 0, 81, 0, 67, - 68, 0, 0, 723, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 448, 0, 0, 82, 83, 0, 0, - 0, 0, 84, 0, 0, 0, 0, 0, 67, 68, - 85, 86, 87, 88, 0, 0, 89, 69, 90, 0, - 70, 0, 71, 72, 73, 74, 447, 0, 0, 76, - 0, 0, 77, 0, 0, 0, 78, 0, 0, 0, - 0, 0, 0, 79, 0, 0, 69, 0, 0, 70, - 80, 71, 72, 73, 74, 447, 0, 0, 76, 0, - 0, 77, 0, 0, 0, 78, 81, 0, 0, 0, - 0, 0, 79, 0, 0, 0, 0, 0, 0, 80, - 0, 0, 448, 0, 0, 82, 83, 0, 0, 0, - 0, 84, 0, 0, 0, 81, 0, 67, 68, 85, - 86, 87, 88, 0, 0, 89, 0, 90, 0, 0, - 0, 448, 0, 0, 82, 83, 0, 0, 0, 0, - 84, 67, 68, 0, 0, 0, 0, 0, 85, 86, - 87, 88, 0, 0, 89, 69, 90, 0, 70, 0, - 71, 72, 73, 74, 75, 0, 0, 76, 0, 70, - 77, 71, 72, 73, 78, 0, 0, 0, 0, 69, - 0, 79, 70, 0, 71, 72, 73, 74, 80, 0, - 0, 76, 0, 0, 77, 0, 0, 0, 78, 80, - 0, 0, 0, 0, 81, 79, 0, 0, 0, 0, - 0, 0, 80, 0, 0, 260, 0, 0, 0, 0, - 0, 0, 0, 82, 83, 0, 0, 0, 81, 84, - 67, 68, 0, 0, 82, 83, 0, 85, 86, 87, - 88, 0, 0, 89, 576, 90, 0, 82, 83, 0, - 0, 88, 0, 84, 0, 0, 90, 0, 0, 67, - 0, 85, 86, 87, 88, 0, 0, 89, 69, 90, - 0, 70, 0, 71, 72, 73, 74, 0, 0, 183, - 76, 0, 0, 77, 0, 0, 0, 78, 0, 0, - 0, 0, 0, 0, 79, 0, 0, 69, 0, 0, - 70, 80, 71, 72, 73, 74, 493, 0, 0, 76, - 0, 0, 77, 0, 0, 0, 78, 81, 0, 0, - 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, - 80, 0, 0, 0, 0, 0, 82, 83, 0, 0, - 0, 0, 84, 0, 0, 173, 81, 0, 0, 0, - 85, 86, 87, 88, 0, 0, 89, 0, 90, 0, - 0, 0, 0, 0, 0, 82, 83, 0, 0, 173, - 0, 84, 0, 0, 0, 0, 0, 0, 0, 85, - 86, 87, 88, 174, 0, 89, 70, 90, 71, 72, - 73, 74, 914, 0, 0, 175, 0, 0, 77, 0, - 0, 0, 78, 0, 0, 0, 0, 174, 0, 79, - 70, 0, 71, 72, 73, 74, 80, 0, 0, 175, - 0, 0, 77, 0, 0, 0, 78, 0, 0, 0, - 0, 0, 81, 79, 0, 0, 0, 0, 0, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 82, 83, 0, 0, 67, 81, 84, 0, 0, - 0, 0, 0, 0, 0, 176, 177, 87, 88, 0, - 0, 89, 0, 90, 0, 82, 83, 0, 0, 0, - 0, 84, 0, 0, 212, 213, 214, 0, 0, 176, - 177, 87, 88, 69, 0, 89, 70, 90, 71, 72, - 73, 74, 0, 0, 0, 76, 0, 0, 77, 0, - 0, 0, 78, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, - 0, 74, 0, 0, 0, 212, 213, 214, 0, 0, - 0, 0, 81, 70, 0, 71, 72, 73, 215, 216, - 0, 0, 0, 0, 212, 213, 214, 0, 0, 0, - 0, 82, 83, 0, 0, 0, 0, 84, 212, 213, - 214, 0, 0, 80, 0, 85, 86, 87, 88, 0, - 0, 89, 74, 90, 217, 935, 936, 937, 0, 260, - 0, 0, 220, 0, 221, 0, 0, 84, 0, 215, - 216, 74, 0, 0, 0, 938, 0, 87, 82, 83, - 939, 0, 0, 0, 0, 74, 0, 0, 215, 216, - 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, - 90, 0, 215, 216, 0, 217, 218, 0, 219, 0, - 0, 0, 0, 220, 0, 221, 0, 0, 84, 0, - 0, 0, 0, 184, 217, 218, 938, 219, 87, 0, - 0, 1185, 220, 0, 221, 0, 0, 84, 217, 218, - 0, 219, 0, 0, 0, 938, 220, 87, 221, 0, - 1187, 84, 0, 0, 105, 106, 0, 0, 0, 938, - 0, 87, 107, 108, 1189, 0, 0, 0, 0, 0, - 0, 109, 0, 110, 111, 112, 113, 0, 0, 0, - 114, 0, 0, 0, 0, 115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, - 0, 0, 0, 0, 0, 122, 123, 124, 125, 0, - 0, 0, 0, 0, 126, 127, 105, 106, 128, 129, - 0, 0, 0, 130, 107, 108, 0, 0, 0, 131, - 132, 0, 133, 109, 0, 110, 111, 112, 113, 0, - 134, 0, 114, 0, 0, 0, 0, 115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 135, 0, 620, - 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, - 120, 121, 0, 0, 0, 0, 0, 122, 123, 124, - 125, 0, 0, 0, 0, 0, 126, 127, 105, 106, - 128, 129, 0, 0, 0, 130, 107, 108, 0, 0, - 0, 131, 132, 0, 133, 109, 0, 110, 111, 112, - 113, 0, 134, 0, 114, 0, 0, 0, 0, 115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 0, 749, 0, 0, 0, 0, 0, 0, 116, 117, - 118, 119, 120, 121, 0, 0, 0, 0, 0, 122, - 123, 124, 125, 0, 0, 0, 0, 0, 126, 127, - 105, 106, 128, 129, 0, 0, 0, 130, 107, 108, - 0, 0, 0, 131, 132, 0, 133, 109, 0, 110, - 111, 112, 113, 0, 134, 0, 114, 0, 0, 0, - 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 135, 0, 754, 0, 0, 0, 0, 0, 0, - 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, - 0, 122, 123, 124, 125, 0, 0, 0, 0, 0, - 126, 127, 105, 106, 128, 129, 0, 0, 0, 130, - 107, 108, 0, 0, 0, 131, 132, 0, 133, 109, - 0, 110, 111, 112, 113, 0, 134, 0, 114, 0, - 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 135, 0, 830, 0, 0, 0, 0, - 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, - 0, 0, 0, 122, 123, 124, 125, 0, 0, 0, - 0, 0, 126, 127, 105, 106, 128, 129, 0, 0, - 0, 130, 107, 108, 0, 0, 0, 131, 132, 0, - 133, 109, 0, 110, 111, 112, 113, 0, 134, 0, - 114, 0, 0, 0, 0, 115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 135, 0, 952, 0, 0, - 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, - 0, 0, 0, 0, 0, 122, 123, 124, 125, 0, - 0, 0, 0, 0, 126, 127, 105, 106, 128, 129, - 0, 0, 0, 130, 107, 108, 0, 0, 0, 131, - 132, 0, 133, 109, 0, 110, 111, 112, 113, 0, - 134, 0, 114, 0, 0, 0, 0, 115, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 135, 0, 1199, - 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, - 120, 121, 0, 0, 0, 0, 0, 122, 123, 124, - 125, 0, 0, 0, 0, 0, 126, 127, 105, 106, - 128, 129, 0, 0, 0, 130, 107, 108, 0, 0, - 0, 131, 132, 0, 133, 109, 0, 110, 111, 112, - 113, 0, 134, 0, 114, 106, 0, 0, 0, 115, - 0, 0, 107, 108, 0, 0, 0, 0, 0, 135, - 0, 1296, 0, 110, 111, 112, 0, 0, 116, 117, - 118, 119, 120, 121, 0, 293, 0, 0, 0, 122, - 123, 124, 125, 0, 0, 0, 0, 0, 126, 127, - 0, 0, 128, 129, 0, 0, 0, 130, 120, 0, - 0, 0, 0, 131, 132, 106, 133, 0, 125, 0, - 0, 0, 107, 108, 126, 0, 0, 0, 0, 129, - 0, 0, 0, 110, 111, 112, 0, 0, 0, 131, - 132, 135, 133, 106, 0, 293, 0, 0, 0, 0, - 107, 108, 106, 0, 0, 0, 0, -141, 0, 107, - 108, 110, 111, 112, 0, 0, 0, 135, 120, 0, - 110, 111, 112, 293, 0, 0, 0, 0, 125, 0, - 0, 0, 293, 70, 126, 71, 72, 73, 128, 129, - 0, 0, 0, 0, 0, 259, 120, 303, 0, 131, - 132, 0, 133, 0, 0, 120, 125, 0, 0, 0, - 0, 0, 126, 80, 0, 125, 70, 129, 71, 72, - 73, 126, 0, 0, 0, 0, 129, 135, 132, 260, - 133, 0, 0, 0, 0, 0, 0, 132, 0, 133, - 0, 0, 0, 0, 0, 0, 80, 0, 82, 83, - 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, - 0, 0, 260, 0, 135, 88, 0, 0, 0, 0, - 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 82, 83, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 172, 0, 0, 0, 0, 88, 0, - 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 189 -}; - -static const yytype_int16 yycheck[] = -{ - 1, 61, 504, 448, 128, 622, 844, 147, 148, 149, - 150, 639, 152, 455, 154, 481, 156, 13, 684, 701, - 464, 6, 15, 8, 162, 15, 15, 644, 0, 13, - 44, 15, 172, 17, 75, 139, 574, 44, 92, 15, - 62, 63, 139, 183, 184, 75, 15, 139, 74, 189, - 190, 15, 145, 106, 107, 108, 722, 110, 111, 112, - 162, 62, 115, 145, 74, 310, 145, 120, 935, 936, - 937, 164, 125, 126, 58, 128, 129, 130, 145, 132, - 133, 162, 164, 144, 57, 164, 81, 82, 83, 582, - 91, 92, 603, 88, 647, 163, 164, 164, 13, 44, - 15, 162, 17, 145, 148, 145, 33, 74, 148, 2, - 650, 793, 652, 653, 654, 655, 656, 162, 144, 163, - 33, 147, 164, 676, 677, 139, 679, 680, 681, 682, - 148, 162, 139, 145, 144, 162, 578, 147, 144, 584, - 146, 147, 148, 58, 145, 163, 147, 148, 149, 150, - 123, 152, 164, 154, 138, 156, 598, 599, 600, 601, - 602, 157, 153, 56, 57, 58, 59, 60, 152, 162, - 63, 172, 162, 157, 685, 164, 145, 144, 162, 164, - 147, 145, 183, 184, 33, 162, 162, 148, 189, 190, - 250, 6, 634, 8, 139, 733, 145, 163, 164, 644, - 254, 255, 163, 145, 74, 153, 744, 718, 719, 204, - 205, 206, 207, 153, 318, 164, 270, 271, 322, 685, - 465, 318, 164, 138, 469, 322, 318, 145, 162, 146, - 322, 148, 914, 274, 161, 162, 163, 152, 163, 164, - 293, 381, 157, 687, 274, 298, 164, 162, 161, 162, - 163, 162, 497, 254, 255, 162, 163, 10, 11, 12, - 13, 145, 162, 816, 17, 260, 33, 778, 269, 270, - 271, 272, 273, 274, 144, 717, 162, 147, 279, 162, - 164, 821, 145, 145, 145, 162, 10, 11, 12, 284, - 828, 145, 333, 162, 736, 188, 162, 850, 147, 147, - 145, 164, 164, 164, 318, 58, 162, 454, 322, 310, - 164, 318, 778, 162, 163, 322, 145, 153, 1185, 164, - 1187, 763, 1189, 144, 145, 1192, 1193, 1194, 770, 771, - 772, 773, 774, 835, 162, 164, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 110, 251, 145, - 145, 162, 900, 256, 162, 163, 164, 13, 145, 15, - 987, 17, 162, 318, 145, 162, 621, 322, 164, 164, - 381, 10, 11, 12, 13, 138, 110, 164, 17, 145, - 157, 158, 159, 164, 161, 162, 163, 398, 399, 152, - 145, 162, 145, 145, 157, 162, 447, 448, 164, 920, - 921, 6, 58, 8, 162, 917, 162, 447, 448, 164, - 913, 164, 164, 147, 317, 163, 164, 428, 162, 58, - 577, 432, 433, 434, 435, 436, 162, 1275, 163, 164, - 587, 588, 589, 590, 591, 446, 162, 163, 449, 450, - 162, 163, 493, 454, 162, 162, 457, 557, 144, 144, - 146, 146, 148, 148, 465, 466, 162, 162, 469, 464, - 162, 478, 162, 162, 10, 11, 12, 478, 144, 162, - 109, 110, 144, 162, 146, 378, 148, 634, 141, 142, - 143, 162, 138, 494, 162, 144, 497, 146, 162, 148, - 162, 394, 395, 1169, 147, 147, 152, 147, 163, 138, - 755, 157, 162, 163, 164, 162, 557, 162, 1011, 145, - 962, 1014, 166, 152, 111, 112, 113, 557, 157, 162, - 163, 164, 162, 162, 162, 576, 157, 164, 74, 75, - 163, 163, 987, 584, 1161, 645, 576, 147, 648, 153, - 144, 162, 162, 162, 584, 146, 557, 558, 164, 145, - 145, 164, 164, 164, 457, 164, 567, 164, 164, 716, - 10, 11, 12, 574, 110, 111, 577, 113, 725, 154, - 154, 582, 118, 164, 120, 586, 587, 588, 589, 590, - 591, 592, 164, 164, 164, 1223, 164, 145, 164, 492, - 164, 164, 603, 644, 645, 164, 164, 648, 144, 164, - 164, 612, 33, 506, 644, 645, 763, 164, 648, 164, - 621, 628, 164, 770, 771, 772, 773, 774, 688, 689, - 164, 154, 164, 634, 74, 75, 696, 164, 698, 164, - 764, 154, 164, 644, 645, 164, 164, 648, 162, 650, - 157, 652, 653, 654, 655, 656, 164, 10, 11, 12, - 13, 163, 15, 664, 17, 163, 165, 164, 561, 74, - 110, 111, 673, 113, 144, 162, 145, 145, 118, 145, - 120, 574, 145, 684, 685, 146, 166, 701, 10, 11, - 12, 145, 687, 164, 701, 162, 62, 837, 838, 944, - 1366, 1367, 1368, 162, 147, 58, 162, 162, 157, 162, - 157, 764, 164, 164, 162, 716, 1161, 718, 719, 85, - 166, 722, 144, 163, 725, 10, 10, 780, 147, 10, - 10, 831, 733, 99, 155, 156, 157, 158, 159, 146, - 161, 162, 163, 744, 154, 805, 145, 165, 146, 166, - 98, 99, 74, 75, 755, 121, 701, 110, 765, 146, - 157, 157, 763, 164, 146, 131, 146, 146, 769, 770, - 771, 772, 773, 774, 775, 165, 1269, 778, 164, 793, - 673, 157, 144, 164, 162, 138, 793, 164, 110, 111, - 831, 113, 1285, 1286, 1287, 164, 118, 162, 120, 152, - 1466, 831, 166, 162, 157, 750, 162, 1473, 163, 162, - 176, 163, 163, 179, 180, 962, 144, 148, 145, 919, - 821, 145, 145, 157, 924, 925, 145, 828, 153, 162, - 831, 10, 11, 12, 13, 153, 837, 838, 17, 732, - 733, 153, 164, 844, 153, 162, 145, 163, 793, 164, - 164, 744, 165, 164, 10, 748, 164, 223, 4, 166, - 162, 915, 1364, 145, 162, 1358, 166, 15, 10, 166, - 1363, 146, 10, 10, 10, 146, 1369, 1370, 919, 58, - 145, 164, 15, 924, 925, 162, 162, 166, 162, 919, - 153, 164, 162, 165, 924, 925, 165, 164, 166, 900, - 914, 165, 268, 165, 164, 164, 164, 914, 801, 802, - 803, 804, 913, 806, 915, 164, 153, 1017, 919, 920, - 921, 153, 153, 924, 925, 1418, 164, 154, 154, 154, - 164, 110, 154, 162, 164, 828, 164, 303, 144, 305, - 306, 307, 308, 944, 164, 61, 987, 164, 164, 1009, - 164, 844, 10, 954, 146, 1448, 10, 987, 324, 138, - 146, 962, 328, 146, 10, 146, 162, 164, 334, 914, - 164, 337, 1465, 152, 162, 162, 1017, 162, 157, 345, - 346, 165, 164, 162, 162, 145, 154, 1017, 164, 164, - 935, 936, 937, 164, 164, 154, 154, 345, 346, 154, - 945, 164, 146, 165, 10, 10, 146, 900, 33, 902, - 1011, 162, 162, 1014, 836, 162, 1017, 146, 643, 164, - 146, 387, 1164, 162, 302, 269, 270, 271, 272, 273, - 146, 1223, 164, 399, 164, 151, 164, 153, 765, 155, - 628, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 322, 954, 764, 987, - 1161, 322, 10, 11, 12, 431, 182, 963, 322, 945, - 186, 187, 188, 1124, 18, 19, 20, 21, 22, 23, - 1180, -1, 1182, -1, 977, -1, -1, 1227, -1, 33, - -1, -1, 458, 399, -1, 988, 989, 990, 991, 992, - 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 1006, 1007, 1008, 1170, 1010, 22, 23, - 1161, -1, -1, 1124, -1, -1, 74, 75, -1, 33, - -1, 1161, 157, 158, 159, 501, 161, 162, 163, 1180, - -1, 1182, -1, -1, -1, -1, 494, -1, -1, 265, - 1180, -1, 1182, -1, -1, -1, -1, -1, -1, 1219, - 1161, 509, 110, 111, -1, 113, 1266, -1, 1169, 1170, - 118, -1, 120, -1, -1, -1, -1, -1, -1, 1180, - -1, 1182, -1, -1, 428, -1, -1, -1, 432, 433, - 434, 435, 436, -1, -1, -1, -1, -1, -1, -1, - 148, -1, 446, -1, 152, 449, 450, 151, 152, 153, - 154, 155, 156, 157, 158, 159, -1, 161, 162, 163, - -1, -1, -1, -1, -1, 1266, 1227, -1, -1, -1, - 596, -1, -1, -1, -1, -1, 1266, -1, -1, -1, - 1185, -1, 1187, -1, 1189, -1, -1, 1192, 1193, 1194, - -1, 155, 156, 157, 158, 159, 1356, 161, 162, 163, - -1, 1154, -1, -1, 380, 1266, 632, -1, 1269, -1, - -1, -1, -1, -1, 1275, -1, -1, 643, 1338, -1, - -1, -1, -1, -1, 1285, 1286, 1287, -1, -1, -1, - -1, 639, -1, -1, -1, -1, -1, -1, -1, 647, - -1, -1, 650, -1, 652, 653, 654, 655, 656, -1, - -1, -1, -1, -1, -1, 1356, 1416, -1, 1214, 1215, - 1216, 1217, 1218, 567, 1220, -1, 1356, -1, 676, 677, - -1, 679, 680, 681, 682, -1, -1, -1, -1, -1, - -1, 1234, 17, 18, 19, 20, 21, 22, 23, 1409, - 1410, -1, 1412, -1, 1414, 1356, -1, 1358, 33, -1, - 22, 23, 1363, -1, -1, 1366, 1367, 1368, 1369, 1370, - 486, 33, -1, -1, -1, 1416, -1, -1, -1, -1, - 496, -1, 1275, -1, -1, -1, 1416, -1, -1, -1, - -1, -1, -1, -1, -1, 1455, 1456, 1457, -1, 1459, - 766, -1, 1214, 1215, 1216, 1217, 1218, 33, 1220, -1, - 526, -1, 528, -1, 530, 1416, -1, 1418, -1, -1, - -1, -1, -1, 1319, 1320, 1321, 1322, 1323, 1324, 1325, - 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, - 1336, 1337, -1, -1, -1, -1, 1339, 1448, -1, 16, - 17, 18, 19, 20, 21, 22, 23, -1, -1, 1352, - -1, -1, -1, -1, 1465, 1466, 33, -1, 816, -1, - 836, -1, 1473, 821, -1, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, -1, 161, 162, 163, 1385, - -1, -1, -1, 155, 156, 157, 158, 159, -1, 161, - 162, 163, 850, -1, -1, -1, -1, 1319, 1320, 1321, - 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, - 1332, 1333, 1334, 1335, 1336, 1337, -1, -1, -1, 155, - 156, 157, 158, 159, -1, 161, 162, 163, -1, -1, - -1, -1, -1, -1, 1440, 20, 21, 22, 23, -1, - 916, -1, -1, -1, -1, -1, -1, -1, 33, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 938, 1385, -1, 941, -1, -1, 145, -1, - -1, -1, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, -1, 161, 162, 163, 164, -1, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, -1, -1, -1, -1, -1, -1, 1440, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, -1, -1, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, -1, 68, -1, 70, 71, 72, 73, - 74, 75, 76, 77, 78, -1, 80, 81, 82, -1, - 155, 156, 157, 158, 159, -1, 161, 162, 163, 805, - -1, -1, -1, -1, 98, -1, -1, -1, -1, -1, - 104, 105, 106, -1, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, -1, -1, -1, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, -1, -1, -1, -1, -1, 52, - -1, 54, 55, 56, -1, -1, -1, -1, -1, -1, - -1, 64, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 98, 1164, -1, -1, -1, - -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, - 23, -1, -1, -1, 117, 118, -1, -1, -1, -1, - 33, -1, -1, -1, -1, 961, -1, -1, -1, -1, - -1, 134, -1, 969, 970, 971, 139, 973, -1, 975, - 976, 977, -1, 1229, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1223, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, - -1, -1, -1, -1, -1, -1, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, -1, -1, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - -1, 68, -1, 70, 71, 72, 73, 74, 75, 76, - 77, 78, -1, 80, 81, 82, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, - 163, 98, -1, 166, -1, -1, -1, 104, 105, 106, - -1, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, -1, -1, 1382, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, -1, 166, - 167, -1, -1, 3, 4, 5, 6, -1, 8, 9, - 10, 11, 12, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 10, 11, 12, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 48, 49, - -1, -1, 52, -1, 54, 55, 56, 57, 58, -1, - 60, 61, -1, 1219, 64, 65, -1, -1, 68, -1, - -1, -1, -1, 73, 74, 75, -1, -1, -1, 79, - -1, -1, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 74, - 75, 17, -1, -1, -1, -1, 106, -1, 108, -1, - 110, -1, -1, -1, -1, 115, -1, 117, 118, 119, - -1, -1, 122, 123, -1, -1, -1, 127, -1, -1, - 130, 131, 132, 133, 134, 110, 111, 137, 113, 139, - -1, -1, 58, 118, -1, 120, -1, -1, 1304, 1305, - 1306, 1307, 152, 1309, 1310, 155, 156, 157, 74, -1, - 160, -1, 162, 163, -1, -1, -1, 167, 3, 4, - 5, 6, 147, 8, 9, 10, 11, -1, 10, 11, - 12, -1, -1, -1, -1, -1, -1, -1, 104, -1, - -1, 107, -1, -1, 110, -1, -1, -1, -1, -1, - -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, - 126, -1, -1, 48, -1, -1, -1, 52, 33, 54, - 55, 56, 138, -1, -1, 60, -1, 62, 63, 64, - 65, -1, -1, -1, -1, -1, 152, -1, 73, 74, - 75, -1, 74, 75, 79, -1, -1, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, -1, 10, 11, 12, -1, -1, - -1, 106, -1, 108, -1, 110, -1, -1, 110, 111, - 115, 113, 117, 118, 119, -1, 118, 122, 120, -1, - -1, -1, 127, -1, -1, 130, -1, -1, -1, 134, - 3, 4, 5, 6, 139, 8, 9, 10, 11, 144, - -1, -1, 144, -1, -1, -1, -1, 152, -1, -1, - 155, 156, 157, -1, -1, 160, -1, 162, 163, 74, - 75, 146, 167, -1, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 48, 161, 162, 163, 52, - -1, 54, 55, 56, -1, -1, -1, 60, -1, -1, - -1, 64, 65, -1, -1, 110, 111, -1, 113, -1, - 73, 74, 75, 118, -1, 120, 79, -1, -1, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, -1, -1, -1, 144, - -1, -1, -1, 106, -1, 108, -1, 110, -1, -1, - -1, -1, 115, -1, 117, 118, 119, -1, -1, 122, - -1, -1, -1, -1, 127, -1, -1, 130, -1, -1, - -1, 134, 3, 4, 5, 6, 139, 8, 9, 10, - 11, -1, 10, 11, 12, -1, -1, 15, -1, 152, - -1, -1, 155, 156, 157, -1, -1, 160, -1, 162, - 163, 164, -1, -1, 167, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, 48, -1, -1, - -1, 52, 33, 54, 55, 56, -1, -1, -1, 60, - -1, -1, -1, 64, 65, -1, -1, -1, -1, -1, - -1, -1, 73, 74, 75, -1, 74, 75, 79, -1, - -1, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, -1, -1, - -1, -1, -1, -1, -1, 106, -1, 108, -1, 110, - -1, -1, 110, 111, 115, 113, 117, 118, 119, -1, - 118, 122, 120, -1, -1, -1, 127, -1, -1, 130, - -1, -1, -1, 134, 3, 4, 5, 6, 139, 8, - 9, 10, 11, 144, 10, 11, 12, -1, -1, -1, - -1, 152, -1, -1, 155, 156, 157, -1, -1, 160, - -1, 162, 163, -1, 145, -1, 167, -1, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 48, - 161, 162, 163, 52, -1, 54, 55, 56, -1, -1, - -1, 60, -1, -1, -1, 64, 65, -1, -1, -1, - -1, -1, -1, -1, 73, 74, 75, -1, 74, 75, - 79, -1, -1, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - -1, -1, -1, -1, -1, -1, -1, 106, -1, 108, - -1, 110, -1, -1, 110, 111, 115, 113, 117, 118, - 119, -1, 118, 122, 120, -1, -1, -1, 127, -1, - -1, 130, -1, -1, -1, 134, 3, 4, 5, 6, - 139, 8, 9, 10, 11, -1, -1, -1, -1, -1, - -1, -1, -1, 152, -1, -1, 155, 156, 157, -1, - -1, 160, -1, 162, 163, 164, -1, -1, 167, 16, - 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, - -1, 48, -1, -1, -1, 52, 33, 54, 55, 56, - -1, -1, -1, 60, -1, -1, -1, 64, 65, -1, - -1, -1, -1, -1, -1, -1, 73, 74, 75, -1, - -1, -1, 79, -1, -1, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, -1, 10, 11, 12, -1, -1, -1, 106, - -1, 108, -1, 110, -1, -1, -1, -1, 115, -1, - 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, - 127, -1, -1, 130, -1, -1, -1, 134, 3, 4, - 5, 6, 139, 8, 9, 10, 11, 144, -1, -1, - -1, -1, -1, -1, -1, 152, -1, -1, 155, 156, - 157, -1, -1, 160, -1, 162, 163, 74, 75, -1, - 167, -1, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 48, 161, 162, 163, 52, -1, 54, - 55, 56, -1, -1, -1, 60, -1, -1, 105, 64, - 65, -1, -1, 110, 111, -1, 113, -1, 73, 74, - 75, 118, -1, 120, 79, -1, -1, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, - -1, 106, -1, 108, -1, 110, -1, -1, -1, -1, - 115, -1, 117, 118, 119, -1, -1, 122, -1, -1, - -1, -1, 127, -1, -1, 130, -1, -1, -1, 134, - 3, 4, 5, 6, 139, 8, 9, 10, 11, -1, - -1, -1, -1, -1, -1, -1, -1, 152, -1, -1, - 155, 156, 157, -1, -1, 160, -1, 162, 163, 164, - -1, -1, 167, 20, 21, 22, 23, -1, -1, -1, - -1, -1, -1, -1, -1, 48, 33, -1, -1, 52, - -1, 54, 55, 56, -1, -1, -1, 60, -1, -1, - -1, 64, 65, -1, -1, -1, -1, -1, -1, -1, - 73, 74, 75, -1, -1, -1, 79, -1, -1, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, -1, -1, 6, -1, - -1, -1, -1, 106, -1, 108, -1, 110, -1, -1, - -1, -1, 115, -1, 117, 118, 119, -1, -1, 122, - -1, -1, -1, -1, 127, -1, -1, 130, -1, -1, - -1, 134, 3, 4, 5, 6, 139, 8, 9, 10, - 11, 12, -1, 51, 15, -1, -1, -1, -1, 152, - 58, 59, 155, 156, 157, -1, -1, 160, -1, 162, - 163, 69, 70, 71, 167, -1, 153, 154, 155, 156, - 157, 158, 159, 81, 161, 162, 163, 48, 49, -1, - -1, 52, -1, 54, 55, 56, 57, 58, -1, 60, - 61, -1, -1, 64, 65, -1, 104, 68, -1, -1, - -1, -1, 73, 74, 75, -1, 114, -1, -1, -1, - -1, 82, 120, -1, -1, -1, -1, 125, 17, 18, - 19, 20, 21, 22, 23, -1, -1, 98, 136, -1, - 138, -1, -1, -1, 33, 106, -1, 108, -1, 110, - -1, -1, -1, 114, 115, -1, 117, 118, 119, -1, - -1, 122, 123, -1, -1, 163, 127, -1, -1, 130, - 131, 132, 133, 134, -1, -1, 137, -1, 139, -1, - 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, - -1, 152, 15, -1, 155, 156, -1, -1, -1, 160, - -1, 162, -1, -1, -1, -1, 167, -1, -1, -1, - -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, - 23, -1, -1, -1, -1, 48, 49, -1, -1, 52, - 33, 54, 55, 56, 57, 58, -1, 60, 61, -1, - -1, 64, 65, -1, -1, 68, -1, -1, 17, -1, - 73, 74, 75, -1, -1, -1, -1, -1, -1, 82, - -1, 150, 151, 152, 33, -1, 155, 156, 157, 158, - 159, -1, 161, 162, 163, 98, -1, -1, -1, -1, - -1, -1, -1, 106, -1, 108, -1, 110, -1, 58, - -1, 114, 115, -1, 117, 118, 119, -1, -1, 122, - 123, -1, -1, -1, 127, 74, -1, 130, 131, 132, - 133, 134, -1, -1, 137, -1, 139, 3, 4, 5, - 6, -1, 8, 9, 10, -1, -1, -1, -1, 152, - -1, -1, 155, 156, -1, 104, -1, 160, 107, 162, - -1, 110, -1, -1, 167, -1, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 126, 161, 162, - 163, -1, 48, 166, -1, -1, -1, -1, -1, 138, - -1, -1, -1, -1, 60, -1, -1, -1, -1, 65, - -1, -1, -1, 152, 0, -1, -1, 73, 74, -1, - -1, -1, -1, 79, -1, -1, -1, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 108, -1, 110, -1, -1, -1, -1, 115, - -1, -1, -1, 119, 50, 51, 122, -1, -1, -1, - -1, 127, 58, 59, 18, 19, 20, 21, 22, 23, - -1, 67, -1, 69, 70, 71, 72, -1, -1, 33, - 76, -1, -1, -1, -1, 81, 152, -1, -1, 155, - 156, 157, -1, -1, 160, -1, 162, 163, -1, -1, - -1, 167, -1, -1, 100, 101, 102, 103, 104, 105, - -1, -1, -1, -1, -1, 111, 112, 113, 114, 11, - -1, -1, -1, -1, 120, 121, -1, -1, 124, 125, - -1, -1, -1, 129, -1, -1, -1, -1, -1, 135, - 136, 6, 138, -1, -1, -1, -1, -1, -1, -1, - 146, 16, 17, 18, 19, 20, 21, 22, 23, -1, - 52, -1, 54, 55, 56, -1, -1, 163, 33, -1, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, - 82, -1, -1, -1, -1, -1, -1, -1, 63, 153, - 154, 155, 156, 157, 158, 159, 98, 161, 162, 163, - -1, -1, 10, 11, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 117, 118, -1, -1, -1, - -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, - -1, 106, 134, -1, -1, -1, -1, 139, 33, -1, - -1, 49, -1, -1, 52, -1, 54, 55, 56, 57, - -1, -1, -1, 61, -1, -1, 64, -1, -1, -1, - 68, -1, -1, -1, -1, -1, -1, 75, -1, -1, - 145, -1, -1, 148, 82, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, -1, 162, 163, -1, - 98, -1, 167, 10, 11, -1, -1, -1, -1, -1, - -1, 109, -1, -1, -1, -1, -1, -1, -1, 117, - 118, -1, -1, -1, -1, 123, -1, -1, -1, -1, - -1, -1, -1, 131, 132, 133, 134, -1, -1, 137, - -1, 139, 49, 10, 11, 52, 144, 54, 55, 56, - 57, -1, -1, -1, 61, -1, -1, 64, -1, -1, - -1, 68, 160, -1, 149, 150, 151, 152, 75, -1, - 155, 156, 157, 158, 159, 82, 161, 162, 163, -1, - -1, -1, 49, -1, -1, 52, -1, 54, 55, 56, - 57, 98, -1, -1, 61, -1, -1, 64, -1, -1, - -1, 68, 109, -1, -1, -1, -1, -1, 75, -1, - 117, 118, -1, -1, -1, 82, 123, 10, 11, 12, - -1, -1, -1, -1, 131, 132, 133, 134, -1, -1, - 137, 98, 139, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 109, -1, -1, -1, -1, -1, -1, -1, - 117, 118, -1, 160, -1, -1, 123, -1, -1, 52, - -1, 54, 55, 56, 131, 132, 133, 134, -1, -1, - 137, 64, 139, 16, 17, 18, 19, 20, 21, 22, - 23, -1, 75, -1, -1, -1, -1, -1, -1, 82, - 33, -1, -1, 160, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, 98, -1, -1, -1, -1, - -1, 33, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, -1, -1, 117, 118, -1, -1, -1, 33, - 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, - -1, 134, -1, -1, 137, -1, 139, 33, 16, 17, - 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 33, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, - 163, -1, -1, 166, -1, -1, -1, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, -1, 161, - 162, 163, 164, -1, -1, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, -1, 161, 162, 163, - 164, -1, -1, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, -1, 161, 162, 163, 164, -1, - -1, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, -1, 161, 162, 163, 164, -1, -1, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - -1, 161, 162, 163, 164, 147, -1, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, -1, 161, - 162, 163, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, - 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 33, 16, 17, - 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, - -1, 18, 19, 20, 21, 22, 23, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 33, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 147, -1, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, -1, 161, 162, 163, - -1, -1, -1, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, -1, 161, 162, 163, -1, 147, - -1, 149, 150, 151, 152, -1, -1, 155, 156, 157, - 158, 159, -1, 161, 162, 163, 11, 12, -1, -1, - 15, -1, 17, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, -1, 161, 162, 163, -1, -1, -1, - -1, 152, 153, 154, 155, 156, 157, 158, 159, -1, - 161, 162, 163, -1, 49, -1, -1, 52, -1, 54, - 55, 56, 57, 58, -1, -1, 61, -1, -1, 64, - 150, 151, 152, 68, -1, 155, 156, 157, 158, 159, - 75, 161, 162, 163, -1, -1, -1, 82, -1, 18, - 19, 20, 21, 22, 23, -1, 10, 11, 12, -1, - -1, -1, -1, 98, 33, 18, 19, 20, 21, 22, - 23, -1, -1, -1, -1, -1, -1, -1, -1, 114, - 33, -1, 117, 118, -1, -1, -1, -1, 123, -1, - 18, 19, 20, 21, 22, 23, 131, 132, 133, 134, - -1, -1, 137, 57, 139, 33, -1, -1, -1, 52, - -1, 54, 55, 56, -1, -1, -1, 152, -1, -1, - 74, 75, 157, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 98, 110, 111, -1, 113, - -1, -1, -1, -1, 118, -1, 120, -1, -1, 123, - -1, 10, 11, 12, 117, 118, -1, 131, -1, 133, - -1, -1, 151, 152, -1, -1, 155, 156, 157, 158, - 159, 134, 161, 162, 163, -1, 139, -1, -1, 152, - -1, -1, 155, 156, 157, 158, 159, -1, 161, 162, - 163, -1, -1, 52, -1, 54, 55, 56, 57, 58, - 11, 12, -1, -1, 15, 64, -1, 155, 156, 157, - 158, 159, -1, 161, 162, 163, 75, -1, -1, -1, - -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 49, 98, - -1, 52, -1, 54, 55, 56, 57, 58, -1, -1, - 61, -1, -1, 64, -1, -1, -1, 68, 117, 118, - -1, -1, -1, -1, 75, -1, -1, -1, -1, -1, - -1, 82, 131, -1, -1, 134, -1, -1, 137, -1, - 139, -1, -1, -1, -1, -1, -1, 98, -1, 11, - 12, -1, -1, 15, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 114, -1, -1, 117, 118, -1, -1, - -1, -1, 123, -1, -1, -1, -1, -1, 11, 12, - 131, 132, 133, 134, -1, -1, 137, 49, 139, -1, - 52, -1, 54, 55, 56, 57, 58, -1, -1, 61, - -1, -1, 64, -1, -1, -1, 68, -1, -1, -1, - -1, -1, -1, 75, -1, -1, 49, -1, -1, 52, - 82, 54, 55, 56, 57, 58, -1, -1, 61, -1, - -1, 64, -1, -1, -1, 68, 98, -1, -1, -1, - -1, -1, 75, -1, -1, -1, -1, -1, -1, 82, - -1, -1, 114, -1, -1, 117, 118, -1, -1, -1, - -1, 123, -1, -1, -1, 98, -1, 11, 12, 131, - 132, 133, 134, -1, -1, 137, -1, 139, -1, -1, - -1, 114, -1, -1, 117, 118, -1, -1, -1, -1, - 123, 11, 12, -1, -1, -1, -1, -1, 131, 132, - 133, 134, -1, -1, 137, 49, 139, -1, 52, -1, - 54, 55, 56, 57, 58, -1, -1, 61, -1, 52, - 64, 54, 55, 56, 68, -1, -1, -1, -1, 49, - -1, 75, 52, -1, 54, 55, 56, 57, 82, -1, - -1, 61, -1, -1, 64, -1, -1, -1, 68, 82, - -1, -1, -1, -1, 98, 75, -1, -1, -1, -1, - -1, -1, 82, -1, -1, 98, -1, -1, -1, -1, - -1, -1, -1, 117, 118, -1, -1, -1, 98, 123, - 11, 12, -1, -1, 117, 118, -1, 131, 132, 133, - 134, -1, -1, 137, 114, 139, -1, 117, 118, -1, - -1, 134, -1, 123, -1, -1, 139, -1, -1, 11, - -1, 131, 132, 133, 134, -1, -1, 137, 49, 139, - -1, 52, -1, 54, 55, 56, 57, -1, -1, 162, - 61, -1, -1, 64, -1, -1, -1, 68, -1, -1, - -1, -1, -1, -1, 75, -1, -1, 49, -1, -1, - 52, 82, 54, 55, 56, 57, 58, -1, -1, 61, - -1, -1, 64, -1, -1, -1, 68, 98, -1, -1, - -1, -1, -1, 75, -1, -1, -1, -1, -1, -1, - 82, -1, -1, -1, -1, -1, 117, 118, -1, -1, - -1, -1, 123, -1, -1, 11, 98, -1, -1, -1, - 131, 132, 133, 134, -1, -1, 137, -1, 139, -1, - -1, -1, -1, -1, -1, 117, 118, -1, -1, 11, - -1, 123, -1, -1, -1, -1, -1, -1, -1, 131, - 132, 133, 134, 49, -1, 137, 52, 139, 54, 55, - 56, 57, 58, -1, -1, 61, -1, -1, 64, -1, - -1, -1, 68, -1, -1, -1, -1, 49, -1, 75, - 52, -1, 54, 55, 56, 57, 82, -1, -1, 61, - -1, -1, 64, -1, -1, -1, 68, -1, -1, -1, - -1, -1, 98, 75, -1, -1, -1, -1, -1, -1, - 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 117, 118, -1, -1, 11, 98, 123, -1, -1, - -1, -1, -1, -1, -1, 131, 132, 133, 134, -1, - -1, 137, -1, 139, -1, 117, 118, -1, -1, -1, - -1, 123, -1, -1, 10, 11, 12, -1, -1, 131, - 132, 133, 134, 49, -1, 137, 52, 139, 54, 55, - 56, 57, -1, -1, -1, 61, -1, -1, 64, -1, - -1, -1, 68, -1, -1, -1, -1, -1, -1, 75, - -1, -1, -1, -1, -1, -1, 82, -1, -1, -1, - -1, 57, -1, -1, -1, 10, 11, 12, -1, -1, - -1, -1, 98, 52, -1, 54, 55, 56, 74, 75, - -1, -1, -1, -1, 10, 11, 12, -1, -1, -1, - -1, 117, 118, -1, -1, -1, -1, 123, 10, 11, - 12, -1, -1, 82, -1, 131, 132, 133, 134, -1, - -1, 137, 57, 139, 110, 111, 112, 113, -1, 98, - -1, -1, 118, -1, 120, -1, -1, 123, -1, 74, - 75, 57, -1, -1, -1, 131, -1, 133, 117, 118, - 136, -1, -1, -1, -1, 57, -1, -1, 74, 75, - -1, -1, -1, -1, -1, 134, -1, -1, -1, -1, - 139, -1, 74, 75, -1, 110, 111, -1, 113, -1, - -1, -1, -1, 118, -1, 120, -1, -1, 123, -1, - -1, -1, -1, 162, 110, 111, 131, 113, 133, -1, - -1, 136, 118, -1, 120, -1, -1, 123, 110, 111, - -1, 113, -1, -1, -1, 131, 118, 133, 120, -1, - 136, 123, -1, -1, 50, 51, -1, -1, -1, 131, - -1, 133, 58, 59, 136, -1, -1, -1, -1, -1, - -1, 67, -1, 69, 70, 71, 72, -1, -1, -1, - 76, -1, -1, -1, -1, 81, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 100, 101, 102, 103, 104, 105, - -1, -1, -1, -1, -1, 111, 112, 113, 114, -1, - -1, -1, -1, -1, 120, 121, 50, 51, 124, 125, - -1, -1, -1, 129, 58, 59, -1, -1, -1, 135, - 136, -1, 138, 67, -1, 69, 70, 71, 72, -1, - 146, -1, 76, -1, -1, -1, -1, 81, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 163, -1, 165, - -1, -1, -1, -1, -1, -1, 100, 101, 102, 103, - 104, 105, -1, -1, -1, -1, -1, 111, 112, 113, - 114, -1, -1, -1, -1, -1, 120, 121, 50, 51, - 124, 125, -1, -1, -1, 129, 58, 59, -1, -1, - -1, 135, 136, -1, 138, 67, -1, 69, 70, 71, - 72, -1, 146, -1, 76, -1, -1, -1, -1, 81, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 163, - -1, 165, -1, -1, -1, -1, -1, -1, 100, 101, - 102, 103, 104, 105, -1, -1, -1, -1, -1, 111, - 112, 113, 114, -1, -1, -1, -1, -1, 120, 121, - 50, 51, 124, 125, -1, -1, -1, 129, 58, 59, - -1, -1, -1, 135, 136, -1, 138, 67, -1, 69, - 70, 71, 72, -1, 146, -1, 76, -1, -1, -1, - -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 163, -1, 165, -1, -1, -1, -1, -1, -1, - 100, 101, 102, 103, 104, 105, -1, -1, -1, -1, - -1, 111, 112, 113, 114, -1, -1, -1, -1, -1, - 120, 121, 50, 51, 124, 125, -1, -1, -1, 129, - 58, 59, -1, -1, -1, 135, 136, -1, 138, 67, - -1, 69, 70, 71, 72, -1, 146, -1, 76, -1, - -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 163, -1, 165, -1, -1, -1, -1, - -1, -1, 100, 101, 102, 103, 104, 105, -1, -1, - -1, -1, -1, 111, 112, 113, 114, -1, -1, -1, - -1, -1, 120, 121, 50, 51, 124, 125, -1, -1, - -1, 129, 58, 59, -1, -1, -1, 135, 136, -1, - 138, 67, -1, 69, 70, 71, 72, -1, 146, -1, - 76, -1, -1, -1, -1, 81, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 163, -1, 165, -1, -1, - -1, -1, -1, -1, 100, 101, 102, 103, 104, 105, - -1, -1, -1, -1, -1, 111, 112, 113, 114, -1, - -1, -1, -1, -1, 120, 121, 50, 51, 124, 125, - -1, -1, -1, 129, 58, 59, -1, -1, -1, 135, - 136, -1, 138, 67, -1, 69, 70, 71, 72, -1, - 146, -1, 76, -1, -1, -1, -1, 81, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 163, -1, 165, - -1, -1, -1, -1, -1, -1, 100, 101, 102, 103, - 104, 105, -1, -1, -1, -1, -1, 111, 112, 113, - 114, -1, -1, -1, -1, -1, 120, 121, 50, 51, - 124, 125, -1, -1, -1, 129, 58, 59, -1, -1, - -1, 135, 136, -1, 138, 67, -1, 69, 70, 71, - 72, -1, 146, -1, 76, 51, -1, -1, -1, 81, - -1, -1, 58, 59, -1, -1, -1, -1, -1, 163, - -1, 165, -1, 69, 70, 71, -1, -1, 100, 101, - 102, 103, 104, 105, -1, 81, -1, -1, -1, 111, - 112, 113, 114, -1, -1, -1, -1, -1, 120, 121, - -1, -1, 124, 125, -1, -1, -1, 129, 104, -1, - -1, -1, -1, 135, 136, 51, 138, -1, 114, -1, - -1, -1, 58, 59, 120, -1, -1, -1, -1, 125, - -1, -1, -1, 69, 70, 71, -1, -1, -1, 135, - 136, 163, 138, 51, -1, 81, -1, -1, -1, -1, - 58, 59, 51, -1, -1, -1, -1, 153, -1, 58, - 59, 69, 70, 71, -1, -1, -1, 163, 104, -1, - 69, 70, 71, 81, -1, -1, -1, -1, 114, -1, - -1, -1, 81, 52, 120, 54, 55, 56, 124, 125, - -1, -1, -1, -1, -1, 64, 104, 105, -1, 135, - 136, -1, 138, -1, -1, 104, 114, -1, -1, -1, - -1, -1, 120, 82, -1, 114, 52, 125, 54, 55, - 56, 120, -1, -1, -1, -1, 125, 163, 136, 98, - 138, -1, -1, -1, -1, -1, -1, 136, -1, 138, - -1, -1, -1, -1, -1, -1, 82, -1, 117, 118, - -1, -1, -1, -1, -1, 163, -1, -1, -1, -1, - -1, -1, 98, -1, 163, 134, -1, -1, -1, -1, - 139, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 117, 118, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 162, -1, -1, -1, -1, 134, -1, - -1, -1, -1, 139, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 162 -}; - - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint16 yystos[] = -{ - 0, 141, 142, 143, 169, 170, 274, 3, 4, 5, - 6, 8, 9, 10, 11, 48, 52, 54, 55, 56, - 60, 64, 65, 73, 74, 75, 79, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 106, 108, 110, 115, 117, 118, - 119, 122, 127, 130, 134, 139, 152, 155, 156, 157, - 160, 162, 163, 167, 264, 265, 273, 11, 12, 49, - 52, 54, 55, 56, 57, 58, 61, 64, 68, 75, - 82, 98, 117, 118, 123, 131, 132, 133, 134, 137, - 139, 227, 228, 232, 233, 235, 241, 242, 246, 247, - 252, 253, 254, 255, 0, 50, 51, 58, 59, 67, - 69, 70, 71, 72, 76, 81, 100, 101, 102, 103, - 104, 105, 111, 112, 113, 114, 120, 121, 124, 125, - 129, 135, 136, 138, 146, 163, 173, 175, 176, 178, - 181, 199, 248, 251, 274, 162, 162, 162, 162, 162, - 162, 153, 162, 153, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 11, 49, 61, 131, 132, 230, 246, - 247, 252, 153, 162, 162, 15, 162, 153, 162, 162, - 162, 264, 264, 264, 264, 264, 11, 52, 54, 55, - 56, 64, 75, 82, 98, 117, 118, 134, 139, 232, - 262, 264, 10, 11, 12, 74, 75, 110, 111, 113, - 118, 120, 148, 152, 268, 269, 271, 274, 264, 16, - 17, 18, 19, 20, 21, 22, 23, 33, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 161, - 162, 163, 6, 8, 227, 228, 162, 57, 123, 64, - 98, 253, 253, 253, 271, 162, 253, 13, 15, 17, - 58, 138, 152, 157, 162, 225, 226, 274, 226, 144, - 10, 11, 12, 110, 147, 272, 10, 11, 12, 110, - 144, 271, 272, 81, 178, 178, 178, 178, 6, 178, - 178, 147, 177, 105, 178, 162, 162, 162, 162, 178, - 144, 271, 147, 147, 147, 178, 178, 162, 178, 181, - 200, 178, 178, 184, 105, 271, 178, 178, 163, 10, - 11, 49, 61, 109, 131, 132, 144, 160, 187, 190, - 229, 231, 233, 235, 241, 246, 247, 252, 261, 262, - 274, 232, 261, 261, 261, 261, 232, 261, 232, 261, - 232, 261, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 261, 162, 271, - 162, 162, 271, 271, 232, 261, 261, 162, 232, 232, - 232, 264, 261, 261, 164, 145, 164, 271, 166, 145, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 164, 262, 264, 226, 226, 264, 232, 157, 271, - 13, 15, 17, 58, 138, 152, 157, 225, 274, 225, - 226, 225, 226, 225, 225, 15, 17, 58, 114, 152, - 157, 210, 211, 220, 227, 228, 274, 163, 244, 245, - 274, 11, 243, 253, 147, 234, 236, 178, 175, 144, - 271, 271, 271, 271, 271, 170, 144, 264, 153, 10, - 11, 190, 229, 231, 271, 146, 148, 179, 180, 271, - 162, 162, 162, 58, 227, 271, 162, 174, 271, 144, - 146, 147, 148, 216, 144, 146, 148, 217, 146, 182, - 271, 272, 271, 164, 164, 164, 164, 164, 164, 154, - 164, 154, 164, 164, 164, 164, 145, 164, 145, 164, - 145, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 264, 232, 261, 154, 164, 164, 271, 164, - 154, 164, 164, 164, 164, 264, 264, 162, 196, 274, - 268, 147, 164, 166, 164, 164, 225, 157, 271, 225, - 225, 225, 225, 225, 163, 225, 114, 227, 228, 220, - 225, 225, 164, 15, 145, 13, 17, 58, 138, 152, - 157, 162, 223, 272, 274, 13, 15, 17, 58, 138, - 152, 157, 162, 224, 260, 264, 274, 271, 165, 243, - 170, 74, 237, 274, 170, 144, 145, 145, 145, 145, - 165, 249, 145, 164, 10, 11, 12, 57, 58, 131, - 201, 202, 203, 204, 205, 252, 274, 162, 217, 185, - 146, 232, 166, 145, 162, 188, 13, 157, 189, 264, - 227, 13, 17, 58, 138, 152, 157, 222, 272, 274, - 232, 170, 162, 256, 257, 171, 172, 271, 62, 63, - 256, 62, 63, 144, 264, 13, 17, 58, 109, 138, - 152, 157, 162, 183, 206, 208, 272, 147, 162, 162, - 232, 232, 232, 164, 164, 164, 162, 164, 162, 210, - 17, 33, 58, 74, 104, 107, 110, 126, 138, 152, - 209, 274, 264, 225, 260, 164, 227, 228, 223, 224, - 164, 164, 196, 15, 220, 157, 223, 223, 223, 223, - 223, 223, 148, 163, 215, 274, 157, 271, 224, 224, - 224, 224, 224, 224, 163, 215, 166, 145, 148, 165, - 147, 238, 239, 274, 165, 250, 10, 10, 10, 10, - 170, 273, 146, 205, 154, 145, 15, 271, 13, 17, - 58, 138, 152, 157, 162, 223, 224, 186, 208, 146, - 166, 179, 3, 4, 5, 9, 10, 15, 48, 60, - 65, 73, 74, 106, 108, 110, 115, 119, 122, 127, - 130, 152, 155, 156, 160, 162, 167, 212, 213, 220, - 221, 266, 267, 273, 274, 210, 157, 206, 210, 164, - 222, 157, 222, 222, 222, 222, 222, 162, 163, 164, - 165, 191, 165, 258, 274, 144, 145, 144, 162, 146, - 146, 165, 146, 146, 144, 218, 219, 264, 274, 146, - 157, 206, 206, 6, 16, 17, 18, 19, 20, 21, - 22, 23, 33, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 63, 106, 145, 148, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 162, 163, 167, 197, 206, 206, 206, 206, 147, 162, - 163, 209, 148, 215, 217, 243, 262, 262, 164, 164, - 164, 262, 262, 164, 58, 230, 162, 144, 166, 162, - 223, 224, 215, 215, 162, 162, 209, 223, 164, 264, - 260, 224, 164, 260, 264, 111, 112, 113, 131, 136, - 240, 247, 270, 271, 144, 145, 170, 145, 164, 145, - 145, 145, 165, 164, 223, 224, 181, 198, 199, 204, - 271, 148, 157, 148, 214, 274, 215, 217, 178, 162, - 153, 153, 230, 153, 15, 162, 153, 162, 264, 264, - 264, 264, 232, 262, 264, 164, 15, 145, 16, 17, - 18, 19, 20, 21, 22, 23, 33, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 161, 162, - 163, 164, 206, 164, 164, 162, 222, 194, 260, 210, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 68, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 80, 81, 82, 98, 104, 105, - 106, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 166, 167, 259, 256, 172, - 261, 261, 218, 165, 145, 206, 10, 164, 166, 164, - 4, 207, 260, 264, 145, 164, 164, 164, 164, 196, - 230, 226, 164, 271, 256, 210, 215, 215, 210, 210, - 162, 166, 162, 166, 145, 136, 270, 136, 270, 136, - 270, 271, 111, 112, 113, 271, 15, 170, 240, 165, - 10, 146, 10, 10, 10, 146, 214, 232, 48, 60, - 65, 115, 119, 122, 152, 155, 156, 157, 160, 162, - 167, 263, 265, 145, 232, 232, 232, 162, 232, 162, - 232, 232, 232, 264, 164, 164, 15, 221, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 164, - 262, 264, 196, 164, 162, 196, 195, 210, 166, 164, - 258, 165, 165, 164, 165, 144, 264, 212, 166, 183, - 209, 226, 15, 164, 165, 164, 164, 164, 210, 210, - 270, 270, 270, 270, 270, 270, 165, 145, 164, 145, - 164, 164, 145, 164, 162, 153, 153, 153, 15, 162, - 153, 263, 263, 263, 263, 263, 232, 262, 263, 16, - 17, 18, 19, 20, 21, 22, 23, 33, 149, 150, - 151, 152, 155, 156, 157, 158, 159, 161, 162, 163, - 186, 164, 154, 154, 261, 154, 271, 164, 154, 164, - 164, 264, 147, 164, 166, 162, 192, 210, 164, 196, - 165, 15, 218, 164, 144, 164, 196, 196, 196, 164, - 164, 10, 146, 10, 146, 146, 10, 146, 232, 232, - 232, 232, 162, 232, 232, 164, 164, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 164, 262, 264, 162, - 162, 164, 162, 164, 162, 264, 193, 210, 164, 196, - 165, 196, 256, 209, 209, 209, 196, 196, 164, 145, - 145, 164, 164, 154, 154, 154, 271, 164, 154, 263, - 147, 164, 166, 262, 262, 262, 262, 210, 164, 196, - 165, 146, 10, 10, 146, 162, 162, 162, 164, 162, - 263, 164, 164, 164, 164, 164, 196, 164, 164, 262, - 262, 262, 262, 196, 209, 146, 146, 164, 164, 164, - 164, 209 -}; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 168, 169, 169, 169, 170, 170, 170, 171, 171, - 172, 172, 172, 174, 173, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 177, 176, - 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 179, 179, 180, 180, - 182, 181, 181, 181, 181, 181, 183, 183, 185, 184, - 184, 186, 186, 188, 187, 189, 187, 191, 190, 192, - 190, 193, 190, 194, 190, 195, 190, 190, 196, 196, - 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 198, - 198, 200, 199, 199, 201, 201, 202, 202, 203, 203, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, - 205, 205, 205, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 206, 206, 207, 206, 208, 208, 209, 209, - 209, 210, 210, 210, 210, 210, 211, 211, 212, 212, - 212, 212, 212, 213, 213, 214, 214, 215, 215, 216, - 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, - 218, 218, 218, 219, 219, 219, 219, 220, 220, 220, - 220, 220, 220, 220, 221, 221, 222, 222, 222, 222, - 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 226, 226, 226, - 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 228, 229, 229, 229, 229, 229, 229, 229, - 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, - 230, 230, 230, 231, 231, 232, 232, 232, 232, 234, - 233, 236, 235, 237, 237, 238, 238, 239, 239, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 241, - 242, 242, 242, 242, 243, 243, 244, 244, 244, 245, - 245, 245, 246, 246, 246, 247, 247, 247, 249, 248, - 250, 248, 248, 248, 251, 251, 251, 252, 252, 252, - 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, - 253, 253, 253, 253, 254, 254, 254, 255, 257, 256, - 258, 258, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 260, - 260, 261, 261, 262, 262, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 0, 170, 171, 171, 171, 172, 172, 172, 173, 173, + 174, 174, 174, 176, 175, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 179, 178, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, + 182, 182, 182, 184, 183, 183, 183, 183, 183, 185, + 185, 187, 186, 186, 188, 188, 190, 189, 191, 189, + 193, 192, 194, 192, 195, 192, 196, 192, 197, 192, + 192, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 200, 200, 201, 202, 201, 201, + 203, 203, 204, 204, 205, 205, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 207, 207, 207, 207, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 209, 208, 210, 210, 211, 211, 211, 212, 212, 212, + 212, 212, 213, 213, 214, 214, 214, 214, 214, 215, + 215, 216, 216, 217, 217, 218, 218, 218, 218, 218, + 219, 219, 219, 219, 219, 219, 220, 220, 220, 221, + 221, 221, 221, 222, 222, 222, 222, 222, 222, 222, + 222, 223, 223, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 230, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 232, 232, 232, 232, 232, 232, + 232, 232, 233, 233, 234, 234, 234, 234, 235, 235, + 235, 235, 237, 236, 239, 238, 240, 240, 241, 241, + 242, 242, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 244, 245, 245, 245, 245, 246, 246, 247, + 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, + 250, 252, 251, 253, 251, 251, 251, 254, 254, 254, + 255, 255, 255, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, + 258, 260, 259, 261, 261, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 263, 263, 264, 264, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 268, 268, 268, 269, 269, 269, - 269, 270, 270, 270, 270, 271, 271, 271, 271, 271, - 271, 271, 271, 271, 271, 272, 272, 272, 272, 273, - 273, 273, 273, 274 + 266, 266, 266, 266, 266, 266, 266, 266, 266, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 271, 271, 271, 271, 271, 272, 272, + 272, 272, 273, 273, 273, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 275, 275, 275, 275, 276, + 276, 276, 276, 277 }; - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 2, 2, 1, 2, 2, 1, 3, @@ -2945,41 +1535,42 @@ static const yytype_uint8 yyr2[] = 2, 1, 1, 2, 2, 2, 2, 7, 9, 11, 9, 11, 13, 9, 13, 9, 7, 5, 0, 3, 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 6, 1, 3, 1, 4, - 0, 4, 3, 3, 3, 1, 2, 4, 0, 4, - 3, 2, 4, 0, 6, 0, 6, 0, 7, 0, - 11, 0, 12, 0, 8, 0, 9, 1, 1, 2, - 2, 2, 2, 2, 2, 2, 2, 4, 5, 6, + 2, 2, 2, 2, 2, 4, 5, 5, 1, 3, + 1, 4, 4, 0, 4, 3, 3, 3, 1, 2, + 4, 0, 4, 3, 2, 4, 0, 6, 0, 6, + 0, 7, 0, 11, 0, 12, 0, 8, 0, 9, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 4, 5, 6, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, - 1, 0, 6, 2, 1, 1, 1, 3, 1, 1, - 1, 2, 4, 2, 3, 3, 4, 2, 3, 1, - 1, 1, 1, 1, 2, 3, 2, 2, 2, 2, - 2, 3, 4, 3, 0, 6, 2, 3, 1, 3, - 4, 1, 1, 1, 3, 2, 1, 3, 1, 1, - 1, 3, 2, 1, 3, 1, 2, 1, 2, 1, - 3, 5, 3, 3, 1, 3, 3, 3, 3, 4, - 1, 1, 2, 1, 3, 3, 5, 3, 4, 5, - 3, 4, 5, 2, 1, 1, 1, 1, 2, 2, - 2, 2, 2, 3, 4, 1, 1, 2, 2, 2, - 2, 2, 3, 4, 7, 3, 1, 2, 2, 2, - 2, 2, 2, 3, 4, 7, 3, 1, 1, 2, - 2, 2, 2, 2, 2, 3, 4, 1, 1, 2, - 2, 2, 2, 2, 2, 3, 4, 5, 9, 9, - 9, 1, 1, 2, 1, 1, 1, 2, 4, 4, - 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, - 4, 2, 4, 4, 1, 1, 1, 2, 2, 2, - 4, 4, 1, 1, 1, 2, 3, 2, 3, 0, - 5, 0, 8, 1, 1, 1, 1, 2, 3, 1, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, - 3, 1, 4, 2, 1, 1, 1, 3, 5, 1, - 2, 4, 1, 2, 2, 1, 1, 1, 0, 6, - 0, 7, 4, 5, 3, 5, 4, 1, 1, 1, + 2, 2, 1, 1, 1, 1, 2, 0, 6, 2, + 1, 1, 1, 3, 1, 1, 1, 2, 4, 2, + 3, 3, 4, 2, 3, 1, 1, 1, 1, 1, + 2, 3, 2, 2, 2, 2, 2, 3, 4, 3, + 0, 6, 2, 3, 1, 3, 4, 1, 1, 1, + 3, 2, 1, 3, 1, 1, 1, 3, 2, 1, + 3, 1, 2, 1, 2, 1, 3, 5, 3, 3, + 1, 3, 3, 3, 3, 4, 1, 1, 2, 1, + 3, 3, 5, 3, 4, 5, 3, 4, 5, 2, + 4, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 3, 4, 1, 1, 2, 2, 2, 2, 2, 3, + 4, 7, 3, 1, 2, 2, 2, 2, 2, 2, + 3, 4, 7, 3, 1, 1, 2, 2, 2, 2, + 2, 2, 3, 4, 1, 1, 2, 2, 2, 2, + 2, 2, 3, 4, 5, 9, 9, 9, 1, 1, + 2, 1, 1, 1, 3, 4, 4, 4, 4, 1, + 1, 1, 1, 2, 1, 1, 1, 3, 4, 2, + 4, 4, 4, 1, 1, 1, 2, 3, 2, 4, + 4, 1, 1, 1, 2, 3, 2, 3, 1, 4, + 5, 5, 0, 6, 0, 9, 1, 1, 1, 1, + 2, 3, 1, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 4, 3, 1, 4, 2, 1, 1, 1, + 3, 5, 1, 2, 4, 1, 2, 2, 1, 1, + 1, 0, 6, 0, 7, 4, 5, 3, 5, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 1, 1, 2, 1, 0, 2, - 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, + 1, 0, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2991,41 +1582,1990 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 1, 1, 3, 1, 4, 7, 7, 7, - 7, 4, 5, 4, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, + 1, 4, 7, 7, 7, 7, 4, 4, 5, 4, + 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, - 3, 3, 3, 1, 4, 7, 7, 7, 7, 4, + 3, 3, 5, 4, 4, 3, 3, 3, 3, 1, + 4, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 5, 4, 2, 5, 4, 4, 2, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 4, 5, 4, 2, 5, 4, 4, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 5, 4, 4, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 8, 11, 4, 4, 6, 4, 4, 6, 6, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 1, 4, 7, 7, 7, 7, 4, 5, 4, 2, - 5, 4, 4, 2, 2, 2, 2, 2, 3, 3, + 3, 5, 4, 4, 3, 3, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, + 11, 4, 4, 6, 4, 4, 6, 6, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 1, 4, + 7, 7, 7, 7, 4, 4, 5, 4, 2, 5, + 4, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, - 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, - 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, + 3, 3, 3, 3, 3, 5, 4, 4, 3, 3, + 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 4, 2, 3, + 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0 }; +/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint16 yydefact[] = +{ + 0, 753, 0, 0, 0, 753, 5, 642, 638, 641, + 749, 750, 644, 645, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 640, 646, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 648, 647, 0, 0, 0, + 0, 0, 639, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 753, 0, 3, 579, 643, 289, 300, 299, + 383, 384, 386, 387, 368, 0, 0, 398, 365, 397, + 392, 389, 388, 391, 369, 0, 0, 370, 390, 400, + 385, 753, 753, 4, 291, 292, 293, 0, 354, 753, + 288, 380, 381, 382, 1, 0, 0, 21, 753, 753, + 753, 22, 753, 753, 753, 0, 38, 753, 0, 0, + 0, 0, 753, 0, 0, 0, 0, 753, 753, 0, + 753, 753, 753, 0, 753, 753, 6, 17, 7, 19, + 0, 15, 16, 18, 68, 40, 753, 753, 0, 753, + 753, 753, 753, 0, 753, 0, 753, 0, 753, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 753, 315, 321, 0, 0, 0, + 603, 0, 753, 314, 0, 753, 753, 0, 0, 0, + 0, 753, 753, 612, 610, 609, 611, 608, 289, 383, + 384, 386, 387, 398, 397, 392, 389, 388, 391, 390, + 385, 0, 0, 538, 735, 736, 737, 738, 741, 739, + 743, 742, 740, 744, 724, 725, 0, 0, 753, 730, + 723, 607, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 751, 752, 753, 753, 0, + 366, 367, 399, 389, 394, 393, 396, 290, 0, 395, + 0, 275, 753, 753, 753, 753, 753, 753, 0, 324, + 274, 326, 753, 745, 746, 747, 748, 0, 356, 0, + 328, 0, 0, 58, 60, 0, 753, 753, 52, 41, + 51, 53, 753, 42, 146, 47, 23, 753, 0, 45, + 0, 0, 0, 0, 50, 753, 0, 26, 25, 24, + 48, 44, 0, 0, 149, 0, 54, 0, 20, 0, + 0, 46, 49, 323, 302, 313, 0, 0, 0, 0, + 13, 0, 0, 0, 322, 63, 304, 305, 306, 354, + 753, 301, 0, 537, 536, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 316, 0, 753, 318, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 728, 731, 0, 753, 0, 726, 203, + 621, 622, 623, 624, 625, 626, 629, 630, 636, 0, + 618, 619, 620, 627, 628, 616, 617, 613, 614, 615, + 635, 634, 0, 0, 325, 327, 0, 0, 0, 753, + 276, 0, 265, 753, 753, 753, 753, 753, 281, 264, + 0, 277, 0, 278, 280, 279, 188, 753, 0, 0, + 0, 753, 753, 0, 189, 192, 753, 0, 187, 753, + 362, 0, 359, 358, 353, 357, 0, 735, 736, 737, + 0, 0, 739, 332, 294, 334, 0, 753, 0, 753, + 302, 0, 0, 43, 39, 753, 0, 0, 0, 0, + 0, 753, 371, 0, 753, 323, 302, 0, 322, 71, + 0, 377, 0, 76, 78, 0, 0, 753, 303, 0, + 753, 0, 401, 205, 0, 0, 66, 401, 210, 0, + 67, 65, 0, 309, 356, 0, 586, 585, 602, 592, + 588, 590, 591, 0, 598, 0, 597, 651, 587, 652, + 0, 654, 0, 655, 0, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 594, 0, 0, 0, 317, + 0, 593, 596, 0, 600, 599, 0, 605, 606, 595, + 589, 580, 539, 729, 0, 753, 753, 753, 91, 204, + 0, 633, 632, 297, 296, 298, 282, 753, 266, 271, + 267, 268, 270, 269, 753, 0, 0, 0, 753, 0, + 229, 0, 0, 753, 191, 0, 0, 753, 753, 753, + 753, 753, 753, 753, 243, 242, 0, 253, 0, 0, + 0, 0, 0, 0, 753, 0, 535, 534, 363, 352, + 295, 0, 0, 753, 753, 0, 55, 59, 716, 712, + 715, 718, 719, 195, 0, 0, 0, 714, 720, 0, + 722, 721, 0, 0, 0, 713, 0, 0, 0, 0, + 0, 0, 0, 0, 196, 231, 199, 232, 668, 717, + 194, 753, 753, 753, 373, 0, 0, 0, 0, 375, + 753, 0, 0, 166, 167, 168, 154, 0, 155, 0, + 151, 156, 152, 753, 165, 150, 0, 73, 0, 379, + 0, 753, 0, 0, 753, 0, 0, 753, 0, 753, + 753, 753, 753, 753, 0, 234, 233, 0, 753, 80, + 0, 753, 0, 8, 0, 0, 0, 0, 0, 0, + 753, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 753, 753, 169, 0, 307, 0, 0, 0, 0, + 0, 319, 320, 604, 0, 601, 0, 727, 0, 98, + 0, 0, 92, 100, 95, 99, 94, 96, 0, 93, + 97, 0, 184, 631, 272, 0, 0, 0, 753, 0, + 753, 753, 0, 0, 753, 190, 193, 753, 248, 244, + 245, 247, 246, 0, 753, 223, 0, 254, 259, 255, + 256, 258, 257, 0, 753, 226, 283, 360, 0, 329, + 0, 0, 753, 337, 753, 336, 62, 0, 0, 0, + 678, 0, 0, 0, 0, 0, 686, 685, 684, 683, + 0, 0, 682, 61, 198, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 56, 376, 753, 0, 0, 0, 0, 753, 0, 37, + 753, 753, 0, 159, 157, 0, 753, 753, 753, 753, + 753, 753, 753, 163, 72, 753, 378, 0, 0, 0, + 0, 311, 310, 0, 753, 239, 235, 236, 238, 237, + 86, 753, 312, 14, 753, 206, 402, 403, 401, 0, + 753, 753, 208, 209, 211, 213, 214, 753, 0, 217, + 219, 216, 212, 0, 176, 172, 0, 115, 116, 117, + 118, 119, 120, 123, 124, 139, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 143, 142, + 126, 125, 112, 114, 113, 121, 122, 110, 111, 107, + 108, 109, 106, 0, 0, 105, 170, 173, 175, 174, + 0, 0, 180, 753, 182, 0, 0, 69, 308, 0, + 0, 653, 656, 657, 0, 0, 753, 0, 753, 0, + 0, 401, 273, 753, 230, 753, 753, 224, 227, 753, + 753, 284, 249, 252, 0, 260, 263, 0, 364, 331, + 330, 333, 0, 0, 339, 338, 0, 0, 0, 753, + 0, 0, 0, 0, 0, 0, 0, 0, 711, 197, + 200, 695, 696, 697, 698, 699, 700, 703, 704, 710, + 0, 692, 693, 694, 701, 702, 690, 691, 687, 688, + 689, 709, 708, 0, 0, 753, 0, 0, 0, 0, + 0, 372, 0, 753, 164, 144, 148, 145, 153, 160, + 0, 753, 0, 161, 201, 0, 74, 753, 0, 0, + 753, 88, 240, 753, 0, 0, 405, 406, 410, 407, + 415, 408, 409, 411, 412, 413, 414, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 483, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 753, 527, 528, 529, 520, 532, 516, 517, + 515, 522, 523, 511, 512, 513, 514, 521, 519, 526, + 524, 530, 525, 518, 531, 404, 0, 9, 0, 0, + 0, 215, 218, 177, 171, 141, 140, 179, 183, 753, + 0, 204, 0, 583, 582, 584, 581, 753, 753, 185, + 104, 101, 0, 0, 0, 225, 228, 0, 0, 753, + 250, 753, 261, 361, 743, 0, 742, 0, 0, 340, + 342, 732, 753, 0, 677, 0, 0, 0, 0, 0, + 675, 674, 0, 680, 681, 669, 0, 707, 706, 374, + 0, 27, 0, 0, 0, 36, 162, 158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 202, 540, 0, 77, 0, 82, 79, 753, 0, + 241, 753, 0, 207, 12, 10, 220, 753, 221, 0, + 178, 70, 0, 186, 0, 102, 649, 753, 753, 753, + 0, 0, 0, 345, 0, 344, 0, 343, 733, 0, + 0, 0, 734, 753, 341, 0, 0, 679, 0, 676, + 0, 705, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 555, 553, 552, 554, + 551, 0, 0, 550, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75, 84, 753, 0, 753, + 81, 533, 11, 0, 753, 401, 103, 753, 753, 753, + 753, 753, 351, 350, 349, 348, 347, 346, 335, 0, + 0, 0, 0, 0, 28, 0, 33, 35, 0, 30, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 578, + 564, 565, 566, 567, 568, 569, 570, 571, 577, 0, + 561, 562, 563, 559, 560, 556, 557, 558, 576, 575, + 0, 0, 753, 0, 753, 87, 222, 181, 0, 287, + 286, 285, 251, 262, 672, 671, 673, 670, 0, 0, + 0, 0, 549, 0, 0, 0, 0, 547, 546, 0, + 541, 0, 574, 573, 0, 753, 89, 650, 29, 0, + 0, 31, 0, 0, 0, 548, 0, 572, 753, 753, + 0, 0, 0, 0, 0, 0, 753, 83, 34, 32, + 544, 543, 545, 542, 85 +}; -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 4, 5, 732, 733, 137, 520, 138, 139, 307, + 140, 292, 293, 141, 532, 750, 328, 708, 894, 342, + 711, 714, 343, 914, 1407, 1472, 1093, 1318, 587, 976, + 1076, 142, 325, 699, 700, 701, 702, 703, 751, 1239, + 752, 781, 463, 464, 673, 674, 1083, 408, 526, 530, + 928, 929, 465, 676, 724, 798, 808, 278, 279, 91, + 92, 344, 180, 345, 93, 289, 94, 643, 95, 644, + 824, 1023, 1024, 1269, 96, 97, 474, 470, 471, 98, + 99, 143, 690, 872, 144, 100, 101, 102, 103, 730, + 731, 916, 1225, 635, 352, 353, 1311, 213, 65, 677, + 678, 227, 228, 1270, 1271, 624, 66, 145 +}; -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -922 +static const yytype_int16 yypact[] = +{ + 238, -922, 3707, 5766, 80, 4877, -922, -922, -922, -922, + -922, -922, -922, -922, -20, -68, -54, -43, -37, -23, + -49, 2, 3, -922, -922, 36, 90, 94, 120, 131, + 141, 166, 171, 181, 186, 204, 224, 233, 250, 252, + 265, 270, 288, 300, 6077, -922, -922, 59, 306, 308, + 30, 112, -922, 325, 331, 338, 3707, 3707, 3707, 3707, + 3707, 2266, 923, 3707, 3915, -922, 146, -922, -922, -922, + -922, -922, -922, -922, -922, 5876, 344, -922, 8, -922, + -922, 1691, 379, 379, -922, 3040, 346, -922, 379, -922, + -922, 220, 220, -922, -922, -922, -922, -11, 104, -922, + -922, -922, -922, -922, -922, 1704, 348, -922, 6862, 6862, + 6862, -922, 6862, 5244, 6862, -31, -922, 6834, 350, 357, + 359, 362, 6862, 1687, 161, 188, 258, 6862, 6862, 371, + 6652, 6862, 6862, 2382, 6862, 6862, -922, -922, -922, -922, + 4341, -922, -922, -922, -922, -922, 3707, 3707, 5766, 3707, + 3707, 3707, 3707, 5766, 3707, 5766, 3707, 5766, 3707, 5766, + 5766, 5766, 5766, 5766, 5766, 5766, 5766, 5766, 5766, 5766, + 5766, 5766, 5766, 5766, 3707, -922, -922, 372, 3040, 373, + 374, 3040, -922, -922, 5766, 3707, 3707, 398, 5362, 5766, + 2266, 3707, 3707, 60, 60, 60, 60, 60, -20, -54, + -43, -37, -23, 2, 36, 94, 1169, 5295, 5415, 5670, + 338, 321, -74, 3915, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, 3040, 3040, -87, 413, -922, + -922, 60, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, + 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, + 3707, 3707, 3707, 2769, 3707, -922, -922, 220, 220, 2903, + -922, -922, -922, 379, -922, -922, -922, -922, 5766, -922, + 405, 560, 273, 220, 220, 273, 273, 4990, 400, -922, + 402, -922, -922, -922, -922, -922, -922, 901, 419, 2827, + -922, 3040, 525, 427, 412, 2469, 5271, 6862, -922, -922, + -922, -922, 6862, -922, -922, -922, -922, 6748, 2638, -922, + 3040, 3040, 3040, 3040, -922, -922, 432, -922, -922, -922, + -922, -922, 3707, 4434, -922, 433, -922, 4520, -922, 3040, + -63, -922, -922, 225, 423, -922, 425, 5962, 3040, 426, + -922, 3040, 198, 205, 443, -922, -922, -922, -922, 942, + -922, -922, 428, 447, -922, 434, 438, 439, 442, 458, + 459, 453, 460, 471, 462, 468, 469, 472, 452, 474, + -69, 494, 480, 481, 482, 483, 484, 486, 487, 488, + 489, 490, 491, 3707, -922, 5766, 3707, -922, 2291, 507, + 498, 499, 3040, 500, 501, 513, 504, 4205, 505, 510, + 3707, 3707, -922, 668, -922, 936, 520, 3707, -922, -922, + 4171, 1444, 1377, 1377, 260, 260, 11, 11, -922, 2653, + 5043, 5059, 5099, 260, 260, 695, 695, 60, 60, 60, + -922, -922, -66, 1527, -922, -922, 519, 4589, 521, 273, + 523, 527, 3040, 273, 273, 273, 273, 273, 526, -922, + 400, -922, 400, -922, 526, 526, -922, 273, 1704, 5852, + 5737, 273, 273, 528, 50, -922, 1127, 232, -922, 3707, + 3040, 531, -922, -922, -922, -922, 901, -12, -10, -6, + 1704, 529, 10, -922, -922, -922, 543, 6862, 1704, 3841, + -20, 533, 4646, -922, -922, -922, 549, 553, 556, 558, + 564, 6192, -922, 3860, 5511, 280, 548, 205, -922, -922, + 567, -922, 5766, -922, 29, 3037, 6101, 1091, -922, 5766, + -922, 559, -922, -922, 3040, 294, -922, -922, -922, 2635, + -922, -922, 1168, -922, 575, 2827, -922, -922, -922, -922, + -922, -922, -922, 562, -922, 563, -922, -922, -922, -922, + 5766, -922, 5766, -922, 5766, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, 4667, 565, 566, -922, + 572, -922, -922, 571, -922, -922, 578, -922, -922, -922, + -922, 60, 3915, -922, 3040, 413, 5617, 4489, -922, 3915, + 3707, -922, -922, -922, -922, -922, 526, 273, -922, 526, + 526, 526, 526, 526, 3707, 212, 681, 5876, 1127, 232, + -922, 311, 320, -922, -922, 5646, 585, 1127, 1127, 1127, + 1127, 1127, 1127, -33, -922, -922, 586, 3040, 232, 232, + 232, 232, 232, 232, 39, 577, 3915, -922, 32, -922, + 601, 700, 2469, -922, 673, 1704, -922, -922, -922, -922, + -922, -922, -922, -922, 588, 598, 600, -922, -922, 6077, + -922, -922, 604, 35, 606, -922, 602, 3707, 3707, 3707, + 3707, 2266, 3707, 596, 64, -922, -922, 4758, -922, 146, + -922, 6862, 6862, 6264, -922, 754, 758, 763, 764, -922, + -922, 256, 617, -922, -922, -922, -922, 5579, -922, 621, + 633, 2906, -922, 1367, -922, -922, 29, -922, 1168, -922, + 634, 5617, 622, 1168, 5617, 619, 4685, 1091, 624, 1091, + 1091, 1091, 1091, 1091, 328, -922, -922, 625, 6336, -922, + 627, -922, 354, -922, 19, 647, 651, 637, 653, 657, + 3171, 3059, 649, 1168, 1168, 4274, 1168, 1168, 1168, 1168, + -922, 79, 323, -922, 901, -922, 3707, 3707, 640, 643, + 644, -922, -922, -922, 3707, -922, 3707, -922, 646, -922, + 5991, 1704, -922, -922, -922, -922, -922, -922, 650, -922, + -922, 671, -922, 3915, 526, 652, 654, 5737, 1127, 232, + -33, 39, 655, 656, 4489, -922, -922, 1127, 659, 659, + 659, 659, 659, 339, 3707, -922, 232, -922, 660, 660, + 660, 660, 660, 363, 3707, -922, 662, -922, 3707, -922, + 663, 4703, 6408, -922, 683, -922, -922, 5766, 5766, 5766, + 666, 5766, 670, 5391, 5766, 2266, 60, 60, 60, 60, + 672, -64, 60, -922, -922, 3981, 3707, 3707, 3707, 3707, + 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, + 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3305, 3707, -922, + -922, -922, -922, -59, 688, 690, 699, 6480, 41, -922, + 1367, 6776, 5511, 3040, 701, 691, 1367, 1367, 1367, 1367, + 1367, 1367, 71, 660, -922, 323, -922, 696, 1168, 228, + 697, -922, -922, 366, 1091, 692, 692, 692, 692, 692, + -922, 3707, -922, -922, 5617, -922, 2099, -922, -922, 3040, + 3707, 3707, -922, -922, -922, -922, -922, 3171, 698, 719, + 3915, -922, -922, 1168, 369, 369, 858, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, 704, 703, -922, -922, 369, 369, 369, + 293, 869, -922, 3707, -922, 2635, 727, -922, 601, -58, + -46, -922, -922, -922, -44, -42, -922, 6077, 220, 829, + 119, -922, -922, 5617, -922, -33, 39, -922, -922, 5617, + 5617, -922, 659, 714, 711, 660, 717, 713, 3327, -922, + -922, -922, 1439, 738, 751, -922, 734, 745, 746, 3707, + 748, 3040, 739, 741, 752, 750, 4740, 3707, -922, -922, + -922, 4171, 1444, 1377, 1377, 260, 260, 11, 11, -922, + 3595, 5043, 5059, 5099, 260, 260, 695, 695, 60, 60, + 60, -922, -922, -38, 1909, 6552, 904, 769, 908, 911, + 912, -922, 775, 71, 660, -922, -922, -922, -922, -922, + 5766, 1367, 4120, -922, -922, 778, -922, -922, 316, 765, + -922, -922, 692, 5617, 759, 766, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, 783, -922, 800, 770, + 804, -922, 3439, 369, -922, -922, -922, -922, -922, 3841, + 762, 3059, 1168, -922, -922, -922, -922, 4489, 220, -922, + -922, -922, 1, 806, 779, -922, -922, 812, 815, 5617, + -922, 5617, -922, -922, 5836, 6061, 6110, 3040, 326, -922, + -922, 968, -922, 1439, -922, 820, 824, 827, 830, 832, + -922, -922, 839, -922, -922, 60, 3707, -922, -922, -922, + -28, -922, -24, 840, 82, -922, -922, -922, 843, 841, + 855, 856, 37, 859, 4120, 4120, 4120, 4120, 4120, 2266, + 4120, 4356, -922, 1168, 755, 851, -922, 755, 5617, 850, + -922, -922, 1840, -922, -922, 1002, -922, 3171, 3915, 857, + -922, -922, 876, -922, 860, -922, -922, -922, -922, -922, + 863, 865, 2075, -922, 2075, -922, 2075, -922, -922, 2075, + 2075, 2075, -922, 6624, -922, 3707, 3707, -922, 3707, -922, + 3707, 3915, 1014, 884, 1029, 892, 893, 1034, 898, 5766, + 5766, 5766, 5766, 886, 5482, 5766, 114, 114, 114, 114, + 114, 887, 99, 114, 4120, 4120, 4120, 4120, 4120, 4120, + 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, + 4120, 4120, 4120, 3573, 3707, -922, -922, 5617, 894, -922, + 755, -922, -922, 885, -922, -922, -922, 4489, 4489, 4489, + -922, -922, -922, -922, -922, -922, -922, -922, -922, 103, + 123, 152, 168, 895, -922, 916, -922, -922, 170, -922, + 902, 903, 918, 920, 3040, 913, 915, 922, 4120, -922, + 5001, 5075, 1543, 1543, 290, 290, 684, 684, -922, 1472, + 5115, 5149, 4141, 906, 906, 114, 114, 114, -922, -922, + 172, 2288, 5617, 917, -922, 755, -922, 755, 921, -922, + -922, -922, 755, 755, -922, -922, -922, -922, 937, 1074, + 1077, 945, -922, 930, 932, 933, 934, -922, -922, 941, + 114, 4120, -922, -922, 940, -922, 755, -922, -922, 943, + 946, -922, 3707, 3707, 3707, -922, 3707, 4356, -922, 4489, + 950, 959, 173, 195, 196, 210, 4489, -922, -922, -922, + -922, -922, -922, -922, -922 +}; +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -922, -922, -303, -922, 197, -922, -922, 807, -922, -922, + 194, -440, 470, -127, -922, -129, -922, -922, -195, -922, + -922, -922, 793, -922, -922, -922, -922, -922, -581, -922, + -922, -111, -922, -922, -922, -922, 240, 429, -672, -922, + -699, -740, -492, -922, -116, -922, 51, -539, -922, -497, + -921, -922, -455, 282, -664, 322, -229, 136, -71, 185, + 24, -288, -645, 801, 1201, -152, -118, -922, -117, -922, + -922, -922, -922, -144, -115, -922, -457, -922, -922, -36, + -27, -922, -922, -922, -922, -29, -45, -922, -922, -523, + -922, -72, -922, -584, -123, -60, 341, 307, 275, -922, + -922, -922, 726, 669, 1170, 243, -476, -1 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -749 +static const yytype_int16 yytable[] = +{ + 6, 212, 304, 324, 737, 610, 1230, 491, 181, 895, + 707, 984, 501, 679, 830, 183, 1334, 182, 606, 640, + 785, 281, 346, 347, 355, 348, 357, 358, 359, 360, + 388, 362, 794, 364, 675, 366, 264, 265, 266, 508, + 641, 899, 712, 269, 240, 187, 767, 255, 647, 256, + 832, 382, 1373, 903, 1011, 905, 906, 907, 908, 909, + 405, 230, 390, 391, -745, 614, -746, 260, 398, 399, + -747, 934, 935, 401, 977, 978, 979, 980, 552, 844, + 104, 401, 406, 401, 805, 511, -748, 512, 1066, 401, + 280, 280, 402, 240, 768, 815, 148, 553, 290, 258, + 591, 401, 1038, 401, 349, 401, 153, 1067, 1243, 401, + 149, 351, 770, 350, 283, 284, 285, 407, 306, 1362, + 1244, 150, 1245, 1364, 1246, 998, 146, 151, 1287, 214, + 215, 216, 804, 261, -745, 282, -746, -745, 1363, -746, + -747, 152, 1365, -747, 147, 354, 354, 1392, 354, 354, + 354, 354, 255, 354, 256, 354, -748, 354, 155, -748, + 796, 264, 265, 266, 269, 920, 154, 1335, 247, 248, + 249, 250, 251, 354, 252, 253, 254, 346, 347, 817, + 348, 290, 818, 921, 354, 354, 434, 435, 713, 407, + 354, 354, 683, 432, 188, 217, 218, 615, 535, 833, + 156, 1374, 451, 453, 814, 346, 347, 1072, 348, 346, + 347, 845, 348, 986, 184, 878, 286, 728, 264, 897, + 1014, 1082, 900, 252, 253, 254, 1088, 409, 981, 1367, + 1017, 219, 220, 270, 221, 271, 804, 272, 634, 222, + 1092, 223, 475, 982, 983, 626, 401, 627, 1368, 628, + 401, 1007, 1008, 287, 157, 987, 280, 280, 158, 349, + 257, 1233, 10, 568, 11, 1449, 351, 189, 350, 1484, + 401, 449, 280, 280, 449, 449, 468, 1402, 1403, 1404, + 273, 472, 238, 239, 159, 1251, 441, 349, 442, 1485, + 443, 349, 629, 240, 351, 160, 350, 988, 351, 401, + 350, 467, 298, 299, 300, 161, 301, 303, 305, 64, + 317, 309, 1390, 1391, 6, 401, 314, 1490, 1486, 401, + 401, 320, 321, 1392, 323, 326, 327, 1094, 331, 332, + 162, 999, 1004, 444, 1487, 163, 1491, 318, 1502, 1530, + 822, 288, 401, 401, 522, 164, 523, 524, 525, 290, + 165, 527, 1248, 528, 820, 529, 1085, 401, 735, 736, + 274, 1531, 1532, 193, 194, 195, 196, 197, 166, 679, + 231, -90, 630, -90, 275, -90, 1533, 604, 786, 276, + 791, 1, 2, 3, 277, 354, 631, 877, 167, 513, + 675, 632, 982, 983, 1089, 1226, 633, 168, 1086, 1240, + 809, 810, 811, 812, 813, 588, 1413, 319, 448, 450, + 452, 454, 455, 445, 169, 1247, 170, 247, 248, 249, + 250, 251, 1095, 252, 253, 254, -90, 446, -90, 171, + -90, 475, 447, 70, 172, 71, 72, 73, 449, 1349, + 1350, 1351, 449, 449, 449, 449, 449, 1397, 1398, 1399, + 1400, 1401, 173, 1402, 1403, 1404, 449, 982, 983, 1237, + 449, 449, 466, 80, 174, 625, 1255, 1256, 637, 527, + 185, 528, 186, 985, 893, 704, 604, 792, 1253, 263, + 982, 983, 1315, 609, 467, 604, 793, 400, 680, 190, + 303, 309, 910, 911, 6, 191, 493, 397, 82, 83, + 918, 919, 192, 705, 804, 1013, 1314, 1332, 259, 1317, + 268, 1254, 295, 467, 310, 88, 726, 1257, 1258, 6, + 90, 311, 517, 312, 346, 347, 313, 348, 814, 1016, + 1091, 911, 485, 982, 983, 322, 383, 385, 386, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 1006, 433, 392, 407, 439, 469, 437, -264, 476, 1065, + 214, 215, 216, 487, 488, 596, 489, 1015, 502, 599, + 600, 601, 602, 603, 409, 468, 782, 514, 504, 515, + 519, 531, 534, 605, 401, 536, 449, 611, 612, 550, + 537, 1319, 492, 637, 538, 539, 349, 625, 540, 543, + 467, 841, 588, 351, 895, 350, 625, 625, 625, 625, + 625, 625, 409, 181, 541, 542, 544, 545, 546, 503, + 183, 789, 182, 409, 547, 548, 217, 218, 549, 467, + 551, 554, 6, 825, 608, 466, 555, 556, 557, 558, + 559, 1074, 560, 561, 562, 563, 564, 565, 809, 810, + 811, 812, 813, 570, 571, 572, 574, 575, 704, 576, + 577, 579, 219, 220, 466, 221, 580, 1479, 1480, 1481, + 222, 646, 223, 583, 586, 593, 597, 595, -266, 6, + 566, 604, 645, 642, 613, 684, 989, 990, 639, 681, + 685, 717, 625, 686, 994, 687, 995, 581, 582, 475, + 468, 688, 706, 468, 589, 709, 726, 1392, 726, 726, + 726, 726, 726, 729, 754, -265, 756, 757, 240, 787, + 917, 762, 763, 784, 181, 467, 764, 765, 467, 931, + 1410, 183, 766, 182, 797, 806, 816, -355, 819, 823, + 782, 409, 827, 828, 1075, 829, 1417, 1418, 1419, 831, + 725, 834, 843, 679, 873, 879, 835, 1340, 874, 1341, + 1077, 466, 769, 875, 876, 753, 636, 881, 485, 1527, + 882, 898, 896, 904, 675, 901, 1534, 625, 623, 409, + 409, 912, 788, 782, 915, 922, 625, 1228, 1229, 923, + 466, 925, 771, 637, 924, 926, 991, 1063, 933, 992, + 993, 467, 996, 637, 1000, 772, 773, 1001, 1003, 1009, + 1010, 1002, 716, 1025, 804, 814, 1408, -273, 1475, 1019, + 1029, 774, 1022, 1477, 1031, 1068, 741, 1069, 1037, 1482, + 1483, 1397, 1398, 1399, 1400, 1401, 1070, 1402, 1403, 1404, + 1081, 1080, 1015, 704, 249, 250, 251, 911, 252, 253, + 254, 775, 1087, 1090, 776, 1231, 1232, 777, 1234, 467, + 1235, 6, 1236, 1238, 1242, 869, 870, 1250, 1259, 625, + 1260, 1261, 1262, 778, 1272, 625, 625, 625, 625, 625, + 625, 1084, 1478, 1506, 409, 779, 466, 783, 1273, 466, + 1274, 1275, 1276, 726, 1278, 1280, 1277, 1281, 1282, 780, + 637, 636, 473, 468, 1290, 1473, 1283, 1291, 1292, 354, + 354, 1293, 1294, 1295, 1519, 1313, 931, 1249, 1320, 1316, + 790, 1330, 1321, 214, 215, 216, 1325, 1526, 467, 1392, + 799, 800, 801, 802, 803, 1337, 214, 215, 216, 821, + 1323, 753, 477, 478, 479, 70, 753, 71, 72, 73, + 725, 181, 725, 725, 725, 725, 725, 1324, 183, 1353, + 182, 1326, 466, 1336, 836, 837, 838, 839, 1338, 842, + 1504, 1339, 637, 1352, 1355, 80, 753, 753, 1356, 753, + 753, 753, 753, 1357, 1358, 588, 1370, 280, 1359, 217, + 218, 263, 468, 1360, 409, 409, 1366, 1369, 468, 468, + 1371, 1372, 217, 218, 1375, 1406, 1409, 1412, 217, 218, + 82, 83, 1415, 1414, 1433, 892, 1416, 467, 354, 1420, + 466, 1421, 1434, 467, 467, 219, 220, 88, 221, 1435, + 1436, 1437, 90, 222, 1438, 223, 1439, 930, 219, 220, + 1444, 221, 1476, 1448, 482, 220, 222, 221, 223, 1493, + 1474, 1488, 222, 1489, 223, 1399, 1400, 1401, 1492, 1402, + 1403, 1404, 1084, 224, 1494, 323, 1495, 225, 1499, 1497, + 625, 1498, 226, 1505, 1509, 1508, 588, 1510, 1507, 588, + 584, 287, 468, 1511, 1512, 226, 1513, 1514, 1528, 466, + 1515, 283, 284, 285, 718, 1516, 1518, 1529, 719, 1520, + 1005, 636, 1521, 1331, 494, 826, 1227, 467, 1405, 1012, + 507, 636, 1078, 1329, 1296, 1018, 880, 1040, 509, 1354, + 1322, 585, 0, 0, 0, 0, 0, 283, 284, 285, + 616, 753, 1036, 0, 617, 0, 0, 725, 0, 0, + 0, 720, 0, 1041, 1042, 1043, 1044, 1045, 1046, 1047, + 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, + 1058, 1059, 1060, 1061, 0, 1064, 753, 1333, 283, 284, + 285, 742, 0, 0, 0, 743, 0, 618, 466, 0, + 0, 0, 0, 0, 466, 466, 0, 0, 0, 0, + 0, 917, 1073, 286, 0, 0, 0, 0, 0, 799, + 800, 801, 802, 803, 0, 0, 0, 0, 636, 0, + 0, 0, 0, 70, 0, 71, 72, 73, 744, 0, + 0, 721, 229, 0, 930, 262, 0, 0, 680, 286, + 0, 0, 0, 0, 0, 722, 782, 280, 0, 1382, + 723, 0, 0, 80, 0, 267, 0, 0, 468, 0, + 468, 0, 211, 467, 0, 0, 0, 619, 0, 263, + 0, 6, 0, 0, 0, 294, 0, 0, 466, 745, + 286, 620, 0, 467, 0, 467, 621, 0, 82, 83, + 636, 622, 1241, 316, 0, 1429, 1430, 0, 1431, 0, + 1432, 0, 0, 330, 0, 88, 0, 0, 746, 0, + 90, 0, 0, 0, 0, 0, 0, 468, 0, 0, + 588, 0, 747, 0, 0, 0, 931, 748, 0, 0, + 0, 0, 749, 174, 0, 0, 588, 588, 588, 0, + 0, 0, 467, 1470, 1285, 0, 0, 0, 384, 356, + 0, 387, 0, 0, 361, 0, 363, 1312, 365, 0, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 0, 0, 283, 284, 285, + 885, 0, 627, 0, 886, 389, 0, 0, 0, 394, + 395, 396, 0, 0, 0, 403, 404, 236, 237, 238, + 239, 0, 0, 1012, 0, 0, 468, 0, 588, 0, + 240, 0, 0, 588, 0, 0, 782, 782, 782, 588, + 588, 0, 0, 0, 466, 0, 0, 887, 0, 0, + 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 440, 0, 0, 466, 0, 466, 0, 0, 214, + 215, 216, 1522, 1523, 1524, 0, 1525, 0, 0, 484, + 0, 486, 234, 235, 236, 237, 238, 239, 0, 438, + 0, 468, 0, 588, 0, 0, 0, 240, 496, 286, + 497, 498, 499, 500, 0, 753, 0, 0, 1384, 1385, + 1386, 1387, 1388, 1389, 1390, 1391, 467, 0, 0, 510, + 0, 0, 0, 466, 588, 1392, 0, 888, 518, 0, + 0, 521, 0, 0, 0, 217, 218, 588, 782, 533, + 0, 889, 0, 0, 0, 782, 890, 0, 0, 0, + 0, 891, 245, 246, 247, 248, 249, 250, 251, 1328, + 252, 253, 254, 232, 233, 234, 235, 236, 237, 238, + 239, 219, 1264, 1265, 1266, 0, 753, 0, 569, 222, + 240, 223, 573, 1388, 1389, 1390, 1391, 0, 0, 0, + 0, 0, 1267, 0, 0, 229, 1392, 1268, 0, 1312, + 1312, 1312, 1312, 1312, 0, 1312, 567, 0, 0, 0, + 0, 0, 466, 1361, 0, 0, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 0, 252, 253, 254, + 0, 0, 598, 0, 0, 0, 0, 0, 0, 0, + 0, 1501, 0, 1393, 1394, 1395, 1396, 0, 294, 1397, + 1398, 1399, 1400, 1401, 930, 1402, 1403, 1404, 0, 0, + 638, 0, 0, 0, 0, 1376, 1377, 1378, 1379, 1380, + 294, 1383, 0, 0, 0, 0, 0, 466, 294, 1312, + 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, + 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 0, + 252, 253, 254, 0, 734, 0, 592, 214, 215, 216, + 1397, 1398, 1399, 1400, 1401, 755, 1402, 1403, 1404, 0, + 0, 1471, 0, 710, 214, 215, 216, 0, 0, 0, + 727, 0, 0, 1312, 0, 1450, 1451, 1452, 1453, 1454, + 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, + 1465, 1466, 1467, 1468, 0, 70, 0, 71, 72, 73, + 0, 758, 0, 759, 403, 760, 0, 262, 0, 0, + 0, 0, 0, 217, 218, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 80, 1312, 0, 0, 0, + 217, 218, 0, 0, 0, 0, 0, 0, 0, 1500, + 0, 263, 0, 0, 0, 0, 0, 807, 0, 219, + 220, 0, 221, 0, 0, 0, 0, 222, 0, 223, + 82, 83, 0, 0, 0, 294, 219, 220, 0, 221, + 0, 0, 0, 0, 222, 0, 223, 88, 0, 0, + 0, 0, 90, 315, 0, 0, 0, 0, 0, 0, + 0, 291, 1517, 1096, 1097, 1098, 1099, 1100, 1101, 1102, + 1103, 1104, 1105, 1106, 0, 1107, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 1116, 1117, 0, 0, 0, 0, + 0, 884, 840, 1118, 1119, 1120, 1121, 1122, 1123, 1124, + 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, + 1135, 1136, 0, 0, 1137, 1138, 1139, 1140, 1141, 1142, + 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 0, + 1152, 0, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, + 1161, 0, 1162, 1163, 1164, 232, 233, 234, 235, 236, + 237, 238, 239, 1343, 1345, 1347, 0, 0, 0, 0, + 1165, 294, 240, 0, 0, 0, 1166, 1167, 1168, 0, + 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, + 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, + 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, + 1199, 1200, 1201, 0, 0, 0, 1202, 1203, 1204, 1205, + 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, + 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1411, 1223, 1224, + 0, 1422, 0, 1423, 0, 1424, 0, 0, 1425, 1426, + 1427, 0, 0, 0, 0, 0, 0, 0, 1026, 1027, + 1028, 0, 1030, 0, 1033, 1034, 1035, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1079, 0, 0, 0, 0, 0, 0, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 0, 252, 253, 254, 0, 0, 0, 1288, 0, + 0, 0, 0, 0, 0, 214, 215, 216, 0, 734, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, + 1104, 1105, 1106, 0, 1107, 1108, 1109, 1110, 1111, 1112, + 1113, 1114, 1115, 1116, 1117, 0, 0, 0, 0, 0, + 0, 0, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, + 1136, 217, 218, 1137, 1138, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 0, 1152, + 1252, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, + 0, 1162, 1163, 1164, 0, 0, 0, 219, 220, 0, + 221, 0, 0, 0, 0, 222, 0, 223, 0, 1165, + 0, 1279, 0, 0, 0, 1166, 1167, 1168, 1267, 1169, + 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, + 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, + 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, + 1200, 1201, 0, 0, 0, 1202, 1203, 1204, 1205, 1206, + 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, + 1217, 1218, 1219, 1220, 1221, 1222, 0, 1223, 1224, 7, + 8, 9, 10, 0, 11, 12, 13, 198, 68, 0, + 0, 1297, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 214, 215, 216, 232, 233, 234, 235, 236, 237, + 238, 239, 0, 0, 0, 0, 15, 69, 0, 0, + 199, 240, 200, 201, 202, 74, 75, 0, 20, 76, + 0, 0, 203, 22, 0, 0, 78, 0, 480, 0, + 481, 23, 24, 204, 0, 0, 0, 26, 0, 0, + 205, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 206, 217, 218, 0, + 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, + 0, 0, 0, 47, 0, 207, 208, 50, 0, 0, + 51, 84, 214, 215, 216, 52, 0, 0, 53, 85, + 86, 87, 209, 219, 220, 89, 221, 210, 0, 0, + 0, 222, 0, 223, 0, 0, 0, 0, 0, 0, + 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, + 61, 62, 0, 0, 63, 0, 0, 1348, 0, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 0, 252, 253, 254, 0, 0, 0, 1503, 217, 218, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 8, 9, 10, 0, 11, 12, 13, + 490, 0, 0, 0, 0, 0, 0, 0, 0, 329, + 0, 0, 0, 0, 219, 220, 0, 221, 0, 0, + 0, 0, 222, 0, 223, 0, 0, 0, 0, 0, + 1381, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 335, 0, 0, 199, 0, 200, 201, 202, 74, 0, + 0, 20, 336, 0, 0, 203, 22, 0, 0, 78, + 0, 0, 0, 0, 23, 24, 204, 0, 0, 0, + 26, 0, 0, 205, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 206, + 1440, 1441, 1442, 1443, 0, 1446, 1447, 44, 0, 45, + 0, 46, 0, 0, 0, 0, 47, 0, 207, 208, + 50, 0, 0, 51, 84, 0, 0, 0, 52, 0, + 0, 53, 338, 339, 87, 209, 0, 0, 89, 0, + 210, 0, 0, 0, 1496, 0, 0, 0, 0, 0, + 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, + 0, 60, 0, 61, 62, 0, 0, 63, 7, 8, + 9, 10, 0, 11, 12, 13, 14, 0, 214, 215, + 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, + 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 240, 0, 0, 16, + 0, 17, 18, 19, 0, 0, 0, 20, 0, 738, + 739, 21, 22, 0, 0, 0, 0, 0, 0, 0, + 23, 24, 25, 0, 217, 218, 26, 0, 0, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, + 219, 220, 47, 221, 48, 49, 50, 0, 222, 51, + 223, 0, 0, 0, 52, 0, 0, 53, 0, 0, + 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, + 14, 740, 0, 0, 495, 0, 0, 0, 0, 56, + 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, + 62, 0, 590, 63, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 15, + 0, 0, 0, 16, 0, 17, 18, 19, 0, 0, + 0, 20, 0, 0, 0, 21, 22, 477, 478, 479, + 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, + 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 0, 0, 0, 0, 480, 0, 481, 44, 0, 45, + 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, + 50, 0, 0, 51, 0, 0, 0, 0, 52, 0, + 0, 53, 0, 217, 218, 54, 7, 8, 9, 10, + 55, 11, 12, 13, 14, 0, 214, 215, 216, 0, + 0, 883, 0, 56, 0, 0, 57, 58, 59, 0, + 0, 60, 0, 61, 62, 431, 0, 63, 0, 482, + 220, 0, 221, 0, 0, 0, 0, 222, 0, 223, + 0, 0, 0, 15, 436, 0, 0, 16, 0, 17, + 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, + 22, 0, 0, 483, 0, 0, 0, 0, 23, 24, + 25, 0, 217, 218, 26, 0, 0, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, + 0, 44, 0, 45, 0, 46, 0, 0, 219, 220, + 47, 221, 48, 49, 50, 0, 222, 51, 223, 0, + 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, + 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, + 214, 215, 216, 0, 0, 0, 0, 56, 0, 0, + 57, 58, 59, 0, 0, 60, 0, 61, 62, 0, + 0, 63, 0, 0, 0, 232, 233, 234, 235, 236, + 237, 238, 239, 0, 0, 0, 0, 15, 715, 0, + 0, 16, 240, 17, 18, 19, 0, 0, 0, 20, + 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, + 0, 0, 23, 24, 25, 0, 217, 218, 26, 0, + 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, + 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, + 0, 0, 219, 220, 47, 221, 48, 49, 50, 0, + 222, 51, 223, 0, 0, 0, 52, 0, 0, 53, + 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, + 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, + 0, 61, 62, 0, 0, 63, 0, 932, 0, 0, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 15, 252, 253, 254, 16, 0, 17, 18, 19, + 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, + 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, + 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, + 0, 45, 0, 46, 0, 0, 0, 0, 47, 0, + 48, 49, 50, 0, 0, 51, 0, 0, 0, 0, + 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, + 9, 10, 55, 11, 12, 13, 14, 927, 0, 0, + 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, + 59, 0, 0, 60, 0, 61, 62, 0, 0, 63, + 0, 0, 0, 232, 233, 234, 235, 236, 237, 238, + 239, 0, 0, 0, 0, 15, 0, 0, 0, 16, + 240, 17, 18, 19, 0, 0, 0, 20, 0, 0, + 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, + 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, + 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, + 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, + 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 56, + 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, + 62, 1062, 0, 63, 1263, 0, 0, 0, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 15, + 252, 253, 254, 16, 0, 17, 18, 19, 0, 0, + 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, + 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, + 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, + 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, + 50, 0, 0, 51, 0, 0, 0, 0, 52, 0, + 0, 53, 0, 0, 0, 54, 7, 8, 9, 10, + 55, 11, 12, 13, 14, 1327, 0, 0, 0, 0, + 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, + 0, 60, 0, 61, 62, 0, 0, 63, 0, 0, + 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, + 0, 0, 0, 15, 0, 0, 0, 16, 240, 17, + 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, + 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, + 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, + 0, 44, 0, 45, 0, 46, 0, 0, 0, 0, + 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, + 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, + 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, + 57, 58, 59, 0, 0, 60, 0, 61, 62, 1469, + 0, 63, 0, 0, 1286, 0, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 15, 252, 253, + 254, 16, 0, 17, 18, 19, 0, 0, 0, 20, + 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, + 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, + 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, + 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, + 0, 0, 0, 0, 47, 0, 48, 49, 50, 0, + 0, 51, 0, 0, 0, 0, 52, 0, 0, 53, + 0, 0, 0, 54, 648, 649, 650, 10, 55, 11, + 651, 652, 67, 68, 0, 0, 653, 0, 0, 0, + 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, + 0, 61, 62, 0, 0, 63, 232, 233, 234, 235, + 236, 237, 238, 239, 0, 0, 0, 0, 458, 0, + 0, 654, 69, 240, 0, 70, 0, 71, 72, 73, + 74, 459, 0, 655, 76, 0, 0, 77, 656, 0, + 0, 78, 0, 0, 0, 0, 657, 658, 79, 0, + 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, + 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, + 0, 81, 0, 0, 0, 0, 0, 0, 240, 659, + 0, 660, 0, 661, 0, 0, 0, 460, 662, 0, + 82, 83, 663, 0, 0, 664, 84, 0, 0, 0, + 665, 0, 0, 666, 85, 86, 87, 88, 0, 0, + 89, 0, 90, 0, 648, 649, 650, 10, 0, 11, + 651, 652, 67, 68, 0, 667, 1039, 0, 668, 669, + 0, 0, 0, 670, 0, 671, 0, 691, 0, 672, + 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 0, 252, 253, 254, 692, 0, 458, 0, + 0, 654, 69, 0, 0, 70, 0, 71, 72, 73, + 74, 459, 0, 655, 76, 0, 0, 77, 656, 0, + 0, 78, 0, 0, 0, 0, 657, 658, 79, 0, + 0, 0, 0, 0, 0, 80, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, + 254, 81, 0, 0, 0, 0, 0, 0, 0, 659, + 0, 660, 0, 661, 0, 0, 0, 460, 662, 0, + 82, 83, 663, 0, 0, 664, 84, 0, 0, 0, + 665, 0, 0, 666, 85, 86, 87, 88, 0, 0, + 89, 0, 90, 7, 8, 9, 10, 0, 11, 12, + 13, 0, 0, 0, 0, 667, 0, 0, 668, 669, + 0, 0, 0, 670, 0, 671, 0, 0, 0, 672, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, + 1387, 1388, 1389, 1390, 1391, 0, 0, 0, 0, 0, + 1298, 0, 0, 0, 1392, 0, 0, 0, 0, 0, + 0, 0, 1299, 0, 0, 0, 0, 1300, 233, 234, + 235, 236, 237, 238, 239, 23, 24, 0, 0, 0, + 0, 26, 0, 0, 240, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, + 45, 0, 46, 0, 0, 0, 0, 1301, 240, 0, + 0, 1302, 0, 0, 1303, 0, 0, 0, 0, 52, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1304, 0, 0, 1305, 1306, 1307, + 936, 0, 1308, 0, 1309, 62, 0, 0, 1310, 0, + 937, 938, 939, 940, 941, 942, 943, 944, 1397, 1398, + 1399, 1400, 1401, 0, 1402, 1403, 1404, 945, 0, 946, + 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, + 957, 0, 0, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 0, 252, 253, 254, 0, 0, 958, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 0, 0, 0, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, + 254, 578, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, + 0, 0, 959, 0, 0, 0, 0, 0, 0, 1392, + 0, 0, 335, 0, 0, 70, 0, 71, 72, 73, + 74, 0, 0, 0, 336, 0, 0, 77, 0, 0, + 0, 78, 0, 0, 0, 0, 0, 0, 79, 0, + 0, 960, 0, 0, 961, 80, 962, 963, 964, 965, + 966, 967, 968, 969, 970, 971, 972, 0, 973, 974, + 0, 81, 975, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 337, 0, 0, 0, 0, 0, 0, 0, + 82, 83, 0, 0, 0, 0, 84, 0, 0, 0, + 0, 0, 0, 0, 338, 339, 87, 88, 0, 0, + 89, 0, 90, 0, 0, 335, 0, 340, 70, 0, + 71, 72, 73, 74, 0, 0, 0, 336, 0, 0, + 77, 0, 0, 341, 78, 0, 769, 1393, 1394, 1395, + 1396, 79, 0, 1397, 1398, 1399, 1400, 1401, 80, 1402, + 1403, 1404, 770, 0, 0, 0, 0, 0, 0, 0, + 505, 506, 0, 0, 81, 0, 771, 0, 0, 0, + 0, 0, 0, 0, 0, 337, 0, 0, 0, 772, + 773, 0, 0, 82, 83, 0, 0, 0, 0, 84, + 0, 0, 0, 0, 0, 774, 0, 338, 339, 87, + 88, 335, 0, 89, 70, 90, 71, 72, 73, 74, + 0, 0, 0, 336, 0, 0, 77, 0, 0, 0, + 78, 0, 0, 0, 0, 775, 341, 79, 776, 0, + 0, 777, 0, 0, 80, 232, 233, 234, 235, 236, + 237, 238, 239, 0, 0, 0, 0, 778, 0, 0, + 81, 0, 240, 0, 0, 0, 0, 0, 0, 779, + 0, 337, 0, 0, 0, 0, 0, 0, 0, 82, + 83, 0, 0, 780, 0, 84, 0, 0, 0, 0, + 0, 0, 0, 338, 339, 87, 88, 0, 0, 89, + 0, 90, 232, 233, 234, 235, 236, 237, 238, 239, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, + 0, 0, 341, 232, 233, 234, 235, 236, 237, 238, + 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 232, 233, 234, 235, 236, 237, 238, 239, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 240, 232, + 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 0, 252, 253, 254, 594, 232, 233, 234, 235, + 236, 237, 238, 239, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 846, 847, 848, 849, 850, 851, + 852, 853, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 854, 0, 0, 0, 0, 0, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 0, 252, + 253, 254, 682, 0, 0, 0, 0, 0, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 0, + 252, 253, 254, 761, 0, 0, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, + 254, 902, 0, 0, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 1020, + 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 0, 252, 253, 254, 1284, 0, 0, 855, + 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, + 0, 866, 867, 868, 105, 0, 106, 0, 0, 107, + 108, 0, 0, 0, 0, 0, 0, 109, 110, 0, + 0, 0, 0, 0, 0, 0, 111, 0, 112, 113, + 114, 115, 0, 0, 0, 116, 0, 0, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, + 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, + 129, 67, 68, 130, 131, 456, 0, 457, 132, 0, + 0, 0, 0, 0, 133, 134, 0, 135, 1385, 1386, + 1387, 1388, 1389, 1390, 1391, 136, 0, 0, 0, 0, + 0, 0, 0, 0, 1392, 0, 0, 458, 0, 0, + 0, 69, 0, 0, 70, 0, 71, 72, 73, 74, + 459, 0, 0, 76, 0, 0, 77, 0, 0, 0, + 78, 234, 235, 236, 237, 238, 239, 79, 0, 0, + 0, 0, 0, 0, 80, 0, 240, 234, 235, 236, + 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, + 81, 0, 240, 1386, 1387, 1388, 1389, 1390, 1391, 0, + 0, 0, 0, 0, 0, 0, 460, 0, 1392, 82, + 83, 0, 0, 0, 0, 84, 0, 234, 235, 236, + 237, 238, 239, 85, 86, 87, 88, 0, 0, 89, + 0, 90, 240, 1386, 1387, 1388, 1389, 1390, 1391, 0, + 0, 0, 0, 0, 461, 0, 0, 0, 1392, 462, + 0, 0, 0, 1394, 1395, 1396, 0, 0, 1397, 1398, + 1399, 1400, 1401, 0, 1402, 1403, 1404, 1386, 1387, 1388, + 1389, 1390, 1391, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1392, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 0, + 0, 0, 0, 244, 245, 246, 247, 248, 249, 250, + 251, 0, 252, 253, 254, 0, 0, 1394, 1395, 1396, + 0, 0, 1397, 1398, 1399, 1400, 1401, 0, 1402, 1403, + 1404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 302, 0, 0, 0, 245, 246, 247, 248, 249, 250, + 251, 0, 252, 253, 254, 0, 0, 0, 1395, 1396, + 0, 0, 1397, 1398, 1399, 1400, 1401, 302, 1402, 1403, + 1404, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 105, 0, 106, 0, 0, 0, 108, 0, 0, + 0, 0, 0, 1396, 109, 110, 1397, 1398, 1399, 1400, + 1401, 0, 1402, 1403, 1404, 112, 113, 114, 105, 0, + 106, 0, 0, 0, 108, 0, 0, 297, 0, 0, + 0, 109, 110, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 112, 296, 114, 0, 0, 0, 0, 70, + 122, 71, 72, 73, 297, 0, 0, 0, 0, 0, + 127, 0, 0, 0, 0, 0, 128, 0, 0, 0, + 130, 131, 393, 67, 68, 0, 0, 122, 0, 80, + 0, 0, 134, 0, 135, 0, 0, 127, 0, 0, + 0, 0, 0, 128, 0, 263, 0, 0, 131, 0, + 0, 1032, 67, 68, 0, 0, 0, 0, 0, 134, + 0, 135, 0, 69, 82, 83, 70, 0, 71, 72, + 73, 74, 75, 0, 0, 76, 0, 0, 77, 0, + 0, 88, 78, 0, 0, 0, 90, 0, 0, 79, + 0, 0, 69, 0, 0, 70, 80, 71, 72, 73, + 74, 75, 0, 0, 76, 0, 0, 77, 0, 185, + 0, 78, 81, 0, 0, 0, 0, 0, 79, 70, + 0, 71, 72, 73, 0, 80, 0, 0, 0, 0, + 0, 82, 83, 0, 0, 0, 0, 84, 0, 0, + 0, 81, 1445, 67, 68, 85, 86, 87, 88, 80, + 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, + 82, 83, 0, 0, 0, 263, 84, 0, 0, 0, + 0, 693, 694, 695, 85, 86, 87, 88, 0, 0, + 89, 0, 90, 69, 82, 83, 70, 0, 71, 72, + 73, 74, 75, 0, 0, 76, 0, 0, 77, 0, + 0, 88, 78, 0, 0, 0, 90, 0, 0, 79, + 0, 0, 0, 0, 0, 70, 80, 71, 72, 73, + 696, 697, 0, 0, 0, 0, 0, 77, 0, 186, + 0, 0, 81, 0, 0, 0, 0, 0, 79, 693, + 694, 695, 0, 0, 0, 80, 0, 0, 0, 0, + 0, 82, 83, 0, 0, 0, 0, 84, 0, 0, + 0, 81, 0, 0, 0, 85, 86, 87, 88, 0, + 0, 89, 0, 90, 0, 0, 0, 0, 67, 68, + 82, 83, 456, 70, 0, 71, 72, 73, 0, 0, + 0, 0, 0, 0, 698, 77, 0, 88, 0, 0, + 89, 0, 90, 0, 0, 0, 79, 67, 68, 0, + 0, 795, 0, 80, 458, 0, 0, 0, 69, 0, + 0, 70, 0, 71, 72, 73, 74, 459, 0, 81, + 76, 0, 0, 77, 0, 0, 0, 78, 0, 0, + 0, 0, 0, 458, 79, 0, 0, 69, 82, 83, + 70, 80, 71, 72, 73, 74, 459, 0, 0, 76, + 0, 0, 77, 0, 0, 88, 78, 81, 89, 0, + 90, 0, 0, 79, 70, 0, 71, 72, 73, 0, + 80, 0, 0, 460, 0, 0, 82, 83, 0, 0, + 0, 0, 84, 0, 0, 0, 81, 0, 67, 68, + 85, 86, 87, 88, 80, 0, 89, 0, 90, 0, + 0, 0, 460, 0, 0, 82, 83, 0, 0, 0, + 263, 84, 0, 0, 0, 0, 0, 67, 68, 85, + 86, 87, 88, 0, 458, 89, 0, 90, 69, 82, + 83, 70, 0, 71, 72, 73, 74, 459, 0, 0, + 76, 0, 0, 77, 0, 0, 88, 78, 0, 0, + 0, 90, 0, 0, 79, 0, 0, 69, 0, 0, + 70, 80, 71, 72, 73, 74, 75, 0, 0, 76, + 0, 0, 77, 0, 191, 0, 78, 81, 0, 0, + 0, 0, 0, 79, 0, 0, 214, 215, 216, 0, + 80, 0, 0, 460, 0, 0, 82, 83, 0, 0, + 0, 0, 84, 67, 68, 0, 81, 0, 0, 0, + 85, 86, 87, 88, 0, 0, 89, 0, 90, 0, + 0, 0, 0, 0, 0, 82, 83, 67, 68, 0, + 0, 84, 0, 0, 0, 0, 0, 0, 0, 85, + 86, 87, 88, 69, 0, 89, 70, 90, 71, 72, + 73, 74, 217, 218, 0, 76, 0, 0, 77, 0, + 0, 0, 78, 0, 0, 0, 0, 69, 0, 79, + 70, 0, 71, 72, 73, 74, 80, 0, 0, 76, + 0, 0, 77, 0, 0, 0, 78, 0, 219, 220, + 0, 221, 81, 79, 0, 0, 222, 0, 223, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 607, 1267, + 0, 82, 83, 67, 1342, 0, 81, 84, 0, 0, + 0, 0, 0, 0, 0, 85, 86, 87, 88, 0, + 0, 89, 0, 90, 0, 82, 83, 0, 0, 0, + 0, 84, 175, 0, 0, 0, 0, 0, 0, 85, + 86, 87, 88, 69, 0, 89, 70, 90, 71, 72, + 73, 74, 516, 0, 0, 76, 0, 0, 77, 0, + 0, 0, 78, 0, 0, 0, 0, 0, 0, 79, + 0, 0, 176, 0, 0, 70, 80, 71, 72, 73, + 74, 997, 0, 0, 177, 0, 0, 77, 0, 0, + 0, 78, 81, 0, 0, 0, 0, 0, 79, 0, + 0, 214, 215, 216, 0, 80, 0, 0, 0, 0, + 0, 82, 83, 0, 0, 0, 0, 84, 175, 0, + 0, 81, 0, 0, 0, 85, 86, 87, 88, 0, + 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, + 82, 83, 67, 0, 0, 0, 84, 0, 0, 0, + 214, 215, 216, 0, 178, 179, 87, 88, 176, 0, + 89, 70, 90, 71, 72, 73, 74, 217, 218, 0, + 177, 0, 0, 77, 0, 0, 0, 78, 0, 0, + 0, 0, 69, 0, 79, 70, 0, 71, 72, 73, + 74, 80, 0, 0, 76, 0, 0, 77, 0, 0, + 0, 78, 0, 219, 220, 0, 221, 81, 79, 0, + 0, 222, 0, 223, 0, 80, 217, 218, 0, 0, + 0, 0, 0, 0, 1267, 0, 82, 83, 0, 1344, + 0, 81, 84, 0, 0, 0, 0, 0, 0, 0, + 178, 179, 87, 88, 0, 0, 89, 0, 90, 0, + 82, 83, 219, 220, 0, 221, 84, 0, 0, 0, + 222, 0, 223, 0, 85, 86, 87, 88, 0, 105, + 89, 106, 90, 1267, 107, 108, 0, 0, 1346, 0, + 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, + 0, 111, 0, 112, 113, 114, 115, 0, 0, 0, + 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, + 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, + 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, + 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, + 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 689, + 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, + 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, + 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, + 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, + 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 871, 0, 0, 0, 0, 0, 0, 118, 119, + 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, + 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, + 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, + 0, 0, 0, 133, 134, 0, 135, 111, 0, 112, + 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, + 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 913, 0, 0, 0, 0, 0, 0, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, + 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, + 109, 110, 0, 0, 0, 133, 134, 0, 135, 111, + 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, + 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1021, 0, 0, 0, 0, + 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, + 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, + 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, + 0, 132, 109, 110, 0, 0, 0, 133, 134, 0, + 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, + 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1071, 0, 0, + 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, + 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, + 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, + 134, 0, 135, 111, 0, 112, 113, 114, 115, 105, + 136, 106, 116, 0, 0, 108, 0, 117, 0, 0, + 0, 0, 109, 110, 0, 0, 0, 0, 0, 1289, + 0, 0, 0, 112, 296, 114, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 297, 0, 124, 125, 126, + 127, 0, 0, 0, 0, 0, 128, 129, 0, 0, + 130, 131, 0, 0, 0, 132, 0, 0, 122, 0, + 0, 133, 134, 0, 135, 0, 0, 0, 127, 0, + 0, 0, 136, 0, 128, 0, 0, 0, 0, 131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, + 134, 1428, 135, 0, 0, 105, 0, 106, 0, 0, + 107, 108, 0, 0, 0, 0, 0, -147, 109, 110, + 0, 0, 0, 0, 0, 0, 0, 111, 0, 112, + 113, 114, 115, 105, 0, 106, 116, 0, 0, 108, + 0, 117, 0, 0, 0, 0, 109, 110, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 297, + 0, 124, 125, 126, 127, 0, 0, 0, 0, 0, + 128, 129, 0, 0, 130, 131, 0, 0, 0, 132, + 0, 105, 122, 106, 0, 133, 134, 108, 135, 0, + 0, 0, 127, 0, 109, 110, 0, 0, 128, 0, + 0, 0, 130, 131, 0, 112, 296, 114, 0, 105, + 0, 106, 0, 133, 134, 108, 135, 297, 0, 0, + 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 112, 296, 114, 0, 0, 0, 0, + 122, 308, 0, 0, 0, 297, 0, 0, 0, 0, + 127, 0, 0, 0, 0, 0, 128, 0, 0, 0, + 0, 131, 0, 0, 0, 0, 0, 0, 122, 0, + 0, 0, 134, 0, 135, 0, 0, 0, 127, 0, + 0, 0, 0, 0, 128, 0, 0, 0, 0, 131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 134, 0, 135 +}; + +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-922))) + +#define yytable_value_is_error(Yytable_value) \ + YYID (0) + +static const yytype_int16 yycheck[] = +{ + 1, 61, 113, 130, 527, 460, 927, 295, 44, 708, + 507, 751, 315, 489, 659, 44, 15, 44, 458, 476, + 604, 92, 140, 140, 147, 140, 149, 150, 151, 152, + 182, 154, 613, 156, 489, 158, 81, 82, 83, 327, + 480, 713, 13, 88, 33, 15, 585, 6, 488, 8, + 15, 174, 15, 717, 794, 719, 720, 721, 722, 723, + 147, 62, 185, 186, 76, 15, 76, 59, 191, 192, + 76, 743, 744, 147, 746, 747, 748, 749, 147, 15, + 0, 147, 169, 147, 623, 148, 76, 150, 147, 147, + 91, 92, 166, 33, 586, 634, 164, 166, 99, 75, + 166, 147, 166, 147, 140, 147, 155, 166, 166, 147, + 164, 140, 33, 140, 10, 11, 12, 150, 149, 147, + 166, 164, 166, 147, 166, 770, 146, 164, 166, 10, + 11, 12, 165, 125, 146, 146, 146, 149, 166, 149, + 146, 164, 166, 149, 164, 146, 147, 33, 149, 150, + 151, 152, 6, 154, 8, 156, 146, 158, 155, 149, + 615, 206, 207, 208, 209, 146, 164, 166, 157, 158, + 159, 160, 161, 174, 163, 164, 165, 295, 295, 147, + 295, 182, 150, 164, 185, 186, 257, 258, 159, 150, + 191, 192, 495, 253, 164, 76, 77, 147, 350, 164, + 164, 164, 273, 274, 165, 323, 323, 166, 323, 327, + 327, 147, 327, 752, 155, 691, 112, 520, 263, 711, + 804, 150, 714, 163, 164, 165, 898, 228, 149, 147, + 814, 112, 113, 13, 115, 15, 165, 17, 467, 120, + 904, 122, 287, 164, 165, 13, 147, 15, 166, 17, + 147, 790, 791, 149, 164, 752, 257, 258, 164, 295, + 75, 933, 6, 386, 8, 166, 295, 155, 295, 166, + 147, 272, 273, 274, 275, 276, 277, 163, 164, 165, + 60, 282, 22, 23, 164, 166, 13, 323, 15, 166, + 17, 327, 60, 33, 323, 164, 323, 754, 327, 147, + 327, 277, 108, 109, 110, 164, 112, 113, 114, 2, + 149, 117, 22, 23, 315, 147, 122, 147, 166, 147, + 147, 127, 128, 33, 130, 131, 132, 911, 134, 135, + 164, 771, 787, 60, 166, 164, 166, 149, 166, 166, + 643, 98, 147, 147, 146, 164, 148, 149, 150, 350, + 164, 146, 997, 148, 642, 150, 895, 147, 64, 65, + 140, 166, 166, 56, 57, 58, 59, 60, 164, 845, + 63, 146, 140, 148, 154, 150, 166, 165, 166, 159, + 609, 143, 144, 145, 164, 386, 154, 690, 164, 164, + 845, 159, 164, 165, 166, 918, 164, 164, 895, 983, + 629, 630, 631, 632, 633, 406, 1327, 149, 272, 273, + 274, 275, 276, 140, 164, 996, 164, 157, 158, 159, + 160, 161, 914, 163, 164, 165, 146, 154, 148, 164, + 150, 476, 159, 54, 164, 56, 57, 58, 439, 113, + 114, 115, 443, 444, 445, 446, 447, 157, 158, 159, + 160, 161, 164, 163, 164, 165, 457, 164, 165, 166, + 461, 462, 277, 84, 164, 466, 1005, 1006, 469, 146, + 164, 148, 164, 150, 703, 504, 165, 166, 1001, 100, + 164, 165, 166, 459, 460, 165, 166, 166, 489, 164, + 296, 297, 164, 165, 495, 164, 302, 190, 119, 120, + 146, 147, 164, 504, 165, 166, 1087, 1247, 164, 1090, + 164, 1003, 164, 489, 164, 136, 517, 1009, 1010, 520, + 141, 164, 337, 164, 642, 642, 164, 642, 165, 166, + 164, 165, 289, 164, 165, 164, 164, 164, 164, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 789, 254, 164, 150, 159, 165, 259, 165, 149, 872, + 10, 11, 12, 48, 147, 439, 164, 806, 146, 443, + 444, 445, 446, 447, 585, 586, 587, 164, 155, 164, + 164, 148, 349, 457, 147, 167, 597, 461, 462, 147, + 166, 1093, 295, 604, 166, 166, 642, 608, 166, 156, + 586, 671, 613, 642, 1313, 642, 617, 618, 619, 620, + 621, 622, 623, 659, 166, 166, 166, 156, 166, 322, + 659, 607, 659, 634, 166, 166, 76, 77, 166, 615, + 166, 147, 643, 644, 459, 460, 166, 166, 166, 166, + 166, 880, 166, 166, 166, 166, 166, 166, 887, 888, + 889, 890, 891, 156, 166, 166, 166, 166, 697, 156, + 166, 166, 112, 113, 489, 115, 166, 1417, 1418, 1419, + 120, 487, 122, 15, 164, 166, 159, 166, 165, 690, + 383, 165, 149, 164, 166, 146, 756, 757, 167, 166, + 147, 516, 703, 147, 764, 147, 766, 400, 401, 754, + 711, 147, 164, 714, 407, 148, 717, 33, 719, 720, + 721, 722, 723, 164, 149, 165, 164, 164, 33, 48, + 731, 166, 166, 597, 770, 711, 164, 166, 714, 740, + 1321, 770, 164, 770, 159, 159, 169, 146, 48, 76, + 751, 752, 164, 155, 881, 155, 1337, 1338, 1339, 155, + 517, 155, 166, 1239, 10, 148, 164, 1259, 10, 1261, + 881, 586, 17, 10, 10, 532, 469, 156, 535, 1519, + 147, 159, 148, 159, 1239, 166, 1526, 788, 466, 790, + 791, 166, 607, 794, 167, 148, 797, 920, 921, 148, + 615, 148, 47, 804, 167, 148, 166, 867, 159, 166, + 166, 787, 166, 814, 164, 60, 61, 146, 164, 164, + 164, 169, 515, 824, 165, 165, 1318, 165, 1409, 166, + 164, 76, 149, 1414, 164, 147, 529, 147, 166, 1420, + 1421, 157, 158, 159, 160, 161, 147, 163, 164, 165, + 159, 150, 1081, 882, 159, 160, 161, 165, 163, 164, + 165, 106, 166, 166, 109, 167, 147, 112, 10, 845, + 166, 872, 169, 4, 147, 681, 682, 48, 164, 880, + 169, 164, 169, 128, 146, 886, 887, 888, 889, 890, + 891, 892, 1415, 1474, 895, 140, 711, 590, 147, 714, + 166, 156, 156, 904, 156, 166, 1029, 166, 156, 154, + 911, 604, 11, 914, 10, 1407, 166, 148, 10, 920, + 921, 10, 10, 148, 1505, 147, 927, 998, 169, 164, + 608, 169, 166, 10, 11, 12, 166, 1518, 914, 33, + 618, 619, 620, 621, 622, 166, 10, 11, 12, 642, + 167, 708, 10, 11, 12, 54, 713, 56, 57, 58, + 717, 997, 719, 720, 721, 722, 723, 167, 997, 1272, + 997, 167, 787, 167, 667, 668, 669, 670, 166, 672, + 1472, 166, 983, 15, 164, 84, 743, 744, 164, 746, + 747, 748, 749, 166, 164, 996, 155, 998, 166, 76, + 77, 100, 1003, 164, 1005, 1006, 166, 164, 1009, 1010, + 155, 155, 76, 77, 155, 164, 166, 15, 76, 77, + 119, 120, 146, 166, 10, 703, 166, 1003, 1029, 166, + 845, 166, 148, 1009, 1010, 112, 113, 136, 115, 10, + 148, 148, 141, 120, 10, 122, 148, 740, 112, 113, + 164, 115, 167, 166, 112, 113, 120, 115, 122, 156, + 166, 166, 120, 147, 122, 159, 160, 161, 166, 163, + 164, 165, 1073, 150, 156, 881, 156, 154, 156, 166, + 1081, 166, 159, 166, 10, 148, 1087, 10, 167, 1090, + 154, 149, 1093, 148, 164, 159, 164, 164, 148, 914, + 166, 10, 11, 12, 13, 164, 166, 148, 17, 166, + 788, 804, 166, 1242, 307, 645, 919, 1093, 1313, 797, + 327, 814, 882, 1239, 1073, 818, 697, 845, 327, 1273, + 1202, 405, -1, -1, -1, -1, -1, 10, 11, 12, + 13, 898, 835, -1, 17, -1, -1, 904, -1, -1, + -1, 60, -1, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, + 863, 864, 865, 866, -1, 868, 933, 1248, 10, 11, + 12, 13, -1, -1, -1, 17, -1, 60, 1003, -1, + -1, -1, -1, -1, 1009, 1010, -1, -1, -1, -1, + -1, 1202, 880, 112, -1, -1, -1, -1, -1, 887, + 888, 889, 890, 891, -1, -1, -1, -1, 911, -1, + -1, -1, -1, 54, -1, 56, 57, 58, 60, -1, + -1, 140, 62, -1, 927, 66, -1, -1, 1239, 112, + -1, -1, -1, -1, -1, 154, 1247, 1248, -1, 1309, + 159, -1, -1, 84, -1, 85, -1, -1, 1259, -1, + 1261, -1, 61, 1239, -1, -1, -1, 140, -1, 100, + -1, 1272, -1, -1, -1, 105, -1, -1, 1093, 111, + 112, 154, -1, 1259, -1, 1261, 159, -1, 119, 120, + 983, 164, 985, 123, -1, 1355, 1356, -1, 1358, -1, + 1360, -1, -1, 133, -1, 136, -1, -1, 140, -1, + 141, -1, -1, -1, -1, -1, -1, 1318, -1, -1, + 1321, -1, 154, -1, -1, -1, 1327, 159, -1, -1, + -1, -1, 164, 164, -1, -1, 1337, 1338, 1339, -1, + -1, -1, 1318, 1403, 1037, -1, -1, -1, 178, 148, + -1, 181, -1, -1, 153, -1, 155, 1082, 157, -1, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, -1, -1, 10, 11, 12, + 13, -1, 15, -1, 17, 184, -1, -1, -1, 188, + 189, 190, -1, -1, -1, 225, 226, 20, 21, 22, + 23, -1, -1, 1081, -1, -1, 1407, -1, 1409, -1, + 33, -1, -1, 1414, -1, -1, 1417, 1418, 1419, 1420, + 1421, -1, -1, -1, 1239, -1, -1, 60, -1, -1, + -1, 1407, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 271, -1, -1, 1259, -1, 1261, -1, -1, 10, + 11, 12, 1512, 1513, 1514, -1, 1516, -1, -1, 289, + -1, 291, 18, 19, 20, 21, 22, 23, -1, 268, + -1, 1472, -1, 1474, -1, -1, -1, 33, 308, 112, + 310, 311, 312, 313, -1, 1242, -1, -1, 16, 17, + 18, 19, 20, 21, 22, 23, 1472, -1, -1, 329, + -1, -1, -1, 1318, 1505, 33, -1, 140, 338, -1, + -1, 341, -1, -1, -1, 76, 77, 1518, 1519, 349, + -1, 154, -1, -1, -1, 1526, 159, -1, -1, -1, + -1, 164, 155, 156, 157, 158, 159, 160, 161, 1232, + 163, 164, 165, 16, 17, 18, 19, 20, 21, 22, + 23, 112, 113, 114, 115, -1, 1313, -1, 388, 120, + 33, 122, 392, 20, 21, 22, 23, -1, -1, -1, + -1, -1, 133, -1, -1, 405, 33, 138, -1, 1304, + 1305, 1306, 1307, 1308, -1, 1310, 385, -1, -1, -1, + -1, -1, 1407, 1286, -1, -1, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, + -1, -1, 442, -1, -1, -1, -1, -1, -1, -1, + -1, 149, -1, 151, 152, 153, 154, -1, 458, 157, + 158, 159, 160, 161, 1327, 163, 164, 165, -1, -1, + 470, -1, -1, -1, -1, 1304, 1305, 1306, 1307, 1308, + 480, 1310, -1, -1, -1, -1, -1, 1472, 488, 1384, + 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, + 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, 164, 165, -1, 524, -1, 169, 10, 11, 12, + 157, 158, 159, 160, 161, 535, 163, 164, 165, -1, + -1, 1404, -1, 512, 10, 11, 12, -1, -1, -1, + 519, -1, -1, 1448, -1, 1384, 1385, 1386, 1387, 1388, + 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, + 1399, 1400, 1401, 1402, -1, 54, -1, 56, 57, 58, + -1, 550, -1, 552, 584, 554, -1, 66, -1, -1, + -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 84, 1501, -1, -1, -1, + 76, 77, -1, -1, -1, -1, -1, -1, -1, 1448, + -1, 100, -1, -1, -1, -1, -1, 627, -1, 112, + 113, -1, 115, -1, -1, -1, -1, 120, -1, 122, + 119, 120, -1, -1, -1, 645, 112, 113, -1, 115, + -1, -1, -1, -1, 120, -1, 122, 136, -1, -1, + -1, -1, 141, 146, -1, -1, -1, -1, -1, -1, + -1, 137, 1501, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, -1, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, + -1, 701, 671, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, -1, -1, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, + 70, -1, 72, 73, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 16, 17, 18, 19, 20, + 21, 22, 23, 1264, 1265, 1266, -1, -1, -1, -1, + 100, 771, 33, -1, -1, -1, 106, 107, 108, -1, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, -1, -1, -1, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + -1, 1342, -1, 1344, -1, 1346, -1, -1, 1349, 1350, + 1351, -1, -1, -1, -1, -1, -1, -1, 827, 828, + 829, -1, 831, -1, 833, 834, 835, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 883, -1, -1, -1, -1, -1, -1, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, 164, 165, -1, -1, -1, 169, -1, + -1, -1, -1, -1, -1, 10, 11, 12, -1, 919, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, + -1, -1, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 76, 77, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, -1, 70, + 1000, 72, 73, 74, 75, 76, 77, 78, 79, 80, + -1, 82, 83, 84, -1, -1, -1, 112, 113, -1, + 115, -1, -1, -1, -1, 120, -1, 122, -1, 100, + -1, 1031, -1, -1, -1, 106, 107, 108, 133, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, -1, -1, -1, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, -1, 168, 169, 3, + 4, 5, 6, -1, 8, 9, 10, 11, 12, -1, + -1, 1080, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 16, 17, 18, 19, 20, 21, + 22, 23, -1, -1, -1, -1, 50, 51, -1, -1, + 54, 33, 56, 57, 58, 59, 60, -1, 62, 63, + -1, -1, 66, 67, -1, -1, 70, -1, 47, -1, + 49, 75, 76, 77, -1, -1, -1, 81, -1, -1, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 76, 77, -1, + -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, + -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, + 124, 125, 10, 11, 12, 129, -1, -1, 132, 133, + 134, 135, 136, 112, 113, 139, 115, 141, -1, -1, + -1, 120, -1, 122, -1, -1, -1, -1, -1, -1, + 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, + 164, 165, -1, -1, 168, -1, -1, 1267, -1, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, -1, -1, -1, 169, 76, 77, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3, 4, 5, 6, -1, 8, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, 112, 113, -1, 115, -1, -1, + -1, -1, 120, -1, 122, -1, -1, -1, -1, -1, + 1309, -1, -1, -1, -1, -1, -1, -1, -1, 50, + 51, -1, -1, 54, -1, 56, 57, 58, 59, -1, + -1, 62, 63, -1, -1, 66, 67, -1, -1, 70, + -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, + 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 1369, 1370, 1371, 1372, -1, 1374, 1375, 108, -1, 110, + -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, + 121, -1, -1, 124, 125, -1, -1, -1, 129, -1, + -1, 132, 133, 134, 135, 136, -1, -1, 139, -1, + 141, -1, -1, -1, 1444, -1, -1, -1, -1, -1, + -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, + -1, 162, -1, 164, 165, -1, -1, 168, 3, 4, + 5, 6, -1, 8, 9, 10, 11, -1, 10, 11, + 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, + 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, + -1, -1, -1, -1, -1, 50, 33, -1, -1, 54, + -1, 56, 57, 58, -1, -1, -1, 62, -1, 64, + 65, 66, 67, -1, -1, -1, -1, -1, -1, -1, + 75, 76, 77, -1, 76, 77, 81, -1, -1, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, + -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, + 112, 113, 117, 115, 119, 120, 121, -1, 120, 124, + 122, -1, -1, -1, 129, -1, -1, 132, -1, -1, + -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, + 11, 146, -1, -1, 146, -1, -1, -1, -1, 154, + -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, + 165, -1, 149, 168, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, 50, + -1, -1, -1, 54, -1, 56, 57, 58, -1, -1, + -1, 62, -1, -1, -1, 66, 67, 10, 11, 12, + -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, + 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + -1, -1, -1, -1, 47, -1, 49, 108, -1, 110, + -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, + 121, -1, -1, 124, -1, -1, -1, -1, 129, -1, + -1, 132, -1, 76, 77, 136, 3, 4, 5, 6, + 141, 8, 9, 10, 11, -1, 10, 11, 12, -1, + -1, 15, -1, 154, -1, -1, 157, 158, 159, -1, + -1, 162, -1, 164, 165, 166, -1, 168, -1, 112, + 113, -1, 115, -1, -1, -1, -1, 120, -1, 122, + -1, -1, -1, 50, 51, -1, -1, 54, -1, 56, + 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, + 67, -1, -1, 146, -1, -1, -1, -1, 75, 76, + 77, -1, 76, 77, 81, -1, -1, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, + -1, 108, -1, 110, -1, 112, -1, -1, 112, 113, + 117, 115, 119, 120, 121, -1, 120, 124, 122, -1, + -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, + 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, + 10, 11, 12, -1, -1, -1, -1, 154, -1, -1, + 157, 158, 159, -1, -1, 162, -1, 164, 165, -1, + -1, 168, -1, -1, -1, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, 50, 51, -1, + -1, 54, 33, 56, 57, 58, -1, -1, -1, 62, + -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, + -1, -1, 75, 76, 77, -1, 76, 77, 81, -1, + -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, + -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, + -1, -1, 112, 113, 117, 115, 119, 120, 121, -1, + 120, 124, 122, -1, -1, -1, 129, -1, -1, 132, + -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, + 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, + -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, + -1, 164, 165, -1, -1, 168, -1, 148, -1, -1, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 50, 163, 164, 165, 54, -1, 56, 57, 58, + -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, + -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, + -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, + -1, 110, -1, 112, -1, -1, -1, -1, 117, -1, + 119, 120, 121, -1, -1, 124, -1, -1, -1, -1, + 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, + 5, 6, 141, 8, 9, 10, 11, 146, -1, -1, + -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, + 159, -1, -1, 162, -1, 164, 165, -1, -1, 168, + -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, + 23, -1, -1, -1, -1, 50, -1, -1, -1, 54, + 33, 56, 57, 58, -1, -1, -1, 62, -1, -1, + -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, + 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, + -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, + -1, -1, 117, -1, 119, 120, 121, -1, -1, 124, + -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, + -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, + -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, + 165, 166, -1, 168, 147, -1, -1, -1, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 50, + 163, 164, 165, 54, -1, 56, 57, 58, -1, -1, + -1, 62, -1, -1, -1, 66, 67, -1, -1, -1, + -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, + 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, + -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, + 121, -1, -1, 124, -1, -1, -1, -1, 129, -1, + -1, 132, -1, -1, -1, 136, 3, 4, 5, 6, + 141, 8, 9, 10, 11, 146, -1, -1, -1, -1, + -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, + -1, 162, -1, 164, 165, -1, -1, 168, -1, -1, + -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, 50, -1, -1, -1, 54, 33, 56, + 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, + 67, -1, -1, -1, -1, -1, -1, -1, 75, 76, + 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, + -1, 108, -1, 110, -1, 112, -1, -1, -1, -1, + 117, -1, 119, 120, 121, -1, -1, 124, -1, -1, + -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, + 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, + 157, 158, 159, -1, -1, 162, -1, 164, 165, 166, + -1, 168, -1, -1, 149, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 50, 163, 164, + 165, 54, -1, 56, 57, 58, -1, -1, -1, 62, + -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, + -1, -1, 75, 76, 77, -1, -1, -1, 81, -1, + -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, + -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, + -1, -1, -1, -1, 117, -1, 119, 120, 121, -1, + -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, + -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, + 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, + -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, + -1, 164, 165, -1, -1, 168, 16, 17, 18, 19, + 20, 21, 22, 23, -1, -1, -1, -1, 47, -1, + -1, 50, 51, 33, -1, 54, -1, 56, 57, 58, + 59, 60, -1, 62, 63, -1, -1, 66, 67, -1, + -1, 70, -1, -1, -1, -1, 75, 76, 77, -1, + -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, + -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, 100, -1, -1, -1, -1, -1, -1, 33, 108, + -1, 110, -1, 112, -1, -1, -1, 116, 117, -1, + 119, 120, 121, -1, -1, 124, 125, -1, -1, -1, + 129, -1, -1, 132, 133, 134, 135, 136, -1, -1, + 139, -1, 141, -1, 3, 4, 5, 6, -1, 8, + 9, 10, 11, 12, -1, 154, 15, -1, 157, 158, + -1, -1, -1, 162, -1, 164, -1, 147, -1, 168, + -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, 164, 165, 166, -1, 47, -1, + -1, 50, 51, -1, -1, 54, -1, 56, 57, 58, + 59, 60, -1, 62, 63, -1, -1, 66, 67, -1, + -1, 70, -1, -1, -1, -1, 75, 76, 77, -1, + -1, -1, -1, -1, -1, 84, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, 100, -1, -1, -1, -1, -1, -1, -1, 108, + -1, 110, -1, 112, -1, -1, -1, 116, 117, -1, + 119, 120, 121, -1, -1, 124, 125, -1, -1, -1, + 129, -1, -1, 132, 133, 134, 135, 136, -1, -1, + 139, -1, 141, 3, 4, 5, 6, -1, 8, 9, + 10, -1, -1, -1, -1, 154, -1, -1, 157, 158, + -1, -1, -1, 162, -1, 164, -1, -1, -1, 168, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, + 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, + 50, -1, -1, -1, 33, -1, -1, -1, -1, -1, + -1, -1, 62, -1, -1, -1, -1, 67, 17, 18, + 19, 20, 21, 22, 23, 75, 76, -1, -1, -1, + -1, 81, -1, -1, 33, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, + 110, -1, 112, -1, -1, -1, -1, 117, 33, -1, + -1, 121, -1, -1, 124, -1, -1, -1, -1, 129, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, + 6, -1, 162, -1, 164, 165, -1, -1, 168, -1, + 16, 17, 18, 19, 20, 21, 22, 23, 157, 158, + 159, 160, 161, -1, 163, 164, 165, 33, -1, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, -1, -1, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, 163, 164, 165, -1, -1, 65, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, -1, -1, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, 166, 16, 17, 18, 19, 20, 21, 22, 23, + -1, -1, 108, -1, -1, -1, -1, -1, -1, 33, + -1, -1, 51, -1, -1, 54, -1, 56, 57, 58, + 59, -1, -1, -1, 63, -1, -1, 66, -1, -1, + -1, 70, -1, -1, -1, -1, -1, -1, 77, -1, + -1, 147, -1, -1, 150, 84, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, -1, 164, 165, + -1, 100, 168, -1, 10, 11, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, + 119, 120, -1, -1, -1, -1, 125, -1, -1, -1, + -1, -1, -1, -1, 133, 134, 135, 136, -1, -1, + 139, -1, 141, -1, -1, 51, -1, 146, 54, -1, + 56, 57, 58, 59, -1, -1, -1, 63, -1, -1, + 66, -1, -1, 162, 70, -1, 17, 151, 152, 153, + 154, 77, -1, 157, 158, 159, 160, 161, 84, 163, + 164, 165, 33, -1, -1, -1, -1, -1, -1, -1, + 10, 11, -1, -1, 100, -1, 47, -1, -1, -1, + -1, -1, -1, -1, -1, 111, -1, -1, -1, 60, + 61, -1, -1, 119, 120, -1, -1, -1, -1, 125, + -1, -1, -1, -1, -1, 76, -1, 133, 134, 135, + 136, 51, -1, 139, 54, 141, 56, 57, 58, 59, + -1, -1, -1, 63, -1, -1, 66, -1, -1, -1, + 70, -1, -1, -1, -1, 106, 162, 77, 109, -1, + -1, 112, -1, -1, 84, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, 128, -1, -1, + 100, -1, 33, -1, -1, -1, -1, -1, -1, 140, + -1, 111, -1, -1, -1, -1, -1, -1, -1, 119, + 120, -1, -1, 154, -1, 125, -1, -1, -1, -1, + -1, -1, -1, 133, 134, 135, 136, -1, -1, 139, + -1, 141, 16, 17, 18, 19, 20, 21, 22, 23, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, + -1, -1, 162, 16, 17, 18, 19, 20, 21, 22, + 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 33, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 33, 16, + 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, 164, 165, 166, 16, 17, 18, 19, + 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 33, 16, 17, 18, 19, 20, 21, + 22, 23, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 33, -1, -1, -1, -1, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 164, 165, 166, -1, -1, -1, -1, -1, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, 164, 165, 166, -1, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, 166, -1, -1, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, + -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, 164, 165, 166, -1, -1, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, 47, -1, 49, -1, -1, 52, + 53, -1, -1, -1, -1, -1, -1, 60, 61, -1, + -1, -1, -1, -1, -1, -1, 69, -1, 71, 72, + 73, 74, -1, -1, -1, 78, -1, -1, -1, -1, + 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 102, + 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, + 113, 114, 115, 116, -1, -1, -1, -1, -1, 122, + 123, 11, 12, 126, 127, 15, -1, 17, 131, -1, + -1, -1, -1, -1, 137, 138, -1, 140, 17, 18, + 19, 20, 21, 22, 23, 148, -1, -1, -1, -1, + -1, -1, -1, -1, 33, -1, -1, 47, -1, -1, + -1, 51, -1, -1, 54, -1, 56, 57, 58, 59, + 60, -1, -1, 63, -1, -1, 66, -1, -1, -1, + 70, 18, 19, 20, 21, 22, 23, 77, -1, -1, + -1, -1, -1, -1, 84, -1, 33, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, + 100, -1, 33, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, -1, -1, -1, 116, -1, 33, 119, + 120, -1, -1, -1, -1, 125, -1, 18, 19, 20, + 21, 22, 23, 133, 134, 135, 136, -1, -1, 139, + -1, 141, 33, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, -1, 154, -1, -1, -1, 33, 159, + -1, -1, -1, 152, 153, 154, -1, -1, 157, 158, + 159, 160, 161, -1, 163, 164, 165, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, + -1, -1, -1, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, 164, 165, -1, -1, 152, 153, 154, + -1, -1, 157, 158, 159, 160, 161, -1, 163, 164, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 6, -1, -1, -1, 155, 156, 157, 158, 159, 160, + 161, -1, 163, 164, 165, -1, -1, -1, 153, 154, + -1, -1, 157, 158, 159, 160, 161, 6, 163, 164, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 47, -1, 49, -1, -1, -1, 53, -1, -1, + -1, -1, -1, 154, 60, 61, 157, 158, 159, 160, + 161, -1, 163, 164, 165, 71, 72, 73, 47, -1, + 49, -1, -1, -1, 53, -1, -1, 83, -1, -1, + -1, 60, 61, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 71, 72, 73, -1, -1, -1, -1, 54, + 106, 56, 57, 58, 83, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, 122, -1, -1, -1, + 126, 127, 10, 11, 12, -1, -1, 106, -1, 84, + -1, -1, 138, -1, 140, -1, -1, 116, -1, -1, + -1, -1, -1, 122, -1, 100, -1, -1, 127, -1, + -1, 10, 11, 12, -1, -1, -1, -1, -1, 138, + -1, 140, -1, 51, 119, 120, 54, -1, 56, 57, + 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, + -1, 136, 70, -1, -1, -1, 141, -1, -1, 77, + -1, -1, 51, -1, -1, 54, 84, 56, 57, 58, + 59, 60, -1, -1, 63, -1, -1, 66, -1, 164, + -1, 70, 100, -1, -1, -1, -1, -1, 77, 54, + -1, 56, 57, 58, -1, 84, -1, -1, -1, -1, + -1, 119, 120, -1, -1, -1, -1, 125, -1, -1, + -1, 100, 10, 11, 12, 133, 134, 135, 136, 84, + -1, 139, -1, 141, -1, -1, -1, -1, -1, -1, + 119, 120, -1, -1, -1, 100, 125, -1, -1, -1, + -1, 10, 11, 12, 133, 134, 135, 136, -1, -1, + 139, -1, 141, 51, 119, 120, 54, -1, 56, 57, + 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, + -1, 136, 70, -1, -1, -1, 141, -1, -1, 77, + -1, -1, -1, -1, -1, 54, 84, 56, 57, 58, + 59, 60, -1, -1, -1, -1, -1, 66, -1, 164, + -1, -1, 100, -1, -1, -1, -1, -1, 77, 10, + 11, 12, -1, -1, -1, 84, -1, -1, -1, -1, + -1, 119, 120, -1, -1, -1, -1, 125, -1, -1, + -1, 100, -1, -1, -1, 133, 134, 135, 136, -1, + -1, 139, -1, 141, -1, -1, -1, -1, 11, 12, + 119, 120, 15, 54, -1, 56, 57, 58, -1, -1, + -1, -1, -1, -1, 133, 66, -1, 136, -1, -1, + 139, -1, 141, -1, -1, -1, 77, 11, 12, -1, + -1, 15, -1, 84, 47, -1, -1, -1, 51, -1, + -1, 54, -1, 56, 57, 58, 59, 60, -1, 100, + 63, -1, -1, 66, -1, -1, -1, 70, -1, -1, + -1, -1, -1, 47, 77, -1, -1, 51, 119, 120, + 54, 84, 56, 57, 58, 59, 60, -1, -1, 63, + -1, -1, 66, -1, -1, 136, 70, 100, 139, -1, + 141, -1, -1, 77, 54, -1, 56, 57, 58, -1, + 84, -1, -1, 116, -1, -1, 119, 120, -1, -1, + -1, -1, 125, -1, -1, -1, 100, -1, 11, 12, + 133, 134, 135, 136, 84, -1, 139, -1, 141, -1, + -1, -1, 116, -1, -1, 119, 120, -1, -1, -1, + 100, 125, -1, -1, -1, -1, -1, 11, 12, 133, + 134, 135, 136, -1, 47, 139, -1, 141, 51, 119, + 120, 54, -1, 56, 57, 58, 59, 60, -1, -1, + 63, -1, -1, 66, -1, -1, 136, 70, -1, -1, + -1, 141, -1, -1, 77, -1, -1, 51, -1, -1, + 54, 84, 56, 57, 58, 59, 60, -1, -1, 63, + -1, -1, 66, -1, 164, -1, 70, 100, -1, -1, + -1, -1, -1, 77, -1, -1, 10, 11, 12, -1, + 84, -1, -1, 116, -1, -1, 119, 120, -1, -1, + -1, -1, 125, 11, 12, -1, 100, -1, -1, -1, + 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, + -1, -1, -1, -1, -1, 119, 120, 11, 12, -1, + -1, 125, -1, -1, -1, -1, -1, -1, -1, 133, + 134, 135, 136, 51, -1, 139, 54, 141, 56, 57, + 58, 59, 76, 77, -1, 63, -1, -1, 66, -1, + -1, -1, 70, -1, -1, -1, -1, 51, -1, 77, + 54, -1, 56, 57, 58, 59, 84, -1, -1, 63, + -1, -1, 66, -1, -1, -1, 70, -1, 112, 113, + -1, 115, 100, 77, -1, -1, 120, -1, 122, -1, + 84, -1, -1, -1, -1, -1, -1, -1, 116, 133, + -1, 119, 120, 11, 138, -1, 100, 125, -1, -1, + -1, -1, -1, -1, -1, 133, 134, 135, 136, -1, + -1, 139, -1, 141, -1, 119, 120, -1, -1, -1, + -1, 125, 11, -1, -1, -1, -1, -1, -1, 133, + 134, 135, 136, 51, -1, 139, 54, 141, 56, 57, + 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, + -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, + -1, -1, 51, -1, -1, 54, 84, 56, 57, 58, + 59, 60, -1, -1, 63, -1, -1, 66, -1, -1, + -1, 70, 100, -1, -1, -1, -1, -1, 77, -1, + -1, 10, 11, 12, -1, 84, -1, -1, -1, -1, + -1, 119, 120, -1, -1, -1, -1, 125, 11, -1, + -1, 100, -1, -1, -1, 133, 134, 135, 136, -1, + -1, 139, -1, 141, -1, -1, -1, -1, -1, -1, + 119, 120, 11, -1, -1, -1, 125, -1, -1, -1, + 10, 11, 12, -1, 133, 134, 135, 136, 51, -1, + 139, 54, 141, 56, 57, 58, 59, 76, 77, -1, + 63, -1, -1, 66, -1, -1, -1, 70, -1, -1, + -1, -1, 51, -1, 77, 54, -1, 56, 57, 58, + 59, 84, -1, -1, 63, -1, -1, 66, -1, -1, + -1, 70, -1, 112, 113, -1, 115, 100, 77, -1, + -1, 120, -1, 122, -1, 84, 76, 77, -1, -1, + -1, -1, -1, -1, 133, -1, 119, 120, -1, 138, + -1, 100, 125, -1, -1, -1, -1, -1, -1, -1, + 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, + 119, 120, 112, 113, -1, 115, 125, -1, -1, -1, + 120, -1, 122, -1, 133, 134, 135, 136, -1, 47, + 139, 49, 141, 133, 52, 53, -1, -1, 138, -1, + -1, -1, 60, 61, -1, -1, -1, -1, -1, -1, + -1, 69, -1, 71, 72, 73, 74, -1, -1, -1, + 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, + -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, + -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, + -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, + 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, + 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, + -1, -1, -1, -1, -1, -1, 102, 103, 104, 105, + 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, + 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, + 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, + -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, + 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 167, -1, -1, -1, -1, -1, -1, 102, 103, + 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, + 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, + 52, 53, 126, 127, -1, -1, -1, 131, 60, 61, + -1, -1, -1, 137, 138, -1, 140, 69, -1, 71, + 72, 73, 74, -1, 148, -1, 78, -1, -1, -1, + -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 167, -1, -1, -1, -1, -1, -1, + 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, + -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, + 122, 123, 52, 53, 126, 127, -1, -1, -1, 131, + 60, 61, -1, -1, -1, 137, 138, -1, 140, 69, + -1, 71, 72, 73, 74, -1, 148, -1, 78, -1, + -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 167, -1, -1, -1, -1, + -1, -1, 102, 103, 104, 105, 106, 107, -1, -1, + -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, + -1, 49, 122, 123, 52, 53, 126, 127, -1, -1, + -1, 131, 60, 61, -1, -1, -1, 137, 138, -1, + 140, 69, -1, 71, 72, 73, 74, -1, 148, -1, + 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 167, -1, -1, + -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, + -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, + -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, + -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, + 138, -1, 140, 69, -1, 71, 72, 73, 74, 47, + 148, 49, 78, -1, -1, 53, -1, 83, -1, -1, + -1, -1, 60, 61, -1, -1, -1, -1, -1, 167, + -1, -1, -1, 71, 72, 73, 102, 103, 104, 105, + 106, 107, -1, -1, -1, 83, -1, 113, 114, 115, + 116, -1, -1, -1, -1, -1, 122, 123, -1, -1, + 126, 127, -1, -1, -1, 131, -1, -1, 106, -1, + -1, 137, 138, -1, 140, -1, -1, -1, 116, -1, + -1, -1, 148, -1, 122, -1, -1, -1, -1, 127, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 137, + 138, 167, 140, -1, -1, 47, -1, 49, -1, -1, + 52, 53, -1, -1, -1, -1, -1, 155, 60, 61, + -1, -1, -1, -1, -1, -1, -1, 69, -1, 71, + 72, 73, 74, 47, -1, 49, 78, -1, -1, 53, + -1, 83, -1, -1, -1, -1, 60, 61, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 71, 72, 73, + 102, 103, 104, 105, 106, 107, -1, -1, -1, 83, + -1, 113, 114, 115, 116, -1, -1, -1, -1, -1, + 122, 123, -1, -1, 126, 127, -1, -1, -1, 131, + -1, 47, 106, 49, -1, 137, 138, 53, 140, -1, + -1, -1, 116, -1, 60, 61, -1, -1, 122, -1, + -1, -1, 126, 127, -1, 71, 72, 73, -1, 47, + -1, 49, -1, 137, 138, 53, 140, 83, -1, -1, + -1, -1, 60, 61, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 71, 72, 73, -1, -1, -1, -1, + 106, 107, -1, -1, -1, 83, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, 122, -1, -1, -1, + -1, 127, -1, -1, -1, -1, -1, -1, 106, -1, + -1, -1, 138, -1, 140, -1, -1, -1, 116, -1, + -1, -1, -1, -1, 122, -1, -1, -1, -1, 127, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 138, -1, 140 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint16 yystos[] = +{ + 0, 143, 144, 145, 171, 172, 277, 3, 4, 5, + 6, 8, 9, 10, 11, 50, 54, 56, 57, 58, + 62, 66, 67, 75, 76, 77, 81, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 108, 110, 112, 117, 119, 120, + 121, 124, 129, 132, 136, 141, 154, 157, 158, 159, + 162, 164, 165, 168, 267, 268, 276, 11, 12, 51, + 54, 56, 57, 58, 59, 60, 63, 66, 70, 77, + 84, 100, 119, 120, 125, 133, 134, 135, 136, 139, + 141, 229, 230, 234, 236, 238, 244, 245, 249, 250, + 255, 256, 257, 258, 0, 47, 49, 52, 53, 60, + 61, 69, 71, 72, 73, 74, 78, 83, 102, 103, + 104, 105, 106, 107, 113, 114, 115, 116, 122, 123, + 126, 127, 131, 137, 138, 140, 148, 175, 177, 178, + 180, 183, 201, 251, 254, 277, 146, 164, 164, 164, + 164, 164, 164, 155, 164, 155, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 11, 51, 63, 133, 134, + 232, 249, 250, 255, 155, 164, 164, 15, 164, 155, + 164, 164, 164, 267, 267, 267, 267, 267, 11, 54, + 56, 57, 58, 66, 77, 84, 100, 119, 120, 136, + 141, 234, 265, 267, 10, 11, 12, 76, 77, 112, + 113, 115, 120, 122, 150, 154, 159, 271, 272, 274, + 277, 267, 16, 17, 18, 19, 20, 21, 22, 23, + 33, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 163, 164, 165, 6, 8, 229, 230, 164, + 59, 125, 66, 100, 256, 256, 256, 274, 164, 256, + 13, 15, 17, 60, 140, 154, 159, 164, 227, 228, + 277, 228, 146, 10, 11, 12, 112, 149, 275, 235, + 277, 137, 181, 182, 274, 164, 72, 83, 180, 180, + 180, 180, 6, 180, 201, 180, 149, 179, 107, 180, + 164, 164, 164, 164, 180, 146, 274, 149, 149, 149, + 180, 180, 164, 180, 183, 202, 180, 180, 186, 107, + 274, 180, 180, 10, 11, 51, 63, 111, 133, 134, + 146, 162, 189, 192, 231, 233, 236, 238, 244, 249, + 250, 255, 264, 265, 277, 264, 234, 264, 264, 264, + 264, 234, 264, 234, 264, 234, 264, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 264, 164, 274, 164, 164, 274, 235, 234, + 264, 264, 164, 10, 234, 234, 234, 267, 264, 264, + 166, 147, 166, 274, 274, 147, 169, 150, 217, 277, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 166, 265, 267, 228, 228, 51, 267, 234, 159, + 274, 13, 15, 17, 60, 140, 154, 159, 227, 277, + 227, 228, 227, 228, 227, 227, 15, 17, 47, 60, + 116, 154, 159, 212, 213, 222, 229, 230, 277, 165, + 247, 248, 277, 11, 246, 256, 149, 10, 11, 12, + 47, 49, 112, 146, 274, 275, 274, 48, 147, 164, + 11, 231, 267, 180, 177, 146, 274, 274, 274, 274, + 274, 172, 146, 267, 155, 10, 11, 192, 231, 233, + 274, 148, 150, 164, 164, 164, 60, 229, 274, 164, + 176, 274, 146, 148, 149, 150, 218, 146, 148, 150, + 219, 148, 184, 274, 275, 235, 167, 166, 166, 166, + 166, 166, 166, 156, 166, 156, 166, 166, 166, 166, + 147, 166, 147, 166, 147, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 267, 234, 264, 274, + 156, 166, 166, 274, 166, 166, 156, 166, 166, 166, + 166, 267, 267, 15, 154, 272, 164, 198, 277, 267, + 149, 166, 169, 166, 166, 166, 227, 159, 274, 227, + 227, 227, 227, 227, 165, 227, 181, 116, 229, 230, + 222, 227, 227, 166, 15, 147, 13, 17, 60, 140, + 154, 159, 164, 225, 275, 277, 13, 15, 17, 60, + 140, 154, 159, 164, 226, 263, 267, 277, 274, 167, + 246, 181, 164, 237, 239, 149, 180, 181, 3, 4, + 5, 9, 10, 15, 50, 62, 67, 75, 76, 108, + 110, 112, 117, 121, 124, 129, 132, 154, 157, 158, + 162, 164, 168, 214, 215, 222, 223, 269, 270, 276, + 277, 166, 166, 172, 146, 147, 147, 147, 147, 167, + 252, 147, 166, 10, 11, 12, 59, 60, 133, 203, + 204, 205, 206, 207, 255, 277, 164, 219, 187, 148, + 234, 190, 13, 159, 191, 51, 267, 229, 13, 17, + 60, 140, 154, 159, 224, 275, 277, 234, 172, 164, + 259, 260, 173, 174, 274, 64, 65, 259, 64, 65, + 146, 267, 13, 17, 60, 111, 140, 154, 159, 164, + 185, 208, 210, 275, 149, 274, 164, 164, 234, 234, + 234, 166, 166, 166, 164, 166, 164, 217, 212, 17, + 33, 47, 60, 61, 76, 106, 109, 112, 128, 140, + 154, 211, 277, 267, 227, 263, 166, 48, 229, 230, + 225, 226, 166, 166, 198, 15, 222, 159, 225, 225, + 225, 225, 225, 225, 165, 217, 159, 274, 226, 226, + 226, 226, 226, 226, 165, 217, 169, 147, 150, 48, + 231, 267, 172, 76, 240, 277, 182, 164, 155, 155, + 232, 155, 15, 164, 155, 164, 267, 267, 267, 267, + 234, 265, 267, 166, 15, 147, 16, 17, 18, 19, + 20, 21, 22, 23, 33, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 163, 164, 165, 180, + 180, 167, 253, 10, 10, 10, 10, 172, 276, 148, + 207, 156, 147, 15, 274, 13, 17, 60, 140, 154, + 159, 164, 225, 226, 188, 210, 148, 212, 159, 208, + 212, 166, 166, 224, 159, 224, 224, 224, 224, 224, + 164, 165, 166, 167, 193, 167, 261, 277, 146, 147, + 146, 164, 148, 148, 167, 148, 148, 146, 220, 221, + 267, 277, 148, 159, 208, 208, 6, 16, 17, 18, + 19, 20, 21, 22, 23, 33, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 65, 108, + 147, 150, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 164, 165, 168, 199, 208, 208, 208, + 208, 149, 164, 165, 211, 150, 217, 219, 246, 265, + 265, 166, 166, 166, 265, 265, 166, 60, 232, 181, + 164, 146, 169, 164, 222, 225, 226, 217, 217, 164, + 164, 211, 225, 166, 263, 226, 166, 263, 267, 166, + 166, 167, 149, 241, 242, 277, 234, 234, 234, 164, + 234, 164, 10, 234, 234, 234, 267, 166, 166, 15, + 223, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 166, 265, 267, 172, 147, 166, 147, 147, + 147, 167, 166, 225, 226, 183, 200, 201, 206, 274, + 150, 159, 150, 216, 277, 217, 219, 166, 208, 166, + 166, 164, 224, 196, 263, 212, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 70, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 82, 83, 84, 100, 106, 107, 108, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 168, 169, 262, 259, 174, 264, 264, + 220, 167, 147, 208, 10, 166, 169, 166, 4, 209, + 263, 267, 147, 166, 166, 166, 166, 198, 232, 228, + 48, 166, 274, 259, 212, 217, 217, 212, 212, 164, + 169, 164, 169, 147, 113, 114, 115, 133, 138, 243, + 273, 274, 146, 147, 166, 156, 156, 264, 156, 274, + 166, 166, 156, 166, 166, 267, 149, 166, 169, 167, + 10, 148, 10, 10, 10, 148, 216, 234, 50, 62, + 67, 117, 121, 124, 154, 157, 158, 159, 162, 164, + 168, 266, 268, 147, 198, 166, 164, 198, 197, 212, + 169, 166, 261, 167, 167, 166, 167, 146, 267, 214, + 169, 185, 211, 228, 15, 166, 167, 166, 166, 166, + 212, 212, 138, 273, 138, 273, 138, 273, 274, 113, + 114, 115, 15, 172, 243, 164, 164, 166, 164, 166, + 164, 267, 147, 166, 147, 166, 166, 147, 166, 164, + 155, 155, 155, 15, 164, 155, 266, 266, 266, 266, + 266, 234, 265, 266, 16, 17, 18, 19, 20, 21, + 22, 23, 33, 151, 152, 153, 154, 157, 158, 159, + 160, 161, 163, 164, 165, 188, 164, 194, 212, 166, + 198, 167, 15, 220, 166, 146, 166, 198, 198, 198, + 166, 166, 273, 273, 273, 273, 273, 273, 167, 265, + 265, 265, 265, 10, 148, 10, 148, 148, 10, 148, + 234, 234, 234, 234, 164, 10, 234, 234, 166, 166, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 166, + 265, 267, 195, 212, 166, 198, 167, 198, 259, 211, + 211, 211, 198, 198, 166, 166, 166, 166, 166, 147, + 147, 166, 166, 156, 156, 156, 274, 166, 166, 156, + 266, 149, 166, 169, 212, 166, 198, 167, 148, 10, + 10, 148, 164, 164, 164, 166, 164, 266, 166, 198, + 166, 166, 265, 265, 265, 265, 198, 211, 148, 148, + 166, 166, 166, 166, 211 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. However, + YYFAIL appears to be in use. Nevertheless, it is formally deprecated + in Bison 2.4.2's NEWS entry, where a plan to phase it out is + discussed. */ + +#define YYFAIL goto yyerrlab +#if defined YYFAIL + /* This is here to suppress warnings from the GCC cpp's + -Wunused-macros. Normally we don't worry about that warning, but + some users do, and we want to make it easy for users to remove + YYFAIL uses, which will produce warnings from Bison 2.5. */ +#endif #define YYRECOVERING() (!!yyerrstatus) @@ -3041,14 +3581,14 @@ do \ } \ else \ { \ - yyerror (&yylloc, YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (0) + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) /* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 +#define YYTERROR 1 +#define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. @@ -3058,7 +3598,7 @@ while (0) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ - if (N) \ + if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ @@ -3072,58 +3612,59 @@ while (0) (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ - while (0) + while (YYID (0)) #endif #define YYRHSLOC(Rhs, K) ((Rhs)[K]) -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - - /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if (! defined __GNUC__ || __GNUC__ < 2 \ + || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) +# define __attribute__(Spec) /* empty */ +# endif +#endif + #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ -YY_ATTRIBUTE_UNUSED +__attribute__((__unused__)) +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static unsigned yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) +#else +static unsigned +yy_location_print_ (yyo, yylocp) + FILE *yyo; + YYLTYPE const * const yylocp; +#endif { unsigned res = 0; int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; if (0 <= yylocp->first_line) { - res += YYFPRINTF (yyo, "%d", yylocp->first_line); + res += fprintf (yyo, "%d", yylocp->first_line); if (0 <= yylocp->first_column) - res += YYFPRINTF (yyo, ".%d", yylocp->first_column); + res += fprintf (yyo, ".%d", yylocp->first_column); } if (0 <= yylocp->last_line) { if (yylocp->first_line < yylocp->last_line) { - res += YYFPRINTF (yyo, "-%d", yylocp->last_line); + res += fprintf (yyo, "-%d", yylocp->last_line); if (0 <= end_col) - res += YYFPRINTF (yyo, ".%d", end_col); + res += fprintf (yyo, ".%d", end_col); } else if (0 <= end_col && yylocp->first_column < end_col) - res += YYFPRINTF (yyo, "-%d", end_col); + res += fprintf (yyo, "-%d", end_col); } return res; } @@ -3137,35 +3678,73 @@ yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) #endif -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value, Location); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) +/* YYLEX -- calling `yylex' with the right arguments. */ +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, &yylloc) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, Location); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) -/*----------------------------------------. -| Print this symbol's value on YYOUTPUT. | -`----------------------------------------*/ +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + YYLTYPE const * const yylocationp; +#endif { FILE *yyo = yyoutput; YYUSE (yyo); - YYUSE (yylocationp); if (!yyvaluep) return; + YYUSE (yylocationp); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); # endif - YYUSE (yytype); + switch (yytype) + { + default: + break; + } } @@ -3173,11 +3752,23 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue | Print this symbol on YYOUTPUT. | `--------------------------------*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + YYLTYPE const * const yylocationp; +#endif { - YYFPRINTF (yyoutput, "%s %s (", - yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); YY_LOCATION_PRINT (yyoutput, *yylocationp); YYFPRINTF (yyoutput, ": "); @@ -3190,8 +3781,16 @@ yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYL | TOP (included). | `------------------------------------------------------------------*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) @@ -3202,42 +3801,50 @@ yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void -yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule) +yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yylsp, yyrule) + YYSTYPE *yyvsp; + YYLTYPE *yylsp; + int yyrule; +#endif { - unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; + unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, - yystos[yyssp[yyi + 1 - yynrhs]], - &(yyvsp[(yyi + 1) - (yynrhs)]) - , &(yylsp[(yyi + 1) - (yynrhs)]) ); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , &(yylsp[(yyi + 1) - (yynrhs)]) ); YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, yylsp, Rule); \ -} while (0) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, yylsp, Rule); \ +} while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ @@ -3251,7 +3858,7 @@ int yydebug; /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif @@ -3274,8 +3881,15 @@ int yydebug; # define yystrlen strlen # else /* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) @@ -3291,8 +3905,16 @@ yystrlen (const char *yystr) # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif { char *yyd = yydest; const char *yys = yysrc; @@ -3322,27 +3944,27 @@ yytnamerr (char *yyres, const char *yystr) char const *yyp = yystr; for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } do_not_strip_quotes: ; } @@ -3365,11 +3987,11 @@ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { - YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); + YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ - const char *yyformat = YY_NULLPTR; + const char *yyformat = YY_NULL; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per @@ -3377,6 +3999,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, int yycount = 0; /* There are many possibilities here to consider: + - Assume YYFAIL is not used. It's too flawed to consider. See + + for details. YYERROR is fine as it does not invoke this + function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected @@ -3426,7 +4052,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, } yyarg[yycount++] = yytname[yyx]; { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; @@ -3493,18 +4119,33 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, | Release the memory associated to this symbol. | `-----------------------------------------------*/ +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, yylocationp) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + YYLTYPE *yylocationp; +#endif { YYUSE (yyvaluep); YYUSE (yylocationp); + if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END + switch (yytype) + { + + default: + break; + } } @@ -3514,27 +4155,66 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio | yyparse. | `----------*/ +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) int yyparse (void) +#else +int +yyparse () + +#endif +#endif { /* The lookahead symbol. */ int yychar; -/* The semantic value of the lookahead symbol. */ +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else /* Default value used for initialization, for pacifying older GCCs or non-GCC compilers. */ -YY_INITIAL_VALUE (static YYSTYPE yyval_default;) -YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); - -/* Location data for the lookahead symbol. */ +static YYSTYPE yyval_default; +# define YY_INITIAL_VALUE(Value) = Value +#endif static YYLTYPE yyloc_default # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL = { 1, 1, 1, 1 } # endif ; +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); + +/* Location data for the lookahead symbol. */ YYLTYPE yylloc = yyloc_default; + /* Number of syntax errors so far. */ int yynerrs; @@ -3543,9 +4223,9 @@ YYLTYPE yylloc = yyloc_default; int yyerrstatus; /* The stacks and their tools: - 'yyss': related to states. - 'yyvs': related to semantic values. - 'yyls': related to locations. + `yyss': related to states. + `yyvs': related to semantic values. + `yyls': related to locations. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ @@ -3624,26 +4304,26 @@ YYLTYPE yylloc = yyloc_default; #ifdef yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - YYLTYPE *yyls1 = yyls; + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + YYLTYPE *yyls1 = yyls; - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yyls1, yysize * sizeof (*yylsp), - &yystacksize); + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yyls1, yysize * sizeof (*yylsp), + &yystacksize); - yyls = yyls1; - yyss = yyss1; - yyvs = yyvs1; + yyls = yyls1; + yyss = yyss1; + yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE @@ -3651,23 +4331,23 @@ YYLTYPE yylloc = yyloc_default; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); - YYSTACK_RELOCATE (yyls_alloc, yyls); + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); + YYSTACK_RELOCATE (yyls_alloc, yyls); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ @@ -3677,10 +4357,10 @@ YYLTYPE yylloc = yyloc_default; yylsp = yyls + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); @@ -3709,7 +4389,7 @@ yybackup: if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); - yychar = yylex (&yylval, &yylloc); + yychar = YYLEX; } if (yychar <= YYEOF) @@ -3774,7 +4454,7 @@ yyreduce: yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. + `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison @@ -3789,64 +4469,65 @@ yyreduce: switch (yyn) { case 3: -#line 444 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 450 "dtool/src/cppparser/cppBison.yxx" { - current_expr = (yyvsp[0].u.expr); + current_expr = (yyvsp[(2) - (2)].u.expr); } -#line 3797 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 4: -#line 448 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 454 "dtool/src/cppparser/cppBison.yxx" { - current_type = (yyvsp[0].u.type); + current_type = (yyvsp[(2) - (2)].u.type); } -#line 3805 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 10: -#line 466 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 472 "dtool/src/cppparser/cppBison.yxx" { - delete (yyvsp[-1].u.expr); + delete (yyvsp[(3) - (4)].u.expr); } -#line 3813 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 11: -#line 470 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 476 "dtool/src/cppparser/cppBison.yxx" { - delete (yyvsp[-2].u.expr); + delete (yyvsp[(3) - (5)].u.expr); } -#line 3821 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 12: -#line 474 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 480 "dtool/src/cppparser/cppBison.yxx" { - delete (yyvsp[-1].u.expr); + delete (yyvsp[(3) - (4)].u.expr); } -#line 3829 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 13: -#line 486 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 492 "dtool/src/cppparser/cppBison.yxx" { push_storage_class((current_storage_class & ~CPPInstance::SC_c_binding) | - ((yyvsp[-1].u.integer) & CPPInstance::SC_c_binding)); + ((yyvsp[(1) - (2)].u.integer) & CPPInstance::SC_c_binding)); } -#line 3838 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 14: -#line 491 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 497 "dtool/src/cppparser/cppBison.yxx" { pop_storage_class(); } -#line 3846 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 21: -#line 504 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 510 "dtool/src/cppparser/cppBison.yxx" { if (publish_nest_level != 0) { yyerror("Unclosed __begin_publish", publish_loc); @@ -3855,36 +4536,36 @@ yyreduce: } publish_previous = current_scope->get_current_vis(); - publish_loc = (yylsp[0]); + publish_loc = (yylsp[(1) - (1)]); publish_nest_level++; current_scope->set_current_vis(V_published); } -#line 3863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 22: -#line 517 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 523 "dtool/src/cppparser/cppBison.yxx" { if (publish_nest_level != 1) { - yyerror("Unmatched __end_publish", (yylsp[0])); + yyerror("Unmatched __end_publish", (yylsp[(1) - (1)])); } else { current_scope->set_current_vis(publish_previous); } publish_nest_level = 0; } -#line 3876 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 23: -#line 526 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 532 "dtool/src/cppparser/cppBison.yxx" { current_scope->set_current_vis(V_published); } -#line 3884 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 24: -#line 530 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 536 "dtool/src/cppparser/cppBison.yxx" { if (publish_nest_level > 0) { current_scope->set_current_vis(V_published); @@ -3892,668 +4573,684 @@ yyreduce: current_scope->set_current_vis(V_public); } } -#line 3896 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 25: -#line 538 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 544 "dtool/src/cppparser/cppBison.yxx" { current_scope->set_current_vis(V_protected); } -#line 3904 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 26: -#line 542 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 548 "dtool/src/cppparser/cppBison.yxx" { current_scope->set_current_vis(V_private); } -#line 3912 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 27: -#line 546 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 552 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[(5) - (7)].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[(5) - (7)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (7)])); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-4].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[-6]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-6])); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (7)].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[(1) - (7)]).file); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (7)])); } -#line 3927 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 28: -#line 557 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 563 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *getter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[(5) - (9)].u.identifier)->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: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[(5) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); } else { - CPPDeclaration *setter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[(7) - (9)].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[(7) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (9)])); } else { setter_func = setter->as_function_group(); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[-8]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (9)].u.identifier), getter->as_function_group(), + setter_func, current_scope, (yylsp[(1) - (9)]).file); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (9)])); } } -#line 3952 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 29: -#line 578 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 584 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *getter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[(5) - (11)].u.identifier)->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: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[(5) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (11)])); } else { - CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[(7) - (11)].u.identifier)->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: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[(7) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (11)])); } else { setter_func = setter->as_function_group(); } - CPPDeclaration *deleter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *deleter = (yyvsp[(9) - (11)].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + yyerror("reference to non-existent or invalid delete method: " + (yyvsp[(9) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(9) - (11)])); deleter = NULL; } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-8].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[-10]).file); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (11)].u.identifier), getter->as_function_group(), + setter_func, current_scope, (yylsp[(1) - (11)]).file); if (deleter) { make_property->_del_function = deleter->as_function_group(); } - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (11)])); } } -#line 3986 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 30: -#line 608 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 614 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *length_getter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *length_getter = (yyvsp[(5) - (9)].u.identifier)->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: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("reference to non-existent or invalid length method: " + (yyvsp[(5) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); length_getter = NULL; } - CPPDeclaration *getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[(7) - (9)].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[(7) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (9)])); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[-8]).file); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (9)].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[(1) - (9)]).file); make_property->_length_function = length_getter->as_function_group(); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (9)])); } -#line 4007 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 31: -#line 625 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 631 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *length_getter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *length_getter = (yyvsp[(5) - (11)].u.identifier)->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: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); + yyerror("reference to non-existent or invalid length method: " + (yyvsp[(5) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (11)])); length_getter = NULL; } - CPPDeclaration *getter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[(7) - (11)].u.identifier)->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: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[(7) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (11)])); } else { - CPPDeclaration *setter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[(9) - (11)].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[(9) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(9) - (11)])); } else { setter_func = setter->as_function_group(); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-8].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[-10]).file); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (11)].u.identifier), getter->as_function_group(), + setter_func, current_scope, (yylsp[(1) - (11)]).file); make_property->_length_function = length_getter->as_function_group(); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (11)])); } } -#line 4039 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 32: -#line 653 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 659 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *length_getter = (yyvsp[-8].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *length_getter = (yyvsp[(5) - (13)].u.identifier)->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: " + (yyvsp[-8].u.identifier)->get_fully_scoped_name(), (yylsp[-8])); + yyerror("reference to non-existent or invalid length method: " + (yyvsp[(5) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (13)])); length_getter = NULL; } - CPPDeclaration *getter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[(7) - (13)].u.identifier)->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: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[(7) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (13)])); } else { - CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[(9) - (13)].u.identifier)->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: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[(9) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(9) - (13)])); } else { setter_func = setter->as_function_group(); } - CPPDeclaration *deleter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *deleter = (yyvsp[(11) - (13)].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + yyerror("reference to non-existent or invalid delete method: " + (yyvsp[(11) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(11) - (13)])); deleter = NULL; } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-10].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[-12]).file); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (13)].u.identifier), getter->as_function_group(), + setter_func, current_scope, (yylsp[(1) - (13)]).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, (yylsp[-12])); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (13)])); } } -#line 4080 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 33: -#line 690 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 696 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *hasser = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *hasser = (yyvsp[(5) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (hasser == (CPPDeclaration *)NULL || hasser->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[(5) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); } - CPPDeclaration *getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[(7) - (9)].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[(7) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (9)])); } if (hasser && getter) { CPPMakeProperty *make_property; - make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), + make_property = new CPPMakeProperty((yyvsp[(3) - (9)].u.identifier), hasser->as_function_group(), getter->as_function_group(), NULL, NULL, - current_scope, (yylsp[-8]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); + current_scope, (yylsp[(1) - (9)]).file); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (9)])); } } -#line 4106 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 34: -#line 712 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 718 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *hasser = (yyvsp[-8].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *hasser = (yyvsp[(5) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (hasser == (CPPDeclaration *)NULL || hasser->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[-8].u.identifier)->get_fully_scoped_name(), (yylsp[-8])); + yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[(5) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (13)])); } - CPPDeclaration *getter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[(7) - (13)].u.identifier)->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: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[(7) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (13)])); } - CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[(9) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[(9) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(9) - (13)])); } - CPPDeclaration *clearer = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *clearer = (yyvsp[(11) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (clearer == (CPPDeclaration *)NULL || clearer->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid clear-function: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + yyerror("Reference to non-existent or invalid clear-function: " + (yyvsp[(11) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(11) - (13)])); } if (hasser && getter && setter && clearer) { CPPMakeProperty *make_property; - make_property = new CPPMakeProperty((yyvsp[-10].u.identifier), + make_property = new CPPMakeProperty((yyvsp[(3) - (13)].u.identifier), hasser->as_function_group(), getter->as_function_group(), setter->as_function_group(), clearer->as_function_group(), - current_scope, (yylsp[-12]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); + current_scope, (yylsp[(1) - (13)]).file); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (13)])); } } -#line 4143 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 35: -#line 745 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 751 "dtool/src/cppparser/cppBison.yxx" { - CPPDeclaration *length_getter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *length_getter = (yyvsp[(5) - (9)].u.identifier)->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: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("reference to non-existent or invalid length method: " + (yyvsp[(5) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); length_getter = NULL; } - CPPDeclaration *element_getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *element_getter = (yyvsp[(7) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (element_getter == (CPPDeclaration *)NULL || element_getter->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("reference to non-existent or invalid element method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + yyerror("reference to non-existent or invalid element method: " + (yyvsp[(7) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); element_getter = NULL; } if (length_getter != (CPPDeclaration *)NULL && element_getter != (CPPDeclaration *)NULL) { - CPPMakeSeq *make_seq = new CPPMakeSeq((yyvsp[-6].u.identifier), + CPPMakeSeq *make_seq = new CPPMakeSeq((yyvsp[(3) - (9)].u.identifier), length_getter->as_function_group(), element_getter->as_function_group(), - current_scope, (yylsp[-8]).file); - current_scope->add_declaration(make_seq, global_scope, current_lexer, (yylsp[-8])); + current_scope, (yylsp[(1) - (9)]).file); + current_scope->add_declaration(make_seq, global_scope, current_lexer, (yylsp[(1) - (9)])); } } -#line 4169 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 36: -#line 767 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 773 "dtool/src/cppparser/cppBison.yxx" { - CPPExpression::Result result = (yyvsp[-4].u.expr)->evaluate(); + CPPExpression::Result result = (yyvsp[(3) - (7)].u.expr)->evaluate(); if (result._type == CPPExpression::RT_error) { - yywarning("static_assert requires a constant expression", (yylsp[-4])); + yywarning("static_assert requires a constant expression", (yylsp[(3) - (7)])); } else if (!result.as_boolean()) { stringstream str; - str << *(yyvsp[-2].u.expr); - yywarning("static_assert failed: " + str.str(), (yylsp[-4])); + str << *(yyvsp[(5) - (7)].u.expr); + yywarning("static_assert failed: " + str.str(), (yylsp[(3) - (7)])); } } -#line 4184 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 37: -#line 778 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 784 "dtool/src/cppparser/cppBison.yxx" { // This alternative version of static_assert was introduced in C++17. - CPPExpression::Result result = (yyvsp[-2].u.expr)->evaluate(); + CPPExpression::Result result = (yyvsp[(3) - (5)].u.expr)->evaluate(); if (result._type == CPPExpression::RT_error) { - yywarning("static_assert requires a constant expression", (yylsp[-2])); + yywarning("static_assert requires a constant expression", (yylsp[(3) - (5)])); } else if (!result.as_boolean()) { - yywarning("static_assert failed", (yylsp[-2])); + yywarning("static_assert failed", (yylsp[(3) - (5)])); } } -#line 4198 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 38: -#line 791 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 797 "dtool/src/cppparser/cppBison.yxx" { CPPScope *new_scope = new CPPScope(current_scope, CPPNameComponent("temp"), V_public); push_scope(new_scope); } -#line 4208 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 39: -#line 797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 803 "dtool/src/cppparser/cppBison.yxx" { delete current_scope; pop_scope(); } -#line 4217 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 40: -#line 806 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 812 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.integer) = 0; } -#line 4225 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 41: -#line 810 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 816 "dtool/src/cppparser/cppBison.yxx" { // This isn't really a storage class, but it helps with parsing. - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_const; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_const; } -#line 4234 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 42: -#line 815 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 821 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extern; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_extern; } -#line 4242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 43: -#line 819 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 825 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extern; - if ((yyvsp[-1].str) == "C") { + (yyval.u.integer) = (yyvsp[(3) - (3)].u.integer) | (int)CPPInstance::SC_extern; + if ((yyvsp[(2) - (3)].str) == "C") { (yyval.u.integer) |= (int)CPPInstance::SC_c_binding; - } else if ((yyvsp[-1].str) == "C++") { + } else if ((yyvsp[(2) - (3)].str) == "C++") { (yyval.u.integer) &= ~(int)CPPInstance::SC_c_binding; } else { - yywarning("Ignoring unknown linkage type \"" + (yyvsp[-1].str) + "\"", (yylsp[-1])); + yywarning("Ignoring unknown linkage type \"" + (yyvsp[(2) - (3)].str) + "\"", (yylsp[(2) - (3)])); } } -#line 4257 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 44: -#line 830 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 836 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_static; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_static; } -#line 4265 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 45: -#line 834 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 840 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_inline; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_inline; } -#line 4273 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 46: -#line 838 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 844 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_virtual; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_virtual; } -#line 4281 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 47: -#line 842 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 848 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_explicit; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_explicit; } -#line 4289 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 48: -#line 846 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 852 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_register; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_register; } -#line 4297 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 49: -#line 850 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 856 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_volatile; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_volatile; } -#line 4305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 50: -#line 854 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 860 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_mutable; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_mutable; } -#line 4313 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 51: -#line 858 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 864 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_constexpr; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_constexpr; } -#line 4321 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 52: -#line 862 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 868 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_blocking; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_blocking; } -#line 4329 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 53: -#line 866 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 872 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extension; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_extension; } -#line 4337 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 54: -#line 870 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 876 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_thread_local; + (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_thread_local; } -#line 4345 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 55: -#line 874 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 880 "dtool/src/cppparser/cppBison.yxx" { // Ignore attribute specifiers for now. - (yyval.u.integer) = (yyvsp[0].u.integer); + (yyval.u.integer) = (yyvsp[(4) - (4)].u.integer); } -#line 4354 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 60: -#line 892 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 56: +/* Line 1792 of yacc.c */ +#line 885 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.integer) = (yyvsp[(5) - (5)].u.integer); +} + break; + + case 57: +/* Line 1792 of yacc.c */ +#line 889 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.integer) = (yyvsp[(5) - (5)].u.integer); +} + break; + + case 63: +/* Line 1792 of yacc.c */ +#line 907 "dtool/src/cppparser/cppBison.yxx" { // We don't need to push/pop type, because we can't nest // type_like_declaration. - if ((yyvsp[0].u.decl)->as_type_declaration()) { - current_type = (yyvsp[0].u.decl)->as_type_declaration()->_type; + if ((yyvsp[(2) - (2)].u.decl)->as_type_declaration()) { + current_type = (yyvsp[(2) - (2)].u.decl)->as_type_declaration()->_type; } else { - current_type = (yyvsp[0].u.decl)->as_type(); + current_type = (yyvsp[(2) - (2)].u.decl)->as_type(); } - push_storage_class((yyvsp[-1].u.integer)); + push_storage_class((yyvsp[(1) - (2)].u.integer)); } -#line 4369 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 61: -#line 903 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 64: +/* Line 1792 of yacc.c */ +#line 918 "dtool/src/cppparser/cppBison.yxx" { pop_storage_class(); } -#line 4377 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 62: -#line 908 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 65: +/* Line 1792 of yacc.c */ +#line 923 "dtool/src/cppparser/cppBison.yxx" { // We don't really care about the storage class here. In fact, it's // not actually legal to define a class or struct using a particular // storage class, but we require it just to help yacc out in its // parsing. - current_scope->add_declaration((yyvsp[-1].u.decl), global_scope, current_lexer, (yylsp[-1])); + current_scope->add_declaration((yyvsp[(2) - (3)].u.decl), global_scope, current_lexer, (yylsp[(2) - (3)])); } -#line 4390 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 63: -#line 917 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - if ((yyvsp[-1].u.instance) != (CPPInstance *)NULL) { - (yyvsp[-1].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); - current_scope->add_declaration((yyvsp[-1].u.instance), global_scope, current_lexer, (yylsp[-1])); - (yyvsp[-1].u.instance)->set_initializer((yyvsp[0].u.expr)); - } -} -#line 4402 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 64: -#line 925 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - if ((yyvsp[-1].u.instance) != (CPPInstance *)NULL) { - (yyvsp[-1].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); - current_scope->add_declaration((yyvsp[-1].u.instance), global_scope, current_lexer, (yylsp[-1])); - (yyvsp[-1].u.instance)->set_initializer((yyvsp[0].u.expr)); - } -} -#line 4414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 66: -#line 941 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 932 "dtool/src/cppparser/cppBison.yxx" { - if (current_storage_class & CPPInstance::SC_const) { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + if ((yyvsp[(2) - (3)].u.instance) != (CPPInstance *)NULL) { + (yyvsp[(2) - (3)].u.instance)->_storage_class |= (current_storage_class | (yyvsp[(1) - (3)].u.integer)); + current_scope->add_declaration((yyvsp[(2) - (3)].u.instance), global_scope, current_lexer, (yylsp[(2) - (3)])); + (yyvsp[(2) - (3)].u.instance)->set_initializer((yyvsp[(3) - (3)].u.expr)); } - CPPInstance *inst = new CPPInstance(current_type, (yyvsp[-1].u.inst_ident), - current_storage_class, - (yylsp[-1]).file); - inst->set_initializer((yyvsp[0].u.expr)); - current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-1])); } -#line 4429 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 67: -#line 952 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 940 "dtool/src/cppparser/cppBison.yxx" { - if (current_storage_class & CPPInstance::SC_const) { - (yyvsp[-3].u.inst_ident)->add_modifier(IIT_const); + if ((yyvsp[(2) - (3)].u.instance) != (CPPInstance *)NULL) { + (yyvsp[(2) - (3)].u.instance)->_storage_class |= (current_storage_class | (yyvsp[(1) - (3)].u.integer)); + current_scope->add_declaration((yyvsp[(2) - (3)].u.instance), global_scope, current_lexer, (yylsp[(2) - (3)])); + (yyvsp[(2) - (3)].u.instance)->set_initializer((yyvsp[(3) - (3)].u.expr)); } - CPPInstance *inst = new CPPInstance(current_type, (yyvsp[-3].u.inst_ident), - current_storage_class, - (yylsp[-3]).file); - inst->set_initializer((yyvsp[-2].u.expr)); - current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-3])); } -#line 4444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 68: -#line 967 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - // We don't need to push/pop type, because we can't nest - // multiple_var_declarations. - if ((yyvsp[0].u.decl)->as_type_declaration()) { - current_type = (yyvsp[0].u.decl)->as_type_declaration()->_type; - } else { - current_type = (yyvsp[0].u.decl)->as_type(); - } - push_storage_class((yyvsp[-1].u.integer)); -} -#line 4459 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 69: -#line 978 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 956 "dtool/src/cppparser/cppBison.yxx" { - pop_storage_class(); + if (current_storage_class & CPPInstance::SC_const) { + (yyvsp[(1) - (2)].u.inst_ident)->add_modifier(IIT_const); + } + CPPInstance *inst = new CPPInstance(current_type, (yyvsp[(1) - (2)].u.inst_ident), + current_storage_class, + (yylsp[(1) - (2)]).file); + inst->set_initializer((yyvsp[(2) - (2)].u.expr)); + current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[(1) - (2)])); } -#line 4467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 70: -#line 982 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 967 "dtool/src/cppparser/cppBison.yxx" { - if ((yyvsp[-1].u.instance) != (CPPDeclaration *)NULL) { - CPPInstance *inst = (yyvsp[-1].u.instance)->as_instance(); - if (inst != (CPPInstance *)NULL) { - inst->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); - current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-1])); - CPPTypedefType *typedef_type = new CPPTypedefType(inst->_type, inst->_ident, current_scope); - current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-1])); - } + if (current_storage_class & CPPInstance::SC_const) { + (yyvsp[(1) - (4)].u.inst_ident)->add_modifier(IIT_const); } + CPPInstance *inst = new CPPInstance(current_type, (yyvsp[(1) - (4)].u.inst_ident), + current_storage_class, + (yylsp[(1) - (4)]).file); + inst->set_initializer((yyvsp[(2) - (4)].u.expr)); + current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[(1) - (4)])); } -#line 4483 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 71: -#line 997 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 982 "dtool/src/cppparser/cppBison.yxx" { - if (current_storage_class & CPPInstance::SC_const) { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + // We don't need to push/pop type, because we can't nest + // multiple_var_declarations. + if ((yyvsp[(2) - (2)].u.decl)->as_type_declaration()) { + current_type = (yyvsp[(2) - (2)].u.decl)->as_type_declaration()->_type; + } else { + current_type = (yyvsp[(2) - (2)].u.decl)->as_type(); } - CPPType *target_type = current_type; - CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-1].u.inst_ident), current_scope, (yylsp[-1]).file); - current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-1])); + push_storage_class((yyvsp[(1) - (2)].u.integer)); } -#line 4496 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 72: -#line 1006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 993 "dtool/src/cppparser/cppBison.yxx" { - if (current_storage_class & CPPInstance::SC_const) { - (yyvsp[-3].u.inst_ident)->add_modifier(IIT_const); - } - CPPType *target_type = current_type; - CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-3].u.inst_ident), current_scope, (yylsp[-3]).file); - current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-3])); + pop_storage_class(); } -#line 4509 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 73: -#line 1020 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 997 "dtool/src/cppparser/cppBison.yxx" { - push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); + if ((yyvsp[(2) - (3)].u.instance) != (CPPDeclaration *)NULL) { + CPPInstance *inst = (yyvsp[(2) - (3)].u.instance)->as_instance(); + if (inst != (CPPInstance *)NULL) { + inst->_storage_class |= (current_storage_class | (yyvsp[(1) - (3)].u.integer)); + current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[(2) - (3)])); + CPPTypedefType *typedef_type = new CPPTypedefType(inst->_type, inst->_ident, current_scope); + current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[(2) - (3)])); + } + } } -#line 4517 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 74: -#line 1024 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1012 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type; - if ((yyvsp[-5].u.identifier)->get_simple_name() == current_scope->get_simple_name() || - (yyvsp[-5].u.identifier)->get_simple_name() == string("~") + current_scope->get_simple_name()) { - // This is a constructor, and has no return. - type = new CPPSimpleType(CPPSimpleType::T_void); - } else { - // This isn't a constructor, so it has an implicit return type of - // int. - yywarning("function has no return type, assuming int", (yylsp[-5])); - type = new CPPSimpleType(CPPSimpleType::T_int); + if (current_storage_class & CPPInstance::SC_const) { + (yyvsp[(1) - (2)].u.inst_ident)->add_modifier(IIT_const); } - pop_scope(); - - CPPInstanceIdentifier *ii = new CPPInstanceIdentifier((yyvsp[-5].u.identifier)); - ii->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); - - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); + CPPType *target_type = current_type; + CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[(1) - (2)].u.inst_ident), current_scope, (yylsp[(1) - (2)]).file); + current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[(1) - (2)])); } -#line 4541 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 75: -#line 1044 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1021 "dtool/src/cppparser/cppBison.yxx" { - push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); + if (current_storage_class & CPPInstance::SC_const) { + (yyvsp[(1) - (4)].u.inst_ident)->add_modifier(IIT_const); + } + CPPType *target_type = current_type; + CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[(1) - (4)].u.inst_ident), current_scope, (yylsp[(1) - (4)]).file); + current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[(1) - (4)])); } -#line 4549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 76: -#line 1048 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1035 "dtool/src/cppparser/cppBison.yxx" + { + push_scope((yyvsp[(1) - (2)].u.identifier)->get_scope(current_scope, global_scope)); +} + break; + + case 77: +/* Line 1792 of yacc.c */ +#line 1039 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type; + if ((yyvsp[(1) - (6)].u.identifier)->get_simple_name() == current_scope->get_simple_name() || + (yyvsp[(1) - (6)].u.identifier)->get_simple_name() == string("~") + current_scope->get_simple_name()) { + // This is a constructor, and has no return. + type = new CPPSimpleType(CPPSimpleType::T_void); + } else { + // This isn't a constructor, so it has an implicit return type of + // int. + yywarning("function has no return type, assuming int", (yylsp[(1) - (6)])); + type = new CPPSimpleType(CPPSimpleType::T_int); + } + pop_scope(); + + CPPInstanceIdentifier *ii = new CPPInstanceIdentifier((yyvsp[(1) - (6)].u.identifier)); + ii->add_func_modifier((yyvsp[(4) - (6)].u.param_list), (yyvsp[(6) - (6)].u.integer)); + + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(1) - (6)]).file); +} + break; + + case 78: +/* Line 1792 of yacc.c */ +#line 1059 "dtool/src/cppparser/cppBison.yxx" + { + push_scope((yyvsp[(1) - (2)].u.identifier)->get_scope(current_scope, global_scope)); +} + break; + + case 79: +/* Line 1792 of yacc.c */ +#line 1063 "dtool/src/cppparser/cppBison.yxx" { pop_scope(); CPPType *type; - if ((yyvsp[-5].u.identifier)->get_simple_name() == current_scope->get_simple_name()) { + if ((yyvsp[(1) - (6)].u.identifier)->get_simple_name() == current_scope->get_simple_name()) { // This is a constructor, and has no return. type = new CPPSimpleType(CPPSimpleType::T_void); } else { @@ -4562,111 +5259,111 @@ yyreduce: type = new CPPSimpleType(CPPSimpleType::T_int); } - CPPInstanceIdentifier *ii = new CPPInstanceIdentifier((yyvsp[-5].u.identifier)); - ii->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); + CPPInstanceIdentifier *ii = new CPPInstanceIdentifier((yyvsp[(1) - (6)].u.identifier)); + ii->add_func_modifier((yyvsp[(4) - (6)].u.param_list), (yyvsp[(6) - (6)].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(1) - (6)]).file); } -#line 4571 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 77: -#line 1071 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 80: +/* Line 1792 of yacc.c */ +#line 1086 "dtool/src/cppparser/cppBison.yxx" { - push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); + push_scope((yyvsp[(2) - (3)].u.identifier)->get_scope(current_scope, global_scope)); } -#line 4579 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 78: -#line 1075 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 81: +/* Line 1792 of yacc.c */ +#line 1090 "dtool/src/cppparser/cppBison.yxx" { pop_scope(); - if ((yyvsp[-5].u.identifier)->is_scoped()) { - yyerror("Invalid destructor name: ~" + (yyvsp[-5].u.identifier)->get_fully_scoped_name(), (yylsp[-5])); + if ((yyvsp[(2) - (7)].u.identifier)->is_scoped()) { + yyerror("Invalid destructor name: ~" + (yyvsp[(2) - (7)].u.identifier)->get_fully_scoped_name(), (yylsp[(2) - (7)])); } else { CPPIdentifier *ident = - new CPPIdentifier("~" + (yyvsp[-5].u.identifier)->get_simple_name(), (yylsp[-5])); - delete (yyvsp[-5].u.identifier); + new CPPIdentifier("~" + (yyvsp[(2) - (7)].u.identifier)->get_simple_name(), (yylsp[(2) - (7)])); + delete (yyvsp[(2) - (7)].u.identifier); CPPType *type; type = new CPPSimpleType(CPPSimpleType::T_void); CPPInstanceIdentifier *ii = new CPPInstanceIdentifier(ident); - ii->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); + ii->add_func_modifier((yyvsp[(5) - (7)].u.param_list), (yyvsp[(7) - (7)].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(2) - (7)]).file); } } -#line 4602 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 79: -#line 1101 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); -} -#line 4610 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 80: -#line 1105 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - pop_scope(); - CPPType *type = (yyvsp[-10].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[-10].u.identifier)->get_fully_scoped_name(), (yylsp[-10])); - } - assert(type != NULL); - - CPPInstanceIdentifier *ii = (yyvsp[-7].u.inst_ident); - ii->add_modifier(IIT_pointer); - ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-10]).file); -} -#line 4628 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 81: -#line 1119 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); -} -#line 4636 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 82: -#line 1123 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1116 "dtool/src/cppparser/cppBison.yxx" { - pop_scope(); - CPPType *type = (yyvsp[-11].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[-11].u.identifier)->get_fully_scoped_name(), (yylsp[-11])); - } - assert(type != NULL); - - CPPInstanceIdentifier *ii = (yyvsp[-7].u.inst_ident); - ii->add_scoped_pointer_modifier((yyvsp[-9].u.identifier)); - ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-11]).file); + push_scope((yyvsp[(4) - (6)].u.inst_ident)->get_scope(current_scope, global_scope)); } -#line 4654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 83: -#line 1139 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1120 "dtool/src/cppparser/cppBison.yxx" { - if ((yyvsp[-3].u.identifier) != NULL) { - push_scope((yyvsp[-3].u.identifier)->get_scope(current_scope, global_scope)); + pop_scope(); + CPPType *type = (yyvsp[(1) - (11)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (11)])); } + assert(type != NULL); + + CPPInstanceIdentifier *ii = (yyvsp[(4) - (11)].u.inst_ident); + ii->add_modifier(IIT_pointer); + ii->add_func_modifier((yyvsp[(8) - (11)].u.param_list), (yyvsp[(10) - (11)].u.integer)); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(1) - (11)]).file); } -#line 4664 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 84: -#line 1145 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1134 "dtool/src/cppparser/cppBison.yxx" { - if ((yyvsp[-7].u.identifier) != NULL) { + push_scope((yyvsp[(5) - (7)].u.inst_ident)->get_scope(current_scope, global_scope)); +} + break; + + case 85: +/* Line 1792 of yacc.c */ +#line 1138 "dtool/src/cppparser/cppBison.yxx" + { + pop_scope(); + CPPType *type = (yyvsp[(1) - (12)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (12)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (12)])); + } + assert(type != NULL); + + CPPInstanceIdentifier *ii = (yyvsp[(5) - (12)].u.inst_ident); + ii->add_scoped_pointer_modifier((yyvsp[(3) - (12)].u.identifier)); + ii->add_func_modifier((yyvsp[(9) - (12)].u.param_list), (yyvsp[(11) - (12)].u.integer)); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(1) - (12)]).file); +} + break; + + case 86: +/* Line 1792 of yacc.c */ +#line 1154 "dtool/src/cppparser/cppBison.yxx" + { + if ((yyvsp[(1) - (4)].u.identifier) != NULL) { + push_scope((yyvsp[(1) - (4)].u.identifier)->get_scope(current_scope, global_scope)); + } +} + break; + + case 87: +/* Line 1792 of yacc.c */ +#line 1160 "dtool/src/cppparser/cppBison.yxx" + { + if ((yyvsp[(1) - (8)].u.identifier) != NULL) { pop_scope(); } @@ -4679,755 +5376,772 @@ yyreduce: // We give typecast operators the name "operator typecast ", // where is a simple name of the type to be typecast. Use // the method's return type to determine the full type description. - string name = "operator typecast " + (yyvsp[-6].u.type)->get_simple_name(); - CPPIdentifier *ident = (yyvsp[-7].u.identifier); + string name = "operator typecast " + (yyvsp[(2) - (8)].u.type)->get_simple_name(); + CPPIdentifier *ident = (yyvsp[(1) - (8)].u.identifier); if (ident == NULL) { - ident = new CPPIdentifier(name, (yylsp[-6])); + ident = new CPPIdentifier(name, (yylsp[(2) - (8)])); } else { ident->add_name(name); } (yyval.u.instance) = CPPInstance::make_typecast_function - (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); + (new CPPInstance((yyvsp[(2) - (8)].u.type), (yyvsp[(3) - (8)].u.inst_ident), 0, (yylsp[(3) - (8)]).file), ident, (yyvsp[(6) - (8)].u.param_list), (yyvsp[(8) - (8)].u.integer)); } -#line 4693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 85: -#line 1170 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 88: +/* Line 1792 of yacc.c */ +#line 1185 "dtool/src/cppparser/cppBison.yxx" { - if ((yyvsp[-4].u.identifier) != NULL) { - push_scope((yyvsp[-4].u.identifier)->get_scope(current_scope, global_scope)); + if ((yyvsp[(1) - (5)].u.identifier) != NULL) { + push_scope((yyvsp[(1) - (5)].u.identifier)->get_scope(current_scope, global_scope)); } } -#line 4703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 86: -#line 1176 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 89: +/* Line 1792 of yacc.c */ +#line 1191 "dtool/src/cppparser/cppBison.yxx" { - if ((yyvsp[-8].u.identifier) != NULL) { + if ((yyvsp[(1) - (9)].u.identifier) != NULL) { pop_scope(); } - CPPIdentifier *ident = (yyvsp[-8].u.identifier); + CPPIdentifier *ident = (yyvsp[(1) - (9)].u.identifier); if (ident == NULL) { - ident = new CPPIdentifier("operator typecast", (yylsp[-5])); + ident = new CPPIdentifier("operator typecast", (yylsp[(4) - (9)])); } else { ident->add_name("operator typecast"); } - (yyvsp[-5].u.inst_ident)->add_modifier(IIT_const); + (yyvsp[(4) - (9)].u.inst_ident)->add_modifier(IIT_const); (yyval.u.instance) = CPPInstance::make_typecast_function - (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); + (new CPPInstance((yyvsp[(3) - (9)].u.type), (yyvsp[(4) - (9)].u.inst_ident), 0, (yylsp[(4) - (9)]).file), ident, (yyvsp[(7) - (9)].u.param_list), (yyvsp[(9) - (9)].u.integer)); } -#line 4723 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 87: -#line 1196 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 90: +/* Line 1792 of yacc.c */ +#line 1211 "dtool/src/cppparser/cppBison.yxx" { CPPDeclaration *decl = - (yyvsp[0].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + (yyvsp[(1) - (1)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (decl != (CPPDeclaration *)NULL) { (yyval.u.instance) = decl->as_instance(); } else { (yyval.u.instance) = (CPPInstance *)NULL; } } -#line 4737 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 88: -#line 1209 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = 0; -} -#line 4745 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 89: -#line 1213 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_const_method; -} -#line 4753 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 90: -#line 1217 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_volatile_method; -} -#line 4761 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 91: -#line 1221 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1224 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_noexcept; + (yyval.u.integer) = 0; } -#line 4769 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 92: -#line 1225 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1228 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_final; + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_const_method; } -#line 4777 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 93: -#line 1229 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1232 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_override; + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_volatile_method; } -#line 4785 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 94: -#line 1233 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1236 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_lvalue_method; + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_noexcept; } -#line 4793 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 95: -#line 1237 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1249 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_rvalue_method; + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_final; } -#line 4801 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 96: -#line 1241 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1253 "dtool/src/cppparser/cppBison.yxx" { - // Used for lambdas, currently ignored. - (yyval.u.integer) = (yyvsp[-1].u.integer); + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_override; } -#line 4810 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 97: -#line 1246 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1257 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[-3].u.integer); + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_lvalue_method; } -#line 4818 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 98: -#line 1250 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1261 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[-4].u.integer); + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_rvalue_method; } -#line 4826 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 99: -#line 1254 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1265 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.integer) = (yyvsp[-5].u.integer); + // Used for lambdas, currently ignored. + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer); } -#line 4834 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 100: -#line 1265 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1270 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "!"; + // Used for lambdas in C++17, currently ignored. + (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer); } -#line 4842 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 101: -#line 1269 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1275 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "~"; + (yyval.u.integer) = (yyvsp[(1) - (4)].u.integer); } -#line 4850 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 102: -#line 1273 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1279 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "*"; + (yyval.u.integer) = (yyvsp[(1) - (5)].u.integer); } -#line 4858 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 103: -#line 1277 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1283 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "/"; + (yyval.u.integer) = (yyvsp[(1) - (6)].u.integer); } -#line 4866 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 104: -#line 1281 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1287 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "%"; + (yyval.u.integer) = (yyvsp[(1) - (4)].u.integer); } -#line 4874 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 105: -#line 1285 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1294 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "+"; + (yyval.str) = "!"; } -#line 4882 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 106: -#line 1289 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1298 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "-"; + (yyval.str) = "~"; } -#line 4890 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 107: -#line 1293 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1302 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "|"; + (yyval.str) = "*"; } -#line 4898 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 108: -#line 1297 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1306 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "&"; + (yyval.str) = "/"; } -#line 4906 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 109: -#line 1301 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1310 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "^"; + (yyval.str) = "%"; } -#line 4914 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 110: -#line 1305 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1314 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "||"; + (yyval.str) = "+"; } -#line 4922 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 111: -#line 1309 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1318 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "&&"; + (yyval.str) = "-"; } -#line 4930 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 112: -#line 1313 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1322 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "=="; + (yyval.str) = "|"; } -#line 4938 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 113: -#line 1317 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1326 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "!="; + (yyval.str) = "&"; } -#line 4946 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 114: -#line 1321 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1330 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "<="; + (yyval.str) = "^"; } -#line 4954 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 115: -#line 1325 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1334 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = ">="; + (yyval.str) = "||"; } -#line 4962 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 116: -#line 1329 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1338 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "<"; + (yyval.str) = "&&"; } -#line 4970 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 117: -#line 1333 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1342 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = ">"; + (yyval.str) = "=="; } -#line 4978 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 118: -#line 1337 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1346 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "<<"; + (yyval.str) = "!="; } -#line 4986 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 119: -#line 1341 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1350 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = ">>"; + (yyval.str) = "<="; } -#line 4994 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 120: -#line 1345 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1354 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "="; + (yyval.str) = ">="; } -#line 5002 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 121: -#line 1349 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1358 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = ","; + (yyval.str) = "<"; } -#line 5010 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 122: -#line 1353 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1362 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "++"; + (yyval.str) = ">"; } -#line 5018 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 123: -#line 1357 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1366 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "--"; + (yyval.str) = "<<"; } -#line 5026 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 124: -#line 1361 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1370 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "*="; + (yyval.str) = ">>"; } -#line 5034 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 125: -#line 1365 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1374 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "/="; + (yyval.str) = "="; } -#line 5042 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 126: -#line 1369 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1378 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "%="; + (yyval.str) = ","; } -#line 5050 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 127: -#line 1373 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1382 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "+="; + (yyval.str) = "++"; } -#line 5058 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 128: -#line 1377 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1386 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "-="; + (yyval.str) = "--"; } -#line 5066 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 129: -#line 1381 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1390 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "|="; + (yyval.str) = "*="; } -#line 5074 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 130: -#line 1385 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1394 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "&="; + (yyval.str) = "/="; } -#line 5082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 131: -#line 1389 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1398 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "^="; + (yyval.str) = "%="; } -#line 5090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 132: -#line 1393 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1402 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "<<="; + (yyval.str) = "+="; } -#line 5098 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 133: -#line 1397 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1406 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = ">>="; + (yyval.str) = "-="; } -#line 5106 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 134: -#line 1401 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1410 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "->"; + (yyval.str) = "|="; } -#line 5114 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 135: -#line 1405 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1414 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "[]"; + (yyval.str) = "&="; } -#line 5122 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 136: -#line 1409 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1418 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "()"; + (yyval.str) = "^="; } -#line 5130 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 137: -#line 1413 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1422 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "new"; + (yyval.str) = "<<="; } -#line 5138 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 138: -#line 1417 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1426 "dtool/src/cppparser/cppBison.yxx" { - (yyval.str) = "delete"; + (yyval.str) = ">>="; +} + break; + + case 139: +/* Line 1792 of yacc.c */ +#line 1430 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.str) = "->"; +} + break; + + case 140: +/* Line 1792 of yacc.c */ +#line 1434 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.str) = "[]"; } -#line 5146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 141: -#line 1429 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1438 "dtool/src/cppparser/cppBison.yxx" { - push_scope(new CPPTemplateScope(current_scope)); + (yyval.str) = "()"; } -#line 5154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 142: -#line 1433 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1442 "dtool/src/cppparser/cppBison.yxx" { - pop_scope(); + (yyval.str) = "new"; } -#line 5162 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 146: -#line 1446 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 143: +/* Line 1792 of yacc.c */ +#line 1446 "dtool/src/cppparser/cppBison.yxx" { - CPPTemplateScope *ts = current_scope->as_template_scope(); - assert(ts != NULL); - ts->add_template_parameter((yyvsp[0].u.decl)); + (yyval.str) = "delete"; } -#line 5172 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 147: -#line 1452 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1459 "dtool/src/cppparser/cppBison.yxx" { - CPPTemplateScope *ts = current_scope->as_template_scope(); - assert(ts != NULL); - ts->add_template_parameter((yyvsp[0].u.decl)); + push_scope(new CPPTemplateScope(current_scope)); } -#line 5182 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 150: -#line 1466 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 148: +/* Line 1792 of yacc.c */ +#line 1463 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); + pop_scope(); } -#line 5190 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 151: -#line 1470 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[0].u.identifier))); -} -#line 5198 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 152: -#line 1474 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1476 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[-2].u.identifier), (yyvsp[0].u.type))); + CPPTemplateScope *ts = current_scope->as_template_scope(); + assert(ts != NULL); + ts->add_template_parameter((yyvsp[(1) - (1)].u.decl)); } -#line 5206 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 153: -#line 1478 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1482 "dtool/src/cppparser/cppBison.yxx" + { + CPPTemplateScope *ts = current_scope->as_template_scope(); + assert(ts != NULL); + ts->add_template_parameter((yyvsp[(3) - (3)].u.decl)); +} + break; + + case 156: +/* Line 1792 of yacc.c */ +#line 1496 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); +} + break; + + case 157: +/* Line 1792 of yacc.c */ +#line 1500 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[(2) - (2)].u.identifier))); +} + break; + + case 158: +/* Line 1792 of yacc.c */ +#line 1504 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[(2) - (4)].u.identifier), (yyvsp[(4) - (4)].u.type))); +} + break; + + case 159: +/* Line 1792 of yacc.c */ +#line 1508 "dtool/src/cppparser/cppBison.yxx" { CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((CPPIdentifier *)NULL); ctp->_packed = true; (yyval.u.decl) = CPPType::new_type(ctp); } -#line 5216 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 154: -#line 1484 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[0].u.identifier)); - ctp->_packed = true; - (yyval.u.decl) = CPPType::new_type(ctp); -} -#line 5226 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 155: -#line 1490 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPInstance *inst = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - inst->set_initializer((yyvsp[0].u.expr)); - (yyval.u.decl) = inst; -} -#line 5236 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 156: -#line 1496 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - CPPInstance *inst = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - inst->set_initializer((yyvsp[0].u.expr)); - (yyval.u.decl) = inst; -} -#line 5247 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 157: -#line 1503 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); - (yyval.u.decl) = inst; -} -#line 5256 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 158: -#line 1508 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); - CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); - (yyval.u.decl) = inst; -} -#line 5266 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 159: -#line 1517 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); -} -#line 5274 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 160: -#line 1521 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1514 "dtool/src/cppparser/cppBison.yxx" { - yywarning("Not a type: " + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); + CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[(3) - (3)].u.identifier)); + ctp->_packed = true; + (yyval.u.decl) = CPPType::new_type(ctp); } -#line 5283 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 161: -#line 1526 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1520 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - } - assert((yyval.u.type) != NULL); + CPPInstance *inst = new CPPInstance((yyvsp[(1) - (3)].u.type), (yyvsp[(2) - (3)].u.inst_ident), 0, (yylsp[(2) - (3)]).file); + inst->set_initializer((yyvsp[(3) - (3)].u.expr)); + (yyval.u.decl) = inst; } -#line 5295 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 162: -#line 1534 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1526 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - } - assert((yyval.u.type) != NULL); + (yyvsp[(3) - (4)].u.inst_ident)->add_modifier(IIT_const); + CPPInstance *inst = new CPPInstance((yyvsp[(2) - (4)].u.type), (yyvsp[(3) - (4)].u.inst_ident), 0, (yylsp[(3) - (4)]).file); + inst->set_initializer((yyvsp[(4) - (4)].u.expr)); + (yyval.u.decl) = inst; } -#line 5307 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 163: -#line 1546 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1533 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + CPPInstance *inst = new CPPInstance((yyvsp[(1) - (2)].u.type), (yyvsp[(2) - (2)].u.inst_ident), 0, (yylsp[(2) - (2)]).file); + (yyval.u.decl) = inst; } -#line 5315 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 164: -#line 1550 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1538 "dtool/src/cppparser/cppBison.yxx" + { + (yyvsp[(3) - (3)].u.inst_ident)->add_modifier(IIT_const); + CPPInstance *inst = new CPPInstance((yyvsp[(2) - (3)].u.type), (yyvsp[(3) - (3)].u.inst_ident), 0, (yylsp[(3) - (3)]).file); + (yyval.u.decl) = inst; +} + break; + + case 165: +/* Line 1792 of yacc.c */ +#line 1547 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); +} + break; + + case 166: +/* Line 1792 of yacc.c */ +#line 1551 "dtool/src/cppparser/cppBison.yxx" + { + yywarning("Not a type: " + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); +} + break; + + case 167: +/* Line 1792 of yacc.c */ +#line 1556 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); + } + assert((yyval.u.type) != NULL); +} + break; + + case 168: +/* Line 1792 of yacc.c */ +#line 1564 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); + } + assert((yyval.u.type) != NULL); +} + break; + + case 169: +/* Line 1792 of yacc.c */ +#line 1576 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(1) - (1)].u.identifier)); +} + break; + + case 170: +/* Line 1792 of yacc.c */ +#line 1580 "dtool/src/cppparser/cppBison.yxx" { // For an operator function. We implement this simply by building a // ficticious name for the function; in other respects it's just // like a regular function. - CPPIdentifier *ident = (yyvsp[-1].u.identifier); + CPPIdentifier *ident = (yyvsp[(1) - (2)].u.identifier); if (ident == NULL) { - ident = new CPPIdentifier("operator "+(yyvsp[0].str), (yylsp[0])); + ident = new CPPIdentifier("operator "+(yyvsp[(2) - (2)].str), (yylsp[(2) - (2)])); } else { - ident->_names.push_back("operator "+(yyvsp[0].str)); + ident->_names.push_back("operator "+(yyvsp[(2) - (2)].str)); } (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } -#line 5333 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 165: -#line 1564 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - // A C++11 literal operator. - if (!(yyvsp[-1].str).empty()) { - yyerror("expected empty string", (yylsp[-1])); - } - CPPIdentifier *ident = (yyvsp[-2].u.identifier); - if (ident == NULL) { - ident = new CPPIdentifier("operator \"\" "+(yyvsp[0].u.identifier)->get_simple_name(), (yylsp[0])); - } else { - ident->_names.push_back("operator \"\" "+(yyvsp[0].u.identifier)->get_simple_name()); - } - - (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); -} -#line 5352 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 166: -#line 1579 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); -} -#line 5361 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 167: -#line 1584 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); -} -#line 5370 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 168: -#line 1589 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); -} -#line 5379 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 169: -#line 1594 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); -} -#line 5388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 170: -#line 1599 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); -} -#line 5397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 171: -#line 1604 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1594 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); + // A C++11 literal operator. + if (!(yyvsp[(2) - (3)].str).empty()) { + yyerror("expected empty string", (yylsp[(2) - (3)])); + } + CPPIdentifier *ident = (yyvsp[(1) - (3)].u.identifier); + if (ident == NULL) { + ident = new CPPIdentifier("operator \"\" "+(yyvsp[(3) - (3)].u.identifier)->get_simple_name(), (yylsp[(3) - (3)])); + } else { + ident->_names.push_back("operator \"\" "+(yyvsp[(3) - (3)].u.identifier)->get_simple_name()); + } + + (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } -#line 5406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 172: -#line 1609 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1609 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 5415 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 173: -#line 1614 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1614 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 5424 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 174: -#line 1619 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1619 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); +} + break; + + case 175: +/* Line 1792 of yacc.c */ +#line 1624 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); +} + break; + + case 176: +/* Line 1792 of yacc.c */ +#line 1629 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); +} + break; + + case 177: +/* Line 1792 of yacc.c */ +#line 1634 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); +} + break; + + case 178: +/* Line 1792 of yacc.c */ +#line 1639 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); +} + break; + + case 179: +/* Line 1792 of yacc.c */ +#line 1644 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.inst_ident) = (yyvsp[(2) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); +} + break; + + case 180: +/* Line 1792 of yacc.c */ +#line 1649 "dtool/src/cppparser/cppBison.yxx" { // Create a scope for this function (in case it is a function) - CPPScope *scope = new CPPScope((yyvsp[-1].u.inst_ident)->get_scope(current_scope, global_scope), + CPPScope *scope = new CPPScope((yyvsp[(1) - (2)].u.inst_ident)->get_scope(current_scope, global_scope), CPPNameComponent(""), V_private); // It still needs to be able to pick up any template arguments, if this is @@ -5437,3665 +6151,3837 @@ yyreduce: push_scope(scope); } -#line 5432 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 175: -#line 1623 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 181: +/* Line 1792 of yacc.c */ +#line 1662 "dtool/src/cppparser/cppBison.yxx" { pop_scope(); - (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); - if ((yyvsp[-2].u.param_list)->is_parameter_expr() && (yyvsp[0].u.integer) == 0) { + (yyval.u.inst_ident) = (yyvsp[(1) - (6)].u.inst_ident); + if ((yyvsp[(4) - (6)].u.param_list)->is_parameter_expr() && (yyvsp[(6) - (6)].u.integer) == 0) { // Oops, this must have been an instance declaration with a // parameter list, not a function prototype. - (yyval.u.inst_ident)->add_initializer_modifier((yyvsp[-2].u.param_list)); + (yyval.u.inst_ident)->add_initializer_modifier((yyvsp[(4) - (6)].u.param_list)); } else { // This was (probably) a function prototype. - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[(4) - (6)].u.param_list), (yyvsp[(6) - (6)].u.integer)); } } -#line 5450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 176: -#line 1641 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 182: +/* Line 1792 of yacc.c */ +#line 1680 "dtool/src/cppparser/cppBison.yxx" { // This is handled a bit awkwardly right now. Ideally it'd be wrapped // up in the instance_identifier rule, but then more needs to happen in // order to avoid shift/reduce conflicts. - if ((yyvsp[0].u.type) != NULL) { - (yyvsp[-1].u.inst_ident)->add_trailing_return_type((yyvsp[0].u.type)); + if ((yyvsp[(2) - (2)].u.type) != NULL) { + (yyvsp[(1) - (2)].u.inst_ident)->add_trailing_return_type((yyvsp[(2) - (2)].u.type)); } - (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); + (yyval.u.inst_ident) = (yyvsp[(1) - (2)].u.inst_ident); } -#line 5464 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 177: -#line 1651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - // Bitfield definition. - (yyvsp[-2].u.inst_ident)->_bit_width = (yyvsp[0].u.integer); - (yyval.u.inst_ident) = (yyvsp[-2].u.inst_ident); -} -#line 5474 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 178: -#line 1661 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = NULL; -} -#line 5482 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 179: -#line 1665 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); -} -#line 5490 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 180: -#line 1669 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); -} -#line 5499 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 181: -#line 1678 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; -} -#line 5507 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 182: -#line 1682 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_includes_ellipsis = true; -} -#line 5516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 183: -#line 1687 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1690 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = (yyvsp[0].u.param_list); + // Bitfield definition. + (yyvsp[(1) - (3)].u.inst_ident)->_bit_width = (yyvsp[(3) - (3)].u.integer); + (yyval.u.inst_ident) = (yyvsp[(1) - (3)].u.inst_ident); } -#line 5524 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 184: -#line 1691 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1700 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.type) = NULL; } -#line 5533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 185: -#line 1696 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1704 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = (yyvsp[-1].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.type) = (yyvsp[(3) - (3)].u.inst_ident)->unroll_type((yyvsp[(2) - (3)].u.type)); } -#line 5542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 186: -#line 1704 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1708 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); + (yyvsp[(4) - (4)].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.type) = (yyvsp[(4) - (4)].u.inst_ident)->unroll_type((yyvsp[(3) - (4)].u.type)); } -#line 5551 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 187: -#line 1709 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1717 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); + (yyval.u.param_list) = new CPPParameterList; } -#line 5560 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 188: -#line 1717 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1721 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5568 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 189: -#line 1721 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1726 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.param_list) = (yyvsp[(1) - (1)].u.param_list); } -#line 5577 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 190: -#line 1726 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1730 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = (yyvsp[0].u.param_list); + (yyval.u.param_list) = (yyvsp[(1) - (3)].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5585 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 191: -#line 1730 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1735 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list) = (yyvsp[(1) - (2)].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5594 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 192: -#line 1735 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1743 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = (yyvsp[-1].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_parameters.push_back((yyvsp[(1) - (1)].u.instance)); } -#line 5603 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 193: -#line 1743 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1748 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); + (yyval.u.param_list) = (yyvsp[(1) - (3)].u.param_list); + (yyval.u.param_list)->_parameters.push_back((yyvsp[(3) - (3)].u.instance)); } -#line 5612 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 194: -#line 1748 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1756 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); + (yyval.u.param_list) = new CPPParameterList; } -#line 5621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 195: -#line 1756 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1760 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5629 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 196: -#line 1760 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1765 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.param_list) = (yyvsp[(1) - (1)].u.param_list); } -#line 5637 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 197: -#line 1767 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1769 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.param_list) = (yyvsp[(1) - (3)].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5645 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 198: -#line 1771 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1774 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.param_list) = (yyvsp[(1) - (2)].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5653 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 199: -#line 1778 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1782 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_parameters.push_back((yyvsp[(1) - (1)].u.instance)); } -#line 5661 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 200: -#line 1782 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1787 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.param_list) = (yyvsp[(1) - (3)].u.param_list); + (yyval.u.param_list)->_parameters.push_back((yyvsp[(3) - (3)].u.instance)); } -#line 5669 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 201: -#line 1786 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1795 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5677 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 202: -#line 1790 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1799 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); + (yyval.u.expr) = (yyvsp[(2) - (2)].u.expr); } -#line 5685 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 203: -#line 1794 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1806 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 204: -#line 1801 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1810 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.expr) = (yyvsp[(2) - (2)].u.expr); } -#line 5701 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 205: -#line 1805 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1817 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5709 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 206: -#line 1809 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[-1].u.expr); -} -#line 5717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 207: -#line 1813 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); -} -#line 5725 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 208: -#line 1817 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); -} -#line 5733 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 209: -#line 1821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1821 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5741 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 207: +/* Line 1792 of yacc.c */ +#line 1825 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = (CPPExpression *)NULL; +} + break; + + case 208: +/* Line 1792 of yacc.c */ +#line 1829 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); +} + break; + + case 209: +/* Line 1792 of yacc.c */ +#line 1833 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); +} + break; + + case 210: +/* Line 1792 of yacc.c */ +#line 1840 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = (CPPExpression *)NULL; +} + break; + + case 211: +/* Line 1792 of yacc.c */ +#line 1844 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = (CPPExpression *)NULL; +} + break; + + case 212: +/* Line 1792 of yacc.c */ +#line 1848 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); +} break; case 213: -#line 1834 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1852 "dtool/src/cppparser/cppBison.yxx" { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); } -#line 5748 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 217: -#line 1843 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 214: +/* Line 1792 of yacc.c */ +#line 1856 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); } -#line 5757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 218: -#line 1848 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 215: +/* Line 1792 of yacc.c */ +#line 1860 "dtool/src/cppparser/cppBison.yxx" { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5767 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 219: -#line 1854 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1873 "dtool/src/cppparser/cppBison.yxx" { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 5777 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 220: -#line 1860 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); -} -#line 5786 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 221: -#line 1865 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); -} -#line 5796 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 222: -#line 1871 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); -} -#line 5806 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 223: -#line 1877 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1882 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.instance) = (yyvsp[0].u.instance); + (yyval.u.instance) = new CPPInstance((yyvsp[(1) - (3)].u.type), (yyvsp[(2) - (3)].u.inst_ident), 0, (yylsp[(2) - (3)]).file); + (yyval.u.instance)->set_initializer((yyvsp[(3) - (3)].u.expr)); } -#line 5814 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 224: -#line 1888 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1887 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.instance) = (yyvsp[0].u.instance); + (yyvsp[(3) - (4)].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[(2) - (4)].u.type), (yyvsp[(3) - (4)].u.inst_ident), 0, (yylsp[(3) - (4)]).file); + (yyval.u.instance)->set_initializer((yyvsp[(4) - (4)].u.expr)); } -#line 5822 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 225: -#line 1892 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1893 "dtool/src/cppparser/cppBison.yxx" + { + (yyvsp[(4) - (5)].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[(3) - (5)].u.type), (yyvsp[(4) - (5)].u.inst_ident), 0, (yylsp[(3) - (5)]).file); + (yyval.u.instance)->set_initializer((yyvsp[(5) - (5)].u.expr)); +} + break; + + case 226: +/* Line 1792 of yacc.c */ +#line 1899 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.instance) = new CPPInstance((yyvsp[(1) - (3)].u.type), (yyvsp[(2) - (3)].u.inst_ident), 0, (yylsp[(2) - (3)]).file); + (yyval.u.instance)->set_initializer((yyvsp[(3) - (3)].u.expr)); +} + break; + + case 227: +/* Line 1792 of yacc.c */ +#line 1904 "dtool/src/cppparser/cppBison.yxx" + { + (yyvsp[(3) - (4)].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[(2) - (4)].u.type), (yyvsp[(3) - (4)].u.inst_ident), 0, (yylsp[(3) - (4)]).file); + (yyval.u.instance)->set_initializer((yyvsp[(4) - (4)].u.expr)); +} + break; + + case 228: +/* Line 1792 of yacc.c */ +#line 1910 "dtool/src/cppparser/cppBison.yxx" + { + (yyvsp[(4) - (5)].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[(3) - (5)].u.type), (yyvsp[(4) - (5)].u.inst_ident), 0, (yylsp[(3) - (5)]).file); + (yyval.u.instance)->set_initializer((yyvsp[(5) - (5)].u.expr)); +} + break; + + case 229: +/* Line 1792 of yacc.c */ +#line 1916 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.instance) = (yyvsp[(2) - (2)].u.instance); +} + break; + + case 230: +/* Line 1792 of yacc.c */ +#line 1920 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.instance) = (yyvsp[(4) - (4)].u.instance); +} + break; + + case 231: +/* Line 1792 of yacc.c */ +#line 1931 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.instance) = (yyvsp[(1) - (1)].u.instance); +} + break; + + case 232: +/* Line 1792 of yacc.c */ +#line 1935 "dtool/src/cppparser/cppBison.yxx" { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_parameter)); (yyval.u.instance) = new CPPInstance(type, "expr"); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); + (yyval.u.instance)->set_initializer((yyvsp[(1) - (1)].u.expr)); } -#line 5833 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 226: -#line 1902 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); -} -#line 5841 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 227: -#line 1906 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); -} -#line 5849 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 228: -#line 1910 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); -} -#line 5858 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 229: -#line 1915 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); -} -#line 5867 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 230: -#line 1920 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); -} -#line 5876 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 231: -#line 1925 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); -} -#line 5885 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 232: -#line 1930 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); -} -#line 5894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 233: -#line 1935 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1945 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 5903 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 234: -#line 1940 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1949 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(1) - (1)].u.identifier)); } -#line 5912 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 235: -#line 1948 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1953 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 5920 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 236: -#line 1952 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1958 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 5928 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 237: -#line 1956 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1963 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 5937 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 238: -#line 1961 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1968 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 5946 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 239: -#line 1966 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1973 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 5955 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 240: -#line 1971 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1978 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); } -#line 5964 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 241: -#line 1976 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1983 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); } -#line 5973 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 242: -#line 1981 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1991 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 5982 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 243: -#line 1986 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1995 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(1) - (1)].u.identifier)); } -#line 5991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 244: -#line 1991 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 1999 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6001 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 245: -#line 1997 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2004 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6010 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 246: -#line 2005 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2009 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 247: -#line 2010 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2014 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6028 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 248: -#line 2015 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2019 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6037 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 249: -#line 2020 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2024 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); } -#line 6046 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 250: -#line 2025 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2029 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); } -#line 6055 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 251: -#line 2030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2034 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[(2) - (7)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[(5) - (7)].u.param_list), (yyvsp[(7) - (7)].u.integer)); } -#line 6064 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 252: -#line 2035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2040 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[(2) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 6073 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 253: -#line 2040 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2048 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; } -#line 6082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 254: -#line 2045 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2053 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(2) - (2)].u.identifier)); + (yyval.u.inst_ident)->_packed = true; } -#line 6091 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 255: -#line 2050 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2058 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6101 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 256: -#line 2056 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2063 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6110 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 257: -#line 2064 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2068 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6118 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 258: -#line 2068 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2073 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6127 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 259: -#line 2073 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2078 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6136 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 260: -#line 2078 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2083 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); } -#line 6145 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 261: -#line 2083 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2088 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); } -#line 6154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 262: -#line 2088 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2093 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[(2) - (7)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[(5) - (7)].u.param_list), (yyvsp[(7) - (7)].u.integer)); } -#line 6163 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 263: -#line 2093 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2099 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[(2) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 6172 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 264: -#line 2098 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2107 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6181 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 265: -#line 2103 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2111 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; } -#line 6190 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 266: -#line 2108 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2116 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(2) - (2)].u.identifier)); + (yyval.u.inst_ident)->_packed = true; } -#line 6199 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 267: -#line 2116 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2121 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6207 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 268: -#line 2120 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2126 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6216 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 269: -#line 2125 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2131 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6225 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 270: -#line 2130 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2136 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6234 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 271: -#line 2135 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2141 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6243 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 272: -#line 2140 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2146 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); } -#line 6252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 273: -#line 2145 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2151 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); } -#line 6261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 274: -#line 2150 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2159 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6270 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 275: -#line 2155 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2163 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; } -#line 6279 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 276: -#line 2160 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2168 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(2) - (2)].u.identifier)); + (yyval.u.inst_ident)->_packed = true; } -#line 6288 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 277: -#line 2165 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2173 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6298 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 278: -#line 2171 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2178 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6309 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 279: -#line 2178 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2183 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6320 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 280: -#line 2185 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2188 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6331 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 281: -#line 2195 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2193 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); + (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6339 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 282: -#line 2199 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2198 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - } - assert((yyval.u.type) != NULL); + (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); } -#line 6351 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 283: -#line 2207 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2203 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); + (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); } -#line 6359 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 284: -#line 2211 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2208 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[(2) - (5)].u.param_list), (yyvsp[(4) - (5)].u.integer), (yyvsp[(5) - (5)].u.type)); } -#line 6367 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 285: -#line 2215 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2214 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); + (yyval.u.inst_ident) = (yyvsp[(3) - (9)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[(6) - (9)].u.param_list), (yyvsp[(8) - (9)].u.integer), (yyvsp[(9) - (9)].u.type)); } -#line 6375 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 286: -#line 2219 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2221 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.enum_type)); + (yyval.u.inst_ident) = (yyvsp[(3) - (9)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[(6) - (9)].u.param_list), (yyvsp[(8) - (9)].u.integer), (yyvsp[(9) - (9)].u.type)); } -#line 6383 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 287: -#line 2223 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2228 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type != NULL) { - (yyval.u.type) = type; - } else { - CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-1]).file)) - ->as_extension_type(); - CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); - if (scope != NULL) { - scope->define_extension_type(et); - } - (yyval.u.type) = et; - } + (yyval.u.inst_ident) = (yyvsp[(3) - (9)].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[(6) - (9)].u.param_list), (yyvsp[(8) - (9)].u.integer), (yyvsp[(9) - (9)].u.type)); } -#line 6403 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 288: -#line 2239 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2238 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = (yyvsp[-2].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); +} + break; + + case 289: +/* Line 1792 of yacc.c */ +#line 2242 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); + } + assert((yyval.u.type) != NULL); +} + break; + + case 290: +/* Line 1792 of yacc.c */ +#line 2250 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[(2) - (2)].u.identifier))); +} + break; + + case 291: +/* Line 1792 of yacc.c */ +#line 2254 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.struct_type)); +} + break; + + case 292: +/* Line 1792 of yacc.c */ +#line 2258 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.struct_type)); +} + break; + + case 293: +/* Line 1792 of yacc.c */ +#line 2262 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.enum_type)); +} + break; + + case 294: +/* Line 1792 of yacc.c */ +#line 2266 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = (yyvsp[(3) - (3)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { (yyval.u.type) = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), current_scope, (yylsp[-3]).file)) + CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (3)].u.extension_enum), (yyvsp[(3) - (3)].u.identifier), current_scope, (yylsp[(1) - (3)]).file)) ->as_extension_type(); - CPPScope *scope = (yyvsp[-2].u.identifier)->get_scope(current_scope, global_scope); + CPPScope *scope = (yyvsp[(3) - (3)].u.identifier)->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } (yyval.u.type) = et; } } -#line 6423 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 289: -#line 2255 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 295: +/* Line 1792 of yacc.c */ +#line 2282 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = (yyvsp[-1].u.expr)->determine_type(); - if ((yyval.u.type) == (CPPType *)NULL) { - stringstream str; - str << *(yyvsp[-1].u.expr); - yyerror("could not determine type of " + str.str(), (yylsp[-1])); + CPPType *type = (yyvsp[(2) - (4)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type != NULL) { + (yyval.u.type) = type; + } else { + CPPExtensionType *et = + CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (4)].u.extension_enum), (yyvsp[(2) - (4)].u.identifier), current_scope, (yylsp[(1) - (4)]).file)) + ->as_extension_type(); + CPPScope *scope = (yyvsp[(2) - (4)].u.identifier)->get_scope(current_scope, global_scope); + if (scope != NULL) { + scope->define_extension_type(et); + } + (yyval.u.type) = et; } } -#line 6436 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 290: -#line 2264 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 296: +/* Line 1792 of yacc.c */ +#line 2298 "dtool/src/cppparser/cppBison.yxx" { - CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); + (yyval.u.type) = (yyvsp[(3) - (4)].u.expr)->determine_type(); + if ((yyval.u.type) == (CPPType *)NULL) { + stringstream str; + str << *(yyvsp[(3) - (4)].u.expr); + yyerror("could not determine type of " + str.str(), (yylsp[(3) - (4)])); + } +} + break; + + case 297: +/* Line 1792 of yacc.c */ +#line 2307 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); +} + break; + + case 298: +/* Line 1792 of yacc.c */ +#line 2311 "dtool/src/cppparser/cppBison.yxx" + { + CPPEnumType *enum_type = (yyvsp[(3) - (4)].u.type)->as_enum_type(); if (enum_type == NULL) { - yyerror("an enumeration type is required", (yylsp[-1])); - (yyval.u.type) = (yyvsp[-1].u.type); + yyerror("an enumeration type is required", (yylsp[(3) - (4)])); + (yyval.u.type) = (yyvsp[(3) - (4)].u.type); } else { (yyval.u.type) = enum_type->get_underlying_type(); } } -#line 6450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 291: -#line 2274 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} -#line 6458 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 292: -#line 2281 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - } - assert((yyval.u.type) != NULL); -} -#line 6470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 293: -#line 2292 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.simple_type)); -} -#line 6478 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 294: -#line 2296 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.decl) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - } - assert((yyval.u.decl) != NULL); -} -#line 6490 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 295: -#line 2304 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); -} -#line 6498 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 296: -#line 2308 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.struct_type)); -} -#line 6506 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 297: -#line 2312 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.struct_type))); -} -#line 6514 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 298: -#line 2316 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.enum_type))); -} -#line 6522 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 299: -#line 2320 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2321 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type != NULL) { - (yyval.u.decl) = type; - } else { - CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-1]).file)) - ->as_extension_type(); - CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); - if (scope != NULL) { - scope->define_extension_type(et); - } - (yyval.u.decl) = et; - } + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 300: -#line 2336 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2328 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = (yyvsp[-2].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type != NULL) { - (yyval.u.decl) = type; - } else { - CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), current_scope, (yylsp[-3]).file)) - ->as_extension_type(); - CPPScope *scope = (yyvsp[-2].u.identifier)->get_scope(current_scope, global_scope); - if (scope != NULL) { - scope->define_extension_type(et); - } - (yyval.u.decl) = et; + (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); } + assert((yyval.u.type) != NULL); } -#line 6562 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 301: -#line 2352 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2339 "dtool/src/cppparser/cppBison.yxx" { - yywarning(string("C++ does not permit forward declaration of untyped enum ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[-1])); + (yyval.u.decl) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); +} + break; - CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + case 302: +/* Line 1792 of yacc.c */ +#line 2343 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.decl) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); + } + assert((yyval.u.decl) != NULL); +} + break; + + case 303: +/* Line 1792 of yacc.c */ +#line 2351 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[(2) - (2)].u.identifier))); +} + break; + + case 304: +/* Line 1792 of yacc.c */ +#line 2355 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = CPPType::new_type((yyvsp[(1) - (1)].u.struct_type)); +} + break; + + case 305: +/* Line 1792 of yacc.c */ +#line 2359 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[(1) - (1)].u.struct_type))); +} + break; + + case 306: +/* Line 1792 of yacc.c */ +#line 2363 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[(1) - (1)].u.enum_type))); +} + break; + + case 307: +/* Line 1792 of yacc.c */ +#line 2367 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = (yyvsp[(3) - (3)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { (yyval.u.decl) = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-1]).file)) + CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (3)].u.extension_enum), (yyvsp[(3) - (3)].u.identifier), current_scope, (yylsp[(1) - (3)]).file)) ->as_extension_type(); - CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); + CPPScope *scope = (yyvsp[(3) - (3)].u.identifier)->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } (yyval.u.decl) = et; } } -#line 6584 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 302: -#line 2370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 308: +/* Line 1792 of yacc.c */ +#line 2383 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.decl) = (yyvsp[-1].u.expr)->determine_type(); - if ((yyval.u.decl) == (CPPType *)NULL) { - stringstream str; - str << *(yyvsp[-1].u.expr); - yyerror("could not determine type of " + str.str(), (yylsp[-1])); + CPPType *type = (yyvsp[(2) - (4)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type != NULL) { + (yyval.u.decl) = type; + } else { + CPPExtensionType *et = + CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (4)].u.extension_enum), (yyvsp[(2) - (4)].u.identifier), current_scope, (yylsp[(1) - (4)]).file)) + ->as_extension_type(); + CPPScope *scope = (yyvsp[(2) - (4)].u.identifier)->get_scope(current_scope, global_scope); + if (scope != NULL) { + scope->define_extension_type(et); + } + (yyval.u.decl) = et; } } -#line 6597 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 303: -#line 2379 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 309: +/* Line 1792 of yacc.c */ +#line 2399 "dtool/src/cppparser/cppBison.yxx" { - CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); + yywarning(string("C++ does not permit forward declaration of untyped enum ") + (yyvsp[(2) - (2)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (2)])); + + CPPType *type = (yyvsp[(2) - (2)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type != NULL) { + (yyval.u.decl) = type; + } else { + CPPExtensionType *et = + CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (2)].u.extension_enum), (yyvsp[(2) - (2)].u.identifier), current_scope, (yylsp[(1) - (2)]).file)) + ->as_extension_type(); + CPPScope *scope = (yyvsp[(2) - (2)].u.identifier)->get_scope(current_scope, global_scope); + if (scope != NULL) { + scope->define_extension_type(et); + } + (yyval.u.decl) = et; + } +} + break; + + case 310: +/* Line 1792 of yacc.c */ +#line 2417 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = (yyvsp[(3) - (4)].u.expr)->determine_type(); + if ((yyval.u.decl) == (CPPType *)NULL) { + stringstream str; + str << *(yyvsp[(3) - (4)].u.expr); + yyerror("could not determine type of " + str.str(), (yylsp[(3) - (4)])); + } +} + break; + + case 311: +/* Line 1792 of yacc.c */ +#line 2426 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); +} + break; + + case 312: +/* Line 1792 of yacc.c */ +#line 2430 "dtool/src/cppparser/cppBison.yxx" + { + CPPEnumType *enum_type = (yyvsp[(3) - (4)].u.type)->as_enum_type(); if (enum_type == NULL) { - yyerror("an enumeration type is required", (yylsp[-1])); - (yyval.u.decl) = (yyvsp[-1].u.type); + yyerror("an enumeration type is required", (yylsp[(3) - (4)])); + (yyval.u.decl) = (yyvsp[(3) - (4)].u.type); } else { (yyval.u.decl) = enum_type->get_underlying_type(); } } -#line 6611 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 304: -#line 2389 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 313: +/* Line 1792 of yacc.c */ +#line 2440 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6619 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 305: -#line 2396 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 314: +/* Line 1792 of yacc.c */ +#line 2447 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); + (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); } -#line 6627 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 306: -#line 2400 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 315: +/* Line 1792 of yacc.c */ +#line 2451 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); } assert((yyval.u.type) != NULL); } -#line 6639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 307: -#line 2408 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 316: +/* Line 1792 of yacc.c */ +#line 2459 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[(2) - (2)].u.identifier))); } -#line 6647 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 308: -#line 2412 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 317: +/* Line 1792 of yacc.c */ +#line 2463 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + CPPType *type = (yyvsp[(3) - (3)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { (yyval.u.type) = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-1]).file)) + CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (3)].u.extension_enum), (yyvsp[(3) - (3)].u.identifier), current_scope, (yylsp[(1) - (3)]).file)) ->as_extension_type(); - CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); + CPPScope *scope = (yyvsp[(3) - (3)].u.identifier)->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } (yyval.u.type) = et; } } -#line 6667 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 309: -#line 2428 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 318: +/* Line 1792 of yacc.c */ +#line 2479 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + CPPType *type = (yyvsp[(2) - (2)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { (yyval.u.type) = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-1]).file)) + CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (2)].u.extension_enum), (yyvsp[(2) - (2)].u.identifier), current_scope, (yylsp[(1) - (2)]).file)) ->as_extension_type(); - CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); + CPPScope *scope = (yyvsp[(2) - (2)].u.identifier)->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } (yyval.u.type) = et; } } -#line 6687 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 310: -#line 2444 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 319: +/* Line 1792 of yacc.c */ +#line 2495 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = (yyvsp[-1].u.expr)->determine_type(); + (yyval.u.type) = (yyvsp[(3) - (4)].u.expr)->determine_type(); if ((yyval.u.type) == (CPPType *)NULL) { stringstream str; - str << *(yyvsp[-1].u.expr); - yyerror("could not determine type of " + str.str(), (yylsp[-1])); + str << *(yyvsp[(3) - (4)].u.expr); + yyerror("could not determine type of " + str.str(), (yylsp[(3) - (4)])); } } -#line 6700 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 311: -#line 2453 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 320: +/* Line 1792 of yacc.c */ +#line 2504 "dtool/src/cppparser/cppBison.yxx" { - CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); + CPPEnumType *enum_type = (yyvsp[(3) - (4)].u.type)->as_enum_type(); if (enum_type == NULL) { - yyerror("an enumeration type is required", (yylsp[-1])); - (yyval.u.type) = (yyvsp[-1].u.type); + yyerror("an enumeration type is required", (yylsp[(3) - (4)])); + (yyval.u.type) = (yyvsp[(3) - (4)].u.type); } else { (yyval.u.type) = enum_type->get_underlying_type(); } } -#line 6714 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 312: -#line 2463 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 321: +/* Line 1792 of yacc.c */ +#line 2514 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6722 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 313: -#line 2470 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 322: +/* Line 1792 of yacc.c */ +#line 2521 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.decl) = (yyvsp[0].u.decl); + (yyval.u.decl) = (yyvsp[(1) - (1)].u.decl); } -#line 6730 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 314: -#line 2474 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 323: +/* Line 1792 of yacc.c */ +#line 2525 "dtool/src/cppparser/cppBison.yxx" { - yyerror(string("unknown type '") + (yyvsp[0].u.identifier)->get_fully_scoped_name() + "'", (yylsp[0])); + yyerror(string("unknown type '") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name() + "'", (yylsp[(1) - (1)])); (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } -#line 6740 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 315: -#line 2482 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 324: +/* Line 1792 of yacc.c */ +#line 2533 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); + (yyval.u.type) = (yyvsp[(2) - (2)].u.inst_ident)->unroll_type((yyvsp[(1) - (2)].u.type)); } -#line 6748 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 316: -#line 2486 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 325: +/* Line 1792 of yacc.c */ +#line 2537 "dtool/src/cppparser/cppBison.yxx" { - (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); + (yyvsp[(3) - (3)].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.type) = (yyvsp[(3) - (3)].u.inst_ident)->unroll_type((yyvsp[(2) - (3)].u.type)); } -#line 6757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 317: -#line 2491 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 326: +/* Line 1792 of yacc.c */ +#line 2542 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); + (yyval.u.type) = (yyvsp[(2) - (2)].u.inst_ident)->unroll_type((yyvsp[(1) - (2)].u.type)); } -#line 6765 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 318: -#line 2495 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 327: +/* Line 1792 of yacc.c */ +#line 2546 "dtool/src/cppparser/cppBison.yxx" { - (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); + (yyvsp[(3) - (3)].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.type) = (yyvsp[(3) - (3)].u.inst_ident)->unroll_type((yyvsp[(2) - (3)].u.type)); } -#line 6774 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 319: -#line 2503 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 332: +/* Line 1792 of yacc.c */ +#line 2561 "dtool/src/cppparser/cppBison.yxx" { CPPVisibility starting_vis = - ((yyvsp[-1].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; + ((yyvsp[(1) - (3)].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; CPPScope *new_scope = new CPPScope(current_scope, CPPNameComponent("anon"), starting_vis); - CPPStructType *st = new CPPStructType((yyvsp[-1].u.extension_enum), NULL, current_scope, - new_scope, (yylsp[-1]).file); + CPPStructType *st = new CPPStructType((yyvsp[(1) - (3)].u.extension_enum), NULL, current_scope, + new_scope, (yylsp[(1) - (3)]).file); new_scope->set_struct_type(st); push_scope(new_scope); push_struct(st); } -#line 6792 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 320: -#line 2517 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 333: +/* Line 1792 of yacc.c */ +#line 2575 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.struct_type) = current_struct; current_struct->_incomplete = false; pop_struct(); pop_scope(); } -#line 6803 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 321: -#line 2527 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 334: +/* Line 1792 of yacc.c */ +#line 2585 "dtool/src/cppparser/cppBison.yxx" { CPPVisibility starting_vis = - ((yyvsp[-1].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; + ((yyvsp[(1) - (3)].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; - CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope, current_lexer); + CPPScope *scope = (yyvsp[(3) - (3)].u.identifier)->get_scope(current_scope, global_scope, current_lexer); if (scope == NULL) { scope = current_scope; } - CPPScope *new_scope = new CPPScope(scope, (yyvsp[0].u.identifier)->_names.back(), + CPPScope *new_scope = new CPPScope(scope, (yyvsp[(3) - (3)].u.identifier)->_names.back(), starting_vis); - CPPStructType *st = new CPPStructType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, - new_scope, (yylsp[-1]).file); + CPPStructType *st = new CPPStructType((yyvsp[(1) - (3)].u.extension_enum), (yyvsp[(3) - (3)].u.identifier), current_scope, + new_scope, (yylsp[(1) - (3)]).file); new_scope->set_struct_type(st); current_scope->define_extension_type(st); push_scope(new_scope); push_struct(st); } -#line 6827 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 322: -#line 2547 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 335: +/* Line 1792 of yacc.c */ +#line 2605 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.struct_type) = current_struct; current_struct->_incomplete = false; pop_struct(); pop_scope(); } -#line 6838 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 324: -#line 2558 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->_final = true; -} -#line 6846 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 329: -#line 2575 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_unknown, false); -} -#line 6854 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 330: -#line 2579 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_public, false); -} -#line 6862 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 331: -#line 2583 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_protected, false); -} -#line 6870 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 332: -#line 2587 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_private, false); -} -#line 6878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 333: -#line 2591 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_public, true); -} -#line 6886 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 334: -#line 2595 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); -} -#line 6894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 335: -#line 2599 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_private, true); -} -#line 6902 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 336: -#line 2603 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_public, true); -} -#line 6910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 337: -#line 2607 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2616 "dtool/src/cppparser/cppBison.yxx" { - current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); + current_struct->_final = true; } -#line 6918 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 338: -#line 2611 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 342: +/* Line 1792 of yacc.c */ +#line 2633 "dtool/src/cppparser/cppBison.yxx" { - current_struct->append_derivation((yyvsp[0].u.type), V_private, true); + current_struct->append_derivation((yyvsp[(1) - (1)].u.type), V_unknown, false); } -#line 6926 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 339: -#line 2618 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 343: +/* Line 1792 of yacc.c */ +#line 2637 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(2) - (2)].u.type), V_public, false); +} + break; + + case 344: +/* Line 1792 of yacc.c */ +#line 2641 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(2) - (2)].u.type), V_protected, false); +} + break; + + case 345: +/* Line 1792 of yacc.c */ +#line 2645 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(2) - (2)].u.type), V_private, false); +} + break; + + case 346: +/* Line 1792 of yacc.c */ +#line 2649 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_public, true); +} + break; + + case 347: +/* Line 1792 of yacc.c */ +#line 2653 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_protected, true); +} + break; + + case 348: +/* Line 1792 of yacc.c */ +#line 2657 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_private, true); +} + break; + + case 349: +/* Line 1792 of yacc.c */ +#line 2661 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_public, true); +} + break; + + case 350: +/* Line 1792 of yacc.c */ +#line 2665 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_protected, true); +} + break; + + case 351: +/* Line 1792 of yacc.c */ +#line 2669 "dtool/src/cppparser/cppBison.yxx" + { + current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_private, true); +} + break; + + case 352: +/* Line 1792 of yacc.c */ +#line 2676 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.enum_type) = current_enum; current_enum = NULL; } -#line 6935 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 340: -#line 2626 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_enum = new CPPEnumType((yyvsp[-2].u.extension_enum), NULL, (yyvsp[0].u.type), current_scope, NULL, (yylsp[-2]).file); -} -#line 6943 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 341: -#line 2630 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_enum = new CPPEnumType((yyvsp[0].u.extension_enum), NULL, current_scope, NULL, (yylsp[0]).file); -} -#line 6951 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 342: -#line 2634 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[-2].u.identifier)->_names.back(), V_public); - current_enum = new CPPEnumType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), (yyvsp[0].u.type), current_scope, new_scope, (yylsp[-3]).file); -} -#line 6960 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 343: -#line 2639 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[0].u.identifier)->_names.back(), V_public); - current_enum = new CPPEnumType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, new_scope, (yylsp[-1]).file); -} -#line 6969 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 344: -#line 2647 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); -} -#line 6977 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 345: -#line 2651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); -} -#line 6985 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 347: -#line 2659 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[-1].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[-1])); -} -#line 6994 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 348: -#line 2664 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[-3].u.identifier)->get_simple_name(), (yyvsp[-1].u.expr), current_lexer, (yylsp[-3])); -} -#line 7003 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 350: -#line 2672 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[0].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[0])); -} -#line 7012 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 351: -#line 2677 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[-2].u.identifier)->get_simple_name(), (yyvsp[0].u.expr), current_lexer, (yylsp[-2])); -} -#line 7021 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 352: -#line 2685 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.extension_enum) = CPPExtensionType::T_enum; -} -#line 7029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 353: -#line 2689 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2684 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; + current_enum = new CPPEnumType((yyvsp[(1) - (3)].u.extension_enum), NULL, (yyvsp[(3) - (3)].u.type), current_scope, NULL, (yylsp[(1) - (3)]).file); } -#line 7037 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 354: -#line 2693 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2688 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; + current_enum = new CPPEnumType((yyvsp[(1) - (1)].u.extension_enum), NULL, current_scope, NULL, (yylsp[(1) - (1)]).file); } -#line 7045 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 355: -#line 2700 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2692 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.extension_enum) = CPPExtensionType::T_class; + CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[(2) - (4)].u.identifier)->_names.back(), V_public); + current_enum = new CPPEnumType((yyvsp[(1) - (4)].u.extension_enum), (yyvsp[(2) - (4)].u.identifier), (yyvsp[(4) - (4)].u.type), current_scope, new_scope, (yylsp[(1) - (4)]).file); } -#line 7053 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 356: -#line 2704 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2697 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.extension_enum) = CPPExtensionType::T_struct; + CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[(2) - (2)].u.identifier)->_names.back(), V_public); + current_enum = new CPPEnumType((yyvsp[(1) - (2)].u.extension_enum), (yyvsp[(2) - (2)].u.identifier), current_scope, new_scope, (yylsp[(1) - (2)]).file); } -#line 7061 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 357: -#line 2708 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2705 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.extension_enum) = CPPExtensionType::T_union; + (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); } -#line 7069 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 358: -#line 2715 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2709 "dtool/src/cppparser/cppBison.yxx" { - CPPScope *scope = (yyvsp[-1].u.identifier)->find_scope(current_scope, global_scope, current_lexer); - if (scope == NULL) { - // This must be a new namespace declaration. - CPPScope *parent_scope = - (yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope, current_lexer); - if (parent_scope == NULL) { - parent_scope = current_scope; - } - scope = new CPPScope(parent_scope, (yyvsp[-1].u.identifier)->_names.back(), V_public); - } - - CPPNamespace *nspace = new CPPNamespace((yyvsp[-1].u.identifier), scope, (yylsp[-2]).file); - current_scope->add_declaration(nspace, global_scope, current_lexer, (yylsp[-2])); - current_scope->define_namespace(nspace); - push_scope(scope); + (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); } -#line 7091 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 359: -#line 2733 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - pop_scope(); -} -#line 7099 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 360: -#line 2737 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2717 "dtool/src/cppparser/cppBison.yxx" { - CPPScope *scope = (yyvsp[-1].u.identifier)->find_scope(current_scope, global_scope, current_lexer); - if (scope == NULL) { - // This must be a new namespace declaration. - CPPScope *parent_scope = - (yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope, current_lexer); - if (parent_scope == NULL) { - parent_scope = current_scope; - } - scope = new CPPScope(parent_scope, (yyvsp[-1].u.identifier)->_names.back(), V_public); - } - - CPPNamespace *nspace = new CPPNamespace((yyvsp[-1].u.identifier), scope, (yylsp[-2]).file); - nspace->_is_inline = true; - current_scope->add_declaration(nspace, global_scope, current_lexer, (yylsp[-2])); - current_scope->define_namespace(nspace); - push_scope(scope); + assert(current_enum != NULL); + current_enum->add_element((yyvsp[(2) - (3)].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[(2) - (3)])); } -#line 7122 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 361: -#line 2756 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2722 "dtool/src/cppparser/cppBison.yxx" { - pop_scope(); + assert(current_enum != NULL); + current_enum->add_element((yyvsp[(2) - (5)].u.identifier)->get_simple_name(), (yyvsp[(4) - (5)].u.expr), current_lexer, (yylsp[(2) - (5)])); +} + break; + + case 363: +/* Line 1792 of yacc.c */ +#line 2730 "dtool/src/cppparser/cppBison.yxx" + { + assert(current_enum != NULL); + current_enum->add_element((yyvsp[(2) - (2)].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[(2) - (2)])); } -#line 7130 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 364: -#line 2765 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2735 "dtool/src/cppparser/cppBison.yxx" { - CPPUsing *using_decl = new CPPUsing((yyvsp[-1].u.identifier), false, (yylsp[-2]).file); - current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-2])); - current_scope->add_using(using_decl, global_scope, current_lexer); + assert(current_enum != NULL); + current_enum->add_element((yyvsp[(2) - (4)].u.identifier)->get_simple_name(), (yyvsp[(4) - (4)].u.expr), current_lexer, (yylsp[(2) - (4)])); } -#line 7140 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 365: -#line 2771 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2743 "dtool/src/cppparser/cppBison.yxx" { - // This is really just an alternative way to declare a typedef. - CPPTypedefType *typedef_type = new CPPTypedefType((yyvsp[-1].u.type), (yyvsp[-3].u.identifier), current_scope); - typedef_type->_using = true; - current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-4])); + (yyval.u.extension_enum) = CPPExtensionType::T_enum; } -#line 7151 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 366: -#line 2778 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2747 "dtool/src/cppparser/cppBison.yxx" { - CPPUsing *using_decl = new CPPUsing((yyvsp[-1].u.identifier), true, (yylsp[-3]).file); - current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-3])); - current_scope->add_using(using_decl, global_scope, current_lexer); + (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; +} + break; + + case 367: +/* Line 1792 of yacc.c */ +#line 2751 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; +} + break; + + case 368: +/* Line 1792 of yacc.c */ +#line 2758 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.extension_enum) = CPPExtensionType::T_class; +} + break; + + case 369: +/* Line 1792 of yacc.c */ +#line 2762 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.extension_enum) = CPPExtensionType::T_struct; } -#line 7161 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 370: -#line 2793 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2766 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); + (yyval.u.extension_enum) = CPPExtensionType::T_union; } -#line 7169 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 371: -#line 2797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2773 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); + CPPScope *scope = (yyvsp[(2) - (3)].u.identifier)->find_scope(current_scope, global_scope, current_lexer); + if (scope == NULL) { + // This must be a new namespace declaration. + CPPScope *parent_scope = + (yyvsp[(2) - (3)].u.identifier)->get_scope(current_scope, global_scope, current_lexer); + if (parent_scope == NULL) { + parent_scope = current_scope; + } + scope = new CPPScope(parent_scope, (yyvsp[(2) - (3)].u.identifier)->_names.back(), V_public); + } + + CPPNamespace *nspace = new CPPNamespace((yyvsp[(2) - (3)].u.identifier), scope, (yylsp[(1) - (3)]).file); + current_scope->add_declaration(nspace, global_scope, current_lexer, (yylsp[(1) - (3)])); + current_scope->define_namespace(nspace); + push_scope(scope); } -#line 7177 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 372: -#line 2801 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2791 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); + pop_scope(); } -#line 7185 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 373: -#line 2805 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2795 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); + CPPScope *scope = (yyvsp[(3) - (4)].u.identifier)->find_scope(current_scope, global_scope, current_lexer); + if (scope == NULL) { + // This must be a new namespace declaration. + CPPScope *parent_scope = + (yyvsp[(3) - (4)].u.identifier)->get_scope(current_scope, global_scope, current_lexer); + if (parent_scope == NULL) { + parent_scope = current_scope; + } + scope = new CPPScope(parent_scope, (yyvsp[(3) - (4)].u.identifier)->_names.back(), V_public); + } + + CPPNamespace *nspace = new CPPNamespace((yyvsp[(3) - (4)].u.identifier), scope, (yylsp[(2) - (4)]).file); + nspace->_is_inline = true; + current_scope->add_declaration(nspace, global_scope, current_lexer, (yylsp[(2) - (4)])); + current_scope->define_namespace(nspace); + push_scope(scope); } -#line 7193 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 374: -#line 2809 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 2814 "dtool/src/cppparser/cppBison.yxx" + { + pop_scope(); +} + break; + + case 377: +/* Line 1792 of yacc.c */ +#line 2823 "dtool/src/cppparser/cppBison.yxx" + { + CPPUsing *using_decl = new CPPUsing((yyvsp[(2) - (3)].u.identifier), false, (yylsp[(1) - (3)]).file); + current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[(1) - (3)])); + current_scope->add_using(using_decl, global_scope, current_lexer); +} + break; + + case 378: +/* Line 1792 of yacc.c */ +#line 2829 "dtool/src/cppparser/cppBison.yxx" + { + // This is really just an alternative way to declare a typedef. + CPPTypedefType *typedef_type = new CPPTypedefType((yyvsp[(4) - (5)].u.type), (yyvsp[(2) - (5)].u.identifier), current_scope); + typedef_type->_using = true; + current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[(1) - (5)])); +} + break; + + case 379: +/* Line 1792 of yacc.c */ +#line 2836 "dtool/src/cppparser/cppBison.yxx" + { + CPPUsing *using_decl = new CPPUsing((yyvsp[(3) - (4)].u.identifier), true, (yylsp[(1) - (4)]).file); + current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[(1) - (4)])); + current_scope->add_using(using_decl, global_scope, current_lexer); +} + break; + + case 383: +/* Line 1792 of yacc.c */ +#line 2851 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); +} + break; + + case 384: +/* Line 1792 of yacc.c */ +#line 2855 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); +} + break; + + case 385: +/* Line 1792 of yacc.c */ +#line 2859 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); +} + break; + + case 386: +/* Line 1792 of yacc.c */ +#line 2863 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); +} + break; + + case 387: +/* Line 1792 of yacc.c */ +#line 2867 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char32_t); } -#line 7201 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 375: -#line 2813 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 388: +/* Line 1792 of yacc.c */ +#line 2871 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short); } -#line 7210 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 376: -#line 2818 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 389: +/* Line 1792 of yacc.c */ +#line 2876 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long); } -#line 7219 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 377: -#line 2823 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 390: +/* Line 1792 of yacc.c */ +#line 2881 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned); } -#line 7228 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 378: -#line 2828 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 391: +/* Line 1792 of yacc.c */ +#line 2886 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed); } -#line 7237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 379: -#line 2833 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 392: +/* Line 1792 of yacc.c */ +#line 2891 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int); } -#line 7245 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 380: -#line 2837 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 393: +/* Line 1792 of yacc.c */ +#line 2895 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.simple_type) = (yyvsp[0].u.simple_type); + (yyval.u.simple_type) = (yyvsp[(2) - (2)].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_short; } -#line 7254 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 381: -#line 2842 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 394: +/* Line 1792 of yacc.c */ +#line 2900 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.simple_type) = (yyvsp[0].u.simple_type); + (yyval.u.simple_type) = (yyvsp[(2) - (2)].u.simple_type); if ((yyval.u.simple_type)->_flags & CPPSimpleType::F_long) { (yyval.u.simple_type)->_flags |= CPPSimpleType::F_longlong; } else { (yyval.u.simple_type)->_flags |= CPPSimpleType::F_long; } } -#line 7267 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 382: -#line 2851 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 395: +/* Line 1792 of yacc.c */ +#line 2909 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.simple_type) = (yyvsp[0].u.simple_type); + (yyval.u.simple_type) = (yyvsp[(2) - (2)].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_unsigned; } -#line 7276 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 383: -#line 2856 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 396: +/* Line 1792 of yacc.c */ +#line 2914 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.simple_type) = (yyvsp[0].u.simple_type); + (yyval.u.simple_type) = (yyvsp[(2) - (2)].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_signed; } -#line 7285 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 384: -#line 2864 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 397: +/* Line 1792 of yacc.c */ +#line 2922 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_float); } -#line 7293 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 385: -#line 2868 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 398: +/* Line 1792 of yacc.c */ +#line 2926 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double); } -#line 7301 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 386: -#line 2872 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 399: +/* Line 1792 of yacc.c */ +#line 2930 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double, CPPSimpleType::F_long); } -#line 7310 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 387: -#line 2880 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 400: +/* Line 1792 of yacc.c */ +#line 2938 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_void); } -#line 7318 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 388: -#line 2889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 401: +/* Line 1792 of yacc.c */ +#line 2947 "dtool/src/cppparser/cppBison.yxx" { current_lexer->_resolve_identifiers = false; } -#line 7326 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 389: -#line 2893 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 402: +/* Line 1792 of yacc.c */ +#line 2951 "dtool/src/cppparser/cppBison.yxx" { current_lexer->_resolve_identifiers = true; } -#line 7334 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 495: -#line 2936 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 510: +/* Line 1792 of yacc.c */ +#line 2995 "dtool/src/cppparser/cppBison.yxx" { } -#line 7341 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 519: -#line 2945 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 7349 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 520: -#line 2949 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 7357 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 521: -#line 2956 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 7365 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 522: -#line 2960 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 7373 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 523: -#line 2967 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 7381 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 524: -#line 2971 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(',', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 7389 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 525: -#line 2978 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 7397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 526: -#line 2982 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); -} -#line 7405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 527: -#line 2986 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); -} -#line 7413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 528: -#line 2990 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); -} -#line 7421 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 529: -#line 2994 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); -} -#line 7429 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 530: -#line 2998 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); -} -#line 7437 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 531: -#line 3002 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); -} -#line 7445 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 532: -#line 3006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 7453 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 533: -#line 3010 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); -} -#line 7461 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 534: -#line 3014 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3004 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 7469 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 535: -#line 3018 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3008 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); } -#line 7477 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 536: -#line 3022 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3015 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 7485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 537: -#line 3026 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3019 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); } -#line 7493 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 538: -#line 3030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3026 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); } -#line 7501 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 539: -#line 3034 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3030 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(',', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7509 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 540: -#line 3038 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3037 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); } -#line 7517 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 541: -#line 3042 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3041 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(2) - (4)].u.type), (yyvsp[(4) - (4)].u.expr))); } -#line 7525 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 542: -#line 3046 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3045 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_static_cast)); } -#line 7533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 543: -#line 3050 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3049 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_dynamic_cast)); } -#line 7541 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 544: -#line 3054 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3053 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_const_cast)); } -#line 7549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 545: -#line 3058 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3057 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_reinterpret_cast)); } -#line 7557 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 546: -#line 3062 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3061 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[(3) - (4)].u.type))); } -#line 7565 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 547: -#line 3066 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3065 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + CPPDeclaration *arg = (yyvsp[(3) - (4)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (arg == (CPPDeclaration *)NULL) { + yyerror("undefined sizeof argument: " + (yyvsp[(3) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(3) - (4)])); + } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { + CPPInstance *inst = arg->as_instance(); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); + } else { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); + } } -#line 7573 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 548: -#line 3070 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3077 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[(4) - (5)].u.identifier))); } -#line 7581 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 549: -#line 3074 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3081 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[(3) - (4)].u.type))); } -#line 7589 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 550: -#line 3078 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3085 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[(2) - (2)].u.expr)); } -#line 7597 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 551: -#line 3082 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3089 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[(2) - (2)].u.expr)); } -#line 7605 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 552: -#line 3086 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3093 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[(2) - (2)].u.expr)); } -#line 7613 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 553: -#line 3090 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3097 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[(2) - (2)].u.expr)); } -#line 7621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 554: -#line 3094 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3101 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[(2) - (2)].u.expr)); } -#line 7629 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 555: -#line 3098 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3105 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[(2) - (2)].u.expr)); } -#line 7637 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 556: -#line 3102 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3109 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7645 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 557: -#line 3106 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3113 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7653 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 558: -#line 3110 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3117 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7661 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 559: -#line 3114 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3121 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7669 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 560: -#line 3118 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3125 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7677 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 561: -#line 3122 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3129 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7685 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 562: -#line 3126 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3133 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 563: -#line 3134 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3137 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7701 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 564: -#line 3138 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3141 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7709 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 565: -#line 3142 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3145 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 566: -#line 3146 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3149 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7725 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 567: -#line 3150 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3153 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7733 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 568: -#line 3154 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3157 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7741 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 569: -#line 3158 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3161 "dtool/src/cppparser/cppBison.yxx" { - // A constructor call. - CPPType *type = (yyvsp[-3].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[-3].u.identifier)->get_fully_scoped_name(), (yylsp[-3])); - } - assert(type != NULL); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7755 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 570: -#line 3168 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3165 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7765 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 571: -#line 3174 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3169 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 7775 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 572: -#line 3180 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3173 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_wchar_t)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[(1) - (5)].u.expr), (yyvsp[(3) - (5)].u.expr), (yyvsp[(5) - (5)].u.expr)); } -#line 7785 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 573: -#line 3186 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3177 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char16_t)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); } -#line 7795 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 574: -#line 3192 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3181 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char32_t)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); } -#line 7805 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 575: -#line 3198 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3185 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_bool)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (3)].u.expr)); } -#line 7815 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 576: -#line 3204 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3189 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('.', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 577: +/* Line 1792 of yacc.c */ +#line 3193 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 578: +/* Line 1792 of yacc.c */ +#line 3197 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); +} + break; + + case 579: +/* Line 1792 of yacc.c */ +#line 3205 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); +} + break; + + case 580: +/* Line 1792 of yacc.c */ +#line 3209 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(2) - (4)].u.type), (yyvsp[(4) - (4)].u.expr))); +} + break; + + case 581: +/* Line 1792 of yacc.c */ +#line 3213 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_static_cast)); +} + break; + + case 582: +/* Line 1792 of yacc.c */ +#line 3217 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_dynamic_cast)); +} + break; + + case 583: +/* Line 1792 of yacc.c */ +#line 3221 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_const_cast)); +} + break; + + case 584: +/* Line 1792 of yacc.c */ +#line 3225 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_reinterpret_cast)); +} + break; + + case 585: +/* Line 1792 of yacc.c */ +#line 3229 "dtool/src/cppparser/cppBison.yxx" + { + // A constructor call. + CPPType *type = (yyvsp[(1) - (4)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (4)])); + } + assert(type != NULL); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); +} + break; + + case 586: +/* Line 1792 of yacc.c */ +#line 3239 "dtool/src/cppparser/cppBison.yxx" + { + // Aggregate initialization. + CPPType *type = (yyvsp[(1) - (4)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[(1) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (4)])); + } + assert(type != NULL); + (yyval.u.expr) = new CPPExpression(CPPExpression::aggregate_init_op(type, (yyvsp[(3) - (4)].u.expr))); +} + break; + + case 587: +/* Line 1792 of yacc.c */ +#line 3249 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); +} + break; + + case 588: +/* Line 1792 of yacc.c */ +#line 3255 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); +} + break; + + case 589: +/* Line 1792 of yacc.c */ +#line 3261 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_wchar_t)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); +} + break; + + case 590: +/* Line 1792 of yacc.c */ +#line 3267 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char16_t)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); +} + break; + + case 591: +/* Line 1792 of yacc.c */ +#line 3273 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char32_t)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); +} + break; + + case 592: +/* Line 1792 of yacc.c */ +#line 3279 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_bool)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); +} + break; + + case 593: +/* Line 1792 of yacc.c */ +#line 3285 "dtool/src/cppparser/cppBison.yxx" { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); } -#line 7826 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 577: -#line 3211 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 594: +/* Line 1792 of yacc.c */ +#line 3292 "dtool/src/cppparser/cppBison.yxx" { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); } -#line 7837 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 578: -#line 3218 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 595: +/* Line 1792 of yacc.c */ +#line 3299 "dtool/src/cppparser/cppBison.yxx" { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); } -#line 7848 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 579: -#line 3225 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 596: +/* Line 1792 of yacc.c */ +#line 3306 "dtool/src/cppparser/cppBison.yxx" { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); } -#line 7859 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 580: -#line 3232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_float)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); -} -#line 7869 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 581: -#line 3238 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_double)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); -} -#line 7879 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 582: -#line 3244 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); -} -#line 7887 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 583: -#line 3248 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 7895 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 584: -#line 3252 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); -} -#line 7903 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 585: -#line 3256 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); -} -#line 7911 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 586: -#line 3260 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); -} -#line 7919 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 587: -#line 3264 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPIdentifier ident(""); - ident.add_name("std"); - ident.add_name("type_info"); - CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); - if (!std_type_info) { - yywarning("cannot use typeid before including ", (yylsp[-3])); - } - (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); -} -#line 7934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 588: -#line 3275 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPIdentifier ident(""); - ident.add_name("std"); - ident.add_name("type_info"); - CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); - if (!std_type_info) { - yywarning("cannot use typeid before including ", (yylsp[-3])); - } - (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); -} -#line 7949 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 589: -#line 3286 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); -} -#line 7957 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 590: -#line 3290 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); -} -#line 7965 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 591: -#line 3294 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); -} -#line 7973 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 592: -#line 3298 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); -} -#line 7981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 593: -#line 3302 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); -} -#line 7989 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 594: -#line 3306 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); -} -#line 7997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 595: -#line 3310 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8005 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 596: -#line 3314 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8013 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 597: -#line 3318 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3313 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_float)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); } -#line 8021 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 598: -#line 3322 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3319 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_double)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); } -#line 8029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 599: -#line 3326 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3325 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[(3) - (4)].u.type))); } -#line 8037 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 600: -#line 3330 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3329 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + CPPDeclaration *arg = (yyvsp[(3) - (4)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (arg == (CPPDeclaration *)NULL) { + yyerror("undefined sizeof argument: " + (yyvsp[(3) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(3) - (4)])); + } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { + CPPInstance *inst = arg->as_instance(); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); + } else { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); + } } -#line 8045 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 601: -#line 3334 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3341 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[(4) - (5)].u.identifier))); } -#line 8053 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 602: -#line 3338 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3345 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[(3) - (4)].u.type))); } -#line 8061 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 603: -#line 3342 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3349 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[(2) - (2)].u.type))); } -#line 8069 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 604: -#line 3346 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3353 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[(2) - (5)].u.type), (yyvsp[(4) - (5)].u.expr))); } -#line 8077 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 605: -#line 3350 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3357 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + CPPIdentifier ident(""); + ident.add_name("std"); + ident.add_name("type_info"); + CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); + if (!std_type_info) { + yywarning("cannot use typeid before including ", (yylsp[(1) - (4)])); + } + (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[(3) - (4)].u.type), std_type_info)); } -#line 8085 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 606: -#line 3354 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3368 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + CPPIdentifier ident(""); + ident.add_name("std"); + ident.add_name("type_info"); + CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); + if (!std_type_info) { + yywarning("cannot use typeid before including ", (yylsp[(1) - (4)])); + } + (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[(3) - (4)].u.expr), std_type_info)); } -#line 8093 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 607: -#line 3358 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3379 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[(2) - (2)].u.expr)); } -#line 8101 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 608: -#line 3362 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3383 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[(2) - (2)].u.expr)); } -#line 8109 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 609: -#line 3366 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3387 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[(2) - (2)].u.expr)); } -#line 8117 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 610: -#line 3370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3391 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[(2) - (2)].u.expr)); } -#line 8125 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 611: -#line 3374 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3395 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[(2) - (2)].u.expr)); } -#line 8133 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 612: -#line 3378 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3399 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[(2) - (2)].u.expr)); } -#line 8141 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 613: -#line 3382 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3403 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8149 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 614: -#line 3386 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3407 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8157 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 615: -#line 3390 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3411 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8165 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 616: -#line 3394 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3415 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8173 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 617: -#line 3398 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3419 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8181 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 618: -#line 3402 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3423 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8189 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 619: -#line 3406 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3427 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8197 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 620: -#line 3413 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3431 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8205 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 621: -#line 3417 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3435 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(true); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8213 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 622: -#line 3421 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3439 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(false); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8221 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 623: -#line 3425 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3443 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8229 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 624: -#line 3429 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3447 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 625: -#line 3433 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3451 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8245 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 626: -#line 3437 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3455 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8253 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 627: -#line 3441 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3459 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); + (yyval.u.expr) = new CPPExpression('<', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 628: -#line 3445 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3463 "dtool/src/cppparser/cppBison.yxx" { - // A variable named "final". C++11 explicitly permits this. - CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); - (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); + (yyval.u.expr) = new CPPExpression('>', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 629: -#line 3451 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3467 "dtool/src/cppparser/cppBison.yxx" { - // A variable named "override". C++11 explicitly permits this. - CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); - (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8281 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 630: -#line 3457 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3471 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8289 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 631: -#line 3461 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3475 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = NULL; + (yyval.u.expr) = new CPPExpression('?', (yyvsp[(1) - (5)].u.expr), (yyvsp[(3) - (5)].u.expr), (yyvsp[(5) - (5)].u.expr)); } -#line 8297 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 632: -#line 3465 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3479 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = NULL; + (yyval.u.expr) = new CPPExpression('[', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); } -#line 8305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 633: -#line 3469 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3483 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); } -#line 8313 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 634: -#line 3473 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3487 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (3)].u.expr)); } -#line 8321 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 635: -#line 3477 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3491 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8329 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 636: -#line 3481 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3495 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); } -#line 8337 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 637: -#line 3485 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3499 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-1].u.type))); + (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); } -#line 8345 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 638: -#line 3489 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3506 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.integer)); } -#line 8353 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 639: -#line 3493 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); -} -#line 8361 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 640: -#line 3497 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[-1].u.type))); -} -#line 8369 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 641: -#line 3501 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[-1].u.type))); -} -#line 8377 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 642: -#line 3505 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[-1].u.type))); -} -#line 8385 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 643: -#line 3509 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[-1].u.type))); -} -#line 8393 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 644: -#line 3513 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[-1].u.type))); -} -#line 8401 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 645: -#line 3517 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[-1].u.type))); -} -#line 8409 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 646: -#line 3521 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[-1].u.type))); -} -#line 8417 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 647: -#line 3525 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[-1].u.type))); -} -#line 8425 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 648: -#line 3529 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[-1].u.type))); -} -#line 8433 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 649: -#line 3533 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[-1].u.type))); -} -#line 8441 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 650: -#line 3547 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 8449 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 651: -#line 3551 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); -} -#line 8457 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 652: -#line 3555 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); -} -#line 8465 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 653: -#line 3559 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); -} -#line 8473 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 654: -#line 3563 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); -} -#line 8481 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 655: -#line 3567 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); -} -#line 8489 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 656: -#line 3571 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); -} -#line 8497 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 657: -#line 3575 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 8505 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 658: -#line 3579 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); -} -#line 8513 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 659: -#line 3583 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); -} -#line 8521 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 660: -#line 3587 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); -} -#line 8529 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 661: -#line 3591 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPIdentifier ident(""); - ident.add_name("std"); - ident.add_name("type_info"); - CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); - if (!std_type_info) { - yywarning("cannot use typeid before including ", (yylsp[-3])); - } - (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); -} -#line 8544 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 662: -#line 3602 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPIdentifier ident(""); - ident.add_name("std"); - ident.add_name("type_info"); - CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); - if (!std_type_info) { - yywarning("cannot use typeid before including ", (yylsp[-3])); - } - (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); -} -#line 8559 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 663: -#line 3613 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); -} -#line 8567 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 664: -#line 3617 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); -} -#line 8575 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 665: -#line 3621 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); -} -#line 8583 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 666: -#line 3625 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); -} -#line 8591 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 667: -#line 3629 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); -} -#line 8599 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 668: -#line 3633 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8607 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 669: -#line 3637 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8615 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 670: -#line 3641 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8623 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 671: -#line 3645 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 672: -#line 3649 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 673: -#line 3653 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8647 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 674: -#line 3657 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8655 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 675: -#line 3661 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8663 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 676: -#line 3665 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8671 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 677: -#line 3669 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8679 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 678: -#line 3673 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8687 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 679: -#line 3677 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8695 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 680: -#line 3681 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 681: -#line 3685 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8711 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 682: -#line 3689 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8719 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 683: -#line 3693 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8727 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 684: -#line 3697 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8735 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 685: -#line 3701 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8743 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 686: -#line 3705 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8751 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 687: -#line 3709 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); -} -#line 8759 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 688: -#line 3713 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); -} -#line 8767 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 689: -#line 3717 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); -} -#line 8775 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 690: -#line 3721 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8783 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 691: -#line 3725 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 8791 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 692: -#line 3729 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[-1].u.expr); -} -#line 8799 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 693: -#line 3736 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); -} -#line 8807 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 694: -#line 3740 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3510 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.expr) = new CPPExpression(true); } -#line 8815 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 695: -#line 3744 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 640: +/* Line 1792 of yacc.c */ +#line 3514 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.expr) = new CPPExpression(false); } -#line 8823 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 696: -#line 3748 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 641: +/* Line 1792 of yacc.c */ +#line 3518 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.integer)); } -#line 8831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 697: -#line 3752 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 642: +/* Line 1792 of yacc.c */ +#line 3522 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.real)); } -#line 8839 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 698: -#line 3756 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 643: +/* Line 1792 of yacc.c */ +#line 3526 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); } -#line 8847 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 699: -#line 3760 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 644: +/* Line 1792 of yacc.c */ +#line 3530 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); } -#line 8855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 700: -#line 3764 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 645: +/* Line 1792 of yacc.c */ +#line 3534 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.identifier), current_scope, global_scope, current_lexer); } -#line 8863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 701: -#line 3768 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 646: +/* Line 1792 of yacc.c */ +#line 3538 "dtool/src/cppparser/cppBison.yxx" { // A variable named "final". C++11 explicitly permits this. - CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); + CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[(1) - (1)])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8873 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 702: -#line 3774 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 647: +/* Line 1792 of yacc.c */ +#line 3544 "dtool/src/cppparser/cppBison.yxx" { // A variable named "override". C++11 explicitly permits this. - CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); + CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[(1) - (1)])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8883 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 703: -#line 3780 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 648: +/* Line 1792 of yacc.c */ +#line 3550 "dtool/src/cppparser/cppBison.yxx" { (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); } -#line 8891 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 649: +/* Line 1792 of yacc.c */ +#line 3554 "dtool/src/cppparser/cppBison.yxx" + { + (yyvsp[(2) - (8)].u.closure_type)->_flags = (yyvsp[(4) - (8)].u.integer); + (yyvsp[(2) - (8)].u.closure_type)->_return_type = (yyvsp[(5) - (8)].u.type); + (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[(2) - (8)].u.closure_type))); +} + break; + + case 650: +/* Line 1792 of yacc.c */ +#line 3560 "dtool/src/cppparser/cppBison.yxx" + { + (yyvsp[(2) - (11)].u.closure_type)->_parameters = (yyvsp[(5) - (11)].u.param_list); + (yyvsp[(2) - (11)].u.closure_type)->_flags = (yyvsp[(7) - (11)].u.integer); + (yyvsp[(2) - (11)].u.closure_type)->_return_type = (yyvsp[(8) - (11)].u.type); + (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[(2) - (11)].u.closure_type))); +} + break; + + case 651: +/* Line 1792 of yacc.c */ +#line 3567 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 652: +/* Line 1792 of yacc.c */ +#line 3571 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 653: +/* Line 1792 of yacc.c */ +#line 3575 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[(3) - (6)].u.type), (yyvsp[(5) - (6)].u.type))); +} + break; + + case 654: +/* Line 1792 of yacc.c */ +#line 3579 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 655: +/* Line 1792 of yacc.c */ +#line 3583 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 656: +/* Line 1792 of yacc.c */ +#line 3587 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[(3) - (6)].u.type), (yyvsp[(5) - (6)].u.type))); +} + break; + + case 657: +/* Line 1792 of yacc.c */ +#line 3591 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[(3) - (6)].u.type), (yyvsp[(5) - (6)].u.type))); +} + break; + + case 658: +/* Line 1792 of yacc.c */ +#line 3595 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 659: +/* Line 1792 of yacc.c */ +#line 3599 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 660: +/* Line 1792 of yacc.c */ +#line 3603 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 661: +/* Line 1792 of yacc.c */ +#line 3607 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 662: +/* Line 1792 of yacc.c */ +#line 3611 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 663: +/* Line 1792 of yacc.c */ +#line 3615 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 664: +/* Line 1792 of yacc.c */ +#line 3619 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 665: +/* Line 1792 of yacc.c */ +#line 3623 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 666: +/* Line 1792 of yacc.c */ +#line 3627 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 667: +/* Line 1792 of yacc.c */ +#line 3631 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[(3) - (4)].u.type))); +} + break; + + case 668: +/* Line 1792 of yacc.c */ +#line 3645 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); +} + break; + + case 669: +/* Line 1792 of yacc.c */ +#line 3649 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(2) - (4)].u.type), (yyvsp[(4) - (4)].u.expr))); +} + break; + + case 670: +/* Line 1792 of yacc.c */ +#line 3653 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_static_cast)); +} + break; + + case 671: +/* Line 1792 of yacc.c */ +#line 3657 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_dynamic_cast)); +} + break; + + case 672: +/* Line 1792 of yacc.c */ +#line 3661 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_const_cast)); +} + break; + + case 673: +/* Line 1792 of yacc.c */ +#line 3665 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_reinterpret_cast)); +} + break; + + case 674: +/* Line 1792 of yacc.c */ +#line 3669 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[(3) - (4)].u.type))); +} + break; + + case 675: +/* Line 1792 of yacc.c */ +#line 3673 "dtool/src/cppparser/cppBison.yxx" + { + CPPDeclaration *arg = (yyvsp[(3) - (4)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (arg == (CPPDeclaration *)NULL) { + yyerror("undefined sizeof argument: " + (yyvsp[(3) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(3) - (4)])); + } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { + CPPInstance *inst = arg->as_instance(); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); + } else { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); + } +} + break; + + case 676: +/* Line 1792 of yacc.c */ +#line 3685 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[(4) - (5)].u.identifier))); +} + break; + + case 677: +/* Line 1792 of yacc.c */ +#line 3689 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[(3) - (4)].u.type))); +} + break; + + case 678: +/* Line 1792 of yacc.c */ +#line 3693 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[(2) - (2)].u.type))); +} + break; + + case 679: +/* Line 1792 of yacc.c */ +#line 3697 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[(2) - (5)].u.type), (yyvsp[(4) - (5)].u.expr))); +} + break; + + case 680: +/* Line 1792 of yacc.c */ +#line 3701 "dtool/src/cppparser/cppBison.yxx" + { + CPPIdentifier ident(""); + ident.add_name("std"); + ident.add_name("type_info"); + CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); + if (!std_type_info) { + yywarning("cannot use typeid before including ", (yylsp[(1) - (4)])); + } + (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[(3) - (4)].u.type), std_type_info)); +} + break; + + case 681: +/* Line 1792 of yacc.c */ +#line 3712 "dtool/src/cppparser/cppBison.yxx" + { + CPPIdentifier ident(""); + ident.add_name("std"); + ident.add_name("type_info"); + CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); + if (!std_type_info) { + yywarning("cannot use typeid before including ", (yylsp[(1) - (4)])); + } + (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[(3) - (4)].u.expr), std_type_info)); +} + break; + + case 682: +/* Line 1792 of yacc.c */ +#line 3723 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[(2) - (2)].u.expr)); +} + break; + + case 683: +/* Line 1792 of yacc.c */ +#line 3727 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[(2) - (2)].u.expr)); +} + break; + + case 684: +/* Line 1792 of yacc.c */ +#line 3731 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[(2) - (2)].u.expr)); +} + break; + + case 685: +/* Line 1792 of yacc.c */ +#line 3735 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[(2) - (2)].u.expr)); +} + break; + + case 686: +/* Line 1792 of yacc.c */ +#line 3739 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[(2) - (2)].u.expr)); +} + break; + + case 687: +/* Line 1792 of yacc.c */ +#line 3743 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('*', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 688: +/* Line 1792 of yacc.c */ +#line 3747 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('/', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 689: +/* Line 1792 of yacc.c */ +#line 3751 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('%', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 690: +/* Line 1792 of yacc.c */ +#line 3755 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('+', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 691: +/* Line 1792 of yacc.c */ +#line 3759 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('-', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 692: +/* Line 1792 of yacc.c */ +#line 3763 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('|', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 693: +/* Line 1792 of yacc.c */ +#line 3767 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('^', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 694: +/* Line 1792 of yacc.c */ +#line 3771 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('&', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 695: +/* Line 1792 of yacc.c */ +#line 3775 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 696: +/* Line 1792 of yacc.c */ +#line 3779 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 697: +/* Line 1792 of yacc.c */ +#line 3783 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 698: +/* Line 1792 of yacc.c */ +#line 3787 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 699: +/* Line 1792 of yacc.c */ +#line 3791 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 700: +/* Line 1792 of yacc.c */ +#line 3795 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 701: +/* Line 1792 of yacc.c */ +#line 3799 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('<', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 702: +/* Line 1792 of yacc.c */ +#line 3803 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('>', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 703: +/* Line 1792 of yacc.c */ +#line 3807 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 704: +/* Line 1792 of yacc.c */ +#line 3811 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 705: +/* Line 1792 of yacc.c */ +#line 3815 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('?', (yyvsp[(1) - (5)].u.expr), (yyvsp[(3) - (5)].u.expr), (yyvsp[(5) - (5)].u.expr)); +} + break; + + case 706: +/* Line 1792 of yacc.c */ +#line 3819 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('[', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); +} + break; + + case 707: +/* Line 1792 of yacc.c */ +#line 3823 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); +} + break; + + case 708: +/* Line 1792 of yacc.c */ +#line 3827 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (3)].u.expr)); +} + break; + + case 709: +/* Line 1792 of yacc.c */ +#line 3831 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression('.', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} + break; + + case 710: +/* Line 1792 of yacc.c */ +#line 3835 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); +} break; case 711: -#line 3801 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3839 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, true); - if (type == NULL) { - type = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); - } - (yyval.u.type) = type; + (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); } -#line 8903 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 712: -#line 3809 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3846 "dtool/src/cppparser/cppBison.yxx" { - CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, true, current_lexer); - if (type == NULL) { - type = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); - } - (yyval.u.type) = type; + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.integer)); } -#line 8915 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 713: -#line 3817 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3850 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); + (yyval.u.expr) = new CPPExpression(true); } -#line 8923 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 714: -#line 3821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3854 "dtool/src/cppparser/cppBison.yxx" { - CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[-1].u.identifier)); - ctp->_packed = true; - (yyval.u.type) = CPPType::new_type(ctp); + (yyval.u.expr) = new CPPExpression(false); } -#line 8933 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 715: -#line 3851 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3858 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.integer)); } -#line 8941 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 716: -#line 3855 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3862 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.real)); } -#line 8949 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 717: -#line 3859 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3866 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); } -#line 8957 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 718: -#line 3863 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3870 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[0])); + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); } -#line 8965 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 719: -#line 3867 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3874 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.identifier), current_scope, global_scope, current_lexer); } -#line 8973 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 720: -#line 3871 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3878 "dtool/src/cppparser/cppBison.yxx" { - // This is not a keyword in Python, so it is useful to be able to use this - // in MAKE_PROPERTY definitions, etc. - (yyval.u.identifier) = new CPPIdentifier("signed", (yylsp[0])); + // A variable named "final". C++11 explicitly permits this. + CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[(1) - (1)])); + (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8983 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 721: -#line 3877 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3884 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[0])); + // A variable named "override". C++11 explicitly permits this. + CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[(1) - (1)])); + (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 722: -#line 3881 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3890 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[0])); + (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); } -#line 8999 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 723: -#line 3885 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3898 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[0])); + (yyval.u.closure_type) = new CPPClosureType(); } -#line 9007 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 724: -#line 3889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3902 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[0])); + (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_value); } -#line 9015 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 725: -#line 3900 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3906 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_reference); } -#line 9023 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 726: -#line 3904 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3910 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.closure_type) = new CPPClosureType(); + (yyvsp[(1) - (2)].u.capture)->_initializer = (yyvsp[(2) - (2)].u.expr); + (yyval.u.closure_type)->_captures.push_back(*(yyvsp[(1) - (2)].u.capture)); + delete (yyvsp[(1) - (2)].u.capture); } -#line 9031 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 727: -#line 3908 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3917 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.closure_type) = (yyvsp[(1) - (4)].u.closure_type); + (yyvsp[(3) - (4)].u.capture)->_initializer = (yyvsp[(4) - (4)].u.expr); + (yyval.u.closure_type)->_captures.push_back(*(yyvsp[(3) - (4)].u.capture)); + delete (yyvsp[(3) - (4)].u.capture); } -#line 9039 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 728: -#line 3912 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3927 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); + (yyval.u.capture) = new CPPClosureType::Capture; + (yyval.u.capture)->_name = (yyvsp[(2) - (2)].u.identifier)->get_simple_name(); + (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } -#line 9047 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 729: -#line 3920 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3933 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = new CPPExpression((yyvsp[0].str)); + (yyval.u.capture) = new CPPClosureType::Capture; + (yyval.u.capture)->_name = (yyvsp[(2) - (3)].u.identifier)->get_simple_name(); + (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } -#line 9055 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 730: -#line 3924 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3939 "dtool/src/cppparser/cppBison.yxx" { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.capture) = new CPPClosureType::Capture; + (yyval.u.capture)->_name = (yyvsp[(1) - (1)].u.identifier)->get_simple_name(); + if ((yyval.u.capture)->_name == "this") { + (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; + } else { + (yyval.u.capture)->_type = CPPClosureType::CT_by_value; + } } -#line 9063 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 731: -#line 3928 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3949 "dtool/src/cppparser/cppBison.yxx" { - // The right string takes on the literal type of the left. - (yyval.u.expr) = (yyvsp[-1].u.expr); - (yyval.u.expr)->_str += (yyvsp[0].str); + (yyval.u.capture) = new CPPClosureType::Capture; + (yyval.u.capture)->_name = (yyvsp[(2) - (2)].u.identifier)->get_simple_name(); + (yyval.u.capture)->_type = CPPClosureType::CT_by_value; + if ((yyval.u.capture)->_name != "this") { + yywarning("only capture name 'this' may be preceded by an asterisk", (yylsp[(2) - (2)])); + } } -#line 9073 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 732: -#line 3934 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 3961 "dtool/src/cppparser/cppBison.yxx" + { + CPPType *type = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, true); + if (type == NULL) { + type = CPPType::new_type(new CPPTBDType((yyvsp[(1) - (1)].u.identifier))); + } + (yyval.u.type) = type; +} + break; + + case 733: +/* Line 1792 of yacc.c */ +#line 3969 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[(2) - (2)].u.identifier))); +} + break; + + case 734: +/* Line 1792 of yacc.c */ +#line 3973 "dtool/src/cppparser/cppBison.yxx" + { + CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[(1) - (2)].u.identifier)); + ctp->_packed = true; + (yyval.u.type) = CPPType::new_type(ctp); +} + break; + + case 735: +/* Line 1792 of yacc.c */ +#line 4003 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); +} + break; + + case 736: +/* Line 1792 of yacc.c */ +#line 4007 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); +} + break; + + case 737: +/* Line 1792 of yacc.c */ +#line 4011 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); +} + break; + + case 738: +/* Line 1792 of yacc.c */ +#line 4015 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[(1) - (1)])); +} + break; + + case 739: +/* Line 1792 of yacc.c */ +#line 4019 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[(1) - (1)])); +} + break; + + case 740: +/* Line 1792 of yacc.c */ +#line 4023 "dtool/src/cppparser/cppBison.yxx" + { + // This is not a keyword in Python, so it is useful to be able to use this + // in MAKE_PROPERTY definitions, etc. + (yyval.u.identifier) = new CPPIdentifier("signed", (yylsp[(1) - (1)])); +} + break; + + case 741: +/* Line 1792 of yacc.c */ +#line 4029 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[(1) - (1)])); +} + break; + + case 742: +/* Line 1792 of yacc.c */ +#line 4033 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[(1) - (1)])); +} + break; + + case 743: +/* Line 1792 of yacc.c */ +#line 4037 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[(1) - (1)])); +} + break; + + case 744: +/* Line 1792 of yacc.c */ +#line 4041 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[(1) - (1)])); +} + break; + + case 745: +/* Line 1792 of yacc.c */ +#line 4052 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); +} + break; + + case 746: +/* Line 1792 of yacc.c */ +#line 4056 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); +} + break; + + case 747: +/* Line 1792 of yacc.c */ +#line 4060 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); +} + break; + + case 748: +/* Line 1792 of yacc.c */ +#line 4064 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[(1) - (1)])); +} + break; + + case 749: +/* Line 1792 of yacc.c */ +#line 4072 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].str)); +} + break; + + case 750: +/* Line 1792 of yacc.c */ +#line 4076 "dtool/src/cppparser/cppBison.yxx" + { + (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); +} + break; + + case 751: +/* Line 1792 of yacc.c */ +#line 4080 "dtool/src/cppparser/cppBison.yxx" + { + // The right string takes on the literal type of the left. + (yyval.u.expr) = (yyvsp[(1) - (2)].u.expr); + (yyval.u.expr)->_str += (yyvsp[(2) - (2)].str); +} + break; + + case 752: +/* Line 1792 of yacc.c */ +#line 4086 "dtool/src/cppparser/cppBison.yxx" { // We have to check that the two literal types match up. - (yyval.u.expr) = (yyvsp[-1].u.expr); - if ((yyvsp[0].u.expr)->_type != CPPExpression::T_string && (yyvsp[0].u.expr)->_type != (yyvsp[-1].u.expr)->_type) { + (yyval.u.expr) = (yyvsp[(1) - (2)].u.expr); + if ((yyvsp[(2) - (2)].u.expr)->_type != CPPExpression::T_string && (yyvsp[(2) - (2)].u.expr)->_type != (yyvsp[(1) - (2)].u.expr)->_type) { yywarning("cannot concatenate two string literals of different types", (yyloc)); } - (yyval.u.expr)->_str += (yyvsp[0].u.expr)->_str; + (yyval.u.expr)->_str += (yyvsp[(2) - (2)].u.expr)->_str; } -#line 9086 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; -#line 9090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +/* Line 1792 of yacc.c */ +#line 9985 "built_x64/tmp/cppBison.yxx.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -9118,7 +10004,7 @@ yyreduce: *++yyvsp = yyval; *++yylsp = yyloc; - /* Now 'shift' the result of the reduction. Determine what state + /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ @@ -9133,9 +10019,9 @@ yyreduce: goto yynewstate; -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ @@ -9146,7 +10032,7 @@ yyerrlab: { ++yynerrs; #if ! YYERROR_VERBOSE - yyerror (&yylloc, YY_("syntax error")); + yyerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) @@ -9173,7 +10059,7 @@ yyerrlab: yymsgp = yymsg; } } - yyerror (&yylloc, yymsgp); + yyerror (yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } @@ -9186,20 +10072,20 @@ yyerrlab: if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval, &yylloc); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval, &yylloc); + yychar = YYEMPTY; + } } /* Else will try to reuse lookahead token after shifting the error @@ -9219,7 +10105,7 @@ yyerrorlab: goto yyerrorlab; yyerror_range[1] = yylsp[1-yylen]; - /* Do not reclaim the symbols of the rule whose action triggered + /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; @@ -9232,29 +10118,29 @@ yyerrorlab: | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; yyerror_range[1] = *yylsp; yydestruct ("Error: popping", - yystos[yystate], yyvsp, yylsp); + yystos[yystate], yyvsp, yylsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -9296,7 +10182,7 @@ yyabortlab: | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: - yyerror (&yylloc, YY_("memory exhausted")); + yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif @@ -9310,14 +10196,14 @@ yyreturn: yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc); } - /* Do not reclaim the symbols of the rule whose action triggered + /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp, yylsp); + yystos[*yyssp], yyvsp, yylsp); YYPOPSTACK (1); } #ifndef yyoverflow @@ -9328,5 +10214,8 @@ yyreturn: if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif - return yyresult; + /* Make sure YYID is used. */ + return YYID (yyresult); } + + diff --git a/dtool/src/cppparser/cppBison.h.prebuilt b/dtool/src/cppparser/cppBison.h.prebuilt index 223bfdf123..57b8c1be8a 100644 --- a/dtool/src/cppparser/cppBison.h.prebuilt +++ b/dtool/src/cppparser/cppBison.h.prebuilt @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 2.7. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. 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 @@ -30,9 +30,9 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -#ifndef YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED -# define YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED -/* Debug traces. */ +#ifndef YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED +# define YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED +/* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif @@ -40,153 +40,156 @@ extern int cppyydebug; #endif -/* Token type. */ +/* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - 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, - TYPEPACK_IDENTIFIER = 267, - SCOPING = 268, - TYPEDEFNAME = 269, - ELLIPSIS = 270, - OROR = 271, - ANDAND = 272, - EQCOMPARE = 273, - NECOMPARE = 274, - LECOMPARE = 275, - GECOMPARE = 276, - LSHIFT = 277, - RSHIFT = 278, - POINTSAT_STAR = 279, - DOT_STAR = 280, - UNARY = 281, - UNARY_NOT = 282, - UNARY_NEGATE = 283, - UNARY_MINUS = 284, - UNARY_PLUS = 285, - UNARY_STAR = 286, - UNARY_REF = 287, - POINTSAT = 288, - SCOPE = 289, - PLUSPLUS = 290, - MINUSMINUS = 291, - TIMESEQUAL = 292, - DIVIDEEQUAL = 293, - MODEQUAL = 294, - PLUSEQUAL = 295, - MINUSEQUAL = 296, - OREQUAL = 297, - ANDEQUAL = 298, - XOREQUAL = 299, - LSHIFTEQUAL = 300, - RSHIFTEQUAL = 301, - KW_ALIGNAS = 302, - KW_ALIGNOF = 303, - KW_AUTO = 304, - KW_BEGIN_PUBLISH = 305, - KW_BLOCKING = 306, - KW_BOOL = 307, - KW_CATCH = 308, - KW_CHAR = 309, - KW_CHAR16_T = 310, - KW_CHAR32_T = 311, - KW_CLASS = 312, - KW_CONST = 313, - KW_CONSTEXPR = 314, - KW_CONST_CAST = 315, - KW_DECLTYPE = 316, - KW_DEFAULT = 317, - KW_DELETE = 318, - KW_DOUBLE = 319, - KW_DYNAMIC_CAST = 320, - KW_ELSE = 321, - KW_END_PUBLISH = 322, - KW_ENUM = 323, - KW_EXTENSION = 324, - KW_EXTERN = 325, - KW_EXPLICIT = 326, - KW_PUBLISHED = 327, - KW_FALSE = 328, - KW_FINAL = 329, - KW_FLOAT = 330, - KW_FRIEND = 331, - KW_FOR = 332, - KW_GOTO = 333, - KW_HAS_VIRTUAL_DESTRUCTOR = 334, - KW_IF = 335, - KW_INLINE = 336, - KW_INT = 337, - KW_IS_ABSTRACT = 338, - KW_IS_BASE_OF = 339, - KW_IS_CLASS = 340, - KW_IS_CONSTRUCTIBLE = 341, - KW_IS_CONVERTIBLE_TO = 342, - KW_IS_DESTRUCTIBLE = 343, - KW_IS_EMPTY = 344, - KW_IS_ENUM = 345, - KW_IS_FINAL = 346, - KW_IS_FUNDAMENTAL = 347, - KW_IS_POD = 348, - KW_IS_POLYMORPHIC = 349, - KW_IS_STANDARD_LAYOUT = 350, - KW_IS_TRIVIAL = 351, - KW_IS_UNION = 352, - KW_LONG = 353, - KW_MAKE_MAP_PROPERTY = 354, - KW_MAKE_PROPERTY = 355, - KW_MAKE_PROPERTY2 = 356, - KW_MAKE_SEQ = 357, - KW_MAKE_SEQ_PROPERTY = 358, - KW_MUTABLE = 359, - KW_NAMESPACE = 360, - KW_NEW = 361, - KW_NOEXCEPT = 362, - KW_NULLPTR = 363, - KW_OPERATOR = 364, - KW_OVERRIDE = 365, - KW_PRIVATE = 366, - KW_PROTECTED = 367, - KW_PUBLIC = 368, - KW_REGISTER = 369, - KW_REINTERPRET_CAST = 370, - KW_RETURN = 371, - KW_SHORT = 372, - KW_SIGNED = 373, - KW_SIZEOF = 374, - KW_STATIC = 375, - KW_STATIC_ASSERT = 376, - KW_STATIC_CAST = 377, - KW_STRUCT = 378, - KW_TEMPLATE = 379, - KW_THREAD_LOCAL = 380, - KW_THROW = 381, - KW_TRUE = 382, - KW_TRY = 383, - KW_TYPEDEF = 384, - KW_TYPEID = 385, - KW_TYPENAME = 386, - KW_UNDERLYING_TYPE = 387, - KW_UNION = 388, - KW_UNSIGNED = 389, - KW_USING = 390, - KW_VIRTUAL = 391, - KW_VOID = 392, - KW_VOLATILE = 393, - KW_WCHAR_T = 394, - KW_WHILE = 395, - START_CPP = 396, - START_CONST_EXPR = 397, - START_TYPE = 398 - }; + /* 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, + TYPEPACK_IDENTIFIER = 267, + SCOPING = 268, + TYPEDEFNAME = 269, + ELLIPSIS = 270, + OROR = 271, + ANDAND = 272, + EQCOMPARE = 273, + NECOMPARE = 274, + LECOMPARE = 275, + GECOMPARE = 276, + LSHIFT = 277, + RSHIFT = 278, + POINTSAT_STAR = 279, + DOT_STAR = 280, + UNARY = 281, + UNARY_NOT = 282, + UNARY_NEGATE = 283, + UNARY_MINUS = 284, + UNARY_PLUS = 285, + UNARY_STAR = 286, + UNARY_REF = 287, + POINTSAT = 288, + SCOPE = 289, + PLUSPLUS = 290, + MINUSMINUS = 291, + TIMESEQUAL = 292, + DIVIDEEQUAL = 293, + MODEQUAL = 294, + PLUSEQUAL = 295, + MINUSEQUAL = 296, + OREQUAL = 297, + ANDEQUAL = 298, + XOREQUAL = 299, + LSHIFTEQUAL = 300, + RSHIFTEQUAL = 301, + ATTR_LEFT = 302, + ATTR_RIGHT = 303, + KW_ALIGNAS = 304, + KW_ALIGNOF = 305, + KW_AUTO = 306, + KW_BEGIN_PUBLISH = 307, + KW_BLOCKING = 308, + KW_BOOL = 309, + KW_CATCH = 310, + KW_CHAR = 311, + KW_CHAR16_T = 312, + KW_CHAR32_T = 313, + KW_CLASS = 314, + KW_CONST = 315, + KW_CONSTEXPR = 316, + KW_CONST_CAST = 317, + KW_DECLTYPE = 318, + KW_DEFAULT = 319, + KW_DELETE = 320, + KW_DOUBLE = 321, + KW_DYNAMIC_CAST = 322, + KW_ELSE = 323, + KW_END_PUBLISH = 324, + KW_ENUM = 325, + KW_EXTENSION = 326, + KW_EXTERN = 327, + KW_EXPLICIT = 328, + KW_PUBLISHED = 329, + KW_FALSE = 330, + KW_FINAL = 331, + KW_FLOAT = 332, + KW_FRIEND = 333, + KW_FOR = 334, + KW_GOTO = 335, + KW_HAS_VIRTUAL_DESTRUCTOR = 336, + KW_IF = 337, + KW_INLINE = 338, + KW_INT = 339, + KW_IS_ABSTRACT = 340, + KW_IS_BASE_OF = 341, + KW_IS_CLASS = 342, + KW_IS_CONSTRUCTIBLE = 343, + KW_IS_CONVERTIBLE_TO = 344, + KW_IS_DESTRUCTIBLE = 345, + KW_IS_EMPTY = 346, + KW_IS_ENUM = 347, + KW_IS_FINAL = 348, + KW_IS_FUNDAMENTAL = 349, + KW_IS_POD = 350, + KW_IS_POLYMORPHIC = 351, + KW_IS_STANDARD_LAYOUT = 352, + KW_IS_TRIVIAL = 353, + KW_IS_UNION = 354, + KW_LONG = 355, + KW_MAKE_MAP_PROPERTY = 356, + KW_MAKE_PROPERTY = 357, + KW_MAKE_PROPERTY2 = 358, + KW_MAKE_SEQ = 359, + KW_MAKE_SEQ_PROPERTY = 360, + KW_MUTABLE = 361, + KW_NAMESPACE = 362, + KW_NEW = 363, + KW_NOEXCEPT = 364, + KW_NULLPTR = 365, + KW_OPERATOR = 366, + KW_OVERRIDE = 367, + KW_PRIVATE = 368, + KW_PROTECTED = 369, + KW_PUBLIC = 370, + KW_REGISTER = 371, + KW_REINTERPRET_CAST = 372, + KW_RETURN = 373, + KW_SHORT = 374, + KW_SIGNED = 375, + KW_SIZEOF = 376, + KW_STATIC = 377, + KW_STATIC_ASSERT = 378, + KW_STATIC_CAST = 379, + KW_STRUCT = 380, + KW_TEMPLATE = 381, + KW_THREAD_LOCAL = 382, + KW_THROW = 383, + KW_TRUE = 384, + KW_TRY = 385, + KW_TYPEDEF = 386, + KW_TYPEID = 387, + KW_TYPENAME = 388, + KW_UNDERLYING_TYPE = 389, + KW_UNION = 390, + KW_UNSIGNED = 391, + KW_USING = 392, + KW_VIRTUAL = 393, + KW_VOID = 394, + KW_VOLATILE = 395, + KW_WCHAR_T = 396, + KW_WHILE = 397, + START_CPP = 398, + START_CONST_EXPR = 399, + START_TYPE = 400 + }; #endif /* Tokens. */ #define REAL 258 @@ -233,122 +236,140 @@ extern int cppyydebug; #define XOREQUAL 299 #define LSHIFTEQUAL 300 #define RSHIFTEQUAL 301 -#define KW_ALIGNAS 302 -#define KW_ALIGNOF 303 -#define KW_AUTO 304 -#define KW_BEGIN_PUBLISH 305 -#define KW_BLOCKING 306 -#define KW_BOOL 307 -#define KW_CATCH 308 -#define KW_CHAR 309 -#define KW_CHAR16_T 310 -#define KW_CHAR32_T 311 -#define KW_CLASS 312 -#define KW_CONST 313 -#define KW_CONSTEXPR 314 -#define KW_CONST_CAST 315 -#define KW_DECLTYPE 316 -#define KW_DEFAULT 317 -#define KW_DELETE 318 -#define KW_DOUBLE 319 -#define KW_DYNAMIC_CAST 320 -#define KW_ELSE 321 -#define KW_END_PUBLISH 322 -#define KW_ENUM 323 -#define KW_EXTENSION 324 -#define KW_EXTERN 325 -#define KW_EXPLICIT 326 -#define KW_PUBLISHED 327 -#define KW_FALSE 328 -#define KW_FINAL 329 -#define KW_FLOAT 330 -#define KW_FRIEND 331 -#define KW_FOR 332 -#define KW_GOTO 333 -#define KW_HAS_VIRTUAL_DESTRUCTOR 334 -#define KW_IF 335 -#define KW_INLINE 336 -#define KW_INT 337 -#define KW_IS_ABSTRACT 338 -#define KW_IS_BASE_OF 339 -#define KW_IS_CLASS 340 -#define KW_IS_CONSTRUCTIBLE 341 -#define KW_IS_CONVERTIBLE_TO 342 -#define KW_IS_DESTRUCTIBLE 343 -#define KW_IS_EMPTY 344 -#define KW_IS_ENUM 345 -#define KW_IS_FINAL 346 -#define KW_IS_FUNDAMENTAL 347 -#define KW_IS_POD 348 -#define KW_IS_POLYMORPHIC 349 -#define KW_IS_STANDARD_LAYOUT 350 -#define KW_IS_TRIVIAL 351 -#define KW_IS_UNION 352 -#define KW_LONG 353 -#define KW_MAKE_MAP_PROPERTY 354 -#define KW_MAKE_PROPERTY 355 -#define KW_MAKE_PROPERTY2 356 -#define KW_MAKE_SEQ 357 -#define KW_MAKE_SEQ_PROPERTY 358 -#define KW_MUTABLE 359 -#define KW_NAMESPACE 360 -#define KW_NEW 361 -#define KW_NOEXCEPT 362 -#define KW_NULLPTR 363 -#define KW_OPERATOR 364 -#define KW_OVERRIDE 365 -#define KW_PRIVATE 366 -#define KW_PROTECTED 367 -#define KW_PUBLIC 368 -#define KW_REGISTER 369 -#define KW_REINTERPRET_CAST 370 -#define KW_RETURN 371 -#define KW_SHORT 372 -#define KW_SIGNED 373 -#define KW_SIZEOF 374 -#define KW_STATIC 375 -#define KW_STATIC_ASSERT 376 -#define KW_STATIC_CAST 377 -#define KW_STRUCT 378 -#define KW_TEMPLATE 379 -#define KW_THREAD_LOCAL 380 -#define KW_THROW 381 -#define KW_TRUE 382 -#define KW_TRY 383 -#define KW_TYPEDEF 384 -#define KW_TYPEID 385 -#define KW_TYPENAME 386 -#define KW_UNDERLYING_TYPE 387 -#define KW_UNION 388 -#define KW_UNSIGNED 389 -#define KW_USING 390 -#define KW_VIRTUAL 391 -#define KW_VOID 392 -#define KW_VOLATILE 393 -#define KW_WCHAR_T 394 -#define KW_WHILE 395 -#define START_CPP 396 -#define START_CONST_EXPR 397 -#define START_TYPE 398 +#define ATTR_LEFT 302 +#define ATTR_RIGHT 303 +#define KW_ALIGNAS 304 +#define KW_ALIGNOF 305 +#define KW_AUTO 306 +#define KW_BEGIN_PUBLISH 307 +#define KW_BLOCKING 308 +#define KW_BOOL 309 +#define KW_CATCH 310 +#define KW_CHAR 311 +#define KW_CHAR16_T 312 +#define KW_CHAR32_T 313 +#define KW_CLASS 314 +#define KW_CONST 315 +#define KW_CONSTEXPR 316 +#define KW_CONST_CAST 317 +#define KW_DECLTYPE 318 +#define KW_DEFAULT 319 +#define KW_DELETE 320 +#define KW_DOUBLE 321 +#define KW_DYNAMIC_CAST 322 +#define KW_ELSE 323 +#define KW_END_PUBLISH 324 +#define KW_ENUM 325 +#define KW_EXTENSION 326 +#define KW_EXTERN 327 +#define KW_EXPLICIT 328 +#define KW_PUBLISHED 329 +#define KW_FALSE 330 +#define KW_FINAL 331 +#define KW_FLOAT 332 +#define KW_FRIEND 333 +#define KW_FOR 334 +#define KW_GOTO 335 +#define KW_HAS_VIRTUAL_DESTRUCTOR 336 +#define KW_IF 337 +#define KW_INLINE 338 +#define KW_INT 339 +#define KW_IS_ABSTRACT 340 +#define KW_IS_BASE_OF 341 +#define KW_IS_CLASS 342 +#define KW_IS_CONSTRUCTIBLE 343 +#define KW_IS_CONVERTIBLE_TO 344 +#define KW_IS_DESTRUCTIBLE 345 +#define KW_IS_EMPTY 346 +#define KW_IS_ENUM 347 +#define KW_IS_FINAL 348 +#define KW_IS_FUNDAMENTAL 349 +#define KW_IS_POD 350 +#define KW_IS_POLYMORPHIC 351 +#define KW_IS_STANDARD_LAYOUT 352 +#define KW_IS_TRIVIAL 353 +#define KW_IS_UNION 354 +#define KW_LONG 355 +#define KW_MAKE_MAP_PROPERTY 356 +#define KW_MAKE_PROPERTY 357 +#define KW_MAKE_PROPERTY2 358 +#define KW_MAKE_SEQ 359 +#define KW_MAKE_SEQ_PROPERTY 360 +#define KW_MUTABLE 361 +#define KW_NAMESPACE 362 +#define KW_NEW 363 +#define KW_NOEXCEPT 364 +#define KW_NULLPTR 365 +#define KW_OPERATOR 366 +#define KW_OVERRIDE 367 +#define KW_PRIVATE 368 +#define KW_PROTECTED 369 +#define KW_PUBLIC 370 +#define KW_REGISTER 371 +#define KW_REINTERPRET_CAST 372 +#define KW_RETURN 373 +#define KW_SHORT 374 +#define KW_SIGNED 375 +#define KW_SIZEOF 376 +#define KW_STATIC 377 +#define KW_STATIC_ASSERT 378 +#define KW_STATIC_CAST 379 +#define KW_STRUCT 380 +#define KW_TEMPLATE 381 +#define KW_THREAD_LOCAL 382 +#define KW_THROW 383 +#define KW_TRUE 384 +#define KW_TRY 385 +#define KW_TYPEDEF 386 +#define KW_TYPEID 387 +#define KW_TYPENAME 388 +#define KW_UNDERLYING_TYPE 389 +#define KW_UNION 390 +#define KW_UNSIGNED 391 +#define KW_USING 392 +#define KW_VIRTUAL 393 +#define KW_VOID 394 +#define KW_VOLATILE 395 +#define KW_WCHAR_T 396 +#define KW_WHILE 397 +#define START_CPP 398 +#define START_CONST_EXPR 399 +#define START_TYPE 400 -/* Value type. */ -/* Location type. */ + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE YYLTYPE; -struct YYLTYPE +typedef struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; -}; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #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); +#else +int cppyyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ -#endif /* !YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED */ +#endif /* !YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED */ From ad34bc3eb8e778277c40e274a6c1b66d926e35ef Mon Sep 17 00:00:00 2001 From: Younguk Kim Date: Thu, 26 Jan 2017 00:16:26 +0900 Subject: [PATCH 033/254] Fix include guard typo. --- panda/src/parametrics/parametricCurveCollection.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/panda/src/parametrics/parametricCurveCollection.h b/panda/src/parametrics/parametricCurveCollection.h index 42a84c7861..1f4ab5c2cb 100644 --- a/panda/src/parametrics/parametricCurveCollection.h +++ b/panda/src/parametrics/parametricCurveCollection.h @@ -11,8 +11,8 @@ * @date 2001-03-04 */ -#ifndef NODEPATHCOLLECTION_H -#define NODEPATHCOLLECTION_H +#ifndef PARAMETRICCURVECOLLECTION_H +#define PARAMETRICCURVECOLLECTION_H #include "pandabase.h" From 8696dcea2c71bf675e74eb963acda63fb17eb9c2 Mon Sep 17 00:00:00 2001 From: fireclawthefox Date: Thu, 26 Jan 2017 11:25:52 +0100 Subject: [PATCH 034/254] Fixed deprecated usage of NodePath.remove in directtools --- direct/src/directtools/DirectCameraControl.py | 2 +- direct/src/directtools/DirectManipulation.py | 6 +++--- direct/src/directtools/DirectSession.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/direct/src/directtools/DirectCameraControl.py b/direct/src/directtools/DirectCameraControl.py index 2913260c57..7870fb09f5 100644 --- a/direct/src/directtools/DirectCameraControl.py +++ b/direct/src/directtools/DirectCameraControl.py @@ -413,7 +413,7 @@ class DirectCameraControl(DirectObject): np = NodePath('temp') np.setPos(base.direct.camera, hitPt) self.coaMarkerPos = np.getPos() - np.remove() + np.removeNode() self.coaMarker.setPos(self.coaMarkerPos) iRay.collisionNodePath.removeNode() diff --git a/direct/src/directtools/DirectManipulation.py b/direct/src/directtools/DirectManipulation.py index 3ebc697400..d7aeb1ee3b 100644 --- a/direct/src/directtools/DirectManipulation.py +++ b/direct/src/directtools/DirectManipulation.py @@ -186,7 +186,7 @@ class DirectManipulationControl(DirectObject): def drawMarquee(self, startX, startY): if self.marquee: - self.marquee.remove() + self.marquee.removeNode() self.marquee = None if base.direct.cameraControl.useMayaCamControls and base.direct.fAlt: @@ -228,7 +228,7 @@ class DirectManipulationControl(DirectObject): skipFlags |= SKIP_CAMERA * (1 - base.getControl()) if self.marquee: - self.marquee.remove() + self.marquee.removeNode() self.marquee = None base.direct.deselectAll() @@ -1691,7 +1691,7 @@ class ObjectHandles(NodePath, DirectObject): np.setPos(base.direct.camera, hitPt) resultPt = Point3(0) resultPt.assign(np.getPos()) - np.remove() + np.removeNode() del iRay return resultPt diff --git a/direct/src/directtools/DirectSession.py b/direct/src/directtools/DirectSession.py index 96f8bdb610..367b753064 100644 --- a/direct/src/directtools/DirectSession.py +++ b/direct/src/directtools/DirectSession.py @@ -900,7 +900,7 @@ class DirectSession(DirectObject): # If nothing specified, try selected node path nodePath = self.selected.last if nodePath: - nodePath.remove() + nodePath.removeNode() def removeAllSelected(self): self.selected.removeAll() From 78d14fcce3d4fc1030a1698c41086d10ace41c0b Mon Sep 17 00:00:00 2001 From: fireclawthefox Date: Thu, 26 Jan 2017 11:26:31 +0100 Subject: [PATCH 035/254] Fixed function name getChildren is expected in the MemoryExplorer and not getChildrenAsList getChildren is also more convenient to the rest of the p3d source --- direct/src/tkwidgets/MemoryExplorer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/direct/src/tkwidgets/MemoryExplorer.py b/direct/src/tkwidgets/MemoryExplorer.py index 62e74a6202..04e81875a0 100755 --- a/direct/src/tkwidgets/MemoryExplorer.py +++ b/direct/src/tkwidgets/MemoryExplorer.py @@ -284,7 +284,7 @@ class MemoryExplorerItem: def getNumChildren(self): return len(self.children) - def getChildrenAsList(self): + def getChildren(self): return self.children def getName(self): From 3318e254b863a4a4d747cdda7e0930ad15c300a0 Mon Sep 17 00:00:00 2001 From: fireclawthefox Date: Thu, 26 Jan 2017 11:26:48 +0100 Subject: [PATCH 036/254] Make the scene graph explorer occupy the empty space Expand the sge to fill up the otherwise unused space below it, which is useful for larger scenes. --- direct/src/tkpanels/DirectSessionPanel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/direct/src/tkpanels/DirectSessionPanel.py b/direct/src/tkpanels/DirectSessionPanel.py index 65a262eda3..b40583cda3 100644 --- a/direct/src/tkpanels/DirectSessionPanel.py +++ b/direct/src/tkpanels/DirectSessionPanel.py @@ -177,8 +177,8 @@ class DirectSessionPanel(AppShell): sgeFrame, nodePath = render, scrolledCanvas_hull_width = 250, scrolledCanvas_hull_height = 300) - self.SGE.pack(fill = BOTH, expand = 0) - sgeFrame.pack(side = LEFT, fill = 'both', expand = 0) + self.SGE.pack(fill = BOTH, expand = 1) + sgeFrame.pack(side = LEFT, fill = 'both', expand = 1) # Create the notebook pages notebook = Pmw.NoteBook(notebookFrame) From c3a196860a8605a3a7dddf39e6b0203dd85d7ec3 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 28 Jan 2017 17:41:09 +0100 Subject: [PATCH 037/254] downloader: support TLS SNI when negotiating with SSL server --- panda/src/downloader/httpChannel.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/panda/src/downloader/httpChannel.cxx b/panda/src/downloader/httpChannel.cxx index 96980fdfaa..3c90d63c3c 100644 --- a/panda/src/downloader/httpChannel.cxx +++ b/panda/src/downloader/httpChannel.cxx @@ -1474,6 +1474,14 @@ run_setup_ssl() { return false; } + string hostname = _request.get_url().get_server(); + result = SSL_set_tlsext_host_name(ssl, hostname.c_str()); + if (result == 0) { + downloader_cat.error() + << _NOTIFY_HTTP_CHANNEL_ID + << "Could not set TLS SNI hostname to '" << hostname << "'\n"; + } + /* * It would be nice to use something like SSL_set_client_cert_cb() here to set * a callback to provide the certificate should it be requested, or even to From cfe810ace70a685441aef757ee7b0ec4680be105 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 6 Feb 2017 13:16:27 +0100 Subject: [PATCH 038/254] Add set_shader_inputs for efficiently setting multiple shader inputs --- dtool/src/interrogate/functionRemap.cxx | 11 +- dtool/src/interrogate/functionRemap.h | 1 + .../interfaceMakerPythonNative.cxx | 43 +++- panda/src/pgraph/nodePath.h | 2 + panda/src/pgraph/nodePath_ext.cxx | 216 ++++++++++++++++++ panda/src/pgraph/nodePath_ext.h | 2 + panda/src/pgraph/shaderAttrib.h | 3 + 7 files changed, 266 insertions(+), 12 deletions(-) diff --git a/dtool/src/interrogate/functionRemap.cxx b/dtool/src/interrogate/functionRemap.cxx index 6659a310db..085d9421d1 100644 --- a/dtool/src/interrogate/functionRemap.cxx +++ b/dtool/src/interrogate/functionRemap.cxx @@ -791,6 +791,15 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak _args_type = InterfaceMaker::AT_single_arg; } else { _args_type = InterfaceMaker::AT_varargs; + + // If the arguments are named "args" and "kwargs", we will be directly + // passing the argument tuples to the function. + if (_parameters.size() == first_param + 2 && + _parameters[first_param]._name == "args" && + (_parameters[first_param + 1]._name == "kwargs" || + _parameters[first_param + 1]._name == "kwds")) { + _flags |= F_explicit_args; + } } switch (_type) { @@ -890,7 +899,7 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak if (_args_type == InterfaceMaker::AT_varargs) { // Every other method can take keyword arguments, if they take more // than one argument. - _args_type = InterfaceMaker::AT_keyword_args; + _args_type |= InterfaceMaker::AT_keyword_args; } } break; diff --git a/dtool/src/interrogate/functionRemap.h b/dtool/src/interrogate/functionRemap.h index 72e18cf09e..b4b8aea6dd 100644 --- a/dtool/src/interrogate/functionRemap.h +++ b/dtool/src/interrogate/functionRemap.h @@ -100,6 +100,7 @@ public: F_coerce_constructor = 0x1000, F_divide_float = 0x2000, F_hash = 0x4000, + F_explicit_args = 0x8000, }; typedef vector Parameters; diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index f24839d331..2b51f87689 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -3453,7 +3453,13 @@ write_function_for_name(ostream &out, Object *obj, max_required_args = collapse_default_remaps(map_sets, max_required_args); } - if (map_sets.size() > 1 && (args_type == AT_varargs || args_type == AT_keyword_args)) { + if (remap->_flags & FunctionRemap::F_explicit_args) { + // We have a remap that wants to handle the wrapper itself. + string expected_params; + write_function_instance(out, remap, 0, 0, expected_params, 2, true, true, + args_type, return_flags); + + } else if (map_sets.size() > 1 && (args_type == AT_varargs || args_type == AT_keyword_args)) { switch (args_type) { case AT_keyword_args: indent(out, 2) << "int parameter_count = (int)PyTuple_Size(args);\n"; @@ -4536,19 +4542,23 @@ write_function_instance(ostream &out, FunctionRemap *remap, expected_params += methodNameFromCppName(remap, "", false); expected_params += "("; - int num_params = max_num_args; - if (remap->_has_this) { - num_params += 1; - } - if (num_params > (int)remap->_parameters.size()) { - // Limit to how many parameters this remap actually has. - num_params = (int)remap->_parameters.size(); - max_num_args = num_params; + int num_params = 0; + + if ((remap->_flags & FunctionRemap::F_explicit_args) == 0) { + num_params = max_num_args; if (remap->_has_this) { - --max_num_args; + num_params += 1; } + if (num_params > (int)remap->_parameters.size()) { + // Limit to how many parameters this remap actually has. + num_params = (int)remap->_parameters.size(); + max_num_args = num_params; + if (remap->_has_this) { + --max_num_args; + } + } + nassertv(num_params <= (int)remap->_parameters.size()); } - nassertv(num_params <= (int)remap->_parameters.size()); bool only_pyobjects = true; @@ -4584,6 +4594,17 @@ write_function_instance(ostream &out, FunctionRemap *remap, } } + if (remap->_flags & FunctionRemap::F_explicit_args) { + // The function handles the arguments by itself. + expected_params += "*args"; + pexprs.push_back("args"); + if (args_type == AT_keyword_args) { + expected_params += ", **kwargs"; + pexprs.push_back("kwds"); + } + num_params = 0; + } + // Now convert (the rest of the) actual arguments, one by one. for (; pn < num_params; ++pn) { ParameterRemap *param = remap->_parameters[pn]._remap; diff --git a/panda/src/pgraph/nodePath.h b/panda/src/pgraph/nodePath.h index 1bbe0845cf..6aeeda6d01 100644 --- a/panda/src/pgraph/nodePath.h +++ b/panda/src/pgraph/nodePath.h @@ -659,6 +659,8 @@ PUBLISHED: INLINE void set_shader_input(CPT_InternalName id, PN_stdfloat n1, PN_stdfloat n2=0, PN_stdfloat n3=0, PN_stdfloat n4=0, int priority=0); + EXTENSION(void set_shader_inputs(PyObject *args, PyObject *kwargs)); + void clear_shader_input(CPT_InternalName id); void set_instance_count(int instance_count); diff --git a/panda/src/pgraph/nodePath_ext.cxx b/panda/src/pgraph/nodePath_ext.cxx index 081a69a814..60cbe19a1c 100644 --- a/panda/src/pgraph/nodePath_ext.cxx +++ b/panda/src/pgraph/nodePath_ext.cxx @@ -13,6 +13,7 @@ #include "nodePath_ext.h" #include "typedWritable_ext.h" +#include "shaderAttrib.h" #ifdef HAVE_PYTHON @@ -24,6 +25,35 @@ extern struct Dtool_PyTypedObject Dtool_LPoint3d; #else extern struct Dtool_PyTypedObject Dtool_LPoint3f; #endif +extern struct Dtool_PyTypedObject Dtool_Texture; +extern struct Dtool_PyTypedObject Dtool_NodePath; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_float; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_double; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_int; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLMatrix4f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LMatrix3f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLMatrix4d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LMatrix3d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4i; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3i; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2i; +extern struct Dtool_PyTypedObject Dtool_LVecBase4f; +extern struct Dtool_PyTypedObject Dtool_LVecBase3f; +extern struct Dtool_PyTypedObject Dtool_LVecBase2f; +extern struct Dtool_PyTypedObject Dtool_LVecBase4d; +extern struct Dtool_PyTypedObject Dtool_LVecBase3d; +extern struct Dtool_PyTypedObject Dtool_LVecBase2d; +extern struct Dtool_PyTypedObject Dtool_LVecBase4i; +extern struct Dtool_PyTypedObject Dtool_LVecBase3i; +extern struct Dtool_PyTypedObject Dtool_LVecBase2i; +extern struct Dtool_PyTypedObject Dtool_ShaderBuffer; +extern struct Dtool_PyTypedObject Dtool_ParamValueBase; #endif // CPPPARSER /** @@ -211,6 +241,192 @@ py_decode_NodePath_from_bam_stream_persist(PyObject *unpickler, const string &da return NodePath::decode_from_bam_stream(data, reader); } +/** + * Sets multiple shader inputs at the same time. This can be significantly + * more efficient if many inputs need to be set at the same time. + */ +void Extension:: +set_shader_inputs(PyObject *args, PyObject *kwargs) { + if (PyObject_Size(args) > 0) { + Dtool_Raise_TypeError("NodePath.set_shader_inputs takes only keyword arguments"); + return; + } + + PT(PandaNode) node = _this->node(); + CPT(RenderAttrib) prev_attrib = node->get_attrib(ShaderAttrib::get_class_slot()); + PT(ShaderAttrib) attrib; + if (prev_attrib == nullptr) { + attrib = new ShaderAttrib(); + } else { + attrib = new ShaderAttrib(*(const ShaderAttrib *)prev_attrib.p()); + } + + PyObject *key, *value; + Py_ssize_t pos = 0; + + while (PyDict_Next(kwargs, &pos, &key, &value)) { + char *buffer; + Py_ssize_t length; +#if PY_MAJOR_VERSION >= 3 + buffer = (char *)PyUnicode_AsUTF8AndSize(key, &length); + if (buffer == nullptr) { +#else + if (PyString_AsStringAndSize(key, &buffer, &length) == -1) { +#endif + Dtool_Raise_TypeError("NodePath.set_shader_inputs accepts only string keywords"); + return; + } + + CPT_InternalName name(string(buffer, length)); + ShaderInput *input = nullptr; + + if (PyTuple_CheckExact(value)) { + // A tuple is interpreted as a vector. + Py_ssize_t size = PyTuple_GET_SIZE(value); + if (size > 4) { + Dtool_Raise_TypeError("NodePath.set_shader_inputs tuple input should not have more than 4 scalars"); + return; + } + // If any of them is a float, we are storing it as a float vector. + bool is_float = false; + for (Py_ssize_t i = 0; i < size; ++i) { + if (PyFloat_CheckExact(PyTuple_GET_ITEM(value, i))) { + is_float = true; + break; + } + } + if (is_float) { + LVecBase4 vec(0); + for (Py_ssize_t i = 0; i < size; ++i) { + vec[i] = (PN_stdfloat)PyFloat_AsDouble(PyTuple_GET_ITEM(value, i)); + } + input = new ShaderInput(name, vec); + } else { + LVecBase4i vec(0); + for (Py_ssize_t i = 0; i < size; ++i) { + vec[i] = (int)PyLong_AsLong(PyTuple_GET_ITEM(value, i)); + } + input = new ShaderInput(name, vec); + } + + } else if (DtoolCanThisBeAPandaInstance(value)) { + Dtool_PyInstDef *inst = (Dtool_PyInstDef *)value; + void *ptr; + + if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_Texture))) { + input = new ShaderInput(name, (Texture *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_NodePath))) { + input = new ShaderInput(name, *(const NodePath *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_float))) { + input = new ShaderInput(name, *(const PTA_float *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_double))) { + input = new ShaderInput(name, *(const PTA_double *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_int))) { + input = new ShaderInput(name, *(const PTA_int *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4f))) { + input = new ShaderInput(name, *(const PTA_LVecBase4f *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3f))) { + input = new ShaderInput(name, *(const PTA_LVecBase3f *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2f))) { + input = new ShaderInput(name, *(const PTA_LVecBase2f *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLMatrix4f))) { + input = new ShaderInput(name, *(const PTA_LMatrix4f *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LMatrix3f))) { + input = new ShaderInput(name, *(const PTA_LMatrix3f *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4d))) { + input = new ShaderInput(name, *(const PTA_LVecBase4d *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3d))) { + input = new ShaderInput(name, *(const PTA_LVecBase3d *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2d))) { + input = new ShaderInput(name, *(const PTA_LVecBase2d *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLMatrix4d))) { + input = new ShaderInput(name, *(const PTA_LMatrix4d *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LMatrix3d))) { + input = new ShaderInput(name, *(const PTA_LMatrix3d *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4i))) { + input = new ShaderInput(name, *(const PTA_LVecBase4i *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3i))) { + input = new ShaderInput(name, *(const PTA_LVecBase3i *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2i))) { + input = new ShaderInput(name, *(const PTA_LVecBase2i *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4f))) { + input = new ShaderInput(name, *(const LVecBase4f *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3f))) { + input = new ShaderInput(name, *(const LVecBase3f *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2f))) { + input = new ShaderInput(name, *(const LVecBase2f *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4d))) { + input = new ShaderInput(name, *(const LVecBase4d *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3d))) { + input = new ShaderInput(name, *(const LVecBase3d *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2d))) { + input = new ShaderInput(name, *(const LVecBase2d *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4i))) { + input = new ShaderInput(name, *(const LVecBase4i *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3i))) { + input = new ShaderInput(name, *(const LVecBase3i *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2i))) { + input = new ShaderInput(name, *(const LVecBase2i *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_ShaderBuffer))) { + input = new ShaderInput(name, (ShaderBuffer *)ptr); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_ParamValueBase))) { + input = new ShaderInput(name, (ParamValueBase *)ptr); + + } else { + Dtool_Raise_TypeError("unknown type passed to NodePath.set_shader_inputs"); + return; + } + + } else if (PyFloat_Check(value)) { + input = new ShaderInput(name, LVecBase4(PyFloat_AS_DOUBLE(value), 0, 0, 0)); + +#if PY_MAJOR_VERSION < 3 + } else if (PyInt_Check(value)) { + input = new ShaderInput(name, LVecBase4i((int)PyInt_AS_LONG(value), 0, 0, 0)); +#endif + + } else if (PyLong_Check(value)) { + input = new ShaderInput(name, LVecBase4i((int)PyLong_AsLong(value), 0, 0, 0)); + + } else { + Dtool_Raise_TypeError("unknown type passed to NodePath.set_shader_inputs"); + return; + } + + attrib->_inputs[move(name)] = input; + } + + node->set_attrib(ShaderAttrib::return_new(attrib)); +} + /** * Returns the tight bounds as a 2-tuple of LPoint3 objects. This is a * convenience function for Python users, among which the use of diff --git a/panda/src/pgraph/nodePath_ext.h b/panda/src/pgraph/nodePath_ext.h index 3b0b8db42a..44c78378db 100644 --- a/panda/src/pgraph/nodePath_ext.h +++ b/panda/src/pgraph/nodePath_ext.h @@ -49,6 +49,8 @@ public: // This is defined to implement cycle detection in Python tags. INLINE int __traverse__(visitproc visit, void *arg); + void set_shader_inputs(PyObject *args, PyObject *kwargs); + PyObject *get_tight_bounds(const NodePath &other = NodePath()) const; }; diff --git a/panda/src/pgraph/shaderAttrib.h b/panda/src/pgraph/shaderAttrib.h index 5a28e929b1..ebdcca499c 100644 --- a/panda/src/pgraph/shaderAttrib.h +++ b/panda/src/pgraph/shaderAttrib.h @@ -31,6 +31,7 @@ #include "pta_LVecBase4.h" #include "pta_LVecBase3.h" #include "pta_LVecBase2.h" +#include "extension.h" /** * @@ -147,6 +148,8 @@ private: typedef pmap Inputs; Inputs _inputs; + friend class Extension; + PUBLISHED: static int get_class_slot() { return _attrib_slot; From 604d826aa38f06ed4ac7bae2bc537ad2c445bf20 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 9 Feb 2017 14:12:08 +0100 Subject: [PATCH 039/254] Bring README.md up to date --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ceb23f7793..a6e1a267a5 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ are included as part of the Windows 7.1 SDK. You will also need to have the third-party dependency libraries available for the build scripts to use. These are available from one of these two URLs, depending on whether you are on a 32-bit or 64-bit system: -https://www.panda3d.org/download/panda3d-1.9.2/panda3d-1.9.2-tools-win32.zip -https://www.panda3d.org/download/panda3d-1.9.2/panda3d-1.9.2-tools-win64.zip +https://www.panda3d.org/download/panda3d-1.9.3/panda3d-1.9.3-tools-win32.zip +https://www.panda3d.org/download/panda3d-1.9.3/panda3d-1.9.3-tools-win64.zip After acquiring these dependencies, you may simply build Panda3D from the command prompt using the following command: @@ -93,11 +93,11 @@ may have to use the installpanda.py script instead, which will directly copy the files into the appropriate locations on your computer. You may have to run the `ldconfig` tool in order to update your library cache after installing Panda3D. -Mac OS X --------- +macOS +----- -On Mac OS X, you will need to download a set of precompiled thirdparty packages in order to -compile Panda3D, which can be acquired from [here](https://www.panda3d.org/download/panda3d-1.9.2/panda3d-1.9.2-tools-mac.tar.gz). +On macOS, you will need to download a set of precompiled thirdparty packages in order to +compile Panda3D, which can be acquired from [here](https://www.panda3d.org/download/panda3d-1.9.3/panda3d-1.9.3-tools-mac.tar.gz). After placing the thirdparty directory inside the panda3d source directory, you may build Panda3D using a command like the following: @@ -107,7 +107,7 @@ python makepanda/makepanda.py --everything --installer ``` In order to make a universal build, pass the --universal flag. You may also -target a specific minimum Mac OS X version using the --osxtarget flag followed +target a specific minimum macOS version using the --osxtarget flag followed by the release number, eg. 10.6 or 10.7. If the build was successful, makepanda will have generated a .dmg file in From dcb793aed4b10d23e205a582e98517167eb77cbb Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 9 Feb 2017 22:56:37 +0100 Subject: [PATCH 040/254] Clean up cpuid code, make selection of cpu/mem info available on Linux, macOS and FreeBSD --- panda/src/display/displayInformation.cxx | 94 +---- panda/src/display/displayInformation.h | 18 +- panda/src/display/graphicsPipe.cxx | 172 +++++++- panda/src/display/graphicsPipe.h | 4 +- panda/src/windisplay/winGraphicsPipe.cxx | 495 +---------------------- 5 files changed, 186 insertions(+), 597 deletions(-) diff --git a/panda/src/display/displayInformation.cxx b/panda/src/display/displayInformation.cxx index 60e3a69e8b..ac357344a5 100644 --- a/panda/src/display/displayInformation.cxx +++ b/panda/src/display/displayInformation.cxx @@ -14,6 +14,13 @@ #include "graphicsStateGuardian.h" #include "displayInformation.h" +// For __rdtsc +#ifdef _MSC_VER +#include +#elif defined(__GNUC__) && !defined(__APPLE__) +#include +#endif + /** * Returns true if these two DisplayModes are identical. */ @@ -58,12 +65,6 @@ DisplayInformation:: if (_display_mode_array != NULL) { delete[] _display_mode_array; } - if (_cpu_id_data != NULL) { - delete _cpu_id_data; - } - if (_cpu_brand_string != NULL) { - delete _cpu_brand_string; - } } /** @@ -134,12 +135,6 @@ DisplayInformation() { _driver_date_day = 0; _driver_date_year = 0; - _cpu_id_version = 1; - _cpu_id_size = 0; - _cpu_id_data = 0; - - _cpu_vendor_string = 0; - _cpu_brand_string = 0; _cpu_version_information = 0; _cpu_brand_index = 0; @@ -152,7 +147,6 @@ DisplayInformation() { _num_logical_cpus = 0; _get_memory_information_function = 0; - _cpu_time_function = 0; _update_cpu_frequency_function = 0; _os_version_major = -1; @@ -493,62 +487,17 @@ get_driver_date_year() { /** * */ -int DisplayInformation:: -get_cpu_id_version() { - return _cpu_id_version; -} - -/** - * Returns the number of 32-bit values for cpu id binary data. - */ -int DisplayInformation:: -get_cpu_id_size() { - return _cpu_id_size; -} - -/** - * Returns part of cpu id binary data based on the index. - */ -unsigned int DisplayInformation:: -get_cpu_id_data(int index) { - unsigned int data; - - data = 0; - if (index >= 0 && index < _cpu_id_size) { - data = _cpu_id_data [index]; - } - - return data; +const string &DisplayInformation:: +get_cpu_vendor_string() const { + return _cpu_vendor_string; } /** * */ -const char *DisplayInformation:: -get_cpu_vendor_string() { - const char *string; - - string = _cpu_vendor_string; - if (string == 0) { - string = ""; - } - - return string; -} - -/** - * - */ -const char *DisplayInformation:: -get_cpu_brand_string() { - const char *string; - - string = _cpu_brand_string; - if (string == 0) { - string = ""; - } - - return string; +const string &DisplayInformation:: +get_cpu_brand_string() const { + return _cpu_brand_string; } /** @@ -576,18 +525,17 @@ get_cpu_frequency() { } /** - * + * Equivalent to the rdtsc processor instruction. */ uint64_t DisplayInformation:: get_cpu_time() { - uint64_t cpu_time; - - cpu_time = 0; - if (_cpu_time_function) { - cpu_time = _cpu_time_function(); - } - - return cpu_time; +#if defined(_MSC_VER) || (defined(__GNUC__) && !defined(__APPLE__)) + return __rdtsc(); +#else + unsigned int lo, hi = 0; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return ((uint64_t)hi << 32) | lo; +#endif } /** diff --git a/panda/src/display/displayInformation.h b/panda/src/display/displayInformation.h index 440e3e8ee8..919e400741 100644 --- a/panda/src/display/displayInformation.h +++ b/panda/src/display/displayInformation.h @@ -94,17 +94,13 @@ PUBLISHED: int get_driver_date_day(); int get_driver_date_year(); - int get_cpu_id_version(); - int get_cpu_id_size(); - unsigned int get_cpu_id_data(int index); - - const char *get_cpu_vendor_string(); - const char *get_cpu_brand_string(); + const string &get_cpu_vendor_string() const; + const string &get_cpu_brand_string() const; unsigned int get_cpu_version_information(); unsigned int get_cpu_brand_index(); uint64_t get_cpu_frequency(); - uint64_t get_cpu_time(); + static uint64_t get_cpu_time(); uint64_t get_maximum_cpu_frequency(); uint64_t get_current_cpu_frequency(); @@ -158,12 +154,9 @@ public: int _driver_date_day; int _driver_date_year; - int _cpu_id_version; - int _cpu_id_size; - unsigned int *_cpu_id_data; - char *_cpu_vendor_string; - char *_cpu_brand_string; + string _cpu_vendor_string; + string _cpu_brand_string; unsigned int _cpu_version_information; unsigned int _cpu_brand_index; @@ -176,7 +169,6 @@ public: int _num_logical_cpus; void (*_get_memory_information_function) (DisplayInformation *display_information); - uint64_t (*_cpu_time_function) (void); int (*_update_cpu_frequency_function) (int processor_number, DisplayInformation *display_information); int _os_version_major; diff --git a/panda/src/display/graphicsPipe.cxx b/panda/src/display/graphicsPipe.cxx index 996b5694ff..7bf9df67a6 100644 --- a/panda/src/display/graphicsPipe.cxx +++ b/panda/src/display/graphicsPipe.cxx @@ -18,6 +18,92 @@ #include "mutexHolder.h" #include "displayInformation.h" +#ifdef IS_LINUX +#include +#include +#endif + +#ifdef IS_OSX +#include +#endif + +#ifdef IS_FREEBSD +#include +#endif + +#if defined(__GNUC__) && !defined(__APPLE__) +// GCC and Clang offer a useful cpuid.h header. +#include +#endif + +#ifdef _MSC_VER +// MSVC has a __cpuid intrinsic. +#include +#endif + +#ifdef _WIN32 +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#endif + +union cpuid_info { + char str[16]; + struct { + uint32_t eax, ebx, ecx, edx; + }; +}; + +/** + * Returns the highest cpuid leaf that is supported by the CPU. + */ +static inline uint32_t get_cpuid_max(uint32_t leaf) { +#if defined(__GNUC__) && !defined(__APPLE__) + return __get_cpuid_max(leaf, 0); +#elif defined(_MSC_VER) + uint32_t p[4] = {0}; + __cpuid((int *)p, leaf); + return p[0]; +#else + unsigned int eax = 0; + __asm__ ("cpuid\n\t" + : "=a" (eax) + : "0" (leaf)); + return eax; +#endif +} + +/** + * Gets cpuid info for the given leaf. + */ +static inline void get_cpuid(uint32_t leaf, cpuid_info &info) { +#if defined(__GNUC__) && !defined(__APPLE__) + __cpuid(leaf, info.eax, info.ebx, info.ecx, info.edx); +#elif defined(_MSC_VER) + __cpuid((int *)info.str, leaf); +#else + __asm__ ("cpuid\n\t" + : "=a" (info.eax), "=b" (info.ebx), "=c" (info.ecx), "=d" (info.edx) + : "0" (leaf)); +#endif +} + +#ifdef IS_LINUX +/** + * Updates the current memory usage statistics in the DisplayInformation. + */ +static void update_memory_info(DisplayInformation *info) { + struct sysinfo meminfo; + if (sysinfo(&meminfo) == 0) { + info->_physical_memory = meminfo.totalram; + info->_available_physical_memory = meminfo.freeram; + info->_page_file_size = meminfo.totalswap; + info->_available_page_file_size = meminfo.freeswap; + } +} +#endif + TypeHandle GraphicsPipe::_type_handle; /** @@ -38,24 +124,78 @@ GraphicsPipe() : _display_width = 0; _display_height = 0; - _display_information = new DisplayInformation ( ); -} + _display_information = new DisplayInformation(); -/** - * Don't try to copy GraphicsPipes. - */ -GraphicsPipe:: -GraphicsPipe(const GraphicsPipe &) { - _is_valid = false; - nassertv(false); -} + cpuid_info info; + const uint32_t max_cpuid = get_cpuid_max(0); + const uint32_t max_extended = get_cpuid_max(0x80000000); -/** - * Don't try to copy GraphicsPipes. - */ -void GraphicsPipe:: -operator = (const GraphicsPipe &) { - nassertv(false); + if (max_cpuid >= 1) { + get_cpuid(0, info); + swap(info.ecx, info.edx); + _display_information->_cpu_vendor_string = string(info.str + 4, 12); + + get_cpuid(1, info); + _display_information->_cpu_version_information = info.eax; + _display_information->_cpu_brand_index = info.ebx & 0xff; + } + + if (max_extended >= 0x80000004) { + string brand; + get_cpuid(0x80000002, info); + brand += string(info.str, strnlen(info.str, 16)); + get_cpuid(0x80000003, info); + brand += string(info.str, strnlen(info.str, 16)); + get_cpuid(0x80000004, info); + brand += string(info.str, strnlen(info.str, 16)); + _display_information->_cpu_brand_string = move(brand); + } + +#if defined(IS_OSX) + // macOS exposes a lot of useful information through sysctl. + size_t len = sizeof(uint64_t); + sysctlbyname("hw.memsize", &_display_information->_physical_memory, &len, NULL, 0); + len = sizeof(uint64_t); + sysctlbyname("hw.cpufrequency", &_display_information->_cpu_frequency, &len, NULL, 0); + len = sizeof(uint64_t); + sysctlbyname("hw.cpufrequency", &_display_information->_current_cpu_frequency, &len, NULL, 0); + len = sizeof(uint64_t); + sysctlbyname("hw.cpufrequency_max", &_display_information->_maximum_cpu_frequency, &len, NULL, 0); + len = sizeof(int); + sysctlbyname("hw.physicalcpu", &_display_information->_num_cpu_cores, &len, NULL, 0); + len = sizeof(int); + sysctlbyname("hw.logicalcpu", &_display_information->_num_logical_cpus, &len, NULL, 0); + +#elif defined(IS_LINUX) + _display_information->_get_memory_information_function = &update_memory_info; + update_memory_info(_display_information); + +#elif defined(IS_FREEBSD) + size_t len = sizeof(uint64_t); + sysctlbyname("hw.physmem", &_display_information->_physical_memory, &len, NULL, 0); + len = sizeof(uint64_t); + sysctlbyname("vm.swap_total", &_display_information->_page_file_size, &len, NULL, 0); + +#elif defined(_WIN32) + MEMORYSTATUSEX status; + status.dwLength = sizeof(MEMORYSTATUSEX); + if (GlobalMemoryStatusEx(&status)) { + _display_information->_physical_memory = status.ullTotalPhys; + _display_information->_available_physical_memory = status.ullAvailPhys; + _display_information->_page_file_size = status.ullTotalPageFile; + _display_information->_available_page_file_size = status.ullAvailPageFile; + _display_information->_process_virtual_memory = status.ullTotalVirtual; + _display_information->_available_process_virtual_memory = status.ullAvailVirtual; + _display_information->_memory_load = status.dwMemoryLoad; + } +#endif + +#if defined(IS_LINUX) || defined(IS_FREEBSD) + long nproc = sysconf(_SC_NPROCESSORS_CONF); + if (nproc > 0) { + _display_information->_num_logical_cpus = nproc; + } +#endif } /** diff --git a/panda/src/display/graphicsPipe.h b/panda/src/display/graphicsPipe.h index 462fa3afcf..f7994b92e1 100644 --- a/panda/src/display/graphicsPipe.h +++ b/panda/src/display/graphicsPipe.h @@ -53,8 +53,8 @@ class EXPCL_PANDA_DISPLAY GraphicsPipe : public TypedReferenceCount { protected: GraphicsPipe(); private: - GraphicsPipe(const GraphicsPipe ©); - void operator = (const GraphicsPipe ©); + GraphicsPipe(const GraphicsPipe ©) DELETED; + GraphicsPipe &operator = (const GraphicsPipe ©) DELETED_ASSIGN; PUBLISHED: virtual ~GraphicsPipe(); diff --git a/panda/src/windisplay/winGraphicsPipe.cxx b/panda/src/windisplay/winGraphicsPipe.cxx index 3d584de226..cf76e06296 100644 --- a/panda/src/windisplay/winGraphicsPipe.cxx +++ b/panda/src/windisplay/winGraphicsPipe.cxx @@ -20,10 +20,7 @@ #include "psapi.h" #include "powrprof.h" - -#ifdef _WIN64 #include -#endif TypeHandle WinGraphicsPipe::_type_handle; @@ -99,443 +96,6 @@ void get_memory_information (DisplayInformation *display_information) { } } -typedef union { - uint64_t long_integer; -} -LONG_INTEGER; - -uint64_t cpu_time_function (void) { -#ifdef _WIN64 - return __rdtsc(); -#else - LONG_INTEGER long_integer; - LONG_INTEGER *long_integer_pointer; - - long_integer_pointer = &long_integer; - - __asm { - mov ebx,[long_integer_pointer] - rdtsc - mov [ebx + 0], eax - mov [ebx + 4], edx - } - - return long_integer.long_integer; -#endif -} - -typedef union { - struct { - union { - struct { - unsigned char al; - unsigned char ah; - }; - unsigned int eax; - }; - unsigned int ebx; - unsigned int ecx; - unsigned int edx; - }; -} CPU_ID_REGISTERS; - -typedef struct { - union { - struct { - int maximum_cpu_id_input; - char cpu_vendor [16]; - }; - - CPU_ID_REGISTERS cpu_id_registers_0; - }; - - union { - CPU_ID_REGISTERS cpu_id_registers_1; - - struct { - // eax - union { - unsigned int eax; - unsigned int version_information; - struct { - unsigned int stepping_id : 4; - unsigned int model : 4; - unsigned int family : 4; - unsigned int processor_type : 2; - unsigned int reserved_0 : 2; - unsigned int extended_model_id : 4; - unsigned int extended_family_id : 8; - unsigned int reserved_1 : 4; - }; - }; - - // ebx - union { - unsigned int ebx; - struct { - unsigned int brand_index : 8; - unsigned int clflush : 8; - unsigned int maximum_logical_processors : 8; - unsigned int initial_apic_id : 8; - }; - }; - - // ecx - union { - unsigned int ecx; - struct { - unsigned int sse3 : 1; - unsigned int reserved_1_to_2 : 2; - unsigned int monitor : 1; - unsigned int ds_cpl : 1; - unsigned int vmx : 1; - unsigned int reserved_6 : 1; - unsigned int est : 1; - unsigned int tm2 : 1; - unsigned int reserved_9 : 1; - unsigned int cnxt_id : 1; - unsigned int reserved_11_to_12 : 2; - unsigned int cmpxchg16b : 1; - unsigned int xtpr_disable : 1; - unsigned int reserved_15_to_31 : 17; - }; - }; - - // edx - union { - unsigned int edx; - struct { - unsigned int fpu : 1; - unsigned int vme : 1; - unsigned int de : 1; - unsigned int pse : 1; - unsigned int tsc : 1; - unsigned int msr : 1; - unsigned int pae : 1; - unsigned int mce : 1; - unsigned int cx8 : 1; - unsigned int apic : 1; - unsigned int reserved_10 : 1; - unsigned int sep : 1; - unsigned int mtrr : 1; - unsigned int pge : 1; - unsigned int mca : 1; - unsigned int cmov : 1; - unsigned int pat : 1; - unsigned int pse_36 : 1; - unsigned int psn : 1; - unsigned int cflush : 1; - unsigned int reserved_20 : 1; - unsigned int ds : 1; - unsigned int acpi : 1; - unsigned int mmx : 1; - unsigned int fxsr : 1; - unsigned int sse : 1; - unsigned int sse2 : 1; - unsigned int ss : 1; - unsigned int htt : 1; - unsigned int tm : 1; - unsigned int reserved_30 : 1; - unsigned int pbe : 1; - }; - }; - }; - }; - - #define MAXIMUM_2 8 - #define MAXIMUM_CHARACTERS (MAXIMUM_2 * sizeof(CPU_ID_REGISTERS)) - - union { - CPU_ID_REGISTERS cpu_id_registers_2; - unsigned char character_array_2 [MAXIMUM_CHARACTERS]; - CPU_ID_REGISTERS cpu_id_registers_2_array [MAXIMUM_2]; - }; - - union { - CPU_ID_REGISTERS cpu_id_registers_0x80000000; - }; - - union { - CPU_ID_REGISTERS cpu_id_registers_0x80000001; - }; - - union { - char cpu_brand_string [sizeof(CPU_ID_REGISTERS) * 3]; - struct { - CPU_ID_REGISTERS cpu_id_registers_0x80000002; - CPU_ID_REGISTERS cpu_id_registers_0x80000003; - CPU_ID_REGISTERS cpu_id_registers_0x80000004; - }; - }; - - union { - struct { - unsigned int eax; - unsigned int ebx; - union { - unsigned int ecx; - struct { - unsigned int l1_data_cache_line_size : 8; - unsigned int l1_data_reserved_8_to_15 : 8; - unsigned int l1_data_associativity : 8; - unsigned int l1_data_cache_size : 8; - }; - }; - union { - unsigned int edx; - struct { - unsigned int l1_code_cache_line_size : 8; - unsigned int l1_code_reserved_8_to_15 : 8; - unsigned int l1_code_associativity : 8; - unsigned int l1_code_cache_size : 8; - }; - }; - }; - CPU_ID_REGISTERS cpu_id_registers_0x80000005; - }; - - union { - struct { - unsigned int eax; - unsigned int ebx; - union { - unsigned int ecx; - struct { - unsigned int l2_cache_line_size : 8; - unsigned int l2_reserved_8_to_11 : 4; - unsigned int l2_associativity : 4; - unsigned int l2_cache_size : 16; - }; - }; - unsigned int edx; - }; - CPU_ID_REGISTERS cpu_id_registers_0x80000006; - }; - - CPU_ID_REGISTERS cpu_id_registers_0x80000008; - - unsigned int cache_line_size; - unsigned int log_base_2_cache_line_size; -} CPU_ID; - -typedef struct { - CPU_ID_REGISTERS cpu_id_registers_0; - CPU_ID_REGISTERS cpu_id_registers_1; - - CPU_ID_REGISTERS cpu_id_registers_0x80000000; - CPU_ID_REGISTERS cpu_id_registers_0x80000001; - CPU_ID_REGISTERS cpu_id_registers_0x80000002; - CPU_ID_REGISTERS cpu_id_registers_0x80000003; - CPU_ID_REGISTERS cpu_id_registers_0x80000004; - - CPU_ID_REGISTERS cpu_id_registers_0x80000006; - - CPU_ID_REGISTERS cpu_id_registers_0x80000008; -} CPU_ID_BINARY_DATA; - -void cpu_id_to_cpu_id_binary_data (CPU_ID *cpu_id, CPU_ID_BINARY_DATA *cpu_id_binary_data) { - cpu_id_binary_data->cpu_id_registers_0 = cpu_id->cpu_id_registers_0; - cpu_id_binary_data->cpu_id_registers_1 = cpu_id->cpu_id_registers_1; - cpu_id_binary_data->cpu_id_registers_0x80000000 = cpu_id->cpu_id_registers_0x80000000; - cpu_id_binary_data->cpu_id_registers_0x80000001 = cpu_id->cpu_id_registers_0x80000001; - cpu_id_binary_data->cpu_id_registers_0x80000002 = cpu_id->cpu_id_registers_0x80000002; - cpu_id_binary_data->cpu_id_registers_0x80000003 = cpu_id->cpu_id_registers_0x80000003; - cpu_id_binary_data->cpu_id_registers_0x80000004 = cpu_id->cpu_id_registers_0x80000004; - cpu_id_binary_data->cpu_id_registers_0x80000006 = cpu_id->cpu_id_registers_0x80000006; - cpu_id_binary_data->cpu_id_registers_0x80000008 = cpu_id->cpu_id_registers_0x80000008; -} - -void cpu_id_binary_data_to_cpu_id (CPU_ID_BINARY_DATA *cpu_id_binary_data, CPU_ID *cpu_id) { - memset (cpu_id, 0, sizeof(CPU_ID)); - - cpu_id->cpu_id_registers_0 = cpu_id_binary_data->cpu_id_registers_0; - cpu_id->cpu_id_registers_1 = cpu_id_binary_data->cpu_id_registers_1; - cpu_id->cpu_id_registers_0x80000000 = cpu_id_binary_data->cpu_id_registers_0x80000000; - cpu_id->cpu_id_registers_0x80000001 = cpu_id_binary_data->cpu_id_registers_0x80000001; - cpu_id->cpu_id_registers_0x80000002 = cpu_id_binary_data->cpu_id_registers_0x80000002; - cpu_id->cpu_id_registers_0x80000003 = cpu_id_binary_data->cpu_id_registers_0x80000003; - cpu_id->cpu_id_registers_0x80000004 = cpu_id_binary_data->cpu_id_registers_0x80000004; - cpu_id->cpu_id_registers_0x80000006 = cpu_id_binary_data->cpu_id_registers_0x80000006; - cpu_id->cpu_id_registers_0x80000008 = cpu_id_binary_data->cpu_id_registers_0x80000008; -} - -int cpuid(int input_eax, CPU_ID_REGISTERS *cpu_id_registers) { - int state; - - state = false; - __try { - if (input_eax == 0) { - // the order of ecx and edx is swapped when saved to make a proper - // vendor string -#ifdef _WIN64 - __cpuid((int*)cpu_id_registers, input_eax); - unsigned int tmp = cpu_id_registers->edx; - cpu_id_registers->edx = cpu_id_registers->ecx; - cpu_id_registers->ecx = tmp; -#else - __asm { - mov eax, [input_eax] - mov edi, [cpu_id_registers] - - cpuid - - mov [edi + 0], eax - mov [edi + 4], ebx - mov [edi + 8], edx - mov [edi + 12], ecx - } -#endif - } else { -#ifdef _WIN64 - __cpuid((int*)cpu_id_registers, input_eax); -#else - __asm { - mov eax, [input_eax] - mov edi, [cpu_id_registers] - - cpuid - - mov [edi + 0], eax - mov [edi + 4], ebx - mov [edi + 8], ecx - mov [edi + 12], edx - } -#endif - } - - state = true; - } - __except (1) { - state = false; - } - - return state; -} - -void parse_cpu_id(CPU_ID *cpu_id) { - printf("CPUID\n"); - printf(" vendor = %s\n", cpu_id->cpu_vendor); - printf(" brand string %s\n", cpu_id->cpu_brand_string); - printf(" maximum_cpu_id_input = %u\n", cpu_id->maximum_cpu_id_input); - printf(" maximum extended information = 0x%X\n", cpu_id->cpu_id_registers_0x80000000.eax); - - printf(" MMX = %u\n", cpu_id->mmx); - printf(" SSE = %u\n", cpu_id->sse); - printf(" SSE2 = %u\n", cpu_id->sse2); - printf(" SSE3 = %u\n", cpu_id->sse3); - - printf(" EST = %u\n", cpu_id->est); - - if (cpu_id->maximum_cpu_id_input >= 1) { - printf(" version_information\n"); - printf(" stepping_id %u\n", cpu_id->stepping_id); - printf(" model %u\n", cpu_id->model); - printf(" family %u\n", cpu_id->family); - printf(" processor_type %u\n", cpu_id->processor_type); - printf(" extended_model_id %u\n", cpu_id->extended_model_id); - printf(" extended_family_id %u\n", cpu_id->extended_family_id); - - printf(" brand_index %u\n", cpu_id->brand_index); - printf(" clflush %u\n", cpu_id->clflush); - printf(" maximum_logical_processors %u\n", cpu_id->maximum_logical_processors); - printf(" initial_apic_id %u\n", cpu_id->initial_apic_id); - -// printf(" cache_line_size %u\n", cpu_id->cache_line_size); printf(" -// log_base_2_cache_line_size %u\n", cpu_id->log_base_2_cache_line_size); - } - - if (cpu_id->cpu_id_registers_0x80000000.eax >= 0x80000005) { - printf(" l1_data_cache_line_size %d\n", cpu_id->l1_data_cache_line_size); - printf(" l1_data_associativity %d\n", cpu_id->l1_data_associativity); - printf(" l1_data_cache_size %dK\n", cpu_id->l1_data_cache_size); - - printf(" l1_code_cache_line_size %d\n", cpu_id->l1_code_cache_line_size); - printf(" l1_code_associativity %d\n", cpu_id->l1_code_associativity); - printf(" l1_code_cache_size %dK\n", cpu_id->l1_code_cache_size); - } - - if (cpu_id->cpu_id_registers_0x80000000.eax >= 0x80000006) { - printf(" l2_cache_line_size %d\n", cpu_id->l2_cache_line_size); - printf(" l2_associativity %d\n", cpu_id->l2_associativity); - printf(" l2_cache_size %dK\n", cpu_id->l2_cache_size); - } -} - -int initialize_cpu_id(CPU_ID *cpu_id) { - int debug = false; - memset(cpu_id, 0, sizeof(CPU_ID)); - - if (cpuid(0, &cpu_id->cpu_id_registers_0)) { - if (cpu_id->maximum_cpu_id_input >= 1) { - cpuid(1, &cpu_id->cpu_id_registers_1); - } - if (cpu_id->maximum_cpu_id_input >= 2) { - unsigned int index; - - cpuid(2, &cpu_id->cpu_id_registers_2); - if (debug) { - printf(" al = %u\n", cpu_id->cpu_id_registers_2.al); - } - - for (index = 1; index < cpu_id->cpu_id_registers_2.al && index < MAXIMUM_2; index++) { - cpuid(2, &cpu_id->cpu_id_registers_2_array [index]); - } - - for (index = 1; index < MAXIMUM_CHARACTERS; index++) { - if (cpu_id->character_array_2 [index]) { - if (debug) { - printf(" cache/TLB byte = %X\n", cpu_id->character_array_2 [index]); - } - switch (cpu_id->character_array_2 [index]) { - case 0x0A: - case 0x0C: - cpu_id->cache_line_size = 32; - cpu_id->log_base_2_cache_line_size = 5; - break; - - case 0x2C: - case 0x60: - case 0x66: - case 0x67: - case 0x68: - cpu_id->cache_line_size = 64; - cpu_id->log_base_2_cache_line_size = 6; - break; - } - } - } - } - - cpuid(0x80000000, &cpu_id->cpu_id_registers_0x80000000); - - if (cpu_id->cpu_id_registers_0x80000000.eax >= 0x80000001) { - cpuid(0x80000001, &cpu_id->cpu_id_registers_0x80000001); - } - - if (cpu_id->cpu_id_registers_0x80000000.eax >= 0x80000004) { - cpuid(0x80000002, &cpu_id->cpu_id_registers_0x80000002); - cpuid(0x80000003, &cpu_id->cpu_id_registers_0x80000003); - cpuid(0x80000004, &cpu_id->cpu_id_registers_0x80000004); - } - - if (cpu_id->cpu_id_registers_0x80000000.eax >= 0x80000005) { - cpuid(0x80000005, &cpu_id->cpu_id_registers_0x80000005); - } - - if (cpu_id->cpu_id_registers_0x80000000.eax >= 0x80000006) { - cpuid(0x80000006, &cpu_id->cpu_id_registers_0x80000006); - } - - if (cpu_id->cpu_id_registers_0x80000000.eax >= 0x80000008) { - cpuid(0x80000008, &cpu_id->cpu_id_registers_0x80000008); - } - - return true; - } - - return false; -} - int update_cpu_frequency_function(int processor_number, DisplayInformation *display_information) { int update; @@ -776,9 +336,6 @@ lookup_cpu_data() { // set callback for memory function _display_information->_get_memory_information_function = get_memory_information; - // set callback for cpu time function - _display_information->_cpu_time_function = cpu_time_function; - // determine CPU frequency uint64_t time; uint64_t end_time; @@ -803,12 +360,12 @@ lookup_cpu_data() { if (QueryPerformanceFrequency(&frequency)) { if (frequency.QuadPart > 0) { if (QueryPerformanceCounter (&counter)) { - time = cpu_time_function(); + time = __rdtsc(); end.QuadPart = counter.QuadPart + frequency.QuadPart; while (QueryPerformanceCounter (&counter) && counter.QuadPart < end.QuadPart) { } - end_time = cpu_time_function(); + end_time = __rdtsc(); _display_information->_cpu_frequency = end_time - time; } @@ -821,54 +378,6 @@ lookup_cpu_data() { sprintf(string, "CPU frequency: %I64d\n", _display_information->_cpu_frequency); windisplay_cat.info() << string; - - // CPUID - CPU_ID cpu_id; - - windisplay_cat.info() << "start CPU ID\n"; - - if (initialize_cpu_id(&cpu_id)) { - CPU_ID_BINARY_DATA *cpu_id_binary_data; - - cpu_id_binary_data = new (CPU_ID_BINARY_DATA); - if (cpu_id_binary_data) { - cpu_id_to_cpu_id_binary_data(&cpu_id, cpu_id_binary_data); - _display_information->_cpu_id_size = sizeof(CPU_ID_BINARY_DATA) / sizeof(unsigned int); - _display_information->_cpu_id_data = (unsigned int *) cpu_id_binary_data; - - _display_information->_cpu_vendor_string = strdup(cpu_id.cpu_vendor); - _display_information->_cpu_brand_string = strdup(cpu_id.cpu_brand_string); - _display_information->_cpu_version_information = cpu_id.version_information; - _display_information->_cpu_brand_index = cpu_id.brand_index; - - if (windisplay_cat.is_debug()) { - windisplay_cat.debug() - << hex << _display_information->_cpu_id_version << dec << "|"; - - int index; - for (index = 0; index < _display_information->_cpu_id_size; ++index) { - unsigned int data; - data = _display_information->_cpu_id_data[index]; - - windisplay_cat.debug(false) - << hex << data << dec; - if (index < _display_information->_cpu_id_size - 1) { - windisplay_cat.debug(false) - << "|"; - } - } - windisplay_cat.debug(false) - << "\n"; - } - } - - if (windisplay_cat.is_debug()) { - parse_cpu_id(&cpu_id); - } - } - - windisplay_cat.info() << "end CPU ID\n"; - // Number of CPU's count_number_of_cpus(_display_information); } From 218ad7058dded4ed12223d14336f6f1fcaa27b74 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 9 Feb 2017 23:50:14 +0100 Subject: [PATCH 041/254] pystub: definitions for debug version of Python --- dtool/src/pystub/pystub.cxx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index d0d6a4ca1a..1ebad938bd 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -90,6 +90,7 @@ extern "C" { EXPCL_PYSTUB int PyModule_AddObject(...); EXPCL_PYSTUB int PyModule_AddStringConstant(...); EXPCL_PYSTUB int PyModule_Create2(...); + EXPCL_PYSTUB int PyModule_Create2TraceRefs(...); EXPCL_PYSTUB int PyNumber_Check(...); EXPCL_PYSTUB int PyNumber_Float(...); EXPCL_PYSTUB int PyNumber_Int(...); @@ -175,6 +176,7 @@ extern "C" { EXPCL_PYSTUB int Py_InitModule4(...); EXPCL_PYSTUB int Py_InitModule4_64(...); EXPCL_PYSTUB int Py_InitModule4TraceRefs(...); + EXPCL_PYSTUB int Py_InitModule4TraceRefs_64(...); EXPCL_PYSTUB int _PyArg_ParseTuple_SizeT(...); EXPCL_PYSTUB int _PyArg_ParseTupleAndKeywords_SizeT(...); EXPCL_PYSTUB int _PyArg_Parse_SizeT(...); @@ -184,9 +186,14 @@ extern "C" { EXPCL_PYSTUB int _PyObject_Del(...); EXPCL_PYSTUB int _PyUnicode_AsString(...); EXPCL_PYSTUB int _PyUnicode_AsStringAndSize(...); + EXPCL_PYSTUB int _Py_AddToAllObjects(...); EXPCL_PYSTUB int _Py_BuildValue_SizeT(...); EXPCL_PYSTUB int _Py_Dealloc(...); + EXPCL_PYSTUB int _Py_ForgetReference(...); EXPCL_PYSTUB int _Py_NegativeRefcount(...); + EXPCL_PYSTUB int _Py_NewReference(...); + EXPCL_PYSTUB int _Py_PrintReferenceAddresses(...); + EXPCL_PYSTUB int _Py_PrintReferences(...); EXPCL_PYSTUB int _Py_RefTotal(...); EXPCL_PYSTUB void Py_Initialize(); @@ -292,6 +299,7 @@ int PyModule_AddIntConstant(...) { return 0; }; int PyModule_AddObject(...) { return 0; }; int PyModule_AddStringConstant(...) { return 0; }; int PyModule_Create2(...) { return 0; }; +int PyModule_Create2TraceRefs(...) { return 0; }; int PyNumber_Check(...) { return 0; } int PyNumber_Float(...) { return 0; } int PyNumber_Int(...) { return 0; } @@ -377,6 +385,7 @@ int Py_BuildValue(...) { return 0; } int Py_InitModule4(...) { return 0; } int Py_InitModule4_64(...) { return 0; } int Py_InitModule4TraceRefs(...) { return 0; }; +int Py_InitModule4TraceRefs_64(...) { return 0; }; int _PyArg_ParseTuple_SizeT(...) { return 0; }; int _PyArg_ParseTupleAndKeywords_SizeT(...) { return 0; }; int _PyArg_Parse_SizeT(...) { return 0; }; @@ -386,9 +395,14 @@ int _PyObject_DebugFree(...) { return 0; }; int _PyObject_Del(...) { return 0; }; int _PyUnicode_AsString(...) { return 0; }; int _PyUnicode_AsStringAndSize(...) { return 0; }; +int _Py_AddToAllObjects(...) { return 0; }; int _Py_BuildValue_SizeT(...) { return 0; }; int _Py_Dealloc(...) { return 0; }; +int _Py_ForgetReference(...) { return 0; }; int _Py_NegativeRefcount(...) { return 0; }; +int _Py_NewReference(...) { return 0; }; +int _Py_PrintReferenceAddresses(...) { return 0; }; +int _Py_PrintReferences(...) { return 0; }; int _Py_RefTotal(...) { return 0; }; // We actually might call this one. From 18f09c48dd87ada568463184472e6d4106cd49ed Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 9 Feb 2017 23:52:38 +0100 Subject: [PATCH 042/254] cppparser: parse template friend declaration --- dtool/src/cppparser/cppBison.cxx.prebuilt | 10760 ++++++++++---------- dtool/src/cppparser/cppBison.h.prebuilt | 337 +- dtool/src/cppparser/cppBison.yxx | 2 + 3 files changed, 5284 insertions(+), 5815 deletions(-) diff --git a/dtool/src/cppparser/cppBison.cxx.prebuilt b/dtool/src/cppparser/cppBison.cxx.prebuilt index 63f0b0ea17..f0cefb3526 100644 --- a/dtool/src/cppparser/cppBison.cxx.prebuilt +++ b/dtool/src/cppparser/cppBison.cxx.prebuilt @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 2.7. */ +/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison implementation 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 it under the terms of the GNU General Public License as published by @@ -44,13 +44,13 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.7" +#define YYBISON_VERSION "3.0.4" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ -#define YYPURE 1 +#define YYPURE 2 /* Push parsers. */ #define YYPUSH 0 @@ -63,15 +63,12 @@ #define yyparse cppyyparse #define yylex cppyylex #define yyerror cppyyerror -#define yylval cppyylval -#define yychar cppyychar #define yydebug cppyydebug #define yynerrs cppyynerrs -#define yylloc cppyylloc + /* Copy the first part of user declarations. */ -/* Line 371 of yacc.c */ -#line 7 "dtool/src/cppparser/cppBison.yxx" +#line 7 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:339 */ #include "cppBisonDefs.h" @@ -267,14 +264,13 @@ pop_struct() { } -/* Line 371 of yacc.c */ -#line 272 "built_x64/tmp/cppBison.yxx.c" +#line 268 "built/tmp/cppBison.yxx.c" /* yacc.c:339 */ -# ifndef YY_NULL +# ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULL nullptr +# define YY_NULLPTR nullptr # else -# define YY_NULL 0 +# define YY_NULLPTR 0 # endif # endif @@ -288,9 +284,9 @@ pop_struct() { /* In a future release of Bison, this section will be replaced by #include "cppBison.yxx.h". */ -#ifndef YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED -# define YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED -/* Enabling traces. */ +#ifndef YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED +# define YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED +/* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif @@ -298,156 +294,155 @@ pop_struct() { extern int cppyydebug; #endif -/* Tokens. */ +/* Token type. */ #ifndef 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, - TYPEPACK_IDENTIFIER = 267, - SCOPING = 268, - TYPEDEFNAME = 269, - ELLIPSIS = 270, - OROR = 271, - ANDAND = 272, - EQCOMPARE = 273, - NECOMPARE = 274, - LECOMPARE = 275, - GECOMPARE = 276, - LSHIFT = 277, - RSHIFT = 278, - POINTSAT_STAR = 279, - DOT_STAR = 280, - UNARY = 281, - UNARY_NOT = 282, - UNARY_NEGATE = 283, - UNARY_MINUS = 284, - UNARY_PLUS = 285, - UNARY_STAR = 286, - UNARY_REF = 287, - POINTSAT = 288, - SCOPE = 289, - PLUSPLUS = 290, - MINUSMINUS = 291, - TIMESEQUAL = 292, - DIVIDEEQUAL = 293, - MODEQUAL = 294, - PLUSEQUAL = 295, - MINUSEQUAL = 296, - OREQUAL = 297, - ANDEQUAL = 298, - XOREQUAL = 299, - LSHIFTEQUAL = 300, - RSHIFTEQUAL = 301, - ATTR_LEFT = 302, - ATTR_RIGHT = 303, - KW_ALIGNAS = 304, - KW_ALIGNOF = 305, - KW_AUTO = 306, - KW_BEGIN_PUBLISH = 307, - KW_BLOCKING = 308, - KW_BOOL = 309, - KW_CATCH = 310, - KW_CHAR = 311, - KW_CHAR16_T = 312, - KW_CHAR32_T = 313, - KW_CLASS = 314, - KW_CONST = 315, - KW_CONSTEXPR = 316, - KW_CONST_CAST = 317, - KW_DECLTYPE = 318, - KW_DEFAULT = 319, - KW_DELETE = 320, - KW_DOUBLE = 321, - KW_DYNAMIC_CAST = 322, - KW_ELSE = 323, - KW_END_PUBLISH = 324, - KW_ENUM = 325, - KW_EXTENSION = 326, - KW_EXTERN = 327, - KW_EXPLICIT = 328, - KW_PUBLISHED = 329, - KW_FALSE = 330, - KW_FINAL = 331, - KW_FLOAT = 332, - KW_FRIEND = 333, - KW_FOR = 334, - KW_GOTO = 335, - KW_HAS_VIRTUAL_DESTRUCTOR = 336, - KW_IF = 337, - KW_INLINE = 338, - KW_INT = 339, - KW_IS_ABSTRACT = 340, - KW_IS_BASE_OF = 341, - KW_IS_CLASS = 342, - KW_IS_CONSTRUCTIBLE = 343, - KW_IS_CONVERTIBLE_TO = 344, - KW_IS_DESTRUCTIBLE = 345, - KW_IS_EMPTY = 346, - KW_IS_ENUM = 347, - KW_IS_FINAL = 348, - KW_IS_FUNDAMENTAL = 349, - KW_IS_POD = 350, - KW_IS_POLYMORPHIC = 351, - KW_IS_STANDARD_LAYOUT = 352, - KW_IS_TRIVIAL = 353, - KW_IS_UNION = 354, - KW_LONG = 355, - KW_MAKE_MAP_PROPERTY = 356, - KW_MAKE_PROPERTY = 357, - KW_MAKE_PROPERTY2 = 358, - KW_MAKE_SEQ = 359, - KW_MAKE_SEQ_PROPERTY = 360, - KW_MUTABLE = 361, - KW_NAMESPACE = 362, - KW_NEW = 363, - KW_NOEXCEPT = 364, - KW_NULLPTR = 365, - KW_OPERATOR = 366, - KW_OVERRIDE = 367, - KW_PRIVATE = 368, - KW_PROTECTED = 369, - KW_PUBLIC = 370, - KW_REGISTER = 371, - KW_REINTERPRET_CAST = 372, - KW_RETURN = 373, - KW_SHORT = 374, - KW_SIGNED = 375, - KW_SIZEOF = 376, - KW_STATIC = 377, - KW_STATIC_ASSERT = 378, - KW_STATIC_CAST = 379, - KW_STRUCT = 380, - KW_TEMPLATE = 381, - KW_THREAD_LOCAL = 382, - KW_THROW = 383, - KW_TRUE = 384, - KW_TRY = 385, - KW_TYPEDEF = 386, - KW_TYPEID = 387, - KW_TYPENAME = 388, - KW_UNDERLYING_TYPE = 389, - KW_UNION = 390, - KW_UNSIGNED = 391, - KW_USING = 392, - KW_VIRTUAL = 393, - KW_VOID = 394, - KW_VOLATILE = 395, - KW_WCHAR_T = 396, - KW_WHILE = 397, - START_CPP = 398, - START_CONST_EXPR = 399, - START_TYPE = 400 - }; + 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, + TYPEPACK_IDENTIFIER = 267, + SCOPING = 268, + TYPEDEFNAME = 269, + ELLIPSIS = 270, + OROR = 271, + ANDAND = 272, + EQCOMPARE = 273, + NECOMPARE = 274, + LECOMPARE = 275, + GECOMPARE = 276, + LSHIFT = 277, + RSHIFT = 278, + POINTSAT_STAR = 279, + DOT_STAR = 280, + UNARY = 281, + UNARY_NOT = 282, + UNARY_NEGATE = 283, + UNARY_MINUS = 284, + UNARY_PLUS = 285, + UNARY_STAR = 286, + UNARY_REF = 287, + POINTSAT = 288, + SCOPE = 289, + PLUSPLUS = 290, + MINUSMINUS = 291, + TIMESEQUAL = 292, + DIVIDEEQUAL = 293, + MODEQUAL = 294, + PLUSEQUAL = 295, + MINUSEQUAL = 296, + OREQUAL = 297, + ANDEQUAL = 298, + XOREQUAL = 299, + LSHIFTEQUAL = 300, + RSHIFTEQUAL = 301, + ATTR_LEFT = 302, + ATTR_RIGHT = 303, + KW_ALIGNAS = 304, + KW_ALIGNOF = 305, + KW_AUTO = 306, + KW_BEGIN_PUBLISH = 307, + KW_BLOCKING = 308, + KW_BOOL = 309, + KW_CATCH = 310, + KW_CHAR = 311, + KW_CHAR16_T = 312, + KW_CHAR32_T = 313, + KW_CLASS = 314, + KW_CONST = 315, + KW_CONSTEXPR = 316, + KW_CONST_CAST = 317, + KW_DECLTYPE = 318, + KW_DEFAULT = 319, + KW_DELETE = 320, + KW_DOUBLE = 321, + KW_DYNAMIC_CAST = 322, + KW_ELSE = 323, + KW_END_PUBLISH = 324, + KW_ENUM = 325, + KW_EXTENSION = 326, + KW_EXTERN = 327, + KW_EXPLICIT = 328, + KW_PUBLISHED = 329, + KW_FALSE = 330, + KW_FINAL = 331, + KW_FLOAT = 332, + KW_FRIEND = 333, + KW_FOR = 334, + KW_GOTO = 335, + KW_HAS_VIRTUAL_DESTRUCTOR = 336, + KW_IF = 337, + KW_INLINE = 338, + KW_INT = 339, + KW_IS_ABSTRACT = 340, + KW_IS_BASE_OF = 341, + KW_IS_CLASS = 342, + KW_IS_CONSTRUCTIBLE = 343, + KW_IS_CONVERTIBLE_TO = 344, + KW_IS_DESTRUCTIBLE = 345, + KW_IS_EMPTY = 346, + KW_IS_ENUM = 347, + KW_IS_FINAL = 348, + KW_IS_FUNDAMENTAL = 349, + KW_IS_POD = 350, + KW_IS_POLYMORPHIC = 351, + KW_IS_STANDARD_LAYOUT = 352, + KW_IS_TRIVIAL = 353, + KW_IS_UNION = 354, + KW_LONG = 355, + KW_MAKE_MAP_PROPERTY = 356, + KW_MAKE_PROPERTY = 357, + KW_MAKE_PROPERTY2 = 358, + KW_MAKE_SEQ = 359, + KW_MAKE_SEQ_PROPERTY = 360, + KW_MUTABLE = 361, + KW_NAMESPACE = 362, + KW_NEW = 363, + KW_NOEXCEPT = 364, + KW_NULLPTR = 365, + KW_OPERATOR = 366, + KW_OVERRIDE = 367, + KW_PRIVATE = 368, + KW_PROTECTED = 369, + KW_PUBLIC = 370, + KW_REGISTER = 371, + KW_REINTERPRET_CAST = 372, + KW_RETURN = 373, + KW_SHORT = 374, + KW_SIGNED = 375, + KW_SIZEOF = 376, + KW_STATIC = 377, + KW_STATIC_ASSERT = 378, + KW_STATIC_CAST = 379, + KW_STRUCT = 380, + KW_TEMPLATE = 381, + KW_THREAD_LOCAL = 382, + KW_THROW = 383, + KW_TRUE = 384, + KW_TRY = 385, + KW_TYPEDEF = 386, + KW_TYPEID = 387, + KW_TYPENAME = 388, + KW_UNDERLYING_TYPE = 389, + KW_UNION = 390, + KW_UNSIGNED = 391, + KW_USING = 392, + KW_VIRTUAL = 393, + KW_VOID = 394, + KW_VOLATILE = 395, + KW_WCHAR_T = 396, + KW_WHILE = 397, + START_CPP = 398, + START_CONST_EXPR = 399, + START_TYPE = 400 + }; #endif /* Tokens. */ #define REAL 258 @@ -594,48 +589,31 @@ extern int cppyydebug; #define START_CONST_EXPR 399 #define START_TYPE 400 +/* 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 -typedef struct YYLTYPE +typedef struct YYLTYPE YYLTYPE; +struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; -} YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +}; # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #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); -#else -int cppyyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ -#endif /* !YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED */ +int cppyyparse (void); + +#endif /* !YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED */ /* Copy the second part of user declarations. */ -/* Line 390 of yacc.c */ -#line 639 "built_x64/tmp/cppBison.yxx.c" +#line 617 "built/tmp/cppBison.yxx.c" /* yacc.c:358 */ #ifdef short # undef short @@ -649,11 +627,8 @@ typedef unsigned char yytype_uint8; #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; #else -typedef short int yytype_int8; +typedef signed char yytype_int8; #endif #ifdef YYTYPE_UINT16 @@ -673,8 +648,7 @@ typedef short int yytype_int16; # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# elif ! defined YYSIZE_T # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else @@ -696,6 +670,33 @@ typedef short int yytype_int16; # endif #endif +#ifndef YY_ATTRIBUTE +# if (defined __GNUC__ \ + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) +# else +# define YY_ATTRIBUTE(Spec) /* empty */ +# endif +#endif + +#ifndef YY_ATTRIBUTE_PURE +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) +#endif + +#if !defined _Noreturn \ + && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) +# if defined _MSC_VER && 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) +# endif +#endif + /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) @@ -703,23 +704,25 @@ typedef short int yytype_int16; # define YYUSE(E) /* empty */ #endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(N) (N) +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") #else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) -#else -static int -YYID (yyi) - int yyi; +# define YY_INITIAL_VALUE(Value) Value #endif -{ - return yyi; -} +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + #if ! defined yyoverflow || YYERROR_VERBOSE @@ -738,8 +741,7 @@ YYID (yyi) # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS @@ -751,8 +753,8 @@ YYID (yyi) # endif # ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -768,7 +770,7 @@ YYID (yyi) # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 @@ -776,15 +778,13 @@ YYID (yyi) # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif @@ -794,8 +794,8 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ - && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ + && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc @@ -821,16 +821,16 @@ union yyalloc elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) #endif @@ -849,7 +849,7 @@ union yyalloc for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ - while (YYID (0)) + while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ @@ -857,25 +857,27 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 104 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 7002 +#define YYLAST 6907 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 170 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 108 /* YYNRULES -- Number of rules. */ -#define YYNRULES 753 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 1535 +#define YYNRULES 755 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 1537 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned + by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 400 -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, without out-of-bounds checking. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -922,349 +924,7 @@ static const yytype_uint8 yytranslate[] = }; #if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 6, 9, 12, 14, 17, 20, 22, - 26, 31, 37, 42, 43, 49, 51, 53, 55, 57, - 59, 62, 64, 66, 69, 72, 75, 78, 86, 96, - 108, 118, 130, 144, 154, 168, 178, 186, 192, 193, - 197, 199, 202, 205, 209, 212, 215, 218, 221, 224, - 227, 230, 233, 236, 239, 242, 247, 253, 259, 261, - 265, 267, 272, 277, 278, 283, 287, 291, 295, 297, - 300, 305, 306, 311, 315, 318, 323, 324, 331, 332, - 339, 340, 348, 349, 361, 362, 375, 376, 385, 386, - 396, 398, 400, 403, 406, 409, 412, 415, 418, 421, - 424, 427, 432, 438, 445, 450, 452, 454, 456, 458, - 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, - 480, 482, 484, 486, 488, 490, 492, 494, 496, 498, - 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, - 520, 523, 526, 528, 530, 532, 534, 537, 538, 545, - 548, 550, 552, 554, 558, 560, 562, 564, 567, 572, - 575, 579, 583, 588, 591, 595, 597, 599, 601, 603, - 605, 608, 612, 615, 618, 621, 624, 627, 631, 636, - 640, 641, 648, 651, 655, 657, 661, 666, 668, 670, - 672, 676, 679, 681, 685, 687, 689, 691, 695, 698, - 700, 704, 706, 709, 711, 714, 716, 720, 726, 730, - 734, 736, 740, 744, 748, 752, 757, 759, 761, 764, - 766, 770, 774, 780, 784, 789, 795, 799, 804, 810, - 813, 818, 820, 822, 824, 826, 829, 832, 835, 838, - 841, 845, 850, 852, 854, 857, 860, 863, 866, 869, - 873, 878, 886, 890, 892, 895, 898, 901, 904, 907, - 910, 914, 919, 927, 931, 933, 935, 938, 941, 944, - 947, 950, 953, 957, 962, 964, 966, 969, 972, 975, - 978, 981, 984, 988, 993, 999, 1009, 1019, 1029, 1031, - 1033, 1036, 1038, 1040, 1042, 1046, 1051, 1056, 1061, 1066, - 1068, 1070, 1072, 1074, 1077, 1079, 1081, 1083, 1087, 1092, - 1095, 1100, 1105, 1110, 1112, 1114, 1116, 1119, 1123, 1126, - 1131, 1136, 1138, 1140, 1142, 1145, 1149, 1152, 1156, 1158, - 1163, 1169, 1175, 1176, 1183, 1184, 1194, 1196, 1198, 1200, - 1202, 1205, 1209, 1211, 1214, 1217, 1220, 1224, 1228, 1232, - 1236, 1240, 1244, 1249, 1253, 1255, 1260, 1263, 1265, 1267, - 1269, 1273, 1279, 1281, 1284, 1289, 1291, 1294, 1297, 1299, - 1301, 1303, 1304, 1311, 1312, 1320, 1325, 1331, 1335, 1341, - 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, - 1366, 1368, 1370, 1372, 1375, 1378, 1381, 1384, 1386, 1388, - 1391, 1393, 1394, 1397, 1399, 1402, 1404, 1406, 1408, 1410, - 1412, 1414, 1416, 1418, 1420, 1422, 1424, 1426, 1428, 1430, - 1432, 1434, 1436, 1438, 1440, 1442, 1444, 1446, 1448, 1450, - 1452, 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 1470, - 1472, 1474, 1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, - 1492, 1494, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510, - 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, - 1532, 1534, 1536, 1538, 1540, 1542, 1544, 1546, 1548, 1550, - 1552, 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568, 1570, - 1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, - 1592, 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, - 1612, 1614, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, - 1632, 1634, 1636, 1638, 1640, 1642, 1644, 1646, 1648, 1650, - 1652, 1654, 1656, 1658, 1662, 1664, 1666, 1668, 1670, 1672, - 1676, 1678, 1683, 1691, 1699, 1707, 1715, 1720, 1725, 1731, - 1736, 1739, 1742, 1745, 1748, 1751, 1754, 1758, 1762, 1766, - 1770, 1774, 1778, 1782, 1786, 1790, 1794, 1798, 1802, 1806, - 1810, 1814, 1818, 1824, 1829, 1834, 1838, 1842, 1846, 1850, - 1852, 1857, 1865, 1873, 1881, 1889, 1894, 1899, 1904, 1909, - 1914, 1919, 1924, 1929, 1934, 1939, 1944, 1949, 1954, 1959, - 1964, 1969, 1975, 1980, 1983, 1989, 1994, 1999, 2002, 2005, - 2008, 2011, 2014, 2017, 2021, 2025, 2029, 2033, 2037, 2041, - 2045, 2049, 2053, 2057, 2061, 2065, 2069, 2073, 2077, 2081, - 2085, 2089, 2095, 2100, 2105, 2109, 2113, 2117, 2121, 2123, - 2125, 2127, 2129, 2131, 2133, 2135, 2137, 2139, 2141, 2143, - 2152, 2164, 2169, 2174, 2181, 2186, 2191, 2198, 2205, 2210, - 2215, 2220, 2225, 2230, 2235, 2240, 2245, 2250, 2255, 2257, - 2262, 2270, 2278, 2286, 2294, 2299, 2304, 2310, 2315, 2318, - 2324, 2329, 2334, 2337, 2340, 2343, 2346, 2349, 2353, 2357, - 2361, 2365, 2369, 2373, 2377, 2381, 2385, 2389, 2393, 2397, - 2401, 2405, 2409, 2413, 2417, 2421, 2427, 2432, 2437, 2441, - 2445, 2449, 2453, 2455, 2457, 2459, 2461, 2463, 2465, 2467, - 2469, 2471, 2473, 2475, 2477, 2479, 2481, 2484, 2489, 2492, - 2496, 2498, 2501, 2503, 2506, 2509, 2511, 2513, 2515, 2517, - 2519, 2521, 2523, 2525, 2527, 2529, 2531, 2533, 2535, 2537, - 2539, 2541, 2544, 2547 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int16 yyrhs[] = -{ - 171, 0, -1, 143, 172, -1, 144, 267, -1, 145, - 234, -1, 277, -1, 172, 148, -1, 172, 177, -1, - 174, -1, 173, 147, 174, -1, 274, 164, 264, 166, - -1, 274, 164, 264, 166, 15, -1, 274, 146, 264, - 167, -1, -1, 180, 146, 176, 172, 167, -1, 183, - -1, 201, -1, 175, -1, 251, -1, 178, -1, 131, - 186, -1, 52, -1, 69, -1, 74, 149, -1, 115, - 149, -1, 114, 149, -1, 113, 149, -1, 102, 164, - 274, 147, 10, 166, 148, -1, 102, 164, 274, 147, - 10, 147, 10, 166, 148, -1, 102, 164, 274, 147, - 10, 147, 10, 147, 10, 166, 148, -1, 105, 164, - 274, 147, 10, 147, 10, 166, 148, -1, 105, 164, - 274, 147, 10, 147, 10, 147, 10, 166, 148, -1, - 105, 164, 274, 147, 10, 147, 10, 147, 10, 147, - 10, 166, 148, -1, 103, 164, 274, 147, 10, 147, - 10, 166, 148, -1, 103, 164, 274, 147, 10, 147, - 10, 147, 10, 147, 10, 166, 148, -1, 104, 164, - 274, 147, 10, 147, 10, 166, 148, -1, 123, 164, - 267, 147, 276, 166, 148, -1, 123, 164, 267, 166, - 148, -1, -1, 78, 179, 177, -1, 277, -1, 60, - 180, -1, 72, 180, -1, 72, 6, 180, -1, 122, - 180, -1, 83, 180, -1, 138, 180, -1, 73, 180, - -1, 116, 180, -1, 140, 180, -1, 106, 180, -1, - 61, 180, -1, 53, 180, -1, 71, 180, -1, 127, - 180, -1, 47, 181, 48, 180, -1, 49, 164, 267, - 166, 180, -1, 49, 164, 231, 166, 180, -1, 182, - -1, 182, 147, 181, -1, 274, -1, 274, 164, 214, - 166, -1, 137, 274, 149, 182, -1, -1, 180, 233, - 184, 185, -1, 180, 231, 148, -1, 180, 189, 218, - -1, 180, 192, 219, -1, 254, -1, 210, 219, -1, - 210, 217, 147, 185, -1, -1, 180, 233, 187, 188, - -1, 180, 192, 219, -1, 210, 219, -1, 210, 217, - 147, 188, -1, -1, 10, 164, 190, 212, 166, 198, - -1, -1, 11, 164, 191, 212, 166, 198, -1, -1, - 162, 274, 164, 193, 212, 166, 198, -1, -1, 11, - 164, 159, 208, 166, 164, 194, 212, 166, 198, 211, - -1, -1, 11, 164, 13, 159, 208, 166, 164, 195, - 212, 166, 198, 211, -1, -1, 111, 229, 224, 164, - 196, 212, 166, 198, -1, -1, 111, 60, 229, 224, - 164, 197, 212, 166, 198, -1, 10, -1, 277, -1, - 198, 60, -1, 198, 140, -1, 198, 109, -1, 198, - 76, -1, 198, 112, -1, 198, 154, -1, 198, 17, - -1, 198, 106, -1, 198, 61, -1, 198, 128, 164, - 166, -1, 198, 128, 164, 274, 166, -1, 198, 128, - 164, 274, 15, 166, -1, 198, 47, 181, 48, -1, - 168, -1, 162, -1, 159, -1, 160, -1, 161, -1, - 157, -1, 158, -1, 152, -1, 154, -1, 153, -1, - 16, -1, 17, -1, 18, -1, 19, -1, 20, -1, - 21, -1, 155, -1, 156, -1, 22, -1, 23, -1, - 150, -1, 147, -1, 35, -1, 36, -1, 37, -1, - 38, -1, 39, -1, 40, -1, 41, -1, 42, -1, - 43, -1, 44, -1, 45, -1, 46, -1, 33, -1, - 165, 169, -1, 164, 166, -1, 108, -1, 65, -1, - 183, -1, 201, -1, 72, 201, -1, -1, 126, 202, - 155, 203, 156, 200, -1, 126, 183, -1, 277, -1, - 204, -1, 206, -1, 204, 147, 206, -1, 59, -1, - 133, -1, 205, -1, 205, 274, -1, 205, 274, 150, - 234, -1, 205, 15, -1, 205, 15, 274, -1, 207, - 225, 216, -1, 60, 207, 225, 216, -1, 207, 226, - -1, 60, 207, 226, -1, 255, -1, 10, -1, 11, - -1, 12, -1, 275, -1, 111, 199, -1, 111, 6, - 10, -1, 60, 208, -1, 140, 208, -1, 159, 208, - -1, 154, 208, -1, 17, 208, -1, 13, 159, 208, - -1, 208, 165, 263, 169, -1, 164, 208, 166, -1, - -1, 208, 164, 209, 214, 166, 198, -1, 208, 211, - -1, 208, 149, 4, -1, 277, -1, 33, 232, 228, - -1, 33, 60, 232, 228, -1, 277, -1, 15, -1, - 213, -1, 213, 147, 15, -1, 213, 15, -1, 222, - -1, 213, 147, 222, -1, 277, -1, 15, -1, 215, - -1, 215, 147, 15, -1, 215, 15, -1, 223, -1, - 215, 147, 223, -1, 277, -1, 150, 266, -1, 277, - -1, 150, 267, -1, 148, -1, 146, 259, 167, -1, - 149, 173, 146, 259, 167, -1, 150, 64, 148, -1, - 150, 65, 148, -1, 148, -1, 146, 259, 167, -1, - 150, 267, 148, -1, 150, 64, 148, -1, 150, 65, - 148, -1, 150, 146, 220, 167, -1, 277, -1, 221, - -1, 221, 147, -1, 267, -1, 146, 220, 167, -1, - 221, 147, 267, -1, 221, 147, 146, 220, 167, -1, - 229, 225, 217, -1, 60, 229, 225, 217, -1, 60, - 116, 229, 225, 217, -1, 230, 226, 217, -1, 60, - 230, 226, 217, -1, 60, 116, 230, 226, 217, -1, - 116, 222, -1, 47, 181, 48, 222, -1, 222, -1, - 269, -1, 277, -1, 275, -1, 60, 224, -1, 140, - 224, -1, 159, 224, -1, 154, 224, -1, 17, 224, - -1, 13, 159, 224, -1, 224, 165, 263, 169, -1, - 277, -1, 275, -1, 60, 225, -1, 140, 225, -1, - 159, 225, -1, 154, 225, -1, 17, 225, -1, 13, - 159, 225, -1, 225, 165, 263, 169, -1, 164, 225, - 166, 164, 212, 166, 198, -1, 164, 225, 166, -1, - 15, -1, 15, 274, -1, 60, 226, -1, 140, 226, - -1, 159, 226, -1, 154, 226, -1, 17, 226, -1, - 13, 159, 226, -1, 226, 165, 263, 169, -1, 164, - 226, 166, 164, 212, 166, 198, -1, 164, 226, 166, - -1, 277, -1, 15, -1, 15, 274, -1, 60, 227, - -1, 140, 227, -1, 159, 227, -1, 154, 227, -1, - 17, 227, -1, 13, 159, 227, -1, 227, 165, 263, - 169, -1, 277, -1, 15, -1, 15, 274, -1, 60, - 228, -1, 140, 228, -1, 159, 227, -1, 154, 227, - -1, 17, 227, -1, 13, 159, 227, -1, 227, 165, - 263, 169, -1, 164, 212, 166, 198, 211, -1, 164, - 159, 227, 166, 164, 212, 166, 198, 211, -1, 164, - 154, 227, 166, 164, 212, 166, 198, 211, -1, 164, - 17, 227, 166, 164, 212, 166, 198, 211, -1, 255, - -1, 11, -1, 133, 274, -1, 236, -1, 238, -1, - 244, -1, 250, 235, 274, -1, 249, 275, 149, 246, - -1, 63, 164, 267, 166, -1, 63, 164, 51, 166, - -1, 134, 164, 234, 166, -1, 51, -1, 12, -1, - 255, -1, 11, -1, 133, 274, -1, 236, -1, 238, - -1, 244, -1, 250, 235, 274, -1, 249, 275, 149, - 246, -1, 249, 274, -1, 63, 164, 267, 166, -1, - 63, 164, 51, 166, -1, 134, 164, 234, 166, -1, - 51, -1, 255, -1, 11, -1, 133, 274, -1, 250, - 235, 274, -1, 249, 274, -1, 63, 164, 267, 166, - -1, 134, 164, 234, 166, -1, 51, -1, 231, -1, - 10, -1, 229, 228, -1, 60, 229, 228, -1, 230, - 228, -1, 60, 230, 228, -1, 277, -1, 235, 47, - 181, 48, -1, 235, 49, 164, 267, 166, -1, 235, - 49, 164, 231, 166, -1, -1, 250, 235, 146, 237, - 172, 167, -1, -1, 250, 235, 275, 239, 240, 241, - 146, 172, 167, -1, 277, -1, 76, -1, 277, -1, - 242, -1, 149, 243, -1, 242, 147, 243, -1, 273, - -1, 115, 273, -1, 114, 273, -1, 113, 273, -1, - 138, 115, 273, -1, 138, 114, 273, -1, 138, 113, - 273, -1, 115, 138, 273, -1, 114, 138, 273, -1, - 113, 138, 273, -1, 245, 146, 248, 167, -1, 249, - 149, 246, -1, 249, -1, 249, 275, 149, 246, -1, - 249, 275, -1, 256, -1, 11, -1, 277, -1, 247, - 274, 147, -1, 247, 274, 150, 267, 147, -1, 247, - -1, 247, 274, -1, 247, 274, 150, 267, -1, 70, - -1, 70, 59, -1, 70, 125, -1, 59, -1, 125, - -1, 135, -1, -1, 107, 274, 146, 252, 172, 167, - -1, -1, 83, 107, 274, 146, 253, 172, 167, -1, - 107, 146, 172, 167, -1, 83, 107, 146, 172, 167, - -1, 137, 274, 148, -1, 137, 274, 150, 234, 148, - -1, 137, 107, 274, 148, -1, 256, -1, 257, -1, - 258, -1, 54, -1, 56, -1, 141, -1, 57, -1, - 58, -1, 119, -1, 100, -1, 136, -1, 120, -1, - 84, -1, 119, 256, -1, 100, 256, -1, 136, 256, - -1, 120, 256, -1, 77, -1, 66, -1, 100, 66, - -1, 139, -1, -1, 260, 261, -1, 277, -1, 261, - 262, -1, 3, -1, 4, -1, 6, -1, 8, -1, - 9, -1, 5, -1, 10, -1, 11, -1, 12, -1, - 13, -1, 7, -1, 15, -1, 16, -1, 17, -1, - 18, -1, 19, -1, 20, -1, 21, -1, 22, -1, - 23, -1, 24, -1, 25, -1, 33, -1, 34, -1, - 35, -1, 36, -1, 37, -1, 38, -1, 39, -1, - 40, -1, 41, -1, 42, -1, 43, -1, 44, -1, - 45, -1, 46, -1, 47, -1, 48, -1, 49, -1, - 50, -1, 51, -1, 54, -1, 55, -1, 56, -1, - 57, -1, 58, -1, 59, -1, 60, -1, 61, -1, - 62, -1, 63, -1, 64, -1, 65, -1, 66, -1, - 67, -1, 68, -1, 70, -1, 72, -1, 73, -1, - 75, -1, 76, -1, 77, -1, 78, -1, 79, -1, - 80, -1, 82, -1, 83, -1, 84, -1, 100, -1, - 106, -1, 107, -1, 108, -1, 110, -1, 111, -1, - 112, -1, 113, -1, 114, -1, 115, -1, 74, -1, - 116, -1, 117, -1, 118, -1, 119, -1, 120, -1, - 121, -1, 122, -1, 123, -1, 124, -1, 125, -1, - 126, -1, 127, -1, 128, -1, 129, -1, 130, -1, - 131, -1, 132, -1, 133, -1, 134, -1, 135, -1, - 136, -1, 137, -1, 138, -1, 139, -1, 140, -1, - 141, -1, 142, -1, 157, -1, 158, -1, 159, -1, - 160, -1, 154, -1, 152, -1, 153, -1, 168, -1, - 162, -1, 150, -1, 161, -1, 155, -1, 156, -1, - 164, -1, 166, -1, 163, -1, 147, -1, 148, -1, - 149, -1, 165, -1, 169, -1, 151, -1, 146, 261, - 167, -1, 277, -1, 267, -1, 277, -1, 265, -1, - 267, -1, 265, 147, 267, -1, 268, -1, 164, 234, - 166, 266, -1, 124, 155, 234, 156, 164, 265, 166, - -1, 67, 155, 234, 156, 164, 265, 166, -1, 62, - 155, 234, 156, 164, 265, 166, -1, 117, 155, 234, - 156, 164, 265, 166, -1, 121, 164, 234, 166, -1, - 121, 164, 10, 166, -1, 121, 15, 164, 274, 166, - -1, 50, 164, 234, 166, -1, 168, 266, -1, 162, - 266, -1, 158, 266, -1, 157, 266, -1, 159, 266, - -1, 154, 266, -1, 266, 159, 266, -1, 266, 160, - 266, -1, 266, 161, 266, -1, 266, 157, 266, -1, - 266, 158, 266, -1, 266, 152, 266, -1, 266, 153, - 266, -1, 266, 154, 266, -1, 266, 16, 266, -1, - 266, 17, 266, -1, 266, 18, 266, -1, 266, 19, - 266, -1, 266, 20, 266, -1, 266, 21, 266, -1, - 266, 22, 266, -1, 266, 23, 266, -1, 266, 151, - 266, 149, 266, -1, 266, 165, 267, 169, -1, 266, - 164, 265, 166, -1, 266, 164, 166, -1, 266, 163, - 266, -1, 266, 33, 266, -1, 164, 265, 166, -1, - 268, -1, 164, 234, 166, 267, -1, 124, 155, 234, - 156, 164, 265, 166, -1, 67, 155, 234, 156, 164, - 265, 166, -1, 62, 155, 234, 156, 164, 265, 166, - -1, 117, 155, 234, 156, 164, 265, 166, -1, 11, - 164, 264, 166, -1, 11, 146, 264, 167, -1, 84, - 164, 264, 166, -1, 56, 164, 264, 166, -1, 141, - 164, 264, 166, -1, 57, 164, 264, 166, -1, 58, - 164, 264, 166, -1, 54, 164, 264, 166, -1, 119, - 164, 264, 166, -1, 100, 164, 264, 166, -1, 136, - 164, 264, 166, -1, 120, 164, 264, 166, -1, 77, - 164, 264, 166, -1, 66, 164, 264, 166, -1, 121, - 164, 234, 166, -1, 121, 164, 10, 166, -1, 121, - 15, 164, 274, 166, -1, 50, 164, 234, 166, -1, - 108, 232, -1, 108, 232, 164, 264, 166, -1, 132, - 164, 234, 166, -1, 132, 164, 267, 166, -1, 168, - 267, -1, 162, 267, -1, 158, 267, -1, 157, 267, - -1, 159, 267, -1, 154, 267, -1, 267, 159, 267, - -1, 267, 160, 267, -1, 267, 161, 267, -1, 267, - 157, 267, -1, 267, 158, 267, -1, 267, 152, 267, - -1, 267, 153, 267, -1, 267, 154, 267, -1, 267, - 16, 267, -1, 267, 17, 267, -1, 267, 18, 267, - -1, 267, 19, 267, -1, 267, 20, 267, -1, 267, - 21, 267, -1, 267, 155, 267, -1, 267, 156, 267, - -1, 267, 22, 267, -1, 267, 23, 267, -1, 267, - 151, 267, 149, 267, -1, 267, 165, 267, 169, -1, - 267, 164, 265, 166, -1, 267, 164, 166, -1, 267, - 163, 267, -1, 267, 33, 267, -1, 164, 265, 166, - -1, 4, -1, 129, -1, 75, -1, 5, -1, 3, - -1, 276, -1, 9, -1, 10, -1, 76, -1, 112, - -1, 110, -1, 165, 271, 169, 198, 211, 146, 259, - 167, -1, 165, 271, 169, 164, 212, 166, 198, 211, - 146, 259, 167, -1, 81, 164, 234, 166, -1, 85, - 164, 234, 166, -1, 86, 164, 234, 147, 234, 166, - -1, 87, 164, 234, 166, -1, 88, 164, 234, 166, - -1, 88, 164, 234, 147, 234, 166, -1, 89, 164, - 234, 147, 234, 166, -1, 90, 164, 234, 166, -1, - 91, 164, 234, 166, -1, 92, 164, 234, 166, -1, - 93, 164, 234, 166, -1, 94, 164, 234, 166, -1, - 95, 164, 234, 166, -1, 96, 164, 234, 166, -1, - 97, 164, 234, 166, -1, 98, 164, 234, 166, -1, - 99, 164, 234, 166, -1, 270, -1, 164, 234, 166, - 267, -1, 124, 155, 234, 156, 164, 265, 166, -1, - 67, 155, 234, 156, 164, 265, 166, -1, 62, 155, - 234, 156, 164, 265, 166, -1, 117, 155, 234, 156, - 164, 265, 166, -1, 121, 164, 234, 166, -1, 121, - 164, 10, 166, -1, 121, 15, 164, 274, 166, -1, - 50, 164, 234, 166, -1, 108, 232, -1, 108, 232, - 164, 264, 166, -1, 132, 164, 234, 166, -1, 132, - 164, 267, 166, -1, 168, 267, -1, 162, 267, -1, - 158, 267, -1, 157, 267, -1, 154, 267, -1, 269, - 159, 267, -1, 269, 160, 267, -1, 269, 161, 267, - -1, 269, 157, 267, -1, 269, 158, 267, -1, 269, - 152, 267, -1, 269, 153, 267, -1, 269, 154, 267, - -1, 269, 16, 267, -1, 269, 17, 267, -1, 269, - 18, 267, -1, 269, 19, 267, -1, 269, 20, 267, - -1, 269, 21, 267, -1, 269, 155, 267, -1, 269, - 156, 267, -1, 269, 22, 267, -1, 269, 23, 267, - -1, 269, 151, 267, 149, 267, -1, 269, 165, 267, - 169, -1, 269, 164, 265, 166, -1, 269, 164, 166, - -1, 269, 163, 267, -1, 269, 33, 267, -1, 164, - 265, 166, -1, 4, -1, 129, -1, 75, -1, 5, - -1, 3, -1, 276, -1, 9, -1, 10, -1, 76, - -1, 112, -1, 110, -1, 277, -1, 150, -1, 154, - -1, 272, 217, -1, 271, 147, 272, 217, -1, 154, - 274, -1, 154, 274, 15, -1, 274, -1, 159, 274, - -1, 274, -1, 133, 274, -1, 274, 15, -1, 10, - -1, 11, -1, 12, -1, 76, -1, 112, -1, 120, - -1, 77, -1, 115, -1, 113, -1, 122, -1, 10, - -1, 11, -1, 12, -1, 112, -1, 6, -1, 8, - -1, 276, 6, -1, 276, 8, -1, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 448, 448, 449, 453, 460, 461, 462, 466, 467, @@ -1281,68 +941,68 @@ static const yytype_uint16 yyrline[] = 1313, 1317, 1321, 1325, 1329, 1333, 1337, 1341, 1345, 1349, 1353, 1357, 1361, 1365, 1369, 1373, 1377, 1381, 1385, 1389, 1393, 1397, 1401, 1405, 1409, 1413, 1417, 1421, 1425, 1429, - 1433, 1437, 1441, 1445, 1452, 1453, 1457, 1459, 1458, 1466, - 1470, 1471, 1475, 1481, 1490, 1491, 1495, 1499, 1503, 1507, - 1513, 1519, 1525, 1532, 1537, 1546, 1550, 1555, 1563, 1575, - 1579, 1593, 1608, 1613, 1618, 1623, 1628, 1633, 1638, 1643, - 1649, 1648, 1679, 1689, 1699, 1703, 1707, 1716, 1720, 1725, - 1729, 1734, 1742, 1747, 1755, 1759, 1764, 1768, 1773, 1781, - 1786, 1794, 1798, 1805, 1809, 1816, 1820, 1824, 1828, 1832, - 1839, 1843, 1847, 1851, 1855, 1859, 1866, 1867, 1868, 1872, - 1875, 1876, 1877, 1881, 1886, 1892, 1898, 1903, 1909, 1915, - 1919, 1930, 1934, 1944, 1948, 1952, 1957, 1962, 1967, 1972, - 1977, 1982, 1990, 1994, 1998, 2003, 2008, 2013, 2018, 2023, - 2028, 2033, 2039, 2047, 2052, 2057, 2062, 2067, 2072, 2077, - 2082, 2087, 2092, 2098, 2106, 2110, 2115, 2120, 2125, 2130, - 2135, 2140, 2145, 2150, 2158, 2162, 2167, 2172, 2177, 2182, - 2187, 2192, 2197, 2202, 2207, 2213, 2220, 2227, 2237, 2241, - 2249, 2253, 2257, 2261, 2265, 2281, 2297, 2306, 2310, 2320, - 2327, 2338, 2342, 2350, 2354, 2358, 2362, 2366, 2382, 2398, - 2416, 2425, 2429, 2439, 2446, 2450, 2458, 2462, 2478, 2494, - 2503, 2513, 2520, 2524, 2532, 2536, 2541, 2545, 2553, 2554, - 2555, 2556, 2561, 2560, 2585, 2584, 2614, 2615, 2622, 2623, - 2627, 2628, 2632, 2636, 2640, 2644, 2648, 2652, 2656, 2660, - 2664, 2668, 2675, 2683, 2687, 2691, 2696, 2704, 2708, 2715, - 2716, 2721, 2728, 2729, 2734, 2742, 2746, 2750, 2757, 2761, - 2765, 2773, 2772, 2795, 2794, 2817, 2818, 2822, 2828, 2835, - 2844, 2845, 2846, 2850, 2854, 2858, 2862, 2866, 2870, 2875, - 2880, 2885, 2890, 2894, 2899, 2908, 2913, 2921, 2925, 2929, - 2937, 2947, 2947, 2957, 2958, 2962, 2963, 2964, 2965, 2966, - 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2973, 2973, 2974, - 2974, 2974, 2974, 2975, 2975, 2975, 2975, 2975, 2976, 2976, - 2976, 2977, 2977, 2977, 2977, 2977, 2978, 2978, 2978, 2978, - 2978, 2979, 2979, 2980, 2980, 2980, 2980, 2980, 2981, 2981, - 2981, 2981, 2981, 2982, 2982, 2982, 2982, 2983, 2983, 2983, - 2983, 2983, 2984, 2984, 2984, 2984, 2984, 2985, 2985, 2985, - 2985, 2985, 2985, 2986, 2986, 2986, 2986, 2986, 2987, 2987, - 2987, 2987, 2988, 2988, 2988, 2988, 2989, 2989, 2989, 2989, - 2989, 2990, 2990, 2990, 2990, 2991, 2991, 2991, 2991, 2991, - 2992, 2992, 2992, 2992, 2993, 2993, 2993, 2993, 2993, 2994, - 2994, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, 2997, - 2997, 2997, 2998, 2998, 2998, 2998, 2998, 2998, 2998, 2998, - 2998, 2998, 2999, 2999, 3003, 3007, 3014, 3018, 3025, 3029, - 3036, 3040, 3044, 3048, 3052, 3056, 3060, 3064, 3076, 3080, - 3084, 3088, 3092, 3096, 3100, 3104, 3108, 3112, 3116, 3120, - 3124, 3128, 3132, 3136, 3140, 3144, 3148, 3152, 3156, 3160, - 3164, 3168, 3172, 3176, 3180, 3184, 3188, 3192, 3196, 3204, - 3208, 3212, 3216, 3220, 3224, 3228, 3238, 3248, 3254, 3260, - 3266, 3272, 3278, 3284, 3291, 3298, 3305, 3312, 3318, 3324, - 3328, 3340, 3344, 3348, 3352, 3356, 3367, 3378, 3382, 3386, - 3390, 3394, 3398, 3402, 3406, 3410, 3414, 3418, 3422, 3426, - 3430, 3434, 3438, 3442, 3446, 3450, 3454, 3458, 3462, 3466, - 3470, 3474, 3478, 3482, 3486, 3490, 3494, 3498, 3505, 3509, - 3513, 3517, 3521, 3525, 3529, 3533, 3537, 3543, 3549, 3553, - 3559, 3566, 3570, 3574, 3578, 3582, 3586, 3590, 3594, 3598, - 3602, 3606, 3610, 3614, 3618, 3622, 3626, 3630, 3644, 3648, - 3652, 3656, 3660, 3664, 3668, 3672, 3684, 3688, 3692, 3696, - 3700, 3711, 3722, 3726, 3730, 3734, 3738, 3742, 3746, 3750, - 3754, 3758, 3762, 3766, 3770, 3774, 3778, 3782, 3786, 3790, - 3794, 3798, 3802, 3806, 3810, 3814, 3818, 3822, 3826, 3830, - 3834, 3838, 3845, 3849, 3853, 3857, 3861, 3865, 3869, 3873, - 3877, 3883, 3889, 3897, 3901, 3905, 3909, 3916, 3926, 3932, - 3938, 3948, 3960, 3968, 3972, 4002, 4006, 4010, 4014, 4018, - 4022, 4028, 4032, 4036, 4040, 4051, 4055, 4059, 4063, 4071, - 4075, 4079, 4085, 4096 + 1433, 1437, 1441, 1445, 1452, 1453, 1454, 1458, 1460, 1459, + 1467, 1468, 1472, 1473, 1477, 1483, 1492, 1493, 1497, 1501, + 1505, 1509, 1515, 1521, 1527, 1534, 1539, 1548, 1552, 1557, + 1565, 1577, 1581, 1595, 1610, 1615, 1620, 1625, 1630, 1635, + 1640, 1645, 1651, 1650, 1681, 1691, 1701, 1705, 1709, 1718, + 1722, 1727, 1731, 1736, 1744, 1749, 1757, 1761, 1766, 1770, + 1775, 1783, 1788, 1796, 1800, 1807, 1811, 1818, 1822, 1826, + 1830, 1834, 1841, 1845, 1849, 1853, 1857, 1861, 1868, 1869, + 1870, 1874, 1877, 1878, 1879, 1883, 1888, 1894, 1900, 1905, + 1911, 1917, 1921, 1932, 1936, 1946, 1950, 1954, 1959, 1964, + 1969, 1974, 1979, 1984, 1992, 1996, 2000, 2005, 2010, 2015, + 2020, 2025, 2030, 2035, 2041, 2049, 2054, 2059, 2064, 2069, + 2074, 2079, 2084, 2089, 2094, 2100, 2108, 2112, 2117, 2122, + 2127, 2132, 2137, 2142, 2147, 2152, 2160, 2164, 2169, 2174, + 2179, 2184, 2189, 2194, 2199, 2204, 2209, 2215, 2222, 2229, + 2239, 2243, 2251, 2255, 2259, 2263, 2267, 2283, 2299, 2308, + 2312, 2322, 2329, 2340, 2344, 2352, 2356, 2360, 2364, 2368, + 2384, 2400, 2418, 2427, 2431, 2441, 2448, 2452, 2460, 2464, + 2480, 2496, 2505, 2515, 2522, 2526, 2534, 2538, 2543, 2547, + 2555, 2556, 2557, 2558, 2563, 2562, 2587, 2586, 2616, 2617, + 2624, 2625, 2629, 2630, 2634, 2638, 2642, 2646, 2650, 2654, + 2658, 2662, 2666, 2670, 2677, 2685, 2689, 2693, 2698, 2706, + 2710, 2717, 2718, 2723, 2730, 2731, 2736, 2744, 2748, 2752, + 2759, 2763, 2767, 2775, 2774, 2797, 2796, 2819, 2820, 2824, + 2830, 2837, 2846, 2847, 2848, 2852, 2856, 2860, 2864, 2868, + 2872, 2877, 2882, 2887, 2892, 2896, 2901, 2910, 2915, 2923, + 2927, 2931, 2939, 2949, 2949, 2959, 2960, 2964, 2965, 2966, + 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2975, + 2975, 2976, 2976, 2976, 2976, 2977, 2977, 2977, 2977, 2977, + 2978, 2978, 2978, 2979, 2979, 2979, 2979, 2979, 2980, 2980, + 2980, 2980, 2980, 2981, 2981, 2982, 2982, 2982, 2982, 2982, + 2983, 2983, 2983, 2983, 2983, 2984, 2984, 2984, 2984, 2985, + 2985, 2985, 2985, 2985, 2986, 2986, 2986, 2986, 2986, 2987, + 2987, 2987, 2987, 2987, 2987, 2988, 2988, 2988, 2988, 2988, + 2989, 2989, 2989, 2989, 2990, 2990, 2990, 2990, 2991, 2991, + 2991, 2991, 2991, 2992, 2992, 2992, 2992, 2993, 2993, 2993, + 2993, 2993, 2994, 2994, 2994, 2994, 2995, 2995, 2995, 2995, + 2995, 2996, 2996, 2999, 2999, 2999, 2999, 2999, 2999, 2999, + 2999, 2999, 2999, 2999, 3000, 3000, 3000, 3000, 3000, 3000, + 3000, 3000, 3000, 3000, 3001, 3001, 3005, 3009, 3016, 3020, + 3027, 3031, 3038, 3042, 3046, 3050, 3054, 3058, 3062, 3066, + 3078, 3082, 3086, 3090, 3094, 3098, 3102, 3106, 3110, 3114, + 3118, 3122, 3126, 3130, 3134, 3138, 3142, 3146, 3150, 3154, + 3158, 3162, 3166, 3170, 3174, 3178, 3182, 3186, 3190, 3194, + 3198, 3206, 3210, 3214, 3218, 3222, 3226, 3230, 3240, 3250, + 3256, 3262, 3268, 3274, 3280, 3286, 3293, 3300, 3307, 3314, + 3320, 3326, 3330, 3342, 3346, 3350, 3354, 3358, 3369, 3380, + 3384, 3388, 3392, 3396, 3400, 3404, 3408, 3412, 3416, 3420, + 3424, 3428, 3432, 3436, 3440, 3444, 3448, 3452, 3456, 3460, + 3464, 3468, 3472, 3476, 3480, 3484, 3488, 3492, 3496, 3500, + 3507, 3511, 3515, 3519, 3523, 3527, 3531, 3535, 3539, 3545, + 3551, 3555, 3561, 3568, 3572, 3576, 3580, 3584, 3588, 3592, + 3596, 3600, 3604, 3608, 3612, 3616, 3620, 3624, 3628, 3632, + 3646, 3650, 3654, 3658, 3662, 3666, 3670, 3674, 3686, 3690, + 3694, 3698, 3702, 3713, 3724, 3728, 3732, 3736, 3740, 3744, + 3748, 3752, 3756, 3760, 3764, 3768, 3772, 3776, 3780, 3784, + 3788, 3792, 3796, 3800, 3804, 3808, 3812, 3816, 3820, 3824, + 3828, 3832, 3836, 3840, 3847, 3851, 3855, 3859, 3863, 3867, + 3871, 3875, 3879, 3885, 3891, 3899, 3903, 3907, 3911, 3918, + 3928, 3934, 3940, 3950, 3962, 3970, 3974, 4004, 4008, 4012, + 4016, 4020, 4024, 4030, 4034, 4038, 4042, 4053, 4057, 4061, + 4065, 4073, 4077, 4081, 4087, 4098 }; #endif @@ -1417,13 +1077,13 @@ static const char *const yytname[] = "const_expr_comma", "no_angle_bracket_const_expr", "const_expr", "const_operand", "formal_const_expr", "formal_const_operand", "capture_list", "capture", "class_derivation_name", "name", - "name_no_final", "string_literal", "empty", YY_NULL + "name_no_final", "string_literal", "empty", YY_NULLPTR }; #endif # ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, @@ -1446,1164 +1106,997 @@ static const yytype_uint16 yytoknum[] = }; # endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint16 yyr1[] = +#define YYPACT_NINF -922 + +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-922))) + +#define YYTABLE_NINF -751 + +#define yytable_value_is_error(Yytable_value) \ + 0 + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const yytype_int16 yypact[] = { - 0, 170, 171, 171, 171, 172, 172, 172, 173, 173, - 174, 174, 174, 176, 175, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 179, 178, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, - 182, 182, 182, 184, 183, 183, 183, 183, 183, 185, - 185, 187, 186, 186, 188, 188, 190, 189, 191, 189, - 193, 192, 194, 192, 195, 192, 196, 192, 197, 192, - 192, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 200, 200, 201, 202, 201, 201, - 203, 203, 204, 204, 205, 205, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 207, 207, 207, 207, 208, - 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 209, 208, 210, 210, 211, 211, 211, 212, 212, 212, - 212, 212, 213, 213, 214, 214, 214, 214, 214, 215, - 215, 216, 216, 217, 217, 218, 218, 218, 218, 218, - 219, 219, 219, 219, 219, 219, 220, 220, 220, 221, - 221, 221, 221, 222, 222, 222, 222, 222, 222, 222, - 222, 223, 223, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 226, 226, 226, 226, 226, 226, 226, - 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, - 230, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 232, 232, 232, 232, 232, 232, - 232, 232, 233, 233, 234, 234, 234, 234, 235, 235, - 235, 235, 237, 236, 239, 238, 240, 240, 241, 241, - 242, 242, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 244, 245, 245, 245, 245, 246, 246, 247, - 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, - 250, 252, 251, 253, 251, 251, 251, 254, 254, 254, - 255, 255, 255, 256, 256, 256, 256, 256, 256, 256, - 256, 256, 256, 256, 256, 256, 256, 257, 257, 257, - 258, 260, 259, 261, 261, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 263, 263, 264, 264, 265, 265, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 271, 271, 271, 271, 271, 272, 272, - 272, 272, 273, 273, 273, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 275, 275, 275, 275, 276, - 276, 276, 276, 277 + 135, -922, 3702, 5708, 37, 4828, -922, -922, -922, -922, + -922, -922, -922, -922, -125, -122, -95, -89, -85, -71, + -59, -41, -50, -922, -922, -38, 12, 28, 42, 55, + 75, 78, 130, 156, 185, 194, 203, 217, 224, 252, + 287, 294, 296, 303, 6019, -922, -922, -37, 307, 311, + 14, -20, -922, 313, 326, 332, 3702, 3702, 3702, 3702, + 3702, 1776, 1058, 3702, 4709, -922, 77, -922, -922, -922, + -922, -922, -922, -922, -922, 5818, 336, -922, -23, -922, + -922, 4057, 4449, 4449, -922, 3303, 344, -922, 4449, -922, + -922, 59, 59, -922, -922, -922, -922, 20, 48, -922, + -922, -922, -922, -922, -922, 468, 345, -922, 6767, 6767, + 6767, -922, 6767, 5186, 6767, 39, -922, 6758, 347, 348, + 352, 354, 6767, 1630, 52, 100, 186, 6767, 6767, 359, + 6638, 6767, 6767, 5704, 6767, 6767, -922, -922, -922, -922, + 4196, -922, -922, -922, -922, -922, 3702, 3702, 5708, 3702, + 3702, 3702, 3702, 5708, 3702, 5708, 3702, 5708, 3702, 5708, + 5708, 5708, 5708, 5708, 5708, 5708, 5708, 5708, 5708, 5708, + 5708, 5708, 5708, 5708, 3702, -922, -922, 362, 3303, 370, + 373, 3303, -922, -922, 5708, 3702, 3702, 374, 5304, 5708, + 1776, 3702, 3702, 51, 51, 51, 51, 51, -125, -95, + -89, -85, -71, -41, -38, 28, 4337, 4997, 5357, 5612, + 332, 87, -103, 4709, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, 3303, 3303, -98, 191, -922, + -922, 51, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, + 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, + 3702, 3702, 3702, 2764, 3702, -922, -922, 59, 59, 2898, + -922, -922, -922, 4449, -922, -922, -922, -922, 5708, -922, + 262, 257, 162, 59, 59, 162, 162, 4941, 188, -922, + 367, -922, -922, -922, -922, -922, -922, 4431, 278, 5129, + -922, 3303, 491, 395, 379, 2486, 5213, 6767, -922, -922, + -922, -922, 6767, -922, -922, -922, -922, 6730, 2901, -922, + 3303, 3303, 3303, 3303, -922, -922, 402, -922, -922, -922, + -922, -922, 3702, -922, 4289, -922, 397, -922, 4375, -922, + 3303, 216, -922, -922, 385, 387, -922, 392, 5904, 3303, + 407, -922, 3303, -21, 324, 425, -922, -922, -922, -922, + 1115, -922, -922, 408, 427, -922, 412, 418, 428, 429, + 432, 433, 423, 434, 437, 441, 443, 444, 449, 456, + 462, -69, 482, 464, 467, 469, 470, 472, 473, 479, + 481, 483, 485, 492, 3702, -922, 5708, 3702, -922, 5260, + 501, 493, 494, 3303, 508, 509, 528, 520, 4060, 522, + 523, 3702, 3702, -922, 633, -922, 1031, 532, 3702, -922, + -922, 4026, 4994, 507, 507, 569, 569, 405, 405, -922, + 3054, 1798, 1271, 1600, 569, 569, 683, 683, 51, 51, + 51, -922, -922, -46, 2253, -922, -922, 533, 4444, 534, + 162, 536, 545, 3303, 162, 162, 162, 162, 162, 541, + -922, 188, -922, 188, -922, 541, 541, -922, 162, 468, + 5794, 5679, 162, 162, 543, 7, -922, 442, 396, -922, + 3702, 3303, 546, -922, -922, -922, -922, 4431, -12, -8, + 10, 468, 548, 71, -922, -922, -922, 561, 6767, 468, + 1917, -125, 549, 4501, -922, -922, -922, 578, 588, 590, + 591, 598, 6134, -922, 3855, 5453, 353, 582, 324, -922, + -922, 577, -922, 5708, -922, 21, 3032, 6043, 1099, -922, + 5708, -922, 583, -922, -922, 3303, 66, -922, -922, -922, + 2625, -922, -922, 413, -922, 599, 5129, -922, -922, -922, + -922, -922, -922, -922, 585, -922, 602, -922, -922, -922, + -922, 5708, -922, 5708, -922, 5708, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, 4522, 611, 612, + -922, 606, -922, -922, 614, -922, -922, 618, -922, -922, + -922, -922, 51, 4709, -922, 3303, 191, 5559, 1592, -922, + 4709, 3702, -922, -922, -922, -922, -922, 541, 162, -922, + 541, 541, 541, 541, 541, 3702, 63, 706, 5818, 442, + 396, -922, 98, 120, -922, -922, 5588, 625, 442, 442, + 442, 442, 442, 442, -70, -922, -922, 627, 3303, 396, + 396, 396, 396, 396, 396, -33, 623, 4709, -922, -58, + -922, 641, 747, 2486, -922, 720, 468, -922, -922, -922, + -922, -922, -922, -922, -922, 635, 647, 650, -922, -922, + 6019, -922, -922, 651, 38, 654, -922, 646, 3702, 3702, + 3702, 3702, 1776, 3702, 645, 25, -922, -922, 4763, -922, + 77, -922, 6767, 6767, 6206, -922, 803, 805, 806, 818, + -922, -922, 376, 682, -922, -922, -922, -922, 5521, -922, + 676, 688, 3169, -922, 1035, -922, -922, 21, -922, 413, + -922, 690, 5559, 680, 413, 5559, 679, 4540, 1099, 692, + 1099, 1099, 1099, 1099, 1099, 167, -922, -922, 686, 6278, + -922, 689, -922, 290, -922, -113, 701, 705, 691, 707, + 711, 3166, 3322, 708, 413, 413, 4129, 413, 413, 413, + 413, -922, 61, 411, -922, 4431, -922, 3702, 3702, 699, + 702, 703, -922, -922, -922, 3702, -922, 3702, -922, 709, + -922, 5933, 468, -922, -922, -922, -922, -922, -922, 712, + -922, -922, 725, -922, 4709, 541, 704, 715, 5679, 442, + 396, -70, -33, 729, 732, 1592, -922, -922, 442, 740, + 740, 740, 740, 740, 298, 3702, -922, 396, -922, 742, + 742, 742, 742, 742, 321, 3702, -922, 743, -922, 3702, + -922, 731, 4558, 6350, -922, 760, -922, -922, 5708, 5708, + 5708, 746, 5708, 749, 5333, 5708, 1776, 51, 51, 51, + 51, 750, -26, 51, -922, -922, 3836, 3702, 3702, 3702, + 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, + 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3300, 3702, + -922, -922, -922, -922, -14, 768, 771, 772, 6422, 17, + -922, 1035, 6647, 5453, 3303, 767, 763, 1035, 1035, 1035, + 1035, 1035, 1035, 85, 742, -922, 411, -922, 757, 413, + 209, 758, -922, -922, 329, 1099, 775, 775, 775, 775, + 775, -922, 3702, -922, -922, 5559, -922, 2319, -922, -922, + 3303, 3702, 3702, -922, -922, -922, -922, -922, 3166, 761, + 789, 4709, -922, -922, 413, 341, 341, 927, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, 776, 774, -922, -922, 341, 341, + 341, 267, 937, -922, 3702, -922, 2625, 797, -922, 641, + 58, 89, -922, -922, -922, 93, 94, -922, 6019, 59, + 898, 132, -922, -922, 5559, -922, -70, -33, -922, -922, + 5559, 5559, -922, 740, 783, 802, 742, 808, 804, 3590, + -922, -922, -922, 3919, 828, 829, -922, 812, 826, 831, + 3702, 832, 3303, 823, 825, 836, 827, 4595, 3702, -922, + -922, -922, 4026, 4994, 507, 507, 569, 569, 405, 405, + -922, 4613, 1798, 1271, 1600, 569, 569, 683, 683, 51, + 51, 51, -922, -922, 96, 2505, 6494, 984, 847, 987, + 990, 992, -922, 856, 85, 742, -922, -922, -922, -922, + -922, -922, 5708, 1035, 3975, -922, -922, 860, -922, -922, + 276, 844, -922, -922, 775, 5559, 843, 848, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, + -922, -922, -922, -922, -922, -922, -922, -922, 846, -922, + 850, 849, 851, -922, 3434, 341, -922, -922, -922, -922, + -922, 1917, 855, 3322, 413, -922, -922, -922, -922, 1592, + 59, -922, -922, -922, 2, 858, 861, -922, -922, 865, + 866, 5559, -922, 5559, -922, -922, 5778, 6003, 6052, 3303, + 368, -922, -922, 1011, -922, 3919, -922, 869, 872, 871, + 876, 878, -922, -922, 887, -922, -922, 51, 3702, -922, + -922, -922, 99, -922, 104, 895, 145, -922, -922, -922, + 899, 919, 920, 921, 40, 923, 3975, 3975, 3975, 3975, + 3975, 1776, 3975, 4211, -922, 413, 2679, 915, -922, 2679, + 5559, 914, -922, -922, 2094, -922, -922, 1066, -922, 3166, + 4709, 917, -922, -922, 938, -922, 926, -922, -922, -922, + -922, -922, 932, 933, 4191, -922, 4191, -922, 4191, -922, + -922, 4191, 4191, 4191, -922, 6566, -922, 3702, 3702, -922, + 3702, -922, 3702, 4709, 1075, 939, 1076, 941, 953, 1092, + 955, 5708, 5708, 5708, 5708, 940, 5424, 5708, 67, 67, + 67, 67, 67, 947, 149, 67, 3975, 3975, 3975, 3975, + 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, + 3975, 3975, 3975, 3975, 3975, 3568, 3702, -922, -922, 5559, + 948, -922, 2679, -922, -922, 954, -922, -922, -922, 1592, + 1592, 1592, -922, -922, -922, -922, -922, -922, -922, -922, + -922, 153, 171, 177, 181, 949, -922, 958, -922, -922, + 189, -922, 957, 950, 964, 972, 3303, 970, 971, 982, + 3975, -922, 4820, 5010, 1350, 1350, 604, 604, 662, 662, + -922, 1203, 5026, 5050, 5066, 770, 770, 67, 67, 67, + -922, -922, 193, 2782, 5559, 973, -922, 2679, -922, 2679, + 974, -922, -922, -922, 2679, 2679, -922, -922, -922, -922, + 994, 1130, 1135, 1000, -922, 985, 986, 988, 989, -922, + -922, 993, 67, 3975, -922, -922, 995, -922, 2679, -922, + -922, 996, 998, -922, 3702, 3702, 3702, -922, 3702, 4211, + -922, 1592, 1006, 1008, 205, 210, 214, 263, 1592, -922, + -922, -922, -922, -922, -922, -922, -922 }; -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 2, 2, 2, 1, 2, 2, 1, 3, - 4, 5, 4, 0, 5, 1, 1, 1, 1, 1, - 2, 1, 1, 2, 2, 2, 2, 7, 9, 11, - 9, 11, 13, 9, 13, 9, 7, 5, 0, 3, - 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 4, 5, 5, 1, 3, - 1, 4, 4, 0, 4, 3, 3, 3, 1, 2, - 4, 0, 4, 3, 2, 4, 0, 6, 0, 6, - 0, 7, 0, 11, 0, 12, 0, 8, 0, 9, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 4, 5, 6, 4, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 1, 1, 1, 1, 2, 0, 6, 2, - 1, 1, 1, 3, 1, 1, 1, 2, 4, 2, - 3, 3, 4, 2, 3, 1, 1, 1, 1, 1, - 2, 3, 2, 2, 2, 2, 2, 3, 4, 3, - 0, 6, 2, 3, 1, 3, 4, 1, 1, 1, - 3, 2, 1, 3, 1, 1, 1, 3, 2, 1, - 3, 1, 2, 1, 2, 1, 3, 5, 3, 3, - 1, 3, 3, 3, 3, 4, 1, 1, 2, 1, - 3, 3, 5, 3, 4, 5, 3, 4, 5, 2, - 4, 1, 1, 1, 1, 2, 2, 2, 2, 2, - 3, 4, 1, 1, 2, 2, 2, 2, 2, 3, - 4, 7, 3, 1, 2, 2, 2, 2, 2, 2, - 3, 4, 7, 3, 1, 1, 2, 2, 2, 2, - 2, 2, 3, 4, 1, 1, 2, 2, 2, 2, - 2, 2, 3, 4, 5, 9, 9, 9, 1, 1, - 2, 1, 1, 1, 3, 4, 4, 4, 4, 1, - 1, 1, 1, 2, 1, 1, 1, 3, 4, 2, - 4, 4, 4, 1, 1, 1, 2, 3, 2, 4, - 4, 1, 1, 1, 2, 3, 2, 3, 1, 4, - 5, 5, 0, 6, 0, 9, 1, 1, 1, 1, - 2, 3, 1, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 4, 3, 1, 4, 2, 1, 1, 1, - 3, 5, 1, 2, 4, 1, 2, 2, 1, 1, - 1, 0, 6, 0, 7, 4, 5, 3, 5, 4, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, - 1, 0, 2, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, - 1, 4, 7, 7, 7, 7, 4, 4, 5, 4, - 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 5, 4, 4, 3, 3, 3, 3, 1, - 4, 7, 7, 7, 7, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 5, 4, 2, 5, 4, 4, 2, 2, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 5, 4, 4, 3, 3, 3, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, - 11, 4, 4, 6, 4, 4, 6, 6, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 1, 4, - 7, 7, 7, 7, 4, 4, 5, 4, 2, 5, - 4, 4, 2, 2, 2, 2, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 5, 4, 4, 3, 3, - 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 4, 2, 3, - 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 0 -}; - -/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ static const yytype_uint16 yydefact[] = { - 0, 753, 0, 0, 0, 753, 5, 642, 638, 641, - 749, 750, 644, 645, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 640, 646, 0, 0, 0, 0, 0, + 0, 755, 0, 0, 0, 755, 5, 644, 640, 643, + 751, 752, 646, 647, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 642, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 648, 647, 0, 0, 0, - 0, 0, 639, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 753, 0, 3, 579, 643, 289, 300, 299, - 383, 384, 386, 387, 368, 0, 0, 398, 365, 397, - 392, 389, 388, 391, 369, 0, 0, 370, 390, 400, - 385, 753, 753, 4, 291, 292, 293, 0, 354, 753, - 288, 380, 381, 382, 1, 0, 0, 21, 753, 753, - 753, 22, 753, 753, 753, 0, 38, 753, 0, 0, - 0, 0, 753, 0, 0, 0, 0, 753, 753, 0, - 753, 753, 753, 0, 753, 753, 6, 17, 7, 19, - 0, 15, 16, 18, 68, 40, 753, 753, 0, 753, - 753, 753, 753, 0, 753, 0, 753, 0, 753, 0, + 0, 0, 0, 0, 0, 650, 649, 0, 0, 0, + 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 755, 0, 3, 581, 645, 291, 302, 301, + 385, 386, 388, 389, 370, 0, 0, 400, 367, 399, + 394, 391, 390, 393, 371, 0, 0, 372, 392, 402, + 387, 755, 755, 4, 293, 294, 295, 0, 356, 755, + 290, 382, 383, 384, 1, 0, 0, 21, 755, 755, + 755, 22, 755, 755, 755, 0, 38, 755, 0, 0, + 0, 0, 755, 0, 0, 0, 0, 755, 755, 0, + 755, 755, 755, 0, 755, 755, 6, 17, 7, 19, + 0, 15, 16, 18, 68, 40, 755, 755, 0, 755, + 755, 755, 755, 0, 755, 0, 755, 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 753, 315, 321, 0, 0, 0, - 603, 0, 753, 314, 0, 753, 753, 0, 0, 0, - 0, 753, 753, 612, 610, 609, 611, 608, 289, 383, - 384, 386, 387, 398, 397, 392, 389, 388, 391, 390, - 385, 0, 0, 538, 735, 736, 737, 738, 741, 739, - 743, 742, 740, 744, 724, 725, 0, 0, 753, 730, - 723, 607, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 755, 317, 323, 0, 0, 0, + 605, 0, 755, 316, 0, 755, 755, 0, 0, 0, + 0, 755, 755, 614, 612, 611, 613, 610, 291, 385, + 386, 388, 389, 400, 399, 394, 391, 390, 393, 392, + 387, 0, 0, 540, 737, 738, 739, 740, 743, 741, + 745, 744, 742, 746, 726, 727, 0, 0, 755, 732, + 725, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 751, 752, 753, 753, 0, - 366, 367, 399, 389, 394, 393, 396, 290, 0, 395, - 0, 275, 753, 753, 753, 753, 753, 753, 0, 324, - 274, 326, 753, 745, 746, 747, 748, 0, 356, 0, - 328, 0, 0, 58, 60, 0, 753, 753, 52, 41, - 51, 53, 753, 42, 146, 47, 23, 753, 0, 45, - 0, 0, 0, 0, 50, 753, 0, 26, 25, 24, - 48, 44, 0, 0, 149, 0, 54, 0, 20, 0, - 0, 46, 49, 323, 302, 313, 0, 0, 0, 0, - 13, 0, 0, 0, 322, 63, 304, 305, 306, 354, - 753, 301, 0, 537, 536, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 753, 754, 755, 755, 0, + 368, 369, 401, 391, 396, 395, 398, 292, 0, 397, + 0, 277, 755, 755, 755, 755, 755, 755, 0, 326, + 276, 328, 755, 747, 748, 749, 750, 0, 358, 0, + 330, 0, 0, 58, 60, 0, 755, 755, 52, 41, + 51, 53, 755, 42, 147, 47, 23, 755, 0, 45, + 0, 0, 0, 0, 50, 755, 0, 26, 25, 24, + 48, 44, 0, 151, 0, 150, 0, 54, 0, 20, + 0, 0, 46, 49, 325, 304, 315, 0, 0, 0, + 0, 13, 0, 0, 0, 324, 63, 306, 307, 308, + 356, 755, 303, 0, 539, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 316, 0, 753, 318, 0, 0, + 0, 0, 0, 0, 0, 318, 0, 755, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 637, 728, 731, 0, 753, 0, 726, 203, - 621, 622, 623, 624, 625, 626, 629, 630, 636, 0, - 618, 619, 620, 627, 628, 616, 617, 613, 614, 615, - 635, 634, 0, 0, 325, 327, 0, 0, 0, 753, - 276, 0, 265, 753, 753, 753, 753, 753, 281, 264, - 0, 277, 0, 278, 280, 279, 188, 753, 0, 0, - 0, 753, 753, 0, 189, 192, 753, 0, 187, 753, - 362, 0, 359, 358, 353, 357, 0, 735, 736, 737, - 0, 0, 739, 332, 294, 334, 0, 753, 0, 753, - 302, 0, 0, 43, 39, 753, 0, 0, 0, 0, - 0, 753, 371, 0, 753, 323, 302, 0, 322, 71, - 0, 377, 0, 76, 78, 0, 0, 753, 303, 0, - 753, 0, 401, 205, 0, 0, 66, 401, 210, 0, - 67, 65, 0, 309, 356, 0, 586, 585, 602, 592, - 588, 590, 591, 0, 598, 0, 597, 651, 587, 652, - 0, 654, 0, 655, 0, 658, 659, 660, 661, 662, - 663, 664, 665, 666, 667, 594, 0, 0, 0, 317, - 0, 593, 596, 0, 600, 599, 0, 605, 606, 595, - 589, 580, 539, 729, 0, 753, 753, 753, 91, 204, - 0, 633, 632, 297, 296, 298, 282, 753, 266, 271, - 267, 268, 270, 269, 753, 0, 0, 0, 753, 0, - 229, 0, 0, 753, 191, 0, 0, 753, 753, 753, - 753, 753, 753, 753, 243, 242, 0, 253, 0, 0, - 0, 0, 0, 0, 753, 0, 535, 534, 363, 352, - 295, 0, 0, 753, 753, 0, 55, 59, 716, 712, - 715, 718, 719, 195, 0, 0, 0, 714, 720, 0, - 722, 721, 0, 0, 0, 713, 0, 0, 0, 0, - 0, 0, 0, 0, 196, 231, 199, 232, 668, 717, - 194, 753, 753, 753, 373, 0, 0, 0, 0, 375, - 753, 0, 0, 166, 167, 168, 154, 0, 155, 0, - 151, 156, 152, 753, 165, 150, 0, 73, 0, 379, - 0, 753, 0, 0, 753, 0, 0, 753, 0, 753, - 753, 753, 753, 753, 0, 234, 233, 0, 753, 80, - 0, 753, 0, 8, 0, 0, 0, 0, 0, 0, - 753, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 64, 753, 753, 169, 0, 307, 0, 0, 0, 0, - 0, 319, 320, 604, 0, 601, 0, 727, 0, 98, - 0, 0, 92, 100, 95, 99, 94, 96, 0, 93, - 97, 0, 184, 631, 272, 0, 0, 0, 753, 0, - 753, 753, 0, 0, 753, 190, 193, 753, 248, 244, - 245, 247, 246, 0, 753, 223, 0, 254, 259, 255, - 256, 258, 257, 0, 753, 226, 283, 360, 0, 329, - 0, 0, 753, 337, 753, 336, 62, 0, 0, 0, - 678, 0, 0, 0, 0, 0, 686, 685, 684, 683, - 0, 0, 682, 61, 198, 0, 0, 0, 0, 0, + 0, 0, 0, 639, 730, 733, 0, 755, 0, 728, + 205, 623, 624, 625, 626, 627, 628, 631, 632, 638, + 0, 620, 621, 622, 629, 630, 618, 619, 615, 616, + 617, 637, 636, 0, 0, 327, 329, 0, 0, 0, + 755, 278, 0, 267, 755, 755, 755, 755, 755, 283, + 266, 0, 279, 0, 280, 282, 281, 190, 755, 0, + 0, 0, 755, 755, 0, 191, 194, 755, 0, 189, + 755, 364, 0, 361, 360, 355, 359, 0, 737, 738, + 739, 0, 0, 741, 334, 296, 336, 0, 755, 0, + 755, 304, 0, 0, 43, 39, 755, 0, 0, 0, + 0, 0, 755, 373, 0, 755, 325, 304, 0, 324, + 71, 0, 379, 0, 76, 78, 0, 0, 755, 305, + 0, 755, 0, 403, 207, 0, 0, 66, 403, 212, + 0, 67, 65, 0, 311, 358, 0, 588, 587, 604, + 594, 590, 592, 593, 0, 600, 0, 599, 653, 589, + 654, 0, 656, 0, 657, 0, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 596, 0, 0, 0, + 319, 0, 595, 598, 0, 602, 601, 0, 607, 608, + 597, 591, 582, 541, 731, 0, 755, 755, 755, 91, + 206, 0, 635, 634, 299, 298, 300, 284, 755, 268, + 273, 269, 270, 272, 271, 755, 0, 0, 0, 755, + 0, 231, 0, 0, 755, 193, 0, 0, 755, 755, + 755, 755, 755, 755, 755, 245, 244, 0, 255, 0, + 0, 0, 0, 0, 0, 755, 0, 537, 536, 365, + 354, 297, 0, 0, 755, 755, 0, 55, 59, 718, + 714, 717, 720, 721, 197, 0, 0, 0, 716, 722, + 0, 724, 723, 0, 0, 0, 715, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 233, 201, 234, 670, + 719, 196, 755, 755, 755, 375, 0, 0, 0, 0, + 377, 755, 0, 0, 168, 169, 170, 156, 0, 157, + 0, 153, 158, 154, 755, 167, 152, 0, 73, 0, + 381, 0, 755, 0, 0, 755, 0, 0, 755, 0, + 755, 755, 755, 755, 755, 0, 236, 235, 0, 755, + 80, 0, 755, 0, 8, 0, 0, 0, 0, 0, + 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 755, 755, 171, 0, 309, 0, 0, 0, + 0, 0, 321, 322, 606, 0, 603, 0, 729, 0, + 98, 0, 0, 92, 100, 95, 99, 94, 96, 0, + 93, 97, 0, 186, 633, 274, 0, 0, 0, 755, + 0, 755, 755, 0, 0, 755, 192, 195, 755, 250, + 246, 247, 249, 248, 0, 755, 225, 0, 256, 261, + 257, 258, 260, 259, 0, 755, 228, 285, 362, 0, + 331, 0, 0, 755, 339, 755, 338, 62, 0, 0, + 0, 680, 0, 0, 0, 0, 0, 688, 687, 686, + 685, 0, 0, 684, 61, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, - 56, 376, 753, 0, 0, 0, 0, 753, 0, 37, - 753, 753, 0, 159, 157, 0, 753, 753, 753, 753, - 753, 753, 753, 163, 72, 753, 378, 0, 0, 0, - 0, 311, 310, 0, 753, 239, 235, 236, 238, 237, - 86, 753, 312, 14, 753, 206, 402, 403, 401, 0, - 753, 753, 208, 209, 211, 213, 214, 753, 0, 217, - 219, 216, 212, 0, 176, 172, 0, 115, 116, 117, - 118, 119, 120, 123, 124, 139, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 143, 142, - 126, 125, 112, 114, 113, 121, 122, 110, 111, 107, - 108, 109, 106, 0, 0, 105, 170, 173, 175, 174, - 0, 0, 180, 753, 182, 0, 0, 69, 308, 0, - 0, 653, 656, 657, 0, 0, 753, 0, 753, 0, - 0, 401, 273, 753, 230, 753, 753, 224, 227, 753, - 753, 284, 249, 252, 0, 260, 263, 0, 364, 331, - 330, 333, 0, 0, 339, 338, 0, 0, 0, 753, - 0, 0, 0, 0, 0, 0, 0, 0, 711, 197, - 200, 695, 696, 697, 698, 699, 700, 703, 704, 710, - 0, 692, 693, 694, 701, 702, 690, 691, 687, 688, - 689, 709, 708, 0, 0, 753, 0, 0, 0, 0, - 0, 372, 0, 753, 164, 144, 148, 145, 153, 160, - 0, 753, 0, 161, 201, 0, 74, 753, 0, 0, - 753, 88, 240, 753, 0, 0, 405, 406, 410, 407, - 415, 408, 409, 411, 412, 413, 414, 416, 417, 418, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 57, 56, 378, 755, 0, 0, 0, 0, 755, 0, + 37, 755, 755, 0, 161, 159, 0, 755, 755, 755, + 755, 755, 755, 755, 165, 72, 755, 380, 0, 0, + 0, 0, 313, 312, 0, 755, 241, 237, 238, 240, + 239, 86, 755, 314, 14, 755, 208, 404, 405, 403, + 0, 755, 755, 210, 211, 213, 215, 216, 755, 0, + 219, 221, 218, 214, 0, 178, 174, 0, 115, 116, + 117, 118, 119, 120, 123, 124, 139, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 143, + 142, 126, 125, 112, 114, 113, 121, 122, 110, 111, + 107, 108, 109, 106, 0, 0, 105, 172, 175, 177, + 176, 0, 0, 182, 755, 184, 0, 0, 69, 310, + 0, 0, 655, 658, 659, 0, 0, 755, 0, 755, + 0, 0, 403, 275, 755, 232, 755, 755, 226, 229, + 755, 755, 286, 251, 254, 0, 262, 265, 0, 366, + 333, 332, 335, 0, 0, 341, 340, 0, 0, 0, + 755, 0, 0, 0, 0, 0, 0, 0, 0, 713, + 199, 202, 697, 698, 699, 700, 701, 702, 705, 706, + 712, 0, 694, 695, 696, 703, 704, 692, 693, 689, + 690, 691, 711, 710, 0, 0, 755, 0, 0, 0, + 0, 0, 374, 0, 755, 166, 146, 144, 149, 145, + 155, 162, 0, 755, 0, 163, 203, 0, 74, 755, + 0, 0, 755, 88, 242, 755, 0, 0, 407, 408, + 412, 409, 417, 410, 411, 413, 414, 415, 416, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 483, 464, 465, 466, 467, + 459, 460, 461, 462, 463, 464, 465, 485, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 484, 485, 486, 487, 488, + 478, 479, 480, 481, 482, 483, 484, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 753, 527, 528, 529, 520, 532, 516, 517, - 515, 522, 523, 511, 512, 513, 514, 521, 519, 526, - 524, 530, 525, 518, 531, 404, 0, 9, 0, 0, - 0, 215, 218, 177, 171, 141, 140, 179, 183, 753, - 0, 204, 0, 583, 582, 584, 581, 753, 753, 185, - 104, 101, 0, 0, 0, 225, 228, 0, 0, 753, - 250, 753, 261, 361, 743, 0, 742, 0, 0, 340, - 342, 732, 753, 0, 677, 0, 0, 0, 0, 0, - 675, 674, 0, 680, 681, 669, 0, 707, 706, 374, - 0, 27, 0, 0, 0, 36, 162, 158, 0, 0, + 509, 510, 511, 512, 755, 529, 530, 531, 522, 534, + 518, 519, 517, 524, 525, 513, 514, 515, 516, 523, + 521, 528, 526, 532, 527, 520, 533, 406, 0, 9, + 0, 0, 0, 217, 220, 179, 173, 141, 140, 181, + 185, 755, 0, 206, 0, 585, 584, 586, 583, 755, + 755, 187, 104, 101, 0, 0, 0, 227, 230, 0, + 0, 755, 252, 755, 263, 363, 745, 0, 744, 0, + 0, 342, 344, 734, 755, 0, 679, 0, 0, 0, + 0, 0, 677, 676, 0, 682, 683, 671, 0, 709, + 708, 376, 0, 27, 0, 0, 0, 36, 164, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 202, 540, 0, 77, 0, 82, 79, 753, 0, - 241, 753, 0, 207, 12, 10, 220, 753, 221, 0, - 178, 70, 0, 186, 0, 102, 649, 753, 753, 753, - 0, 0, 0, 345, 0, 344, 0, 343, 733, 0, - 0, 0, 734, 753, 341, 0, 0, 679, 0, 676, - 0, 705, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 555, 553, 552, 554, - 551, 0, 0, 550, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 204, 542, 0, 77, 0, 82, 79, + 755, 0, 243, 755, 0, 209, 12, 10, 222, 755, + 223, 0, 180, 70, 0, 188, 0, 102, 651, 755, + 755, 755, 0, 0, 0, 347, 0, 346, 0, 345, + 735, 0, 0, 0, 736, 755, 343, 0, 0, 681, + 0, 678, 0, 707, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 557, 555, + 554, 556, 553, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 75, 84, 753, 0, 753, - 81, 533, 11, 0, 753, 401, 103, 753, 753, 753, - 753, 753, 351, 350, 349, 348, 347, 346, 335, 0, - 0, 0, 0, 0, 28, 0, 33, 35, 0, 30, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 578, - 564, 565, 566, 567, 568, 569, 570, 571, 577, 0, - 561, 562, 563, 559, 560, 556, 557, 558, 576, 575, - 0, 0, 753, 0, 753, 87, 222, 181, 0, 287, - 286, 285, 251, 262, 672, 671, 673, 670, 0, 0, - 0, 0, 549, 0, 0, 0, 0, 547, 546, 0, - 541, 0, 574, 573, 0, 753, 89, 650, 29, 0, - 0, 31, 0, 0, 0, 548, 0, 572, 753, 753, - 0, 0, 0, 0, 0, 0, 753, 83, 34, 32, - 544, 543, 545, 542, 85 + 0, 0, 0, 0, 0, 0, 0, 75, 84, 755, + 0, 755, 81, 535, 11, 0, 755, 403, 103, 755, + 755, 755, 755, 755, 353, 352, 351, 350, 349, 348, + 337, 0, 0, 0, 0, 0, 28, 0, 33, 35, + 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 580, 566, 567, 568, 569, 570, 571, 572, 573, + 579, 0, 563, 564, 565, 561, 562, 558, 559, 560, + 578, 577, 0, 0, 755, 0, 755, 87, 224, 183, + 0, 289, 288, 287, 253, 264, 674, 673, 675, 672, + 0, 0, 0, 0, 551, 0, 0, 0, 0, 549, + 548, 0, 543, 0, 576, 575, 0, 755, 89, 652, + 29, 0, 0, 31, 0, 0, 0, 550, 0, 574, + 755, 755, 0, 0, 0, 0, 0, 0, 755, 83, + 34, 32, 546, 545, 547, 544, 85 }; -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 4, 5, 732, 733, 137, 520, 138, 139, 307, - 140, 292, 293, 141, 532, 750, 328, 708, 894, 342, - 711, 714, 343, 914, 1407, 1472, 1093, 1318, 587, 976, - 1076, 142, 325, 699, 700, 701, 702, 703, 751, 1239, - 752, 781, 463, 464, 673, 674, 1083, 408, 526, 530, - 928, 929, 465, 676, 724, 798, 808, 278, 279, 91, - 92, 344, 180, 345, 93, 289, 94, 643, 95, 644, - 824, 1023, 1024, 1269, 96, 97, 474, 470, 471, 98, - 99, 143, 690, 872, 144, 100, 101, 102, 103, 730, - 731, 916, 1225, 635, 352, 353, 1311, 213, 65, 677, - 678, 227, 228, 1270, 1271, 624, 66, 145 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -922 -static const yytype_int16 yypact[] = -{ - 238, -922, 3707, 5766, 80, 4877, -922, -922, -922, -922, - -922, -922, -922, -922, -20, -68, -54, -43, -37, -23, - -49, 2, 3, -922, -922, 36, 90, 94, 120, 131, - 141, 166, 171, 181, 186, 204, 224, 233, 250, 252, - 265, 270, 288, 300, 6077, -922, -922, 59, 306, 308, - 30, 112, -922, 325, 331, 338, 3707, 3707, 3707, 3707, - 3707, 2266, 923, 3707, 3915, -922, 146, -922, -922, -922, - -922, -922, -922, -922, -922, 5876, 344, -922, 8, -922, - -922, 1691, 379, 379, -922, 3040, 346, -922, 379, -922, - -922, 220, 220, -922, -922, -922, -922, -11, 104, -922, - -922, -922, -922, -922, -922, 1704, 348, -922, 6862, 6862, - 6862, -922, 6862, 5244, 6862, -31, -922, 6834, 350, 357, - 359, 362, 6862, 1687, 161, 188, 258, 6862, 6862, 371, - 6652, 6862, 6862, 2382, 6862, 6862, -922, -922, -922, -922, - 4341, -922, -922, -922, -922, -922, 3707, 3707, 5766, 3707, - 3707, 3707, 3707, 5766, 3707, 5766, 3707, 5766, 3707, 5766, - 5766, 5766, 5766, 5766, 5766, 5766, 5766, 5766, 5766, 5766, - 5766, 5766, 5766, 5766, 3707, -922, -922, 372, 3040, 373, - 374, 3040, -922, -922, 5766, 3707, 3707, 398, 5362, 5766, - 2266, 3707, 3707, 60, 60, 60, 60, 60, -20, -54, - -43, -37, -23, 2, 36, 94, 1169, 5295, 5415, 5670, - 338, 321, -74, 3915, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, 3040, 3040, -87, 413, -922, - -922, 60, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, - 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, - 3707, 3707, 3707, 2769, 3707, -922, -922, 220, 220, 2903, - -922, -922, -922, 379, -922, -922, -922, -922, 5766, -922, - 405, 560, 273, 220, 220, 273, 273, 4990, 400, -922, - 402, -922, -922, -922, -922, -922, -922, 901, 419, 2827, - -922, 3040, 525, 427, 412, 2469, 5271, 6862, -922, -922, - -922, -922, 6862, -922, -922, -922, -922, 6748, 2638, -922, - 3040, 3040, 3040, 3040, -922, -922, 432, -922, -922, -922, - -922, -922, 3707, 4434, -922, 433, -922, 4520, -922, 3040, - -63, -922, -922, 225, 423, -922, 425, 5962, 3040, 426, - -922, 3040, 198, 205, 443, -922, -922, -922, -922, 942, - -922, -922, 428, 447, -922, 434, 438, 439, 442, 458, - 459, 453, 460, 471, 462, 468, 469, 472, 452, 474, - -69, 494, 480, 481, 482, 483, 484, 486, 487, 488, - 489, 490, 491, 3707, -922, 5766, 3707, -922, 2291, 507, - 498, 499, 3040, 500, 501, 513, 504, 4205, 505, 510, - 3707, 3707, -922, 668, -922, 936, 520, 3707, -922, -922, - 4171, 1444, 1377, 1377, 260, 260, 11, 11, -922, 2653, - 5043, 5059, 5099, 260, 260, 695, 695, 60, 60, 60, - -922, -922, -66, 1527, -922, -922, 519, 4589, 521, 273, - 523, 527, 3040, 273, 273, 273, 273, 273, 526, -922, - 400, -922, 400, -922, 526, 526, -922, 273, 1704, 5852, - 5737, 273, 273, 528, 50, -922, 1127, 232, -922, 3707, - 3040, 531, -922, -922, -922, -922, 901, -12, -10, -6, - 1704, 529, 10, -922, -922, -922, 543, 6862, 1704, 3841, - -20, 533, 4646, -922, -922, -922, 549, 553, 556, 558, - 564, 6192, -922, 3860, 5511, 280, 548, 205, -922, -922, - 567, -922, 5766, -922, 29, 3037, 6101, 1091, -922, 5766, - -922, 559, -922, -922, 3040, 294, -922, -922, -922, 2635, - -922, -922, 1168, -922, 575, 2827, -922, -922, -922, -922, - -922, -922, -922, 562, -922, 563, -922, -922, -922, -922, - 5766, -922, 5766, -922, 5766, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, 4667, 565, 566, -922, - 572, -922, -922, 571, -922, -922, 578, -922, -922, -922, - -922, 60, 3915, -922, 3040, 413, 5617, 4489, -922, 3915, - 3707, -922, -922, -922, -922, -922, 526, 273, -922, 526, - 526, 526, 526, 526, 3707, 212, 681, 5876, 1127, 232, - -922, 311, 320, -922, -922, 5646, 585, 1127, 1127, 1127, - 1127, 1127, 1127, -33, -922, -922, 586, 3040, 232, 232, - 232, 232, 232, 232, 39, 577, 3915, -922, 32, -922, - 601, 700, 2469, -922, 673, 1704, -922, -922, -922, -922, - -922, -922, -922, -922, 588, 598, 600, -922, -922, 6077, - -922, -922, 604, 35, 606, -922, 602, 3707, 3707, 3707, - 3707, 2266, 3707, 596, 64, -922, -922, 4758, -922, 146, - -922, 6862, 6862, 6264, -922, 754, 758, 763, 764, -922, - -922, 256, 617, -922, -922, -922, -922, 5579, -922, 621, - 633, 2906, -922, 1367, -922, -922, 29, -922, 1168, -922, - 634, 5617, 622, 1168, 5617, 619, 4685, 1091, 624, 1091, - 1091, 1091, 1091, 1091, 328, -922, -922, 625, 6336, -922, - 627, -922, 354, -922, 19, 647, 651, 637, 653, 657, - 3171, 3059, 649, 1168, 1168, 4274, 1168, 1168, 1168, 1168, - -922, 79, 323, -922, 901, -922, 3707, 3707, 640, 643, - 644, -922, -922, -922, 3707, -922, 3707, -922, 646, -922, - 5991, 1704, -922, -922, -922, -922, -922, -922, 650, -922, - -922, 671, -922, 3915, 526, 652, 654, 5737, 1127, 232, - -33, 39, 655, 656, 4489, -922, -922, 1127, 659, 659, - 659, 659, 659, 339, 3707, -922, 232, -922, 660, 660, - 660, 660, 660, 363, 3707, -922, 662, -922, 3707, -922, - 663, 4703, 6408, -922, 683, -922, -922, 5766, 5766, 5766, - 666, 5766, 670, 5391, 5766, 2266, 60, 60, 60, 60, - 672, -64, 60, -922, -922, 3981, 3707, 3707, 3707, 3707, - 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, - 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3305, 3707, -922, - -922, -922, -922, -59, 688, 690, 699, 6480, 41, -922, - 1367, 6776, 5511, 3040, 701, 691, 1367, 1367, 1367, 1367, - 1367, 1367, 71, 660, -922, 323, -922, 696, 1168, 228, - 697, -922, -922, 366, 1091, 692, 692, 692, 692, 692, - -922, 3707, -922, -922, 5617, -922, 2099, -922, -922, 3040, - 3707, 3707, -922, -922, -922, -922, -922, 3171, 698, 719, - 3915, -922, -922, 1168, 369, 369, 858, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, 704, 703, -922, -922, 369, 369, 369, - 293, 869, -922, 3707, -922, 2635, 727, -922, 601, -58, - -46, -922, -922, -922, -44, -42, -922, 6077, 220, 829, - 119, -922, -922, 5617, -922, -33, 39, -922, -922, 5617, - 5617, -922, 659, 714, 711, 660, 717, 713, 3327, -922, - -922, -922, 1439, 738, 751, -922, 734, 745, 746, 3707, - 748, 3040, 739, 741, 752, 750, 4740, 3707, -922, -922, - -922, 4171, 1444, 1377, 1377, 260, 260, 11, 11, -922, - 3595, 5043, 5059, 5099, 260, 260, 695, 695, 60, 60, - 60, -922, -922, -38, 1909, 6552, 904, 769, 908, 911, - 912, -922, 775, 71, 660, -922, -922, -922, -922, -922, - 5766, 1367, 4120, -922, -922, 778, -922, -922, 316, 765, - -922, -922, 692, 5617, 759, 766, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, 783, -922, 800, 770, - 804, -922, 3439, 369, -922, -922, -922, -922, -922, 3841, - 762, 3059, 1168, -922, -922, -922, -922, 4489, 220, -922, - -922, -922, 1, 806, 779, -922, -922, 812, 815, 5617, - -922, 5617, -922, -922, 5836, 6061, 6110, 3040, 326, -922, - -922, 968, -922, 1439, -922, 820, 824, 827, 830, 832, - -922, -922, 839, -922, -922, 60, 3707, -922, -922, -922, - -28, -922, -24, 840, 82, -922, -922, -922, 843, 841, - 855, 856, 37, 859, 4120, 4120, 4120, 4120, 4120, 2266, - 4120, 4356, -922, 1168, 755, 851, -922, 755, 5617, 850, - -922, -922, 1840, -922, -922, 1002, -922, 3171, 3915, 857, - -922, -922, 876, -922, 860, -922, -922, -922, -922, -922, - 863, 865, 2075, -922, 2075, -922, 2075, -922, -922, 2075, - 2075, 2075, -922, 6624, -922, 3707, 3707, -922, 3707, -922, - 3707, 3915, 1014, 884, 1029, 892, 893, 1034, 898, 5766, - 5766, 5766, 5766, 886, 5482, 5766, 114, 114, 114, 114, - 114, 887, 99, 114, 4120, 4120, 4120, 4120, 4120, 4120, - 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, - 4120, 4120, 4120, 3573, 3707, -922, -922, 5617, 894, -922, - 755, -922, -922, 885, -922, -922, -922, 4489, 4489, 4489, - -922, -922, -922, -922, -922, -922, -922, -922, -922, 103, - 123, 152, 168, 895, -922, 916, -922, -922, 170, -922, - 902, 903, 918, 920, 3040, 913, 915, 922, 4120, -922, - 5001, 5075, 1543, 1543, 290, 290, 684, 684, -922, 1472, - 5115, 5149, 4141, 906, 906, 114, 114, 114, -922, -922, - 172, 2288, 5617, 917, -922, 755, -922, 755, 921, -922, - -922, -922, 755, 755, -922, -922, -922, -922, 937, 1074, - 1077, 945, -922, 930, 932, 933, 934, -922, -922, 941, - 114, 4120, -922, -922, 940, -922, 755, -922, -922, 943, - 946, -922, 3707, 3707, 3707, -922, 3707, 4356, -922, 4489, - 950, 959, 173, 195, 196, 210, 4489, -922, -922, -922, - -922, -922, -922, -922, -922 -}; - -/* YYPGOTO[NTERM-NUM]. */ + /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -922, -922, -303, -922, 197, -922, -922, 807, -922, -922, - 194, -440, 470, -127, -922, -129, -922, -922, -195, -922, - -922, -922, 793, -922, -922, -922, -922, -922, -581, -922, - -922, -111, -922, -922, -922, -922, 240, 429, -672, -922, - -699, -740, -492, -922, -116, -922, 51, -539, -922, -497, - -921, -922, -455, 282, -664, 322, -229, 136, -71, 185, - 24, -288, -645, 801, 1201, -152, -118, -922, -117, -922, - -922, -922, -922, -144, -115, -922, -457, -922, -922, -36, - -27, -922, -922, -922, -922, -29, -45, -922, -922, -523, - -922, -72, -922, -584, -123, -60, 341, 307, 275, -922, - -922, -922, 726, 669, 1170, 243, -476, -1 + -922, -922, -284, -922, 238, -922, -922, 853, -127, -922, + 195, -424, 519, -126, -922, -78, -922, -922, -148, -922, + -922, -922, 840, -922, -922, -922, -922, -922, -582, -922, + -922, -111, -922, -922, -922, -922, 286, 474, -641, -922, + -691, -728, -576, -922, -64, -922, 108, -558, -922, -492, + -921, -922, -434, 337, -608, 241, 389, 609, -87, 24, + 86, -287, -647, 859, 230, -162, -130, -922, -128, -922, + -922, -922, -922, -91, -121, -922, -471, -922, -922, -18, + 18, -922, -922, -922, -922, -29, 81, -922, -922, -514, + -922, -16, -922, -567, -104, -60, 288, 716, 90, -922, + -922, -922, 787, -367, 1319, -68, -481, -1 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -749 + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 4, 5, 733, 734, 137, 521, 138, 139, 307, + 140, 292, 293, 141, 533, 751, 329, 709, 895, 343, + 712, 715, 344, 915, 1409, 1474, 1095, 1320, 588, 977, + 1078, 142, 326, 700, 701, 702, 703, 704, 752, 1241, + 753, 782, 464, 465, 674, 675, 1085, 409, 527, 531, + 929, 930, 466, 677, 725, 799, 809, 278, 279, 91, + 92, 345, 180, 346, 93, 289, 94, 644, 95, 645, + 825, 1024, 1025, 1271, 96, 97, 475, 471, 472, 98, + 99, 143, 691, 873, 144, 100, 101, 102, 103, 731, + 732, 917, 1227, 636, 353, 354, 1313, 213, 65, 678, + 679, 227, 228, 1272, 1273, 625, 66, 145 +}; + + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 6, 212, 304, 324, 737, 610, 1230, 491, 181, 895, - 707, 984, 501, 679, 830, 183, 1334, 182, 606, 640, - 785, 281, 346, 347, 355, 348, 357, 358, 359, 360, - 388, 362, 794, 364, 675, 366, 264, 265, 266, 508, - 641, 899, 712, 269, 240, 187, 767, 255, 647, 256, - 832, 382, 1373, 903, 1011, 905, 906, 907, 908, 909, - 405, 230, 390, 391, -745, 614, -746, 260, 398, 399, - -747, 934, 935, 401, 977, 978, 979, 980, 552, 844, - 104, 401, 406, 401, 805, 511, -748, 512, 1066, 401, - 280, 280, 402, 240, 768, 815, 148, 553, 290, 258, - 591, 401, 1038, 401, 349, 401, 153, 1067, 1243, 401, - 149, 351, 770, 350, 283, 284, 285, 407, 306, 1362, - 1244, 150, 1245, 1364, 1246, 998, 146, 151, 1287, 214, - 215, 216, 804, 261, -745, 282, -746, -745, 1363, -746, - -747, 152, 1365, -747, 147, 354, 354, 1392, 354, 354, - 354, 354, 255, 354, 256, 354, -748, 354, 155, -748, - 796, 264, 265, 266, 269, 920, 154, 1335, 247, 248, - 249, 250, 251, 354, 252, 253, 254, 346, 347, 817, - 348, 290, 818, 921, 354, 354, 434, 435, 713, 407, - 354, 354, 683, 432, 188, 217, 218, 615, 535, 833, - 156, 1374, 451, 453, 814, 346, 347, 1072, 348, 346, - 347, 845, 348, 986, 184, 878, 286, 728, 264, 897, - 1014, 1082, 900, 252, 253, 254, 1088, 409, 981, 1367, - 1017, 219, 220, 270, 221, 271, 804, 272, 634, 222, - 1092, 223, 475, 982, 983, 626, 401, 627, 1368, 628, - 401, 1007, 1008, 287, 157, 987, 280, 280, 158, 349, - 257, 1233, 10, 568, 11, 1449, 351, 189, 350, 1484, - 401, 449, 280, 280, 449, 449, 468, 1402, 1403, 1404, - 273, 472, 238, 239, 159, 1251, 441, 349, 442, 1485, - 443, 349, 629, 240, 351, 160, 350, 988, 351, 401, - 350, 467, 298, 299, 300, 161, 301, 303, 305, 64, - 317, 309, 1390, 1391, 6, 401, 314, 1490, 1486, 401, - 401, 320, 321, 1392, 323, 326, 327, 1094, 331, 332, - 162, 999, 1004, 444, 1487, 163, 1491, 318, 1502, 1530, - 822, 288, 401, 401, 522, 164, 523, 524, 525, 290, - 165, 527, 1248, 528, 820, 529, 1085, 401, 735, 736, - 274, 1531, 1532, 193, 194, 195, 196, 197, 166, 679, - 231, -90, 630, -90, 275, -90, 1533, 604, 786, 276, - 791, 1, 2, 3, 277, 354, 631, 877, 167, 513, - 675, 632, 982, 983, 1089, 1226, 633, 168, 1086, 1240, - 809, 810, 811, 812, 813, 588, 1413, 319, 448, 450, - 452, 454, 455, 445, 169, 1247, 170, 247, 248, 249, - 250, 251, 1095, 252, 253, 254, -90, 446, -90, 171, - -90, 475, 447, 70, 172, 71, 72, 73, 449, 1349, - 1350, 1351, 449, 449, 449, 449, 449, 1397, 1398, 1399, - 1400, 1401, 173, 1402, 1403, 1404, 449, 982, 983, 1237, - 449, 449, 466, 80, 174, 625, 1255, 1256, 637, 527, - 185, 528, 186, 985, 893, 704, 604, 792, 1253, 263, - 982, 983, 1315, 609, 467, 604, 793, 400, 680, 190, - 303, 309, 910, 911, 6, 191, 493, 397, 82, 83, - 918, 919, 192, 705, 804, 1013, 1314, 1332, 259, 1317, - 268, 1254, 295, 467, 310, 88, 726, 1257, 1258, 6, - 90, 311, 517, 312, 346, 347, 313, 348, 814, 1016, - 1091, 911, 485, 982, 983, 322, 383, 385, 386, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, - 1006, 433, 392, 407, 439, 469, 437, -264, 476, 1065, - 214, 215, 216, 487, 488, 596, 489, 1015, 502, 599, - 600, 601, 602, 603, 409, 468, 782, 514, 504, 515, - 519, 531, 534, 605, 401, 536, 449, 611, 612, 550, - 537, 1319, 492, 637, 538, 539, 349, 625, 540, 543, - 467, 841, 588, 351, 895, 350, 625, 625, 625, 625, - 625, 625, 409, 181, 541, 542, 544, 545, 546, 503, - 183, 789, 182, 409, 547, 548, 217, 218, 549, 467, - 551, 554, 6, 825, 608, 466, 555, 556, 557, 558, - 559, 1074, 560, 561, 562, 563, 564, 565, 809, 810, - 811, 812, 813, 570, 571, 572, 574, 575, 704, 576, - 577, 579, 219, 220, 466, 221, 580, 1479, 1480, 1481, - 222, 646, 223, 583, 586, 593, 597, 595, -266, 6, - 566, 604, 645, 642, 613, 684, 989, 990, 639, 681, - 685, 717, 625, 686, 994, 687, 995, 581, 582, 475, - 468, 688, 706, 468, 589, 709, 726, 1392, 726, 726, - 726, 726, 726, 729, 754, -265, 756, 757, 240, 787, - 917, 762, 763, 784, 181, 467, 764, 765, 467, 931, - 1410, 183, 766, 182, 797, 806, 816, -355, 819, 823, - 782, 409, 827, 828, 1075, 829, 1417, 1418, 1419, 831, - 725, 834, 843, 679, 873, 879, 835, 1340, 874, 1341, - 1077, 466, 769, 875, 876, 753, 636, 881, 485, 1527, - 882, 898, 896, 904, 675, 901, 1534, 625, 623, 409, - 409, 912, 788, 782, 915, 922, 625, 1228, 1229, 923, - 466, 925, 771, 637, 924, 926, 991, 1063, 933, 992, - 993, 467, 996, 637, 1000, 772, 773, 1001, 1003, 1009, - 1010, 1002, 716, 1025, 804, 814, 1408, -273, 1475, 1019, - 1029, 774, 1022, 1477, 1031, 1068, 741, 1069, 1037, 1482, - 1483, 1397, 1398, 1399, 1400, 1401, 1070, 1402, 1403, 1404, - 1081, 1080, 1015, 704, 249, 250, 251, 911, 252, 253, - 254, 775, 1087, 1090, 776, 1231, 1232, 777, 1234, 467, - 1235, 6, 1236, 1238, 1242, 869, 870, 1250, 1259, 625, - 1260, 1261, 1262, 778, 1272, 625, 625, 625, 625, 625, - 625, 1084, 1478, 1506, 409, 779, 466, 783, 1273, 466, - 1274, 1275, 1276, 726, 1278, 1280, 1277, 1281, 1282, 780, - 637, 636, 473, 468, 1290, 1473, 1283, 1291, 1292, 354, - 354, 1293, 1294, 1295, 1519, 1313, 931, 1249, 1320, 1316, - 790, 1330, 1321, 214, 215, 216, 1325, 1526, 467, 1392, - 799, 800, 801, 802, 803, 1337, 214, 215, 216, 821, - 1323, 753, 477, 478, 479, 70, 753, 71, 72, 73, - 725, 181, 725, 725, 725, 725, 725, 1324, 183, 1353, - 182, 1326, 466, 1336, 836, 837, 838, 839, 1338, 842, - 1504, 1339, 637, 1352, 1355, 80, 753, 753, 1356, 753, - 753, 753, 753, 1357, 1358, 588, 1370, 280, 1359, 217, - 218, 263, 468, 1360, 409, 409, 1366, 1369, 468, 468, - 1371, 1372, 217, 218, 1375, 1406, 1409, 1412, 217, 218, - 82, 83, 1415, 1414, 1433, 892, 1416, 467, 354, 1420, - 466, 1421, 1434, 467, 467, 219, 220, 88, 221, 1435, - 1436, 1437, 90, 222, 1438, 223, 1439, 930, 219, 220, - 1444, 221, 1476, 1448, 482, 220, 222, 221, 223, 1493, - 1474, 1488, 222, 1489, 223, 1399, 1400, 1401, 1492, 1402, - 1403, 1404, 1084, 224, 1494, 323, 1495, 225, 1499, 1497, - 625, 1498, 226, 1505, 1509, 1508, 588, 1510, 1507, 588, - 584, 287, 468, 1511, 1512, 226, 1513, 1514, 1528, 466, - 1515, 283, 284, 285, 718, 1516, 1518, 1529, 719, 1520, - 1005, 636, 1521, 1331, 494, 826, 1227, 467, 1405, 1012, - 507, 636, 1078, 1329, 1296, 1018, 880, 1040, 509, 1354, - 1322, 585, 0, 0, 0, 0, 0, 283, 284, 285, - 616, 753, 1036, 0, 617, 0, 0, 725, 0, 0, - 0, 720, 0, 1041, 1042, 1043, 1044, 1045, 1046, 1047, - 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, - 1058, 1059, 1060, 1061, 0, 1064, 753, 1333, 283, 284, - 285, 742, 0, 0, 0, 743, 0, 618, 466, 0, - 0, 0, 0, 0, 466, 466, 0, 0, 0, 0, - 0, 917, 1073, 286, 0, 0, 0, 0, 0, 799, - 800, 801, 802, 803, 0, 0, 0, 0, 636, 0, - 0, 0, 0, 70, 0, 71, 72, 73, 744, 0, - 0, 721, 229, 0, 930, 262, 0, 0, 680, 286, - 0, 0, 0, 0, 0, 722, 782, 280, 0, 1382, - 723, 0, 0, 80, 0, 267, 0, 0, 468, 0, - 468, 0, 211, 467, 0, 0, 0, 619, 0, 263, - 0, 6, 0, 0, 0, 294, 0, 0, 466, 745, - 286, 620, 0, 467, 0, 467, 621, 0, 82, 83, - 636, 622, 1241, 316, 0, 1429, 1430, 0, 1431, 0, - 1432, 0, 0, 330, 0, 88, 0, 0, 746, 0, - 90, 0, 0, 0, 0, 0, 0, 468, 0, 0, - 588, 0, 747, 0, 0, 0, 931, 748, 0, 0, - 0, 0, 749, 174, 0, 0, 588, 588, 588, 0, - 0, 0, 467, 1470, 1285, 0, 0, 0, 384, 356, - 0, 387, 0, 0, 361, 0, 363, 1312, 365, 0, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 0, 0, 283, 284, 285, - 885, 0, 627, 0, 886, 389, 0, 0, 0, 394, - 395, 396, 0, 0, 0, 403, 404, 236, 237, 238, - 239, 0, 0, 1012, 0, 0, 468, 0, 588, 0, - 240, 0, 0, 588, 0, 0, 782, 782, 782, 588, - 588, 0, 0, 0, 466, 0, 0, 887, 0, 0, - 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 440, 0, 0, 466, 0, 466, 0, 0, 214, - 215, 216, 1522, 1523, 1524, 0, 1525, 0, 0, 484, - 0, 486, 234, 235, 236, 237, 238, 239, 0, 438, - 0, 468, 0, 588, 0, 0, 0, 240, 496, 286, - 497, 498, 499, 500, 0, 753, 0, 0, 1384, 1385, - 1386, 1387, 1388, 1389, 1390, 1391, 467, 0, 0, 510, - 0, 0, 0, 466, 588, 1392, 0, 888, 518, 0, - 0, 521, 0, 0, 0, 217, 218, 588, 782, 533, - 0, 889, 0, 0, 0, 782, 890, 0, 0, 0, - 0, 891, 245, 246, 247, 248, 249, 250, 251, 1328, - 252, 253, 254, 232, 233, 234, 235, 236, 237, 238, - 239, 219, 1264, 1265, 1266, 0, 753, 0, 569, 222, - 240, 223, 573, 1388, 1389, 1390, 1391, 0, 0, 0, - 0, 0, 1267, 0, 0, 229, 1392, 1268, 0, 1312, - 1312, 1312, 1312, 1312, 0, 1312, 567, 0, 0, 0, - 0, 0, 466, 1361, 0, 0, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 0, 252, 253, 254, - 0, 0, 598, 0, 0, 0, 0, 0, 0, 0, - 0, 1501, 0, 1393, 1394, 1395, 1396, 0, 294, 1397, - 1398, 1399, 1400, 1401, 930, 1402, 1403, 1404, 0, 0, - 638, 0, 0, 0, 0, 1376, 1377, 1378, 1379, 1380, - 294, 1383, 0, 0, 0, 0, 0, 466, 294, 1312, - 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, - 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 0, - 252, 253, 254, 0, 734, 0, 592, 214, 215, 216, - 1397, 1398, 1399, 1400, 1401, 755, 1402, 1403, 1404, 0, - 0, 1471, 0, 710, 214, 215, 216, 0, 0, 0, - 727, 0, 0, 1312, 0, 1450, 1451, 1452, 1453, 1454, - 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, - 1465, 1466, 1467, 1468, 0, 70, 0, 71, 72, 73, - 0, 758, 0, 759, 403, 760, 0, 262, 0, 0, - 0, 0, 0, 217, 218, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 80, 1312, 0, 0, 0, - 217, 218, 0, 0, 0, 0, 0, 0, 0, 1500, - 0, 263, 0, 0, 0, 0, 0, 807, 0, 219, - 220, 0, 221, 0, 0, 0, 0, 222, 0, 223, - 82, 83, 0, 0, 0, 294, 219, 220, 0, 221, - 0, 0, 0, 0, 222, 0, 223, 88, 0, 0, - 0, 0, 90, 315, 0, 0, 0, 0, 0, 0, - 0, 291, 1517, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1103, 1104, 1105, 1106, 0, 1107, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 1115, 1116, 1117, 0, 0, 0, 0, - 0, 884, 840, 1118, 1119, 1120, 1121, 1122, 1123, 1124, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, - 1135, 1136, 0, 0, 1137, 1138, 1139, 1140, 1141, 1142, - 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 0, - 1152, 0, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, - 1161, 0, 1162, 1163, 1164, 232, 233, 234, 235, 236, - 237, 238, 239, 1343, 1345, 1347, 0, 0, 0, 0, - 1165, 294, 240, 0, 0, 0, 1166, 1167, 1168, 0, - 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, - 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, - 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, - 1199, 1200, 1201, 0, 0, 0, 1202, 1203, 1204, 1205, - 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, - 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1411, 1223, 1224, - 0, 1422, 0, 1423, 0, 1424, 0, 0, 1425, 1426, - 1427, 0, 0, 0, 0, 0, 0, 0, 1026, 1027, - 1028, 0, 1030, 0, 1033, 1034, 1035, 0, 0, 0, + 6, 212, 304, 323, 325, 281, 641, 1232, 492, 680, + 347, 769, 348, 831, 738, 183, 708, 1336, 896, 349, + 389, 146, 615, 255, 985, 256, 181, 611, 768, 187, + 288, 502, 795, 921, 713, 607, 260, 104, 786, 147, + 845, 509, 148, 356, 402, 358, 359, 360, 361, 406, + 363, 922, 365, 833, 367, 1375, 676, 642, 283, 284, + 285, 230, 182, 403, -747, 648, 806, 1012, -748, 149, + 383, 407, 270, 900, 271, 150, 272, 816, 553, 151, + 408, 391, 392, 255, 240, 256, -749, 399, 400, 818, + 280, 280, 819, 152, 771, 805, 153, 554, 290, 257, + 1394, 402, 261, 935, 936, 155, 978, 979, 980, 981, + 904, 352, 906, 907, 908, 909, 910, 408, 184, 273, + 592, 402, 350, 154, 999, 523, 156, 524, 525, 526, + 736, 737, 815, 1067, -747, 189, 898, -747, -748, 901, + 1039, -748, 214, 215, 216, 355, 355, -750, 355, 355, + 355, 355, 1068, 355, 616, 355, -749, 355, 351, -749, + 286, 258, 264, 265, 266, 347, 282, 348, 1337, 269, + 435, 436, 846, 355, 349, 442, 157, 443, 188, 444, + 714, 290, 797, 1073, 355, 355, 452, 454, 306, 536, + 355, 355, 158, 433, 347, 987, 348, 287, 347, 274, + 348, 317, 834, 349, 1376, 402, 159, 349, 217, 218, + 982, 879, 684, 275, 252, 253, 254, -750, 276, 160, + -750, 486, 445, 277, 1245, 983, 984, 410, 605, 787, + 1404, 1405, 1406, 1008, 1009, 1084, 402, 729, 1015, 161, + 402, 402, 162, 402, 219, 220, 1364, 221, 1018, 318, + 805, 1366, 222, 401, 223, 1246, 280, 280, 1090, 1247, + 1248, 988, 1289, 605, 793, 1365, 352, 214, 215, 216, + 1367, 450, 280, 280, 450, 450, 469, 350, 1, 2, + 3, 473, 535, 569, 989, 605, 794, 264, 265, 266, + 269, 211, 1369, 1235, 163, 352, 402, 1094, 1253, 352, + 402, 467, 446, 298, 299, 300, 350, 301, 303, 305, + 350, 1370, 309, 351, 6, 1451, 447, 314, 402, 1486, + 164, 448, 320, 321, 402, 324, 327, 328, 402, 332, + 333, 911, 912, 217, 218, 319, 1492, 1487, 1087, 1097, + 402, 408, 351, 1488, 264, 1096, 351, 1489, 1000, 165, + 290, 1250, 402, 470, 1005, 1493, 821, 402, 166, 1504, + 823, 402, 518, 468, 512, 680, 513, 167, 476, 219, + 220, 1532, 221, 983, 984, 1091, 1533, 222, 357, 223, + 1534, 168, 10, 362, 11, 364, 355, 366, 169, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 1088, 1228, 589, 878, 1415, 627, + 402, 628, 676, 629, 390, 1249, 170, 1242, 395, 396, + 397, 440, -267, 283, 284, 285, 743, 477, 1256, 1535, + 744, 983, 984, 1239, 1259, 1260, 919, 920, 240, 450, + 983, 984, 1317, 450, 450, 450, 450, 450, 1257, 1258, + 726, 171, 283, 284, 285, 617, 630, 450, 172, 618, + 173, 450, 450, 805, 1014, 754, 626, 174, 486, 638, + 528, 185, 529, 745, 530, 186, 705, 190, 214, 215, + 216, 1351, 1352, 1353, 609, 467, 815, 1017, 1255, 681, + 191, 303, 309, 1093, 912, 6, 192, 494, 439, -90, + 259, -90, 619, -90, 706, 983, 984, 1316, 268, 295, + 1319, 310, 311, 347, 467, 348, 312, 727, 313, 1321, + 6, 1334, 349, 322, 746, 286, 384, 236, 237, 238, + 239, -90, -266, -90, 386, -90, 631, 387, 393, 488, + 240, 718, 489, 490, 217, 218, 610, 468, 503, 514, + 632, 515, 505, 747, 286, 633, 516, 528, 476, 529, + 634, 986, 247, 248, 249, 250, 251, 748, 252, 253, + 254, 520, 749, 532, 402, 537, 468, 750, 538, 544, + 219, 220, 620, 221, 539, 410, 469, 783, 222, 1066, + 223, 238, 239, 546, 540, 541, 621, 450, 542, 543, + 545, 622, 240, 551, 638, 291, 623, 547, 626, 548, + 549, 467, 842, 589, 352, 550, 568, 626, 626, 626, + 626, 626, 626, 410, 896, 350, 1392, 1393, 552, 555, + 556, 183, 789, 557, 410, 558, 559, 1394, 560, 561, + 467, 754, 181, 6, 826, 562, 754, 563, 584, 564, + 726, 565, 726, 726, 726, 726, 726, 571, 566, 572, + 573, 351, 245, 246, 247, 248, 249, 250, 251, 705, + 252, 253, 254, 468, 575, 576, 754, 754, 182, 754, + 754, 754, 754, 647, 577, 1342, 578, 1343, 580, 581, + 6, 1481, 1482, 1483, 790, 1394, 587, 990, 991, 594, + 596, -268, 468, 626, 598, 995, 605, 996, 624, 614, + 646, 469, 643, 640, 469, 682, 240, 727, 64, 727, + 727, 727, 727, 727, 685, 710, 247, 248, 249, 250, + 251, 918, 252, 253, 254, 686, 467, 687, 688, 467, + 932, 1412, 183, 711, 1410, 689, 707, 730, 755, 757, + 728, 783, 410, 181, 788, 1076, 1077, 1419, 1420, 1421, + 680, 1399, 1400, 1401, 1402, 1403, 758, 1404, 1405, 1406, + 765, 1079, 193, 194, 195, 196, 197, 763, 764, 231, + 766, 759, 767, 760, 798, 761, 807, -357, 626, 182, + 410, 410, 817, 1529, 783, 820, 824, 626, 468, 828, + 1536, 468, 829, 1394, 638, 830, 832, 676, 1064, 835, + 836, 844, 467, 874, 638, 875, 876, 1230, 1231, 1399, + 1400, 1401, 1402, 1403, 1026, 1404, 1405, 1406, 877, 1477, + 880, 754, 882, 1475, 1479, 883, 476, 726, 897, 899, + 1484, 1485, 249, 250, 251, 902, 252, 253, 254, 923, + 791, 905, 913, 924, 705, 926, 916, 635, 925, 927, + 800, 801, 802, 803, 804, 992, 754, 934, 993, 994, + 467, 1002, 6, 1003, 468, 997, 1001, 870, 871, 1004, + 626, 449, 451, 453, 455, 456, 626, 626, 626, 626, + 626, 626, 1086, 1010, 1508, 410, 1011, 1020, 1506, 1345, + 1347, 1349, 841, 1480, 727, 805, 398, 815, -275, 1023, + 1030, 638, 1251, 1032, 469, 1069, 1038, 1082, 1070, 1071, + 355, 355, 1083, 1089, 1092, 1521, 1279, 932, 1233, 1401, + 1402, 1403, 468, 1404, 1405, 1406, 1234, 1236, 1528, 467, + 912, 1240, 1237, 1238, 1244, 893, 1252, 1261, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 183, + 434, 1262, 1263, 1264, 1274, 438, 1275, 1424, 1276, 1425, + 181, 1426, 1277, 638, 1427, 1428, 1429, 1278, 1280, 1282, + 1355, 1283, 1284, 1285, 1292, 1293, 589, 1294, 280, 792, + 1295, 468, 1296, 469, 1297, 410, 410, 1315, 1318, 469, + 469, 493, 1322, 1325, 1323, 1327, 182, 1326, 1328, 810, + 811, 812, 813, 814, 1332, 1338, 1354, 1339, 467, 355, + 1006, 1340, 1341, 1357, 467, 467, 1358, 1359, 504, 1013, + 1360, 214, 215, 216, 1361, 283, 284, 285, 886, 597, + 628, 1362, 887, 600, 601, 602, 603, 604, 1027, 1028, + 1029, 1368, 1031, 1371, 1034, 1035, 1036, 606, 214, 215, + 216, 612, 613, 1086, 1372, 1373, 1374, 324, 1377, 1408, + 1411, 1414, 626, 1416, 1417, 1435, 1437, 1436, 589, 1438, + 468, 589, 1418, 894, 469, 888, 468, 468, 1422, 1423, + 567, 1439, 1440, 1441, 1446, 1491, 1495, 217, 218, 283, + 284, 285, 719, 1450, 1476, 1490, 720, 582, 583, 467, + 1496, 1478, 1074, 1494, 590, 478, 479, 480, 1497, 800, + 801, 802, 803, 804, 217, 218, 1499, 1500, 1501, 1507, + 1511, 1509, 1510, 219, 220, 1512, 221, 286, 1513, 1514, + 1515, 222, 1516, 223, 1530, 1517, 1531, 1518, 1229, 721, + 495, 1520, 1522, 1335, 1523, 827, 1333, 1407, 508, 1080, + 219, 220, 881, 221, 1314, 889, 754, 1331, 222, 1007, + 223, 468, 1298, 1041, 1356, 585, 637, 510, 1324, 890, + 226, 217, 218, 586, 891, 0, 1016, 0, 0, 892, + 0, 0, 0, 918, 0, 0, 0, 785, 224, 0, + 0, 286, 225, 0, 0, 0, 0, 226, 0, 1386, + 1387, 1388, 1389, 1390, 1391, 1392, 1393, 483, 220, 0, + 221, 0, 717, 0, 0, 222, 1394, 223, 0, 722, + 681, 0, 0, 0, 0, 0, 742, 754, 783, 280, + 0, 1384, 0, 723, 0, 0, 0, 0, 724, 0, + 469, 0, 469, 0, 287, 467, 0, 0, 0, 0, + 1075, 0, 0, 6, 0, 0, 0, 810, 811, 812, + 813, 814, 0, 0, 0, 467, 0, 467, 0, 234, + 235, 236, 237, 238, 239, 0, 0, 1431, 1432, 0, + 1433, 0, 1434, 0, 240, 0, 0, 784, 0, 0, + 0, 0, 1299, 0, 0, 0, 0, 0, 0, 469, + 0, 637, 589, 0, 1013, 0, 0, 468, 932, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 589, 589, + 589, 0, 0, 0, 467, 1472, 0, 468, 0, 468, + 0, 0, 1503, 0, 1395, 1396, 1397, 1398, 0, 822, + 1399, 1400, 1401, 1402, 1403, 0, 1404, 1405, 1406, 0, + 1390, 1391, 1392, 1393, 0, 0, 0, 0, 0, 0, + 0, 229, 0, 1394, 837, 838, 839, 840, 0, 843, + 0, 0, 0, 0, 0, 0, 1314, 1314, 1314, 1314, + 1314, 0, 1314, 0, 267, 0, 468, 0, 469, 0, + 589, 0, 0, 0, 0, 589, 0, 0, 783, 783, + 783, 589, 589, 0, 294, 244, 245, 246, 247, 248, + 249, 250, 251, 467, 252, 253, 254, 0, 0, 0, + 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 1524, 1525, 1526, 931, 1527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1079, 0, 0, 0, 0, 0, 0, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 0, 252, 253, 254, 0, 0, 0, 1288, 0, - 0, 0, 0, 0, 0, 214, 215, 216, 0, 734, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, - 1104, 1105, 1106, 0, 1107, 1108, 1109, 1110, 1111, 1112, - 1113, 1114, 1115, 1116, 1117, 0, 0, 0, 0, 0, - 0, 0, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, - 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, - 1136, 217, 218, 1137, 1138, 1139, 1140, 1141, 1142, 1143, - 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 0, 1152, - 1252, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, - 0, 1162, 1163, 1164, 0, 0, 0, 219, 220, 0, - 221, 0, 0, 0, 0, 222, 0, 223, 0, 1165, - 0, 1279, 0, 0, 0, 1166, 1167, 1168, 1267, 1169, - 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, - 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, - 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, - 1200, 1201, 0, 0, 0, 1202, 1203, 1204, 1205, 1206, - 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, - 1217, 1218, 1219, 1220, 1221, 1222, 0, 1223, 1224, 7, + 0, 0, 1016, 469, 0, 589, 1314, 1314, 1314, 1314, + 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, + 1314, 1314, 1314, 1314, 1314, 468, 0, 385, 467, 0, + 388, 0, 0, 0, 0, 0, 589, 1399, 1400, 1401, + 1402, 1403, 0, 1404, 1405, 1406, 0, 0, 0, 589, + 783, 637, 0, 0, 0, 0, 0, 783, 0, 0, + 0, 637, 0, 0, 0, 1019, 0, 0, 0, 0, + 1314, 1383, 0, 0, 404, 405, 0, 0, 0, 0, + 0, 0, 1037, 0, 0, 0, 0, 0, 0, 0, + 468, 0, 0, 1042, 1043, 1044, 1045, 1046, 1047, 1048, + 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1060, 1061, 1062, 0, 1065, 0, 0, 0, 0, + 441, 0, 0, 1314, 1378, 1379, 1380, 1381, 1382, 0, + 1385, 1442, 1443, 1444, 1445, 0, 1448, 1449, 485, 770, + 487, 0, 0, 0, 0, 0, 0, 0, 234, 235, + 236, 237, 238, 239, 0, 771, 0, 497, 637, 498, + 499, 500, 501, 240, 0, 0, 0, 0, 0, 772, + 214, 215, 216, 0, 931, 0, 0, 0, 0, 511, + 0, 0, 773, 774, 0, 0, 0, 0, 519, 0, + 0, 522, 0, 0, 0, 0, 0, 0, 775, 534, + 0, 0, 0, 0, 1452, 1453, 1454, 1455, 1456, 1457, + 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, + 1468, 1469, 1470, 0, 0, 0, 0, 0, 776, 0, + 637, 777, 1243, 0, 778, 0, 217, 218, 570, 0, + 0, 0, 574, 0, 0, 0, 0, 0, 0, 0, + 779, 0, 0, 0, 0, 229, 0, 0, 0, 0, + 0, 0, 780, 0, 0, 0, 0, 0, 1502, 0, + 0, 0, 219, 220, 0, 221, 781, 0, 0, 0, + 222, 0, 223, 0, 1287, 245, 246, 247, 248, 249, + 250, 251, 599, 252, 253, 254, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 315, 0, 294, 7, 8, 9, 10, 0, 11, 12, 13, 198, 68, 0, - 0, 1297, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 214, 215, 216, 232, 233, 234, 235, 236, 237, + 639, 1519, 0, 0, 0, 0, 0, 0, 0, 0, + 294, 0, 0, 0, 0, 0, 0, 0, 294, 0, + 0, 0, 0, 0, 0, 0, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, 15, 69, 0, 0, 199, 240, 200, 201, 202, 74, 75, 0, 20, 76, - 0, 0, 203, 22, 0, 0, 78, 0, 480, 0, - 481, 23, 24, 204, 0, 0, 0, 26, 0, 0, + 0, 0, 203, 22, 735, 0, 78, 0, 0, 0, + 0, 23, 24, 204, 0, 756, 0, 26, 0, 0, 205, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 206, 217, 218, 0, + 37, 38, 39, 40, 41, 42, 206, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, 0, 47, 0, 207, 208, 50, 0, 0, - 51, 84, 214, 215, 216, 52, 0, 0, 53, 85, - 86, 87, 209, 219, 220, 89, 221, 210, 0, 0, - 0, 222, 0, 223, 0, 0, 0, 0, 0, 0, - 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, - 61, 62, 0, 0, 63, 0, 0, 1348, 0, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 0, 252, 253, 254, 0, 0, 0, 1503, 217, 218, + 51, 84, 0, 0, 404, 52, 0, 0, 53, 85, + 86, 87, 209, 0, 0, 89, 0, 210, 0, 0, + 649, 650, 651, 10, 0, 11, 652, 653, 67, 68, + 56, 0, 654, 57, 58, 59, 0, 0, 60, 0, + 61, 62, 0, 0, 63, 0, 0, 808, 0, 0, + 1330, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 0, 252, 253, 254, 459, 294, 0, 655, 69, 0, + 0, 70, 0, 71, 72, 73, 74, 460, 0, 656, + 76, 0, 0, 77, 657, 0, 0, 78, 0, 0, + 0, 0, 658, 659, 79, 0, 0, 0, 0, 0, + 0, 80, 0, 0, 1363, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, + 0, 885, 0, 0, 0, 660, 0, 661, 0, 662, + 0, 0, 0, 461, 663, 0, 82, 83, 664, 0, + 0, 665, 84, 0, 0, 931, 666, 0, 0, 667, + 85, 86, 87, 88, 0, 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 8, 9, 10, 0, 11, 12, 13, - 490, 0, 0, 0, 0, 0, 0, 0, 0, 329, - 0, 0, 0, 0, 219, 220, 0, 221, 0, 0, - 0, 0, 222, 0, 223, 0, 0, 0, 0, 0, - 1381, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 335, 0, 0, 199, 0, 200, 201, 202, 74, 0, - 0, 20, 336, 0, 0, 203, 22, 0, 0, 78, - 0, 0, 0, 0, 23, 24, 204, 0, 0, 0, - 26, 0, 0, 205, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 206, - 1440, 1441, 1442, 1443, 0, 1446, 1447, 44, 0, 45, - 0, 46, 0, 0, 0, 0, 47, 0, 207, 208, - 50, 0, 0, 51, 84, 0, 0, 0, 52, 0, - 0, 53, 338, 339, 87, 209, 0, 0, 89, 0, - 210, 0, 0, 0, 1496, 0, 0, 0, 0, 0, - 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, - 0, 60, 0, 61, 62, 0, 0, 63, 7, 8, - 9, 10, 0, 11, 12, 13, 14, 0, 214, 215, - 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, + 0, 668, 0, 0, 669, 670, 0, 0, 0, 671, + 0, 672, 0, 0, 0, 673, 0, 0, 0, 0, + 0, 294, 0, 0, 0, 0, 0, 1098, 1099, 1100, + 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 0, 1109, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, + 0, 0, 1473, 0, 0, 0, 0, 1120, 1121, 1122, + 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, + 1133, 1134, 1135, 1136, 1137, 1138, 0, 0, 1139, 1140, + 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, + 1151, 1152, 1153, 0, 1154, 0, 1155, 1156, 1157, 1158, + 1159, 1160, 1161, 1162, 1163, 0, 1164, 1165, 1166, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1167, 0, 0, 0, 0, 0, + 1168, 1169, 1170, 1081, 1171, 1172, 1173, 1174, 1175, 1176, + 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, + 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, + 1197, 1198, 1199, 1200, 1201, 1202, 1203, 0, 0, 735, + 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, + 1224, 1413, 1225, 1226, 0, 0, 0, 0, 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 240, 0, 0, 16, - 0, 17, 18, 19, 0, 0, 0, 20, 0, 738, - 739, 21, 22, 0, 0, 0, 0, 0, 0, 0, - 23, 24, 25, 0, 217, 218, 26, 0, 0, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, - 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, - 219, 220, 47, 221, 48, 49, 50, 0, 222, 51, - 223, 0, 0, 0, 52, 0, 0, 53, 0, 0, - 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, - 14, 740, 0, 0, 495, 0, 0, 0, 0, 56, - 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, - 62, 0, 590, 63, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 15, - 0, 0, 0, 16, 0, 17, 18, 19, 0, 0, - 0, 20, 0, 0, 0, 21, 22, 477, 478, 479, - 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, - 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 0, 0, 0, 0, 480, 0, 481, 44, 0, 45, - 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, - 50, 0, 0, 51, 0, 0, 0, 0, 52, 0, - 0, 53, 0, 217, 218, 54, 7, 8, 9, 10, - 55, 11, 12, 13, 14, 0, 214, 215, 216, 0, - 0, 883, 0, 56, 0, 0, 57, 58, 59, 0, - 0, 60, 0, 61, 62, 431, 0, 63, 0, 482, - 220, 0, 221, 0, 0, 0, 0, 222, 0, 223, - 0, 0, 0, 15, 436, 0, 0, 16, 0, 17, - 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, - 22, 0, 0, 483, 0, 0, 0, 0, 23, 24, - 25, 0, 217, 218, 26, 0, 0, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, - 0, 44, 0, 45, 0, 46, 0, 0, 219, 220, - 47, 221, 48, 49, 50, 0, 222, 51, 223, 0, - 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, - 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, - 214, 215, 216, 0, 0, 0, 0, 56, 0, 0, - 57, 58, 59, 0, 0, 60, 0, 61, 62, 0, - 0, 63, 0, 0, 0, 232, 233, 234, 235, 236, - 237, 238, 239, 0, 0, 0, 0, 15, 715, 0, - 0, 16, 240, 17, 18, 19, 0, 0, 0, 20, - 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, - 0, 0, 23, 24, 25, 0, 217, 218, 26, 0, - 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, - 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, - 0, 0, 219, 220, 47, 221, 48, 49, 50, 0, - 222, 51, 223, 0, 0, 0, 52, 0, 0, 53, - 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, - 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, - 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, - 0, 61, 62, 0, 0, 63, 0, 932, 0, 0, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 15, 252, 253, 254, 16, 0, 17, 18, 19, - 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, - 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, - 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, - 0, 45, 0, 46, 0, 0, 0, 0, 47, 0, - 48, 49, 50, 0, 0, 51, 0, 0, 0, 0, - 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, - 9, 10, 55, 11, 12, 13, 14, 927, 0, 0, - 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, - 59, 0, 0, 60, 0, 61, 62, 0, 0, 63, - 0, 0, 0, 232, 233, 234, 235, 236, 237, 238, - 239, 0, 0, 0, 0, 15, 0, 0, 0, 16, - 240, 17, 18, 19, 0, 0, 0, 20, 0, 0, - 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1254, 0, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, + 1106, 1107, 1108, 0, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1116, 1117, 1118, 1119, 0, 0, 0, 0, 0, + 0, 1281, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, + 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, + 1138, 0, 0, 1139, 1140, 1141, 1142, 1143, 1144, 1145, + 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 0, 1154, + 0, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, + 0, 1164, 1165, 1166, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 1167, + 0, 0, 593, 0, 0, 1168, 1169, 1170, 0, 1171, + 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, + 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, + 1202, 1203, 0, 0, 0, 1204, 1205, 1206, 1207, 1208, + 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, + 1219, 1220, 1221, 1222, 1223, 1224, 0, 1225, 1226, 7, + 8, 9, 10, 0, 11, 12, 13, 491, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, + 0, 0, 0, 0, 0, 0, 15, 336, 240, 0, + 199, 0, 200, 201, 202, 74, 0, 0, 20, 337, + 0, 0, 203, 22, 0, 0, 78, 0, 0, 0, + 0, 23, 24, 204, 0, 0, 0, 26, 0, 0, + 205, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 206, 0, 1350, 0, + 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, + 0, 0, 0, 47, 0, 207, 208, 50, 0, 0, + 51, 84, 0, 0, 0, 52, 0, 0, 53, 339, + 340, 87, 209, 0, 0, 89, 0, 210, 7, 8, + 9, 10, 0, 11, 12, 13, 14, 0, 0, 0, + 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, + 61, 62, 0, 0, 63, 0, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, + 254, 0, 0, 0, 1290, 15, 0, 0, 0, 16, + 0, 17, 18, 19, 0, 0, 0, 20, 0, 739, + 740, 21, 22, 0, 0, 0, 770, 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, - 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, - 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, - 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, - 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, - 14, 0, 0, 0, 0, 0, 0, 0, 0, 56, - 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, - 62, 1062, 0, 63, 1263, 0, 0, 0, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 15, - 252, 253, 254, 16, 0, 17, 18, 19, 0, 0, - 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, - 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, - 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, - 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, - 50, 0, 0, 51, 0, 0, 0, 0, 52, 0, - 0, 53, 0, 0, 0, 54, 7, 8, 9, 10, - 55, 11, 12, 13, 14, 1327, 0, 0, 0, 0, - 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, - 0, 60, 0, 61, 62, 0, 0, 63, 0, 0, - 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, - 0, 0, 0, 15, 0, 0, 0, 16, 240, 17, - 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, - 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, - 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, - 0, 44, 0, 45, 0, 46, 0, 0, 0, 0, - 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, - 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, - 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, - 57, 58, 59, 0, 0, 60, 0, 61, 62, 1469, - 0, 63, 0, 0, 1286, 0, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 15, 252, 253, - 254, 16, 0, 17, 18, 19, 0, 0, 0, 20, - 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, - 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, - 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, - 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, - 0, 0, 0, 0, 47, 0, 48, 49, 50, 0, - 0, 51, 0, 0, 0, 0, 52, 0, 0, 53, - 0, 0, 0, 54, 648, 649, 650, 10, 55, 11, - 651, 652, 67, 68, 0, 0, 653, 0, 0, 0, - 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, - 0, 61, 62, 0, 0, 63, 232, 233, 234, 235, - 236, 237, 238, 239, 0, 0, 0, 0, 458, 0, - 0, 654, 69, 240, 0, 70, 0, 71, 72, 73, - 74, 459, 0, 655, 76, 0, 0, 77, 656, 0, - 0, 78, 0, 0, 0, 0, 657, 658, 79, 0, - 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, - 0, 81, 0, 0, 0, 0, 0, 0, 240, 659, - 0, 660, 0, 661, 0, 0, 0, 460, 662, 0, - 82, 83, 663, 0, 0, 664, 84, 0, 0, 0, - 665, 0, 0, 666, 85, 86, 87, 88, 0, 0, - 89, 0, 90, 0, 648, 649, 650, 10, 0, 11, - 651, 652, 67, 68, 0, 667, 1039, 0, 668, 669, - 0, 0, 0, 670, 0, 671, 0, 691, 0, 672, - 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 0, 252, 253, 254, 692, 0, 458, 0, - 0, 654, 69, 0, 0, 70, 0, 71, 72, 73, - 74, 459, 0, 655, 76, 0, 0, 77, 656, 0, - 0, 78, 0, 0, 0, 0, 657, 658, 79, 0, - 0, 0, 0, 0, 0, 80, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, - 254, 81, 0, 0, 0, 0, 0, 0, 0, 659, - 0, 660, 0, 661, 0, 0, 0, 460, 662, 0, - 82, 83, 663, 0, 0, 664, 84, 0, 0, 0, - 665, 0, 0, 666, 85, 86, 87, 88, 0, 0, - 89, 0, 90, 7, 8, 9, 10, 0, 11, 12, - 13, 0, 0, 0, 0, 667, 0, 0, 668, 669, - 0, 0, 0, 670, 0, 671, 0, 0, 0, 672, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, - 1387, 1388, 1389, 1390, 1391, 0, 0, 0, 0, 0, - 1298, 0, 0, 0, 1392, 0, 0, 0, 0, 0, - 0, 0, 1299, 0, 0, 0, 0, 1300, 233, 234, - 235, 236, 237, 238, 239, 23, 24, 0, 0, 0, - 0, 26, 0, 0, 240, 28, 29, 30, 31, 32, + 38, 39, 40, 41, 42, 43, 772, 0, 0, 0, + 0, 0, 0, 44, 0, 45, 0, 46, 0, 773, + 774, 0, 47, 0, 48, 49, 50, 0, 0, 51, + 0, 0, 0, 0, 52, 775, 0, 53, 0, 0, + 0, 54, 0, 0, 0, 1498, 55, 7, 8, 9, + 10, 741, 11, 12, 13, 14, 0, 0, 0, 56, + 0, 0, 57, 58, 59, 776, 0, 60, 777, 61, + 62, 778, 0, 63, 0, 0, 0, 0, 232, 233, + 234, 235, 236, 237, 238, 239, 0, 779, 0, 0, + 0, 0, 0, 0, 15, 240, 0, 0, 16, 780, + 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, + 21, 22, 0, 781, 0, 0, 0, 0, 0, 23, + 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, + 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, + 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, + 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, + 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, + 0, 214, 215, 216, 0, 0, 0, 0, 56, 0, + 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, + 432, 0, 63, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 0, 252, 253, 254, 15, 437, + 0, 1505, 16, 0, 17, 18, 19, 0, 0, 0, + 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, + 0, 0, 0, 23, 24, 25, 0, 217, 218, 26, + 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, + 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, + 46, 0, 0, 219, 220, 47, 221, 48, 49, 50, + 0, 222, 51, 223, 0, 0, 0, 52, 0, 0, + 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, + 11, 12, 13, 14, 0, 0, 0, 496, 0, 0, + 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, + 60, 0, 61, 62, 0, 0, 63, 0, 0, 0, + 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, + 0, 0, 15, 716, 0, 0, 16, 240, 17, 18, + 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, + 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, + 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, + 44, 0, 45, 0, 46, 0, 0, 0, 0, 47, + 0, 48, 49, 50, 0, 0, 51, 0, 0, 0, + 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, + 8, 9, 10, 55, 11, 12, 13, 14, 0, 214, + 215, 216, 0, 0, 884, 0, 56, 0, 0, 57, + 58, 59, 0, 0, 60, 0, 61, 62, 0, 0, + 63, 0, 0, 591, 0, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 15, 252, 253, 254, + 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, + 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, + 0, 23, 24, 25, 0, 217, 218, 26, 0, 0, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, + 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, + 0, 219, 220, 47, 221, 48, 49, 50, 0, 222, + 51, 223, 0, 0, 0, 52, 0, 0, 53, 0, + 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, + 13, 14, 928, 214, 215, 216, 0, 0, 0, 0, + 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, + 61, 62, 0, 0, 63, 0, 0, 0, 232, 233, + 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, + 15, 0, 0, 0, 16, 240, 17, 18, 19, 0, + 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, + 0, 0, 0, 0, 0, 23, 24, 25, 0, 217, + 218, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, - 45, 0, 46, 0, 0, 0, 0, 1301, 240, 0, - 0, 1302, 0, 0, 1303, 0, 0, 0, 0, 52, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1304, 0, 0, 1305, 1306, 1307, - 936, 0, 1308, 0, 1309, 62, 0, 0, 1310, 0, - 937, 938, 939, 940, 941, 942, 943, 944, 1397, 1398, - 1399, 1400, 1401, 0, 1402, 1403, 1404, 945, 0, 946, - 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, - 957, 0, 0, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 0, 252, 253, 254, 0, 0, 958, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 333, 334, 0, 0, 0, 241, 242, 243, 244, + 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, + 45, 0, 46, 0, 0, 219, 220, 47, 221, 48, + 49, 50, 0, 222, 51, 223, 0, 0, 0, 52, + 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, + 10, 55, 11, 12, 13, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, + 0, 0, 60, 0, 61, 62, 1063, 0, 63, 0, + 933, 0, 0, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 15, 252, 253, 254, 16, 0, + 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, + 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, + 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, + 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, + 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, + 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, + 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, + 1329, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, + 0, 0, 63, 0, 0, 0, 232, 233, 234, 235, + 236, 237, 238, 239, 0, 0, 0, 0, 15, 0, + 0, 0, 16, 240, 17, 18, 19, 0, 0, 0, + 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, + 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, + 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, + 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, + 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, + 0, 0, 51, 0, 0, 0, 0, 52, 0, 0, + 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, + 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, + 60, 0, 61, 62, 1471, 0, 63, 1265, 0, 0, + 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 15, 252, 253, 254, 16, 0, 17, 18, + 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, + 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, + 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, + 44, 0, 45, 0, 46, 0, 0, 0, 0, 47, + 0, 48, 49, 50, 0, 0, 51, 0, 0, 0, + 0, 52, 0, 0, 53, 0, 0, 0, 54, 649, + 650, 651, 10, 55, 11, 652, 653, 67, 68, 0, + 0, 1040, 0, 0, 0, 0, 56, 0, 0, 57, + 58, 59, 0, 0, 60, 0, 61, 62, 0, 0, + 63, 232, 233, 234, 235, 236, 237, 238, 239, 0, + 0, 0, 0, 459, 0, 0, 655, 69, 240, 0, + 70, 0, 71, 72, 73, 74, 460, 0, 656, 76, + 0, 0, 77, 657, 0, 0, 78, 0, 0, 0, + 0, 658, 659, 79, 0, 0, 0, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 214, + 215, 216, 0, 0, 0, 0, 81, 0, 0, 0, + 0, 0, 0, 0, 660, 0, 661, 0, 662, 0, + 0, 0, 461, 663, 0, 82, 83, 664, 0, 0, + 665, 84, 0, 0, 0, 666, 0, 0, 667, 85, + 86, 87, 88, 0, 0, 89, 0, 90, 7, 8, + 9, 10, 0, 11, 12, 13, 0, 0, 0, 0, + 668, 0, 0, 669, 670, 217, 218, 0, 671, 0, + 672, 0, 692, 0, 673, 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, - 254, 578, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, - 0, 0, 959, 0, 0, 0, 0, 0, 0, 1392, - 0, 0, 335, 0, 0, 70, 0, 71, 72, 73, - 74, 0, 0, 0, 336, 0, 0, 77, 0, 0, - 0, 78, 0, 0, 0, 0, 0, 0, 79, 0, - 0, 960, 0, 0, 961, 80, 962, 963, 964, 965, - 966, 967, 968, 969, 970, 971, 972, 0, 973, 974, - 0, 81, 975, 0, 333, 334, 0, 0, 0, 0, - 0, 0, 337, 0, 0, 0, 0, 0, 0, 0, - 82, 83, 0, 0, 0, 0, 84, 0, 0, 0, - 0, 0, 0, 0, 338, 339, 87, 88, 0, 0, - 89, 0, 90, 0, 0, 335, 0, 340, 70, 0, - 71, 72, 73, 74, 0, 0, 0, 336, 0, 0, - 77, 0, 0, 341, 78, 0, 769, 1393, 1394, 1395, - 1396, 79, 0, 1397, 1398, 1399, 1400, 1401, 80, 1402, - 1403, 1404, 770, 0, 0, 0, 0, 0, 0, 0, - 505, 506, 0, 0, 81, 0, 771, 0, 0, 0, - 0, 0, 0, 0, 0, 337, 0, 0, 0, 772, - 773, 0, 0, 82, 83, 0, 0, 0, 0, 84, - 0, 0, 0, 0, 0, 774, 0, 338, 339, 87, - 88, 335, 0, 89, 70, 90, 71, 72, 73, 74, - 0, 0, 0, 336, 0, 0, 77, 0, 0, 0, - 78, 0, 0, 0, 0, 775, 341, 79, 776, 0, - 0, 777, 0, 0, 80, 232, 233, 234, 235, 236, - 237, 238, 239, 0, 0, 0, 0, 778, 0, 0, - 81, 0, 240, 0, 0, 0, 0, 0, 0, 779, - 0, 337, 0, 0, 0, 0, 0, 0, 0, 82, - 83, 0, 0, 780, 0, 84, 0, 0, 0, 0, - 0, 0, 0, 338, 339, 87, 88, 0, 0, 89, - 0, 90, 232, 233, 234, 235, 236, 237, 238, 239, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, - 0, 0, 341, 232, 233, 234, 235, 236, 237, 238, - 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 232, 233, 234, 235, 236, 237, 238, 239, 0, + 254, 693, 0, 0, 0, 1300, 0, 0, 0, 0, + 0, 219, 1266, 1267, 1268, 0, 0, 1301, 0, 222, + 0, 223, 1302, 233, 234, 235, 236, 237, 238, 239, + 23, 24, 1269, 0, 0, 0, 26, 1270, 0, 240, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 0, 232, 233, 234, 235, + 236, 237, 238, 239, 0, 45, 0, 46, 0, 0, + 0, 0, 1303, 240, 0, 0, 1304, 0, 0, 1305, + 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 70, 0, 71, 72, 73, 0, 0, 0, 0, + 0, 0, 0, 262, 0, 0, 0, 0, 0, 1306, + 0, 0, 1307, 1308, 1309, 937, 0, 1310, 0, 1311, + 62, 80, 0, 1312, 0, 938, 939, 940, 941, 942, + 943, 944, 945, 0, 0, 0, 0, 263, 0, 0, + 0, 0, 946, 0, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 82, 83, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 0, 252, + 253, 254, 0, 88, 959, 0, 0, 0, 90, 0, + 0, 214, 215, 216, 0, 0, 334, 335, 0, 0, + 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 0, 252, 253, 254, 579, 1386, 1387, 1388, + 1389, 1390, 1391, 1392, 1393, 0, 0, 960, 0, 0, + 0, 0, 0, 0, 1394, 0, 0, 336, 0, 0, + 70, 0, 71, 72, 73, 74, 0, 0, 0, 337, + 0, 0, 77, 0, 0, 0, 78, 217, 218, 0, + 0, 0, 0, 79, 0, 0, 961, 0, 0, 962, + 80, 963, 964, 965, 966, 967, 968, 969, 970, 971, + 972, 973, 0, 974, 975, 0, 81, 976, 0, 334, + 335, 0, 0, 219, 220, 0, 221, 338, 0, 0, + 0, 222, 0, 223, 0, 82, 83, 0, 0, 0, + 0, 84, 0, 0, 1269, 0, 0, 0, 0, 339, + 340, 87, 88, 0, 0, 89, 0, 90, 0, 0, + 336, 0, 341, 70, 0, 71, 72, 73, 74, 0, + 0, 0, 337, 0, 0, 77, 0, 0, 342, 78, + 0, 0, 1395, 1396, 1397, 1398, 79, 0, 1399, 1400, + 1401, 1402, 1403, 80, 1404, 1405, 1406, 0, 0, 0, + 0, 0, 0, 0, 0, 506, 507, 0, 0, 81, + 0, 70, 0, 71, 72, 73, 0, 0, 0, 0, + 338, 0, 0, 262, 0, 0, 0, 0, 82, 83, + 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, + 0, 80, 339, 340, 87, 88, 336, 0, 89, 70, + 90, 71, 72, 73, 74, 0, 0, 263, 337, 0, + 0, 77, 474, 0, 0, 78, 0, 0, 0, 0, + 0, 342, 79, 0, 0, 0, 82, 83, 0, 80, + 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, + 0, 0, 0, 88, 0, 81, 0, 240, 90, 0, + 0, 0, 0, 0, 0, 70, 338, 71, 72, 73, + 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, + 84, 174, 0, 70, 0, 71, 72, 73, 339, 340, + 87, 88, 0, 0, 89, 80, 90, 232, 233, 234, + 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, + 0, 263, 0, 80, 240, 0, 0, 342, 232, 233, + 234, 235, 236, 237, 238, 239, 0, 0, 0, 263, + 82, 83, 0, 0, 0, 240, 232, 233, 234, 235, + 236, 237, 238, 239, 0, 0, 0, 88, 82, 83, + 0, 0, 90, 240, 232, 233, 234, 235, 236, 237, + 238, 239, 0, 0, 0, 88, 0, 0, 0, 0, + 90, 240, 0, 0, 0, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 0, 252, 253, 254, + 595, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 0, 252, 253, 254, 594, 232, 233, 234, 235, - 236, 237, 238, 239, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 240, 846, 847, 848, 849, 850, 851, - 852, 853, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 854, 0, 0, 0, 0, 0, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 0, 252, - 253, 254, 682, 0, 0, 0, 0, 0, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 0, - 252, 253, 254, 761, 0, 0, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, - 254, 902, 0, 0, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 1020, - 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 0, 252, 253, 254, 683, 0, 0, + 0, 0, 0, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 0, 252, 253, 254, 762, 0, 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 0, 252, 253, 254, 1284, 0, 0, 855, - 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, - 0, 866, 867, 868, 105, 0, 106, 0, 0, 107, - 108, 0, 0, 0, 0, 0, 0, 109, 110, 0, - 0, 0, 0, 0, 0, 0, 111, 0, 112, 113, - 114, 115, 0, 0, 0, 116, 0, 0, 0, 0, - 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, - 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, - 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, - 129, 67, 68, 130, 131, 456, 0, 457, 132, 0, - 0, 0, 0, 0, 133, 134, 0, 135, 1385, 1386, - 1387, 1388, 1389, 1390, 1391, 136, 0, 0, 0, 0, - 0, 0, 0, 0, 1392, 0, 0, 458, 0, 0, - 0, 69, 0, 0, 70, 0, 71, 72, 73, 74, - 459, 0, 0, 76, 0, 0, 77, 0, 0, 0, - 78, 234, 235, 236, 237, 238, 239, 79, 0, 0, - 0, 0, 0, 0, 80, 0, 240, 234, 235, 236, + 250, 251, 0, 252, 253, 254, 903, 0, 0, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 0, 252, 253, 254, 1021, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, - 81, 0, 240, 1386, 1387, 1388, 1389, 1390, 1391, 0, - 0, 0, 0, 0, 0, 0, 460, 0, 1392, 82, - 83, 0, 0, 0, 0, 84, 0, 234, 235, 236, - 237, 238, 239, 85, 86, 87, 88, 0, 0, 89, - 0, 90, 240, 1386, 1387, 1388, 1389, 1390, 1391, 0, - 0, 0, 0, 0, 461, 0, 0, 0, 1392, 462, - 0, 0, 0, 1394, 1395, 1396, 0, 0, 1397, 1398, - 1399, 1400, 1401, 0, 1402, 1403, 1404, 1386, 1387, 1388, - 1389, 1390, 1391, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1392, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 0, - 0, 0, 0, 244, 245, 246, 247, 248, 249, 250, - 251, 0, 252, 253, 254, 0, 0, 1394, 1395, 1396, - 0, 0, 1397, 1398, 1399, 1400, 1401, 0, 1402, 1403, - 1404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 302, 0, 0, 0, 245, 246, 247, 248, 249, 250, - 251, 0, 252, 253, 254, 0, 0, 0, 1395, 1396, - 0, 0, 1397, 1398, 1399, 1400, 1401, 302, 1402, 1403, - 1404, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 105, 0, 106, 0, 0, 0, 108, 0, 0, - 0, 0, 0, 1396, 109, 110, 1397, 1398, 1399, 1400, - 1401, 0, 1402, 1403, 1404, 112, 113, 114, 105, 0, - 106, 0, 0, 0, 108, 0, 0, 297, 0, 0, - 0, 109, 110, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 112, 296, 114, 0, 0, 0, 0, 70, - 122, 71, 72, 73, 297, 0, 0, 0, 0, 0, - 127, 0, 0, 0, 0, 0, 128, 0, 0, 0, - 130, 131, 393, 67, 68, 0, 0, 122, 0, 80, - 0, 0, 134, 0, 135, 0, 0, 127, 0, 0, - 0, 0, 0, 128, 0, 263, 0, 0, 131, 0, - 0, 1032, 67, 68, 0, 0, 0, 0, 0, 134, - 0, 135, 0, 69, 82, 83, 70, 0, 71, 72, - 73, 74, 75, 0, 0, 76, 0, 0, 77, 0, - 0, 88, 78, 0, 0, 0, 90, 0, 0, 79, - 0, 0, 69, 0, 0, 70, 80, 71, 72, 73, - 74, 75, 0, 0, 76, 0, 0, 77, 0, 185, - 0, 78, 81, 0, 0, 0, 0, 0, 79, 70, - 0, 71, 72, 73, 0, 80, 0, 0, 0, 0, - 0, 82, 83, 0, 0, 0, 0, 84, 0, 0, - 0, 81, 1445, 67, 68, 85, 86, 87, 88, 80, - 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, - 82, 83, 0, 0, 0, 263, 84, 0, 0, 0, - 0, 693, 694, 695, 85, 86, 87, 88, 0, 0, - 89, 0, 90, 69, 82, 83, 70, 0, 71, 72, - 73, 74, 75, 0, 0, 76, 0, 0, 77, 0, - 0, 88, 78, 0, 0, 0, 90, 0, 0, 79, - 0, 0, 0, 0, 0, 70, 80, 71, 72, 73, - 696, 697, 0, 0, 0, 0, 0, 77, 0, 186, - 0, 0, 81, 0, 0, 0, 0, 0, 79, 693, - 694, 695, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 82, 83, 0, 0, 0, 0, 84, 0, 0, - 0, 81, 0, 0, 0, 85, 86, 87, 88, 0, - 0, 89, 0, 90, 0, 0, 0, 0, 67, 68, - 82, 83, 456, 70, 0, 71, 72, 73, 0, 0, - 0, 0, 0, 0, 698, 77, 0, 88, 0, 0, - 89, 0, 90, 0, 0, 0, 79, 67, 68, 0, - 0, 795, 0, 80, 458, 0, 0, 0, 69, 0, - 0, 70, 0, 71, 72, 73, 74, 459, 0, 81, - 76, 0, 0, 77, 0, 0, 0, 78, 0, 0, - 0, 0, 0, 458, 79, 0, 0, 69, 82, 83, - 70, 80, 71, 72, 73, 74, 459, 0, 0, 76, - 0, 0, 77, 0, 0, 88, 78, 81, 89, 0, - 90, 0, 0, 79, 70, 0, 71, 72, 73, 0, - 80, 0, 0, 460, 0, 0, 82, 83, 0, 0, - 0, 0, 84, 0, 0, 0, 81, 0, 67, 68, - 85, 86, 87, 88, 80, 0, 89, 0, 90, 0, - 0, 0, 460, 0, 0, 82, 83, 0, 0, 0, - 263, 84, 0, 0, 0, 0, 0, 67, 68, 85, - 86, 87, 88, 0, 458, 89, 0, 90, 69, 82, - 83, 70, 0, 71, 72, 73, 74, 459, 0, 0, - 76, 0, 0, 77, 0, 0, 88, 78, 0, 0, - 0, 90, 0, 0, 79, 0, 0, 69, 0, 0, - 70, 80, 71, 72, 73, 74, 75, 0, 0, 76, - 0, 0, 77, 0, 191, 0, 78, 81, 0, 0, - 0, 0, 0, 79, 0, 0, 214, 215, 216, 0, - 80, 0, 0, 460, 0, 0, 82, 83, 0, 0, - 0, 0, 84, 67, 68, 0, 81, 0, 0, 0, - 85, 86, 87, 88, 0, 0, 89, 0, 90, 0, - 0, 0, 0, 0, 0, 82, 83, 67, 68, 0, - 0, 84, 0, 0, 0, 0, 0, 0, 0, 85, - 86, 87, 88, 69, 0, 89, 70, 90, 71, 72, - 73, 74, 217, 218, 0, 76, 0, 0, 77, 0, - 0, 0, 78, 0, 0, 0, 0, 69, 0, 79, - 70, 0, 71, 72, 73, 74, 80, 0, 0, 76, - 0, 0, 77, 0, 0, 0, 78, 0, 219, 220, - 0, 221, 81, 79, 0, 0, 222, 0, 223, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 607, 1267, - 0, 82, 83, 67, 1342, 0, 81, 84, 0, 0, - 0, 0, 0, 0, 0, 85, 86, 87, 88, 0, - 0, 89, 0, 90, 0, 82, 83, 0, 0, 0, - 0, 84, 175, 0, 0, 0, 0, 0, 0, 85, - 86, 87, 88, 69, 0, 89, 70, 90, 71, 72, - 73, 74, 516, 0, 0, 76, 0, 0, 77, 0, - 0, 0, 78, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 176, 0, 0, 70, 80, 71, 72, 73, - 74, 997, 0, 0, 177, 0, 0, 77, 0, 0, - 0, 78, 81, 0, 0, 0, 0, 0, 79, 0, - 0, 214, 215, 216, 0, 80, 0, 0, 0, 0, - 0, 82, 83, 0, 0, 0, 0, 84, 175, 0, - 0, 81, 0, 0, 0, 85, 86, 87, 88, 0, - 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, - 82, 83, 67, 0, 0, 0, 84, 0, 0, 0, - 214, 215, 216, 0, 178, 179, 87, 88, 176, 0, - 89, 70, 90, 71, 72, 73, 74, 217, 218, 0, - 177, 0, 0, 77, 0, 0, 0, 78, 0, 0, - 0, 0, 69, 0, 79, 70, 0, 71, 72, 73, - 74, 80, 0, 0, 76, 0, 0, 77, 0, 0, - 0, 78, 0, 219, 220, 0, 221, 81, 79, 0, - 0, 222, 0, 223, 0, 80, 217, 218, 0, 0, - 0, 0, 0, 0, 1267, 0, 82, 83, 0, 1344, - 0, 81, 84, 0, 0, 0, 0, 0, 0, 0, - 178, 179, 87, 88, 0, 0, 89, 0, 90, 0, - 82, 83, 219, 220, 0, 221, 84, 0, 0, 0, - 222, 0, 223, 0, 85, 86, 87, 88, 0, 105, - 89, 106, 90, 1267, 107, 108, 0, 0, 1346, 0, - 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, - 0, 111, 0, 112, 113, 114, 115, 0, 0, 0, - 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, + 0, 0, 240, 0, 0, 0, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, + 254, 1286, 1288, 0, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 847, + 848, 849, 850, 851, 852, 853, 854, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 855, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 1387, 1388, 1389, + 1390, 1391, 1392, 1393, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1394, 0, 0, 0, 0, 0, 0, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 0, 252, 253, 254, 105, 0, 106, 0, 0, + 107, 108, 0, 0, 0, 0, 0, 0, 109, 110, + 0, 0, 0, 0, 0, 0, 0, 111, 0, 112, + 113, 114, 115, 0, 0, 0, 116, 0, 0, 0, + 0, 117, 0, 0, 856, 857, 858, 859, 860, 861, + 862, 863, 864, 865, 866, 0, 867, 868, 869, 0, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 124, 125, 126, 127, 0, 0, 0, 0, 0, + 128, 129, 67, 68, 130, 131, 457, 0, 458, 132, + 0, 0, 0, 0, 0, 133, 134, 0, 135, 0, + 0, 0, 1396, 1397, 1398, 0, 136, 1399, 1400, 1401, + 1402, 1403, 0, 1404, 1405, 1406, 0, 0, 459, 0, + 0, 0, 69, 0, 0, 70, 0, 71, 72, 73, + 74, 460, 0, 0, 76, 0, 0, 77, 0, 0, + 0, 78, 234, 235, 236, 237, 238, 239, 79, 0, + 0, 0, 0, 0, 0, 80, 0, 240, 1388, 1389, + 1390, 1391, 1392, 1393, 0, 0, 0, 0, 0, 0, + 0, 81, 0, 1394, 1388, 1389, 1390, 1391, 1392, 1393, + 0, 70, 0, 71, 72, 73, 0, 461, 0, 1394, + 82, 83, 0, 0, 0, 0, 84, 0, 1388, 1389, + 1390, 1391, 1392, 1393, 85, 86, 87, 88, 0, 0, + 89, 80, 90, 1394, 1388, 1389, 1390, 1391, 1392, 1393, + 0, 0, 0, 0, 0, 462, 0, 263, 0, 1394, + 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 82, 83, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 88, 0, 0, 0, 0, 90, 478, + 479, 480, 0, 0, 0, 0, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 0, 252, 253, 254, + 0, 185, 1396, 1397, 1398, 0, 0, 1399, 1400, 1401, + 1402, 1403, 0, 1404, 1405, 1406, 481, 0, 482, 1397, + 1398, 0, 0, 1399, 1400, 1401, 1402, 1403, 0, 1404, + 1405, 1406, 302, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1398, 217, 218, 1399, 1400, 1401, + 1402, 1403, 0, 1404, 1405, 1406, 0, 0, 0, 302, + 0, 0, 0, 1399, 1400, 1401, 1402, 1403, 0, 1404, + 1405, 1406, 0, 105, 0, 106, 0, 0, 0, 108, + 0, 483, 220, 0, 221, 0, 109, 110, 0, 222, + 0, 223, 0, 0, 0, 0, 0, 112, 113, 114, + 105, 0, 106, 0, 0, 0, 108, 0, 0, 297, + 214, 215, 216, 109, 110, 484, 0, 0, 0, 0, + 0, 0, 0, 0, 112, 296, 114, 0, 0, 0, + 0, 0, 122, 0, 0, 0, 297, 0, 0, 0, + 0, 0, 127, 0, 0, 0, 0, 481, 128, 482, + 0, 0, 130, 131, 394, 67, 68, 0, 0, 122, + 0, 0, 0, 0, 134, 0, 135, 0, 0, 127, + 0, 0, 0, 0, 0, 128, 217, 218, 0, 0, + 131, 0, 0, 1033, 67, 68, 0, 0, 0, 0, + 0, 134, 0, 135, 0, 69, 0, 0, 70, 0, + 71, 72, 73, 74, 75, 0, 0, 76, 0, 0, + 77, 0, 219, 220, 78, 221, 0, 0, 0, 0, + 222, 79, 223, 0, 69, 0, 0, 70, 80, 71, + 72, 73, 74, 75, 0, 0, 76, 0, 0, 77, + 0, 0, 0, 78, 81, 0, 0, 0, 0, 0, + 79, 70, 0, 71, 72, 73, 0, 80, 0, 0, + 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, + 0, 0, 0, 81, 1447, 67, 68, 85, 86, 87, + 88, 80, 0, 89, 0, 90, 0, 0, 0, 0, + 0, 0, 82, 83, 0, 0, 0, 263, 84, 0, + 0, 0, 0, 694, 695, 696, 85, 86, 87, 88, + 0, 0, 89, 0, 90, 69, 82, 83, 70, 0, + 71, 72, 73, 74, 75, 0, 0, 76, 0, 0, + 77, 0, 0, 88, 78, 0, 0, 0, 90, 0, + 0, 79, 0, 0, 0, 0, 0, 70, 80, 71, + 72, 73, 697, 698, 0, 0, 0, 0, 0, 77, + 0, 186, 0, 0, 81, 0, 0, 0, 0, 0, + 79, 694, 695, 696, 0, 0, 0, 80, 0, 0, + 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, + 0, 0, 0, 81, 0, 0, 0, 85, 86, 87, + 88, 0, 0, 89, 0, 90, 0, 0, 0, 0, + 67, 68, 82, 83, 457, 70, 0, 71, 72, 73, + 0, 0, 0, 0, 0, 0, 699, 77, 0, 88, + 0, 0, 89, 0, 90, 0, 0, 0, 79, 67, + 68, 0, 0, 796, 0, 80, 459, 0, 0, 0, + 69, 0, 0, 70, 0, 71, 72, 73, 74, 460, + 0, 81, 76, 0, 0, 77, 0, 0, 0, 78, + 0, 0, 0, 0, 0, 459, 79, 0, 0, 69, + 82, 83, 70, 80, 71, 72, 73, 74, 460, 0, + 0, 76, 0, 0, 77, 0, 0, 88, 78, 81, + 89, 0, 90, 0, 0, 79, 70, 0, 71, 72, + 73, 0, 80, 0, 0, 461, 0, 0, 82, 83, + 0, 0, 0, 0, 84, 0, 0, 0, 81, 0, + 67, 68, 85, 86, 87, 88, 80, 0, 89, 0, + 90, 0, 0, 0, 461, 0, 0, 82, 83, 0, + 0, 0, 263, 84, 214, 215, 216, 0, 0, 67, + 68, 85, 86, 87, 88, 0, 459, 89, 0, 90, + 69, 82, 83, 70, 0, 71, 72, 73, 74, 460, + 0, 0, 76, 0, 0, 77, 0, 0, 88, 78, + 0, 0, 0, 90, 0, 0, 79, 0, 0, 69, + 0, 0, 70, 80, 71, 72, 73, 74, 75, 0, + 0, 76, 0, 0, 77, 0, 191, 0, 78, 81, + 217, 218, 0, 0, 0, 79, 0, 0, 214, 215, + 216, 0, 80, 0, 0, 461, 0, 0, 82, 83, + 0, 0, 0, 0, 84, 67, 68, 0, 81, 0, + 0, 330, 85, 86, 87, 88, 219, 220, 89, 221, + 90, 0, 0, 0, 222, 0, 223, 82, 83, 67, + 68, 0, 0, 84, 0, 0, 0, 0, 0, 0, + 0, 85, 86, 87, 88, 69, 0, 89, 70, 90, + 71, 72, 73, 74, 217, 218, 0, 76, 0, 0, + 77, 0, 0, 0, 78, 0, 0, 0, 0, 69, + 0, 79, 70, 0, 71, 72, 73, 74, 80, 0, + 0, 76, 0, 0, 77, 0, 0, 0, 78, 0, + 219, 220, 0, 221, 81, 79, 0, 0, 222, 0, + 223, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 608, 1269, 0, 82, 83, 67, 1344, 0, 81, 84, + 0, 0, 0, 0, 0, 0, 0, 85, 86, 87, + 88, 0, 0, 89, 0, 90, 0, 82, 83, 0, + 0, 0, 0, 84, 175, 0, 0, 0, 0, 0, + 0, 85, 86, 87, 88, 69, 0, 89, 70, 90, + 71, 72, 73, 74, 517, 0, 0, 76, 0, 0, + 77, 0, 0, 0, 78, 0, 0, 0, 0, 0, + 0, 79, 0, 0, 176, 0, 0, 70, 80, 71, + 72, 73, 74, 998, 0, 0, 177, 0, 0, 77, + 0, 0, 0, 78, 81, 0, 0, 0, 0, 0, + 79, 0, 0, 214, 215, 216, 0, 80, 0, 0, + 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, + 175, 0, 0, 81, 0, 0, 0, 85, 86, 87, + 88, 0, 0, 89, 0, 90, 0, 0, 0, 0, + 0, 0, 82, 83, 67, 0, 0, 0, 84, 0, + 0, 0, 214, 215, 216, 0, 178, 179, 87, 88, + 176, 0, 89, 70, 90, 71, 72, 73, 74, 217, + 218, 0, 177, 0, 0, 77, 0, 0, 0, 78, + 0, 0, 0, 0, 69, 0, 79, 70, 0, 71, + 72, 73, 74, 80, 0, 0, 76, 0, 0, 77, + 0, 0, 0, 78, 0, 219, 220, 0, 221, 81, + 79, 0, 0, 222, 0, 223, 0, 80, 217, 218, + 0, 0, 0, 0, 0, 0, 1269, 0, 82, 83, + 0, 1346, 0, 81, 84, 0, 0, 0, 0, 0, + 0, 0, 178, 179, 87, 88, 0, 0, 89, 0, + 90, 0, 82, 83, 219, 220, 0, 221, 84, 0, + 0, 0, 222, 0, 223, 0, 85, 86, 87, 88, + 0, 105, 89, 106, 90, 1269, 107, 108, 0, 0, + 1348, 0, 0, 0, 109, 110, 0, 0, 0, 0, + 0, 0, 0, 111, 0, 112, 113, 114, 115, 0, + 0, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, - 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, - 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, - 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, - 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 689, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, @@ -2611,710 +2104,694 @@ static const yytype_int16 yytable[] = 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 871, 0, 0, 0, 0, 0, 0, 118, 119, + 0, 690, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 913, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 872, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1021, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 914, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1071, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1022, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, - 134, 0, 135, 111, 0, 112, 113, 114, 115, 105, - 136, 106, 116, 0, 0, 108, 0, 117, 0, 0, - 0, 0, 109, 110, 0, 0, 0, 0, 0, 1289, - 0, 0, 0, 112, 296, 114, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 297, 0, 124, 125, 126, - 127, 0, 0, 0, 0, 0, 128, 129, 0, 0, - 130, 131, 0, 0, 0, 132, 0, 0, 122, 0, - 0, 133, 134, 0, 135, 0, 0, 0, 127, 0, - 0, 0, 136, 0, 128, 0, 0, 0, 0, 131, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, - 134, 1428, 135, 0, 0, 105, 0, 106, 0, 0, - 107, 108, 0, 0, 0, 0, 0, -147, 109, 110, - 0, 0, 0, 0, 0, 0, 0, 111, 0, 112, - 113, 114, 115, 105, 0, 106, 116, 0, 0, 108, - 0, 117, 0, 0, 0, 0, 109, 110, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 297, - 0, 124, 125, 126, 127, 0, 0, 0, 0, 0, - 128, 129, 0, 0, 130, 131, 0, 0, 0, 132, - 0, 105, 122, 106, 0, 133, 134, 108, 135, 0, - 0, 0, 127, 0, 109, 110, 0, 0, 128, 0, - 0, 0, 130, 131, 0, 112, 296, 114, 0, 105, - 0, 106, 0, 133, 134, 108, 135, 297, 0, 0, - 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 112, 296, 114, 0, 0, 0, 0, - 122, 308, 0, 0, 0, 297, 0, 0, 0, 0, - 127, 0, 0, 0, 0, 0, 128, 0, 0, 0, - 0, 131, 0, 0, 0, 0, 0, 0, 122, 0, - 0, 0, 134, 0, 135, 0, 0, 0, 127, 0, - 0, 0, 0, 0, 128, 0, 0, 0, 0, 131, + 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, + 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1072, + 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, + 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, + 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, + 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, + 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 134, 0, 135 + 0, 1291, 0, 0, 0, 0, 0, 0, 118, 119, + 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, + 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, + 0, 108, 130, 131, 105, 0, 106, 132, 109, 110, + 108, 0, 0, 133, 134, 0, 135, 109, 110, 112, + 296, 114, 0, 0, 136, 0, 116, 0, 112, 113, + 114, 297, 0, 0, 0, 116, 0, 0, 0, 0, + 297, 0, 0, 1430, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, + 0, 0, 0, 122, 127, 0, 0, 0, 0, 0, + 128, 0, 0, 127, 0, 131, 0, 0, 0, 128, + 0, 0, 0, 130, 131, 133, 134, 105, 135, 106, + 0, 0, 107, 108, 133, 134, 0, 135, 0, 0, + 109, 110, 0, -148, 0, 0, 0, 0, 0, 111, + 0, 112, 113, 114, 115, 105, 0, 106, 116, 0, + 0, 108, 0, 117, 105, 0, 106, 0, 109, 110, + 108, 0, 0, 0, 0, 0, 0, 109, 110, 112, + 296, 114, 118, 119, 120, 121, 122, 123, 112, 296, + 114, 297, 0, 124, 125, 126, 127, 0, 0, 0, + 297, 0, 128, 129, 0, 0, 130, 131, 0, 0, + 0, 132, 0, 0, 122, 308, 0, 133, 134, 0, + 135, 0, 0, 122, 127, 0, 0, 0, 0, 0, + 128, 0, 0, 127, 0, 131, 0, 0, 0, 128, + 0, 0, 0, 0, 131, 0, 134, 0, 135, 0, + 0, 0, 0, 0, 0, 134, 0, 135 }; -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-922))) - -#define yytable_value_is_error(Yytable_value) \ - YYID (0) - static const yytype_int16 yycheck[] = { - 1, 61, 113, 130, 527, 460, 927, 295, 44, 708, - 507, 751, 315, 489, 659, 44, 15, 44, 458, 476, - 604, 92, 140, 140, 147, 140, 149, 150, 151, 152, - 182, 154, 613, 156, 489, 158, 81, 82, 83, 327, - 480, 713, 13, 88, 33, 15, 585, 6, 488, 8, - 15, 174, 15, 717, 794, 719, 720, 721, 722, 723, - 147, 62, 185, 186, 76, 15, 76, 59, 191, 192, - 76, 743, 744, 147, 746, 747, 748, 749, 147, 15, - 0, 147, 169, 147, 623, 148, 76, 150, 147, 147, - 91, 92, 166, 33, 586, 634, 164, 166, 99, 75, - 166, 147, 166, 147, 140, 147, 155, 166, 166, 147, - 164, 140, 33, 140, 10, 11, 12, 150, 149, 147, - 166, 164, 166, 147, 166, 770, 146, 164, 166, 10, - 11, 12, 165, 125, 146, 146, 146, 149, 166, 149, - 146, 164, 166, 149, 164, 146, 147, 33, 149, 150, - 151, 152, 6, 154, 8, 156, 146, 158, 155, 149, - 615, 206, 207, 208, 209, 146, 164, 166, 157, 158, - 159, 160, 161, 174, 163, 164, 165, 295, 295, 147, - 295, 182, 150, 164, 185, 186, 257, 258, 159, 150, - 191, 192, 495, 253, 164, 76, 77, 147, 350, 164, - 164, 164, 273, 274, 165, 323, 323, 166, 323, 327, - 327, 147, 327, 752, 155, 691, 112, 520, 263, 711, - 804, 150, 714, 163, 164, 165, 898, 228, 149, 147, - 814, 112, 113, 13, 115, 15, 165, 17, 467, 120, - 904, 122, 287, 164, 165, 13, 147, 15, 166, 17, - 147, 790, 791, 149, 164, 752, 257, 258, 164, 295, - 75, 933, 6, 386, 8, 166, 295, 155, 295, 166, - 147, 272, 273, 274, 275, 276, 277, 163, 164, 165, - 60, 282, 22, 23, 164, 166, 13, 323, 15, 166, - 17, 327, 60, 33, 323, 164, 323, 754, 327, 147, - 327, 277, 108, 109, 110, 164, 112, 113, 114, 2, - 149, 117, 22, 23, 315, 147, 122, 147, 166, 147, - 147, 127, 128, 33, 130, 131, 132, 911, 134, 135, - 164, 771, 787, 60, 166, 164, 166, 149, 166, 166, - 643, 98, 147, 147, 146, 164, 148, 149, 150, 350, - 164, 146, 997, 148, 642, 150, 895, 147, 64, 65, - 140, 166, 166, 56, 57, 58, 59, 60, 164, 845, - 63, 146, 140, 148, 154, 150, 166, 165, 166, 159, - 609, 143, 144, 145, 164, 386, 154, 690, 164, 164, - 845, 159, 164, 165, 166, 918, 164, 164, 895, 983, - 629, 630, 631, 632, 633, 406, 1327, 149, 272, 273, - 274, 275, 276, 140, 164, 996, 164, 157, 158, 159, - 160, 161, 914, 163, 164, 165, 146, 154, 148, 164, - 150, 476, 159, 54, 164, 56, 57, 58, 439, 113, - 114, 115, 443, 444, 445, 446, 447, 157, 158, 159, - 160, 161, 164, 163, 164, 165, 457, 164, 165, 166, - 461, 462, 277, 84, 164, 466, 1005, 1006, 469, 146, - 164, 148, 164, 150, 703, 504, 165, 166, 1001, 100, - 164, 165, 166, 459, 460, 165, 166, 166, 489, 164, - 296, 297, 164, 165, 495, 164, 302, 190, 119, 120, - 146, 147, 164, 504, 165, 166, 1087, 1247, 164, 1090, - 164, 1003, 164, 489, 164, 136, 517, 1009, 1010, 520, - 141, 164, 337, 164, 642, 642, 164, 642, 165, 166, - 164, 165, 289, 164, 165, 164, 164, 164, 164, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 789, 254, 164, 150, 159, 165, 259, 165, 149, 872, - 10, 11, 12, 48, 147, 439, 164, 806, 146, 443, - 444, 445, 446, 447, 585, 586, 587, 164, 155, 164, - 164, 148, 349, 457, 147, 167, 597, 461, 462, 147, - 166, 1093, 295, 604, 166, 166, 642, 608, 166, 156, - 586, 671, 613, 642, 1313, 642, 617, 618, 619, 620, - 621, 622, 623, 659, 166, 166, 166, 156, 166, 322, - 659, 607, 659, 634, 166, 166, 76, 77, 166, 615, - 166, 147, 643, 644, 459, 460, 166, 166, 166, 166, - 166, 880, 166, 166, 166, 166, 166, 166, 887, 888, - 889, 890, 891, 156, 166, 166, 166, 166, 697, 156, - 166, 166, 112, 113, 489, 115, 166, 1417, 1418, 1419, - 120, 487, 122, 15, 164, 166, 159, 166, 165, 690, - 383, 165, 149, 164, 166, 146, 756, 757, 167, 166, - 147, 516, 703, 147, 764, 147, 766, 400, 401, 754, - 711, 147, 164, 714, 407, 148, 717, 33, 719, 720, - 721, 722, 723, 164, 149, 165, 164, 164, 33, 48, - 731, 166, 166, 597, 770, 711, 164, 166, 714, 740, - 1321, 770, 164, 770, 159, 159, 169, 146, 48, 76, - 751, 752, 164, 155, 881, 155, 1337, 1338, 1339, 155, - 517, 155, 166, 1239, 10, 148, 164, 1259, 10, 1261, - 881, 586, 17, 10, 10, 532, 469, 156, 535, 1519, - 147, 159, 148, 159, 1239, 166, 1526, 788, 466, 790, - 791, 166, 607, 794, 167, 148, 797, 920, 921, 148, - 615, 148, 47, 804, 167, 148, 166, 867, 159, 166, - 166, 787, 166, 814, 164, 60, 61, 146, 164, 164, - 164, 169, 515, 824, 165, 165, 1318, 165, 1409, 166, - 164, 76, 149, 1414, 164, 147, 529, 147, 166, 1420, - 1421, 157, 158, 159, 160, 161, 147, 163, 164, 165, - 159, 150, 1081, 882, 159, 160, 161, 165, 163, 164, - 165, 106, 166, 166, 109, 167, 147, 112, 10, 845, - 166, 872, 169, 4, 147, 681, 682, 48, 164, 880, - 169, 164, 169, 128, 146, 886, 887, 888, 889, 890, - 891, 892, 1415, 1474, 895, 140, 711, 590, 147, 714, - 166, 156, 156, 904, 156, 166, 1029, 166, 156, 154, - 911, 604, 11, 914, 10, 1407, 166, 148, 10, 920, - 921, 10, 10, 148, 1505, 147, 927, 998, 169, 164, - 608, 169, 166, 10, 11, 12, 166, 1518, 914, 33, - 618, 619, 620, 621, 622, 166, 10, 11, 12, 642, - 167, 708, 10, 11, 12, 54, 713, 56, 57, 58, - 717, 997, 719, 720, 721, 722, 723, 167, 997, 1272, - 997, 167, 787, 167, 667, 668, 669, 670, 166, 672, - 1472, 166, 983, 15, 164, 84, 743, 744, 164, 746, - 747, 748, 749, 166, 164, 996, 155, 998, 166, 76, - 77, 100, 1003, 164, 1005, 1006, 166, 164, 1009, 1010, - 155, 155, 76, 77, 155, 164, 166, 15, 76, 77, - 119, 120, 146, 166, 10, 703, 166, 1003, 1029, 166, - 845, 166, 148, 1009, 1010, 112, 113, 136, 115, 10, - 148, 148, 141, 120, 10, 122, 148, 740, 112, 113, - 164, 115, 167, 166, 112, 113, 120, 115, 122, 156, - 166, 166, 120, 147, 122, 159, 160, 161, 166, 163, - 164, 165, 1073, 150, 156, 881, 156, 154, 156, 166, - 1081, 166, 159, 166, 10, 148, 1087, 10, 167, 1090, - 154, 149, 1093, 148, 164, 159, 164, 164, 148, 914, - 166, 10, 11, 12, 13, 164, 166, 148, 17, 166, - 788, 804, 166, 1242, 307, 645, 919, 1093, 1313, 797, - 327, 814, 882, 1239, 1073, 818, 697, 845, 327, 1273, - 1202, 405, -1, -1, -1, -1, -1, 10, 11, 12, - 13, 898, 835, -1, 17, -1, -1, 904, -1, -1, - -1, 60, -1, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, - 863, 864, 865, 866, -1, 868, 933, 1248, 10, 11, - 12, 13, -1, -1, -1, 17, -1, 60, 1003, -1, - -1, -1, -1, -1, 1009, 1010, -1, -1, -1, -1, - -1, 1202, 880, 112, -1, -1, -1, -1, -1, 887, - 888, 889, 890, 891, -1, -1, -1, -1, 911, -1, - -1, -1, -1, 54, -1, 56, 57, 58, 60, -1, - -1, 140, 62, -1, 927, 66, -1, -1, 1239, 112, - -1, -1, -1, -1, -1, 154, 1247, 1248, -1, 1309, - 159, -1, -1, 84, -1, 85, -1, -1, 1259, -1, - 1261, -1, 61, 1239, -1, -1, -1, 140, -1, 100, - -1, 1272, -1, -1, -1, 105, -1, -1, 1093, 111, - 112, 154, -1, 1259, -1, 1261, 159, -1, 119, 120, - 983, 164, 985, 123, -1, 1355, 1356, -1, 1358, -1, - 1360, -1, -1, 133, -1, 136, -1, -1, 140, -1, - 141, -1, -1, -1, -1, -1, -1, 1318, -1, -1, - 1321, -1, 154, -1, -1, -1, 1327, 159, -1, -1, - -1, -1, 164, 164, -1, -1, 1337, 1338, 1339, -1, - -1, -1, 1318, 1403, 1037, -1, -1, -1, 178, 148, - -1, 181, -1, -1, 153, -1, 155, 1082, 157, -1, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, -1, -1, 10, 11, 12, - 13, -1, 15, -1, 17, 184, -1, -1, -1, 188, - 189, 190, -1, -1, -1, 225, 226, 20, 21, 22, - 23, -1, -1, 1081, -1, -1, 1407, -1, 1409, -1, - 33, -1, -1, 1414, -1, -1, 1417, 1418, 1419, 1420, - 1421, -1, -1, -1, 1239, -1, -1, 60, -1, -1, - -1, 1407, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 271, -1, -1, 1259, -1, 1261, -1, -1, 10, - 11, 12, 1512, 1513, 1514, -1, 1516, -1, -1, 289, - -1, 291, 18, 19, 20, 21, 22, 23, -1, 268, - -1, 1472, -1, 1474, -1, -1, -1, 33, 308, 112, - 310, 311, 312, 313, -1, 1242, -1, -1, 16, 17, - 18, 19, 20, 21, 22, 23, 1472, -1, -1, 329, - -1, -1, -1, 1318, 1505, 33, -1, 140, 338, -1, - -1, 341, -1, -1, -1, 76, 77, 1518, 1519, 349, - -1, 154, -1, -1, -1, 1526, 159, -1, -1, -1, - -1, 164, 155, 156, 157, 158, 159, 160, 161, 1232, - 163, 164, 165, 16, 17, 18, 19, 20, 21, 22, - 23, 112, 113, 114, 115, -1, 1313, -1, 388, 120, - 33, 122, 392, 20, 21, 22, 23, -1, -1, -1, - -1, -1, 133, -1, -1, 405, 33, 138, -1, 1304, - 1305, 1306, 1307, 1308, -1, 1310, 385, -1, -1, -1, - -1, -1, 1407, 1286, -1, -1, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, - -1, -1, 442, -1, -1, -1, -1, -1, -1, -1, - -1, 149, -1, 151, 152, 153, 154, -1, 458, 157, - 158, 159, 160, 161, 1327, 163, 164, 165, -1, -1, - 470, -1, -1, -1, -1, 1304, 1305, 1306, 1307, 1308, - 480, 1310, -1, -1, -1, -1, -1, 1472, 488, 1384, - 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, - 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, - 163, 164, 165, -1, 524, -1, 169, 10, 11, 12, - 157, 158, 159, 160, 161, 535, 163, 164, 165, -1, - -1, 1404, -1, 512, 10, 11, 12, -1, -1, -1, - 519, -1, -1, 1448, -1, 1384, 1385, 1386, 1387, 1388, - 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1399, 1400, 1401, 1402, -1, 54, -1, 56, 57, 58, - -1, 550, -1, 552, 584, 554, -1, 66, -1, -1, - -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 1501, -1, -1, -1, - 76, 77, -1, -1, -1, -1, -1, -1, -1, 1448, - -1, 100, -1, -1, -1, -1, -1, 627, -1, 112, - 113, -1, 115, -1, -1, -1, -1, 120, -1, 122, - 119, 120, -1, -1, -1, 645, 112, 113, -1, 115, - -1, -1, -1, -1, 120, -1, 122, 136, -1, -1, - -1, -1, 141, 146, -1, -1, -1, -1, -1, -1, - -1, 137, 1501, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, -1, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, - -1, 701, 671, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, -1, -1, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, - 70, -1, 72, 73, 74, 75, 76, 77, 78, 79, - 80, -1, 82, 83, 84, 16, 17, 18, 19, 20, - 21, 22, 23, 1264, 1265, 1266, -1, -1, -1, -1, - 100, 771, 33, -1, -1, -1, 106, 107, 108, -1, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, -1, -1, -1, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 1, 61, 113, 130, 130, 92, 477, 928, 295, 490, + 140, 587, 140, 660, 528, 44, 508, 15, 709, 140, + 182, 146, 15, 6, 752, 8, 44, 461, 586, 15, + 98, 315, 614, 146, 13, 459, 59, 0, 605, 164, + 15, 328, 164, 147, 147, 149, 150, 151, 152, 147, + 154, 164, 156, 15, 158, 15, 490, 481, 10, 11, + 12, 62, 44, 166, 76, 489, 624, 795, 76, 164, + 174, 169, 13, 714, 15, 164, 17, 635, 147, 164, + 150, 185, 186, 6, 33, 8, 76, 191, 192, 147, + 91, 92, 150, 164, 33, 165, 155, 166, 99, 75, + 33, 147, 125, 744, 745, 155, 747, 748, 749, 750, + 718, 140, 720, 721, 722, 723, 724, 150, 155, 60, + 166, 147, 140, 164, 771, 146, 164, 148, 149, 150, + 64, 65, 165, 147, 146, 155, 712, 149, 146, 715, + 166, 149, 10, 11, 12, 146, 147, 76, 149, 150, + 151, 152, 166, 154, 147, 156, 146, 158, 140, 149, + 112, 75, 81, 82, 83, 295, 146, 295, 166, 88, + 257, 258, 147, 174, 295, 13, 164, 15, 164, 17, + 159, 182, 616, 166, 185, 186, 273, 274, 149, 351, + 191, 192, 164, 253, 324, 753, 324, 149, 328, 140, + 328, 149, 164, 324, 164, 147, 164, 328, 76, 77, + 149, 692, 496, 154, 163, 164, 165, 146, 159, 164, + 149, 289, 60, 164, 166, 164, 165, 228, 165, 166, + 163, 164, 165, 791, 792, 150, 147, 521, 805, 164, + 147, 147, 164, 147, 112, 113, 147, 115, 815, 149, + 165, 147, 120, 166, 122, 166, 257, 258, 899, 166, + 166, 753, 166, 165, 166, 166, 295, 10, 11, 12, + 166, 272, 273, 274, 275, 276, 277, 295, 143, 144, + 145, 282, 350, 387, 755, 165, 166, 206, 207, 208, + 209, 61, 147, 934, 164, 324, 147, 905, 166, 328, + 147, 277, 140, 108, 109, 110, 324, 112, 113, 114, + 328, 166, 117, 295, 315, 166, 154, 122, 147, 166, + 164, 159, 127, 128, 147, 130, 131, 132, 147, 134, + 135, 164, 165, 76, 77, 149, 147, 166, 896, 915, + 147, 150, 324, 166, 263, 912, 328, 166, 772, 164, + 351, 998, 147, 165, 788, 166, 643, 147, 164, 166, + 644, 147, 338, 277, 148, 846, 150, 164, 287, 112, + 113, 166, 115, 164, 165, 166, 166, 120, 148, 122, + 166, 164, 6, 153, 8, 155, 387, 157, 164, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - -1, 1342, -1, 1344, -1, 1346, -1, -1, 1349, 1350, - 1351, -1, -1, -1, -1, -1, -1, -1, 827, 828, - 829, -1, 831, -1, 833, 834, 835, -1, -1, -1, + 170, 171, 172, 173, 896, 919, 407, 691, 1329, 13, + 147, 15, 846, 17, 184, 997, 164, 984, 188, 189, + 190, 159, 165, 10, 11, 12, 13, 149, 1004, 166, + 17, 164, 165, 166, 1010, 1011, 146, 147, 33, 440, + 164, 165, 166, 444, 445, 446, 447, 448, 1006, 1007, + 518, 164, 10, 11, 12, 13, 60, 458, 164, 17, + 164, 462, 463, 165, 166, 533, 467, 164, 536, 470, + 146, 164, 148, 60, 150, 164, 505, 164, 10, 11, + 12, 113, 114, 115, 460, 461, 165, 166, 1002, 490, + 164, 296, 297, 164, 165, 496, 164, 302, 268, 146, + 164, 148, 60, 150, 505, 164, 165, 1089, 164, 164, + 1092, 164, 164, 643, 490, 643, 164, 518, 164, 1095, + 521, 1249, 643, 164, 111, 112, 164, 20, 21, 22, + 23, 146, 165, 148, 164, 150, 140, 164, 164, 48, + 33, 517, 147, 164, 76, 77, 460, 461, 146, 164, + 154, 164, 155, 140, 112, 159, 164, 146, 477, 148, + 164, 150, 157, 158, 159, 160, 161, 154, 163, 164, + 165, 164, 159, 148, 147, 167, 490, 164, 166, 156, + 112, 113, 140, 115, 166, 586, 587, 588, 120, 873, + 122, 22, 23, 156, 166, 166, 154, 598, 166, 166, + 166, 159, 33, 147, 605, 137, 164, 166, 609, 166, + 166, 587, 672, 614, 643, 166, 386, 618, 619, 620, + 621, 622, 623, 624, 1315, 643, 22, 23, 166, 147, + 166, 660, 608, 166, 635, 166, 166, 33, 166, 166, + 616, 709, 660, 644, 645, 166, 714, 166, 15, 166, + 718, 166, 720, 721, 722, 723, 724, 156, 166, 166, + 166, 643, 155, 156, 157, 158, 159, 160, 161, 698, + 163, 164, 165, 587, 166, 166, 744, 745, 660, 747, + 748, 749, 750, 488, 156, 1261, 166, 1263, 166, 166, + 691, 1419, 1420, 1421, 608, 33, 164, 757, 758, 166, + 166, 165, 616, 704, 159, 765, 165, 767, 467, 166, + 149, 712, 164, 167, 715, 166, 33, 718, 2, 720, + 721, 722, 723, 724, 146, 148, 157, 158, 159, 160, + 161, 732, 163, 164, 165, 147, 712, 147, 147, 715, + 741, 1323, 771, 513, 1320, 147, 164, 164, 149, 164, + 520, 752, 753, 771, 48, 882, 882, 1339, 1340, 1341, + 1241, 157, 158, 159, 160, 161, 164, 163, 164, 165, + 164, 882, 56, 57, 58, 59, 60, 166, 166, 63, + 166, 551, 164, 553, 159, 555, 159, 146, 789, 771, + 791, 792, 169, 1521, 795, 48, 76, 798, 712, 164, + 1528, 715, 155, 33, 805, 155, 155, 1241, 868, 155, + 164, 166, 788, 10, 815, 10, 10, 921, 922, 157, + 158, 159, 160, 161, 825, 163, 164, 165, 10, 1411, + 148, 899, 156, 1409, 1416, 147, 755, 905, 148, 159, + 1422, 1423, 159, 160, 161, 166, 163, 164, 165, 148, + 609, 159, 166, 148, 883, 148, 167, 468, 167, 148, + 619, 620, 621, 622, 623, 166, 934, 159, 166, 166, + 846, 146, 873, 169, 788, 166, 164, 682, 683, 164, + 881, 272, 273, 274, 275, 276, 887, 888, 889, 890, + 891, 892, 893, 164, 1476, 896, 164, 166, 1474, 1266, + 1267, 1268, 672, 1417, 905, 165, 190, 165, 165, 149, + 164, 912, 999, 164, 915, 147, 166, 150, 147, 147, + 921, 922, 159, 166, 166, 1507, 1030, 928, 167, 159, + 160, 161, 846, 163, 164, 165, 147, 10, 1520, 915, + 165, 4, 166, 169, 147, 704, 48, 164, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 998, + 254, 169, 164, 169, 146, 259, 147, 1344, 166, 1346, + 998, 1348, 156, 984, 1351, 1352, 1353, 156, 156, 166, + 1274, 166, 156, 166, 10, 148, 997, 10, 999, 610, + 10, 915, 10, 1004, 148, 1006, 1007, 147, 164, 1010, + 1011, 295, 169, 167, 166, 166, 998, 167, 167, 630, + 631, 632, 633, 634, 169, 167, 15, 166, 1004, 1030, + 789, 166, 166, 164, 1010, 1011, 164, 166, 322, 798, + 164, 10, 11, 12, 166, 10, 11, 12, 13, 440, + 15, 164, 17, 444, 445, 446, 447, 448, 828, 829, + 830, 166, 832, 164, 834, 835, 836, 458, 10, 11, + 12, 462, 463, 1074, 155, 155, 155, 882, 155, 164, + 166, 15, 1083, 166, 146, 10, 10, 148, 1089, 148, + 1004, 1092, 166, 704, 1095, 60, 1010, 1011, 166, 166, + 384, 148, 10, 148, 164, 147, 156, 76, 77, 10, + 11, 12, 13, 166, 166, 166, 17, 401, 402, 1095, + 156, 167, 881, 166, 408, 10, 11, 12, 156, 888, + 889, 890, 891, 892, 76, 77, 166, 166, 156, 166, + 10, 167, 148, 112, 113, 10, 115, 112, 148, 164, + 164, 120, 164, 122, 148, 166, 148, 164, 920, 60, + 307, 166, 166, 1250, 166, 646, 1244, 1315, 328, 883, + 112, 113, 698, 115, 1084, 140, 1244, 1241, 120, 790, + 122, 1095, 1074, 846, 1275, 154, 470, 328, 1204, 154, + 159, 76, 77, 406, 159, -1, 807, -1, -1, 164, + -1, -1, -1, 1204, -1, -1, -1, 598, 150, -1, + -1, 112, 154, -1, -1, -1, -1, 159, -1, 16, + 17, 18, 19, 20, 21, 22, 23, 112, 113, -1, + 115, -1, 516, -1, -1, 120, 33, 122, -1, 140, + 1241, -1, -1, -1, -1, -1, 530, 1315, 1249, 1250, + -1, 1311, -1, 154, -1, -1, -1, -1, 159, -1, + 1261, -1, 1263, -1, 149, 1241, -1, -1, -1, -1, + 881, -1, -1, 1274, -1, -1, -1, 888, 889, 890, + 891, 892, -1, -1, -1, 1261, -1, 1263, -1, 18, + 19, 20, 21, 22, 23, -1, -1, 1357, 1358, -1, + 1360, -1, 1362, -1, 33, -1, -1, 591, -1, -1, + -1, -1, 1082, -1, -1, -1, -1, -1, -1, 1320, + -1, 605, 1323, -1, 1083, -1, -1, 1241, 1329, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1339, 1340, + 1341, -1, -1, -1, 1320, 1405, -1, 1261, -1, 1263, + -1, -1, 149, -1, 151, 152, 153, 154, -1, 643, + 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, + 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, + -1, 62, -1, 33, 668, 669, 670, 671, -1, 673, + -1, -1, -1, -1, -1, -1, 1306, 1307, 1308, 1309, + 1310, -1, 1312, -1, 85, -1, 1320, -1, 1409, -1, + 1411, -1, -1, -1, -1, 1416, -1, -1, 1419, 1420, + 1421, 1422, 1423, -1, 105, 154, 155, 156, 157, 158, + 159, 160, 161, 1409, 163, 164, 165, -1, -1, -1, + -1, -1, 123, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 133, -1, 1514, 1515, 1516, 741, 1518, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 883, -1, -1, -1, -1, -1, -1, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, -1, 163, 164, 165, -1, -1, -1, 169, -1, - -1, -1, -1, -1, -1, 10, 11, 12, -1, 919, + -1, -1, 1083, 1474, -1, 1476, 1386, 1387, 1388, 1389, + 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, + 1400, 1401, 1402, 1403, 1404, 1409, -1, 178, 1474, -1, + 181, -1, -1, -1, -1, -1, 1507, 157, 158, 159, + 160, 161, -1, 163, 164, 165, -1, -1, -1, 1520, + 1521, 805, -1, -1, -1, -1, -1, 1528, -1, -1, + -1, 815, -1, -1, -1, 819, -1, -1, -1, -1, + 1450, 1311, -1, -1, 225, 226, -1, -1, -1, -1, + -1, -1, 836, -1, -1, -1, -1, -1, -1, -1, + 1474, -1, -1, 847, 848, 849, 850, 851, 852, 853, + 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, + 864, 865, 866, 867, -1, 869, -1, -1, -1, -1, + 271, -1, -1, 1503, 1306, 1307, 1308, 1309, 1310, -1, + 1312, 1371, 1372, 1373, 1374, -1, 1376, 1377, 289, 17, + 291, -1, -1, -1, -1, -1, -1, -1, 18, 19, + 20, 21, 22, 23, -1, 33, -1, 308, 912, 310, + 311, 312, 313, 33, -1, -1, -1, -1, -1, 47, + 10, 11, 12, -1, 928, -1, -1, -1, -1, 330, + -1, -1, 60, 61, -1, -1, -1, -1, 339, -1, + -1, 342, -1, -1, -1, -1, -1, -1, 76, 350, + -1, -1, -1, -1, 1386, 1387, 1388, 1389, 1390, 1391, + 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, + 1402, 1403, 1404, -1, -1, -1, -1, -1, 106, -1, + 984, 109, 986, -1, 112, -1, 76, 77, 389, -1, + -1, -1, 393, -1, -1, -1, -1, -1, -1, -1, + 128, -1, -1, -1, -1, 406, -1, -1, -1, -1, + -1, -1, 140, -1, -1, -1, -1, -1, 1450, -1, + -1, -1, 112, 113, -1, 115, 154, -1, -1, -1, + 120, -1, 122, -1, 1038, 155, 156, 157, 158, 159, + 160, 161, 443, 163, 164, 165, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 146, -1, 459, 3, + 4, 5, 6, -1, 8, 9, 10, 11, 12, -1, + 471, 1503, -1, -1, -1, -1, -1, -1, -1, -1, + 481, -1, -1, -1, -1, -1, -1, -1, 489, -1, + -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, + 22, 23, -1, -1, -1, -1, 50, 51, -1, -1, + 54, 33, 56, 57, 58, 59, 60, -1, 62, 63, + -1, -1, 66, 67, 525, -1, 70, -1, -1, -1, + -1, 75, 76, 77, -1, 536, -1, 81, -1, -1, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, + -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, + -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, + 124, 125, -1, -1, 585, 129, -1, -1, 132, 133, + 134, 135, 136, -1, -1, 139, -1, 141, -1, -1, + 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, + 154, -1, 15, 157, 158, 159, -1, -1, 162, -1, + 164, 165, -1, -1, 168, -1, -1, 628, -1, -1, + 1234, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, 47, 646, -1, 50, 51, -1, + -1, 54, -1, 56, 57, 58, 59, 60, -1, 62, + 63, -1, -1, 66, 67, -1, -1, 70, -1, -1, + -1, -1, 75, 76, 77, -1, -1, -1, -1, -1, + -1, 84, -1, -1, 1288, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 100, -1, -1, + -1, 702, -1, -1, -1, 108, -1, 110, -1, 112, + -1, -1, -1, 116, 117, -1, 119, 120, 121, -1, + -1, 124, 125, -1, -1, 1329, 129, -1, -1, 132, + 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3, 4, 5, 6, 7, 8, 9, 10, + -1, 154, -1, -1, 157, 158, -1, -1, -1, 162, + -1, 164, -1, -1, -1, 168, -1, -1, -1, -1, + -1, 772, -1, -1, -1, -1, -1, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, -1, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + -1, -1, 1406, -1, -1, -1, -1, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, -1, -1, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, -1, 70, -1, 72, 73, 74, 75, + 76, 77, 78, 79, 80, -1, 82, 83, 84, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 100, -1, -1, -1, -1, -1, + 106, 107, 108, 884, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, -1, -1, 920, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, -1, -1, -1, -1, -1, 16, + 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1001, -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, - -1, -1, 33, 34, 35, 36, 37, 38, 39, 40, + -1, 1032, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 76, 77, 54, 55, 56, 57, 58, 59, 60, + 51, -1, -1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, 70, - 1000, 72, 73, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, -1, -1, -1, 112, 113, -1, - 115, -1, -1, -1, -1, 120, -1, 122, -1, 100, - -1, 1031, -1, -1, -1, 106, 107, 108, 133, 110, + -1, 72, 73, 74, 75, 76, 77, 78, 79, 80, + -1, 82, 83, 84, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, 100, + -1, -1, 169, -1, -1, 106, 107, 108, -1, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, -1, -1, -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, 169, 3, - 4, 5, 6, -1, 8, 9, 10, 11, 12, -1, - -1, 1080, -1, -1, -1, -1, -1, -1, -1, -1, + 4, 5, 6, -1, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, -1, 50, 51, -1, -1, - 54, 33, 56, 57, 58, 59, 60, -1, 62, 63, - -1, -1, 66, 67, -1, -1, 70, -1, 47, -1, - 49, 75, 76, 77, -1, -1, -1, 81, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, -1, -1, -1, 50, 51, 33, -1, + 54, -1, 56, 57, 58, 59, -1, -1, 62, 63, + -1, -1, 66, 67, -1, -1, 70, -1, -1, -1, + -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 76, 77, -1, + 94, 95, 96, 97, 98, 99, 100, -1, 1269, -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, - 124, 125, 10, 11, 12, 129, -1, -1, 132, 133, - 134, 135, 136, 112, 113, 139, 115, 141, -1, -1, - -1, 120, -1, 122, -1, -1, -1, -1, -1, -1, + 124, 125, -1, -1, -1, 129, -1, -1, 132, 133, + 134, 135, 136, -1, -1, 139, -1, 141, 3, 4, + 5, 6, -1, 8, 9, 10, 11, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, - 164, 165, -1, -1, 168, -1, -1, 1267, -1, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, -1, -1, -1, 169, 76, 77, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3, 4, 5, 6, -1, 8, 9, 10, - 11, -1, -1, -1, -1, -1, -1, -1, -1, 107, - -1, -1, -1, -1, 112, 113, -1, 115, -1, -1, - -1, -1, 120, -1, 122, -1, -1, -1, -1, -1, - 1309, -1, -1, -1, -1, -1, -1, -1, -1, 50, - 51, -1, -1, 54, -1, 56, 57, 58, 59, -1, - -1, 62, 63, -1, -1, 66, 67, -1, -1, 70, - -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, - 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 1369, 1370, 1371, 1372, -1, 1374, 1375, 108, -1, 110, - -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, - 121, -1, -1, 124, 125, -1, -1, -1, 129, -1, - -1, 132, 133, 134, 135, 136, -1, -1, 139, -1, - 141, -1, -1, -1, 1444, -1, -1, -1, -1, -1, - -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, - -1, 162, -1, 164, 165, -1, -1, 168, 3, 4, - 5, 6, -1, 8, 9, 10, 11, -1, 10, 11, - 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, - 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, - -1, -1, -1, -1, -1, 50, 33, -1, -1, 54, + 164, 165, -1, -1, 168, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, -1, -1, -1, 169, 50, -1, -1, -1, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, 64, - 65, 66, 67, -1, -1, -1, -1, -1, -1, -1, - 75, 76, 77, -1, 76, 77, 81, -1, -1, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, - -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, - 112, 113, 117, 115, 119, 120, 121, -1, 120, 124, - 122, -1, -1, -1, 129, -1, -1, 132, -1, -1, - -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, - 11, 146, -1, -1, 146, -1, -1, -1, -1, 154, - -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, - 165, -1, 149, 168, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, 50, - -1, -1, -1, 54, -1, 56, 57, 58, -1, -1, - -1, 62, -1, -1, -1, 66, 67, 10, 11, 12, - -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, - 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - -1, -1, -1, -1, 47, -1, 49, 108, -1, 110, - -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, - 121, -1, -1, 124, -1, -1, -1, -1, 129, -1, - -1, 132, -1, 76, 77, 136, 3, 4, 5, 6, - 141, 8, 9, 10, 11, -1, 10, 11, 12, -1, - -1, 15, -1, 154, -1, -1, 157, 158, 159, -1, - -1, 162, -1, 164, 165, 166, -1, 168, -1, 112, - 113, -1, 115, -1, -1, -1, -1, 120, -1, 122, - -1, -1, -1, 50, 51, -1, -1, 54, -1, 56, - 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, - 67, -1, -1, 146, -1, -1, -1, -1, 75, 76, - 77, -1, 76, 77, 81, -1, -1, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, - -1, 108, -1, 110, -1, 112, -1, -1, 112, 113, - 117, 115, 119, 120, 121, -1, 120, 124, 122, -1, - -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, - 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, - 10, 11, 12, -1, -1, -1, -1, 154, -1, -1, - 157, 158, 159, -1, -1, 162, -1, 164, 165, -1, - -1, 168, -1, -1, -1, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, 50, 51, -1, - -1, 54, 33, 56, 57, 58, -1, -1, -1, 62, - -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, - -1, -1, 75, 76, 77, -1, 76, 77, 81, -1, - -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, - -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, - -1, -1, 112, 113, 117, 115, 119, 120, 121, -1, - 120, 124, 122, -1, -1, -1, 129, -1, -1, 132, - -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, - 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, - -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, - -1, 164, 165, -1, -1, 168, -1, 148, -1, -1, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 50, 163, 164, 165, 54, -1, 56, 57, 58, - -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, - -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, - -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, - -1, 110, -1, 112, -1, -1, -1, -1, 117, -1, - 119, 120, 121, -1, -1, 124, -1, -1, -1, -1, - 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, - 5, 6, 141, 8, 9, 10, 11, 146, -1, -1, - -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, - 159, -1, -1, 162, -1, 164, 165, -1, -1, 168, - -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, - 23, -1, -1, -1, -1, 50, -1, -1, -1, 54, - 33, 56, 57, 58, -1, -1, -1, 62, -1, -1, - -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, + 65, 66, 67, -1, -1, -1, 17, -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, - -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, - -1, -1, 117, -1, 119, 120, 121, -1, -1, 124, - -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, - -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, - 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, - -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, - 165, 166, -1, 168, 147, -1, -1, -1, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 50, - 163, 164, 165, 54, -1, 56, 57, 58, -1, -1, - -1, 62, -1, -1, -1, 66, 67, -1, -1, -1, - -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, - 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, - -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, - 121, -1, -1, 124, -1, -1, -1, -1, 129, -1, - -1, 132, -1, -1, -1, 136, 3, 4, 5, 6, - 141, 8, 9, 10, 11, 146, -1, -1, -1, -1, - -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, - -1, 162, -1, 164, 165, -1, -1, 168, -1, -1, - -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, - -1, -1, -1, 50, -1, -1, -1, 54, 33, 56, - 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, - 67, -1, -1, -1, -1, -1, -1, -1, 75, 76, - 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, - -1, 108, -1, 110, -1, 112, -1, -1, -1, -1, - 117, -1, 119, 120, 121, -1, -1, 124, -1, -1, - -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, - 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, - -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, - 157, 158, 159, -1, -1, 162, -1, 164, 165, 166, - -1, 168, -1, -1, 149, -1, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 50, 163, 164, - 165, 54, -1, 56, 57, 58, -1, -1, -1, 62, - -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, - -1, -1, 75, 76, 77, -1, -1, -1, 81, -1, - -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, - -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, - -1, -1, -1, -1, 117, -1, 119, 120, 121, -1, - -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, - -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, - -1, 164, 165, -1, -1, 168, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, 47, -1, - -1, 50, 51, 33, -1, 54, -1, 56, 57, 58, - 59, 60, -1, 62, 63, -1, -1, 66, 67, -1, - -1, 70, -1, -1, -1, -1, 75, 76, 77, -1, - -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, - -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, - -1, 100, -1, -1, -1, -1, -1, -1, 33, 108, - -1, 110, -1, 112, -1, -1, -1, 116, 117, -1, - 119, 120, 121, -1, -1, 124, 125, -1, -1, -1, - 129, -1, -1, 132, 133, 134, 135, 136, -1, -1, - 139, -1, 141, -1, 3, 4, 5, 6, -1, 8, - 9, 10, 11, 12, -1, 154, 15, -1, 157, 158, - -1, -1, -1, 162, -1, 164, -1, 147, -1, 168, - -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, 164, 165, 166, -1, 47, -1, - -1, 50, 51, -1, -1, 54, -1, 56, 57, 58, - 59, 60, -1, 62, 63, -1, -1, 66, 67, -1, - -1, 70, -1, -1, -1, -1, 75, 76, 77, -1, - -1, -1, -1, -1, -1, 84, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, - 165, 100, -1, -1, -1, -1, -1, -1, -1, 108, - -1, 110, -1, 112, -1, -1, -1, 116, 117, -1, - 119, 120, 121, -1, -1, 124, 125, -1, -1, -1, - 129, -1, -1, 132, 133, 134, 135, 136, -1, -1, - 139, -1, 141, 3, 4, 5, 6, -1, 8, 9, - 10, -1, -1, -1, -1, 154, -1, -1, 157, 158, - -1, -1, -1, 162, -1, 164, -1, -1, -1, 168, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, - 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, - 50, -1, -1, -1, 33, -1, -1, -1, -1, -1, - -1, -1, 62, -1, -1, -1, -1, 67, 17, 18, - 19, 20, 21, 22, 23, 75, 76, -1, -1, -1, - -1, 81, -1, -1, 33, 85, 86, 87, 88, 89, + 95, 96, 97, 98, 99, 100, 47, -1, -1, -1, + -1, -1, -1, 108, -1, 110, -1, 112, -1, 60, + 61, -1, 117, -1, 119, 120, 121, -1, -1, 124, + -1, -1, -1, -1, 129, 76, -1, 132, -1, -1, + -1, 136, -1, -1, -1, 1446, 141, 3, 4, 5, + 6, 146, 8, 9, 10, 11, -1, -1, -1, 154, + -1, -1, 157, 158, 159, 106, -1, 162, 109, 164, + 165, 112, -1, 168, -1, -1, -1, -1, 16, 17, + 18, 19, 20, 21, 22, 23, -1, 128, -1, -1, + -1, -1, -1, -1, 50, 33, -1, -1, 54, 140, + 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, + 66, 67, -1, 154, -1, -1, -1, -1, -1, 75, + 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, + -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, + -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, + -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, + 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, + -1, 10, 11, 12, -1, -1, -1, -1, 154, -1, + -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, + 166, -1, 168, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, -1, 163, 164, 165, 50, 51, + -1, 169, 54, -1, 56, 57, 58, -1, -1, -1, + 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, + -1, -1, -1, 75, 76, 77, -1, 76, 77, 81, + -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, + -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, + 112, -1, -1, 112, 113, 117, 115, 119, 120, 121, + -1, 120, 124, 122, -1, -1, -1, 129, -1, -1, + 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, + 8, 9, 10, 11, -1, -1, -1, 146, -1, -1, + -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, + 162, -1, 164, 165, -1, -1, 168, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, + -1, -1, 50, 51, -1, -1, 54, 33, 56, 57, + 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, + -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, + -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, + 108, -1, 110, -1, 112, -1, -1, -1, -1, 117, + -1, 119, 120, 121, -1, -1, 124, -1, -1, -1, + -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, + 4, 5, 6, 141, 8, 9, 10, 11, -1, 10, + 11, 12, -1, -1, 15, -1, 154, -1, -1, 157, + 158, 159, -1, -1, 162, -1, 164, 165, -1, -1, + 168, -1, -1, 149, -1, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 50, 163, 164, 165, + 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, + -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, + -1, 75, 76, 77, -1, 76, 77, 81, -1, -1, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, + -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, + -1, 112, 113, 117, 115, 119, 120, 121, -1, 120, + 124, 122, -1, -1, -1, 129, -1, -1, 132, -1, + -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, + 10, 11, 146, 10, 11, 12, -1, -1, -1, -1, + 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, + 164, 165, -1, -1, 168, -1, -1, -1, 16, 17, + 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, + 50, -1, -1, -1, 54, 33, 56, 57, 58, -1, + -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, + -1, -1, -1, -1, -1, 75, 76, 77, -1, 76, + 77, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, - 110, -1, 112, -1, -1, -1, -1, 117, 33, -1, - -1, 121, -1, -1, 124, -1, -1, -1, -1, 129, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, + 110, -1, 112, -1, -1, 112, 113, 117, 115, 119, + 120, 121, -1, 120, 124, 122, -1, -1, -1, 129, + -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, + 6, 141, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, - 6, -1, 162, -1, 164, 165, -1, -1, 168, -1, - 16, 17, 18, 19, 20, 21, 22, 23, 157, 158, - 159, 160, 161, -1, 163, 164, 165, 33, -1, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, -1, -1, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, -1, 163, 164, 165, -1, -1, 65, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, -1, -1, -1, 151, 152, 153, 154, + -1, -1, 162, -1, 164, 165, 166, -1, 168, -1, + 148, -1, -1, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 50, 163, 164, 165, 54, -1, + 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, + 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, + 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, + -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, + -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, + -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, + 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, + 146, -1, -1, -1, -1, -1, -1, -1, 154, -1, + -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, + -1, -1, 168, -1, -1, -1, 16, 17, 18, 19, + 20, 21, 22, 23, -1, -1, -1, -1, 50, -1, + -1, -1, 54, 33, 56, 57, 58, -1, -1, -1, + 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, + -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, + -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, + -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, + 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, + -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, + 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, + 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, + -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, + 162, -1, 164, 165, 166, -1, 168, 147, -1, -1, + -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 50, 163, 164, 165, 54, -1, 56, 57, + 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, + -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, + -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, + 108, -1, 110, -1, 112, -1, -1, -1, -1, 117, + -1, 119, 120, 121, -1, -1, 124, -1, -1, -1, + -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, + 4, 5, 6, 141, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, -1, 154, -1, -1, 157, + 158, 159, -1, -1, 162, -1, 164, 165, -1, -1, + 168, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, 47, -1, -1, 50, 51, 33, -1, + 54, -1, 56, 57, 58, 59, 60, -1, 62, 63, + -1, -1, 66, 67, -1, -1, 70, -1, -1, -1, + -1, 75, 76, 77, -1, -1, -1, -1, -1, -1, + 84, -1, -1, -1, -1, -1, -1, -1, -1, 10, + 11, 12, -1, -1, -1, -1, 100, -1, -1, -1, + -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, + -1, -1, 116, 117, -1, 119, 120, 121, -1, -1, + 124, 125, -1, -1, -1, 129, -1, -1, 132, 133, + 134, 135, 136, -1, -1, 139, -1, 141, 3, 4, + 5, 6, -1, 8, 9, 10, -1, -1, -1, -1, + 154, -1, -1, 157, 158, 76, 77, -1, 162, -1, + 164, -1, 147, -1, 168, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, - 165, 166, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, 108, -1, -1, -1, -1, -1, -1, 33, - -1, -1, 51, -1, -1, 54, -1, 56, 57, 58, - 59, -1, -1, -1, 63, -1, -1, 66, -1, -1, - -1, 70, -1, -1, -1, -1, -1, -1, 77, -1, - -1, 147, -1, -1, 150, 84, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, -1, 164, 165, - -1, 100, 168, -1, 10, 11, -1, -1, -1, -1, - -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, - 119, 120, -1, -1, -1, -1, 125, -1, -1, -1, - -1, -1, -1, -1, 133, 134, 135, 136, -1, -1, - 139, -1, 141, -1, -1, 51, -1, 146, 54, -1, - 56, 57, 58, 59, -1, -1, -1, 63, -1, -1, - 66, -1, -1, 162, 70, -1, 17, 151, 152, 153, - 154, 77, -1, 157, 158, 159, 160, 161, 84, 163, - 164, 165, 33, -1, -1, -1, -1, -1, -1, -1, - 10, 11, -1, -1, 100, -1, 47, -1, -1, -1, - -1, -1, -1, -1, -1, 111, -1, -1, -1, 60, - 61, -1, -1, 119, 120, -1, -1, -1, -1, 125, - -1, -1, -1, -1, -1, 76, -1, 133, 134, 135, - 136, 51, -1, 139, 54, 141, 56, 57, 58, 59, - -1, -1, -1, 63, -1, -1, 66, -1, -1, -1, - 70, -1, -1, -1, -1, 106, 162, 77, 109, -1, - -1, 112, -1, -1, 84, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, 128, -1, -1, - 100, -1, 33, -1, -1, -1, -1, -1, -1, 140, - -1, 111, -1, -1, -1, -1, -1, -1, -1, 119, - 120, -1, -1, 154, -1, 125, -1, -1, -1, -1, - -1, -1, -1, 133, 134, 135, 136, -1, -1, 139, - -1, 141, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, - -1, -1, 162, 16, 17, 18, 19, 20, 21, 22, - 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 33, 16, 17, 18, 19, 20, 21, 22, 23, -1, + 165, 166, -1, -1, -1, 50, -1, -1, -1, -1, + -1, 112, 113, 114, 115, -1, -1, 62, -1, 120, + -1, 122, 67, 17, 18, 19, 20, 21, 22, 23, + 75, 76, 133, -1, -1, -1, 81, 138, -1, 33, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, -1, 16, 17, 18, 19, + 20, 21, 22, 23, -1, 110, -1, 112, -1, -1, + -1, -1, 117, 33, -1, -1, 121, -1, -1, 124, + -1, -1, -1, -1, 129, -1, -1, -1, -1, -1, + -1, 54, -1, 56, 57, 58, -1, -1, -1, -1, + -1, -1, -1, 66, -1, -1, -1, -1, -1, 154, + -1, -1, 157, 158, 159, 6, -1, 162, -1, 164, + 165, 84, -1, 168, -1, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, 100, -1, -1, + -1, -1, 33, -1, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 119, 120, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 164, 165, -1, 136, 65, -1, -1, -1, 141, -1, + -1, 10, 11, 12, -1, -1, 10, 11, -1, -1, + -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, 164, 165, 166, 16, 17, 18, + 19, 20, 21, 22, 23, -1, -1, 108, -1, -1, + -1, -1, -1, -1, 33, -1, -1, 51, -1, -1, + 54, -1, 56, 57, 58, 59, -1, -1, -1, 63, + -1, -1, 66, -1, -1, -1, 70, 76, 77, -1, + -1, -1, -1, 77, -1, -1, 147, -1, -1, 150, + 84, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, -1, 164, 165, -1, 100, 168, -1, 10, + 11, -1, -1, 112, 113, -1, 115, 111, -1, -1, + -1, 120, -1, 122, -1, 119, 120, -1, -1, -1, + -1, 125, -1, -1, 133, -1, -1, -1, -1, 133, + 134, 135, 136, -1, -1, 139, -1, 141, -1, -1, + 51, -1, 146, 54, -1, 56, 57, 58, 59, -1, + -1, -1, 63, -1, -1, 66, -1, -1, 162, 70, + -1, -1, 151, 152, 153, 154, 77, -1, 157, 158, + 159, 160, 161, 84, 163, 164, 165, -1, -1, -1, + -1, -1, -1, -1, -1, 10, 11, -1, -1, 100, + -1, 54, -1, 56, 57, 58, -1, -1, -1, -1, + 111, -1, -1, 66, -1, -1, -1, -1, 119, 120, + -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, + -1, 84, 133, 134, 135, 136, 51, -1, 139, 54, + 141, 56, 57, 58, 59, -1, -1, 100, 63, -1, + -1, 66, 11, -1, -1, 70, -1, -1, -1, -1, + -1, 162, 77, -1, -1, -1, 119, 120, -1, 84, + 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, + -1, -1, -1, 136, -1, 100, -1, 33, 141, -1, + -1, -1, -1, -1, -1, 54, 111, 56, 57, 58, + -1, -1, -1, -1, 119, 120, -1, -1, -1, -1, + 125, 164, -1, 54, -1, 56, 57, 58, 133, 134, + 135, 136, -1, -1, 139, 84, 141, 16, 17, 18, + 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, + -1, 100, -1, 84, 33, -1, -1, 162, 16, 17, + 18, 19, 20, 21, 22, 23, -1, -1, -1, 100, + 119, 120, -1, -1, -1, 33, 16, 17, 18, 19, + 20, 21, 22, 23, -1, -1, -1, 136, 119, 120, + -1, -1, 141, 33, 16, 17, 18, 19, 20, 21, + 22, 23, -1, -1, -1, 136, -1, -1, -1, -1, + 141, 33, -1, -1, -1, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, + 166, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, -1, 163, 164, 165, 166, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - 164, 165, 166, -1, -1, -1, -1, -1, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, - 163, 164, 165, 166, -1, -1, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, - 165, 166, -1, -1, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, - -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, 163, 164, 165, 166, -1, -1, + -1, -1, -1, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, -1, 163, 164, 165, 166, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, 47, -1, 49, -1, -1, 52, - 53, -1, -1, -1, -1, -1, -1, 60, 61, -1, - -1, -1, -1, -1, -1, -1, 69, -1, 71, 72, - 73, 74, -1, -1, -1, 78, -1, -1, -1, -1, - 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 102, - 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, - 113, 114, 115, 116, -1, -1, -1, -1, -1, 122, - 123, 11, 12, 126, 127, 15, -1, 17, 131, -1, - -1, -1, -1, -1, 137, 138, -1, 140, 17, 18, - 19, 20, 21, 22, 23, 148, -1, -1, -1, -1, - -1, -1, -1, -1, 33, -1, -1, 47, -1, -1, - -1, 51, -1, -1, 54, -1, 56, 57, 58, 59, - 60, -1, -1, 63, -1, -1, 66, -1, -1, -1, - 70, 18, 19, 20, 21, 22, 23, 77, -1, -1, - -1, -1, -1, -1, 84, -1, 33, 18, 19, 20, + -1, 163, 164, 165, 166, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, - 100, -1, 33, 18, 19, 20, 21, 22, 23, -1, - -1, -1, -1, -1, -1, -1, 116, -1, 33, 119, - 120, -1, -1, -1, -1, 125, -1, 18, 19, 20, - 21, 22, 23, 133, 134, 135, 136, -1, -1, 139, - -1, 141, 33, 18, 19, 20, 21, 22, 23, -1, - -1, -1, -1, -1, 154, -1, -1, -1, 33, 159, - -1, -1, -1, 152, 153, 154, -1, -1, 157, 158, - 159, 160, 161, -1, 163, 164, 165, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, - -1, -1, -1, 154, 155, 156, 157, 158, 159, 160, - 161, -1, 163, 164, 165, -1, -1, 152, 153, 154, - -1, -1, 157, 158, 159, 160, 161, -1, 163, 164, - 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 6, -1, -1, -1, 155, 156, 157, 158, 159, 160, - 161, -1, 163, 164, 165, -1, -1, -1, 153, 154, - -1, -1, 157, 158, 159, 160, 161, 6, 163, 164, - 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 47, -1, 49, -1, -1, -1, 53, -1, -1, - -1, -1, -1, 154, 60, 61, 157, 158, 159, 160, - 161, -1, 163, 164, 165, 71, 72, 73, 47, -1, - 49, -1, -1, -1, 53, -1, -1, 83, -1, -1, - -1, 60, 61, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 71, 72, 73, -1, -1, -1, -1, 54, - 106, 56, 57, 58, 83, -1, -1, -1, -1, -1, - 116, -1, -1, -1, -1, -1, 122, -1, -1, -1, - 126, 127, 10, 11, 12, -1, -1, 106, -1, 84, - -1, -1, 138, -1, 140, -1, -1, 116, -1, -1, - -1, -1, -1, 122, -1, 100, -1, -1, 127, -1, - -1, 10, 11, 12, -1, -1, -1, -1, -1, 138, - -1, 140, -1, 51, 119, 120, 54, -1, 56, 57, - 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, - -1, 136, 70, -1, -1, -1, 141, -1, -1, 77, - -1, -1, 51, -1, -1, 54, 84, 56, 57, 58, - 59, 60, -1, -1, 63, -1, -1, 66, -1, 164, - -1, 70, 100, -1, -1, -1, -1, -1, 77, 54, - -1, 56, 57, 58, -1, 84, -1, -1, -1, -1, - -1, 119, 120, -1, -1, -1, -1, 125, -1, -1, - -1, 100, 10, 11, 12, 133, 134, 135, 136, 84, - -1, 139, -1, 141, -1, -1, -1, -1, -1, -1, - 119, 120, -1, -1, -1, 100, 125, -1, -1, -1, - -1, 10, 11, 12, 133, 134, 135, 136, -1, -1, - 139, -1, 141, 51, 119, 120, 54, -1, 56, 57, - 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, - -1, 136, 70, -1, -1, -1, 141, -1, -1, 77, - -1, -1, -1, -1, -1, 54, 84, 56, 57, 58, - 59, 60, -1, -1, -1, -1, -1, 66, -1, 164, - -1, -1, 100, -1, -1, -1, -1, -1, 77, 10, - 11, 12, -1, -1, -1, 84, -1, -1, -1, -1, - -1, 119, 120, -1, -1, -1, -1, 125, -1, -1, - -1, 100, -1, -1, -1, 133, 134, 135, 136, -1, - -1, 139, -1, 141, -1, -1, -1, -1, 11, 12, - 119, 120, 15, 54, -1, 56, 57, 58, -1, -1, - -1, -1, -1, -1, 133, 66, -1, 136, -1, -1, - 139, -1, 141, -1, -1, -1, 77, 11, 12, -1, - -1, 15, -1, 84, 47, -1, -1, -1, 51, -1, - -1, 54, -1, 56, 57, 58, 59, 60, -1, 100, - 63, -1, -1, 66, -1, -1, -1, 70, -1, -1, - -1, -1, -1, 47, 77, -1, -1, 51, 119, 120, - 54, 84, 56, 57, 58, 59, 60, -1, -1, 63, - -1, -1, 66, -1, -1, 136, 70, 100, 139, -1, - 141, -1, -1, 77, 54, -1, 56, 57, 58, -1, - 84, -1, -1, 116, -1, -1, 119, 120, -1, -1, - -1, -1, 125, -1, -1, -1, 100, -1, 11, 12, - 133, 134, 135, 136, 84, -1, 139, -1, 141, -1, - -1, -1, 116, -1, -1, 119, 120, -1, -1, -1, - 100, 125, -1, -1, -1, -1, -1, 11, 12, 133, - 134, 135, 136, -1, 47, 139, -1, 141, 51, 119, - 120, 54, -1, 56, 57, 58, 59, 60, -1, -1, - 63, -1, -1, 66, -1, -1, 136, 70, -1, -1, - -1, 141, -1, -1, 77, -1, -1, 51, -1, -1, - 54, 84, 56, 57, 58, 59, 60, -1, -1, 63, - -1, -1, 66, -1, 164, -1, 70, 100, -1, -1, - -1, -1, -1, 77, -1, -1, 10, 11, 12, -1, - 84, -1, -1, 116, -1, -1, 119, 120, -1, -1, - -1, -1, 125, 11, 12, -1, 100, -1, -1, -1, - 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, - -1, -1, -1, -1, -1, 119, 120, 11, 12, -1, - -1, 125, -1, -1, -1, -1, -1, -1, -1, 133, - 134, 135, 136, 51, -1, 139, 54, 141, 56, 57, - 58, 59, 76, 77, -1, 63, -1, -1, 66, -1, - -1, -1, 70, -1, -1, -1, -1, 51, -1, 77, - 54, -1, 56, 57, 58, 59, 84, -1, -1, 63, - -1, -1, 66, -1, -1, -1, 70, -1, 112, 113, - -1, 115, 100, 77, -1, -1, 120, -1, 122, -1, - 84, -1, -1, -1, -1, -1, -1, -1, 116, 133, - -1, 119, 120, 11, 138, -1, 100, 125, -1, -1, - -1, -1, -1, -1, -1, 133, 134, 135, 136, -1, - -1, 139, -1, 141, -1, 119, 120, -1, -1, -1, - -1, 125, 11, -1, -1, -1, -1, -1, -1, 133, - 134, 135, 136, 51, -1, 139, 54, 141, 56, 57, - 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, - -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, - -1, -1, 51, -1, -1, 54, 84, 56, 57, 58, - 59, 60, -1, -1, 63, -1, -1, 66, -1, -1, - -1, 70, 100, -1, -1, -1, -1, -1, 77, -1, - -1, 10, 11, 12, -1, 84, -1, -1, -1, -1, - -1, 119, 120, -1, -1, -1, -1, 125, 11, -1, - -1, 100, -1, -1, -1, 133, 134, 135, 136, -1, - -1, 139, -1, 141, -1, -1, -1, -1, -1, -1, - 119, 120, 11, -1, -1, -1, 125, -1, -1, -1, - 10, 11, 12, -1, 133, 134, 135, 136, 51, -1, - 139, 54, 141, 56, 57, 58, 59, 76, 77, -1, - 63, -1, -1, 66, -1, -1, -1, 70, -1, -1, - -1, -1, 51, -1, 77, 54, -1, 56, 57, 58, - 59, 84, -1, -1, 63, -1, -1, 66, -1, -1, - -1, 70, -1, 112, 113, -1, 115, 100, 77, -1, - -1, 120, -1, 122, -1, 84, 76, 77, -1, -1, - -1, -1, -1, -1, 133, -1, 119, 120, -1, 138, - -1, 100, 125, -1, -1, -1, -1, -1, -1, -1, - 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, - 119, 120, 112, 113, -1, 115, 125, -1, -1, -1, - 120, -1, 122, -1, 133, 134, 135, 136, -1, 47, - 139, 49, 141, 133, 52, 53, -1, -1, 138, -1, - -1, -1, 60, 61, -1, -1, -1, -1, -1, -1, - -1, 69, -1, 71, 72, 73, 74, -1, -1, -1, - 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, + -1, -1, 33, -1, -1, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, 166, 149, -1, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, 16, + 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, + -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, + 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, 164, 165, 47, -1, 49, -1, -1, + 52, 53, -1, -1, -1, -1, -1, -1, 60, 61, + -1, -1, -1, -1, -1, -1, -1, 69, -1, 71, + 72, 73, 74, -1, -1, -1, 78, -1, -1, -1, + -1, 83, -1, -1, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, + 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, + -1, 113, 114, 115, 116, -1, -1, -1, -1, -1, + 122, 123, 11, 12, 126, 127, 15, -1, 17, 131, + -1, -1, -1, -1, -1, 137, 138, -1, 140, -1, + -1, -1, 152, 153, 154, -1, 148, 157, 158, 159, + 160, 161, -1, 163, 164, 165, -1, -1, 47, -1, + -1, -1, 51, -1, -1, 54, -1, 56, 57, 58, + 59, 60, -1, -1, 63, -1, -1, 66, -1, -1, + -1, 70, 18, 19, 20, 21, 22, 23, 77, -1, + -1, -1, -1, -1, -1, 84, -1, 33, 18, 19, + 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, + -1, 100, -1, 33, 18, 19, 20, 21, 22, 23, + -1, 54, -1, 56, 57, 58, -1, 116, -1, 33, + 119, 120, -1, -1, -1, -1, 125, -1, 18, 19, + 20, 21, 22, 23, 133, 134, 135, 136, -1, -1, + 139, 84, 141, 33, 18, 19, 20, 21, 22, 23, + -1, -1, -1, -1, -1, 154, -1, 100, -1, 33, + 159, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 119, 120, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 136, -1, -1, -1, -1, 141, 10, + 11, 12, -1, -1, -1, -1, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, + -1, 164, 152, 153, 154, -1, -1, 157, 158, 159, + 160, 161, -1, 163, 164, 165, 47, -1, 49, 153, + 154, -1, -1, 157, 158, 159, 160, 161, -1, 163, + 164, 165, 6, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 154, 76, 77, 157, 158, 159, + 160, 161, -1, 163, 164, 165, -1, -1, -1, 6, + -1, -1, -1, 157, 158, 159, 160, 161, -1, 163, + 164, 165, -1, 47, -1, 49, -1, -1, -1, 53, + -1, 112, 113, -1, 115, -1, 60, 61, -1, 120, + -1, 122, -1, -1, -1, -1, -1, 71, 72, 73, + 47, -1, 49, -1, -1, -1, 53, -1, -1, 83, + 10, 11, 12, 60, 61, 146, -1, -1, -1, -1, + -1, -1, -1, -1, 71, 72, 73, -1, -1, -1, + -1, -1, 106, -1, -1, -1, 83, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, 47, 122, 49, + -1, -1, 126, 127, 10, 11, 12, -1, -1, 106, + -1, -1, -1, -1, 138, -1, 140, -1, -1, 116, + -1, -1, -1, -1, -1, 122, 76, 77, -1, -1, + 127, -1, -1, 10, 11, 12, -1, -1, -1, -1, + -1, 138, -1, 140, -1, 51, -1, -1, 54, -1, + 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, + 66, -1, 112, 113, 70, 115, -1, -1, -1, -1, + 120, 77, 122, -1, 51, -1, -1, 54, 84, 56, + 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, + -1, -1, -1, 70, 100, -1, -1, -1, -1, -1, + 77, 54, -1, 56, 57, 58, -1, 84, -1, -1, + -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, + -1, -1, -1, 100, 10, 11, 12, 133, 134, 135, + 136, 84, -1, 139, -1, 141, -1, -1, -1, -1, + -1, -1, 119, 120, -1, -1, -1, 100, 125, -1, + -1, -1, -1, 10, 11, 12, 133, 134, 135, 136, + -1, -1, 139, -1, 141, 51, 119, 120, 54, -1, + 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, + 66, -1, -1, 136, 70, -1, -1, -1, 141, -1, + -1, 77, -1, -1, -1, -1, -1, 54, 84, 56, + 57, 58, 59, 60, -1, -1, -1, -1, -1, 66, + -1, 164, -1, -1, 100, -1, -1, -1, -1, -1, + 77, 10, 11, 12, -1, -1, -1, 84, -1, -1, + -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, + -1, -1, -1, 100, -1, -1, -1, 133, 134, 135, + 136, -1, -1, 139, -1, 141, -1, -1, -1, -1, + 11, 12, 119, 120, 15, 54, -1, 56, 57, 58, + -1, -1, -1, -1, -1, -1, 133, 66, -1, 136, + -1, -1, 139, -1, 141, -1, -1, -1, 77, 11, + 12, -1, -1, 15, -1, 84, 47, -1, -1, -1, + 51, -1, -1, 54, -1, 56, 57, 58, 59, 60, + -1, 100, 63, -1, -1, 66, -1, -1, -1, 70, + -1, -1, -1, -1, -1, 47, 77, -1, -1, 51, + 119, 120, 54, 84, 56, 57, 58, 59, 60, -1, + -1, 63, -1, -1, 66, -1, -1, 136, 70, 100, + 139, -1, 141, -1, -1, 77, 54, -1, 56, 57, + 58, -1, 84, -1, -1, 116, -1, -1, 119, 120, + -1, -1, -1, -1, 125, -1, -1, -1, 100, -1, + 11, 12, 133, 134, 135, 136, 84, -1, 139, -1, + 141, -1, -1, -1, 116, -1, -1, 119, 120, -1, + -1, -1, 100, 125, 10, 11, 12, -1, -1, 11, + 12, 133, 134, 135, 136, -1, 47, 139, -1, 141, + 51, 119, 120, 54, -1, 56, 57, 58, 59, 60, + -1, -1, 63, -1, -1, 66, -1, -1, 136, 70, + -1, -1, -1, 141, -1, -1, 77, -1, -1, 51, + -1, -1, 54, 84, 56, 57, 58, 59, 60, -1, + -1, 63, -1, -1, 66, -1, 164, -1, 70, 100, + 76, 77, -1, -1, -1, 77, -1, -1, 10, 11, + 12, -1, 84, -1, -1, 116, -1, -1, 119, 120, + -1, -1, -1, -1, 125, 11, 12, -1, 100, -1, + -1, 107, 133, 134, 135, 136, 112, 113, 139, 115, + 141, -1, -1, -1, 120, -1, 122, 119, 120, 11, + 12, -1, -1, 125, -1, -1, -1, -1, -1, -1, + -1, 133, 134, 135, 136, 51, -1, 139, 54, 141, + 56, 57, 58, 59, 76, 77, -1, 63, -1, -1, + 66, -1, -1, -1, 70, -1, -1, -1, -1, 51, + -1, 77, 54, -1, 56, 57, 58, 59, 84, -1, + -1, 63, -1, -1, 66, -1, -1, -1, 70, -1, + 112, 113, -1, 115, 100, 77, -1, -1, 120, -1, + 122, -1, 84, -1, -1, -1, -1, -1, -1, -1, + 116, 133, -1, 119, 120, 11, 138, -1, 100, 125, + -1, -1, -1, -1, -1, -1, -1, 133, 134, 135, + 136, -1, -1, 139, -1, 141, -1, 119, 120, -1, + -1, -1, -1, 125, 11, -1, -1, -1, -1, -1, + -1, 133, 134, 135, 136, 51, -1, 139, 54, 141, + 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, + 66, -1, -1, -1, 70, -1, -1, -1, -1, -1, + -1, 77, -1, -1, 51, -1, -1, 54, 84, 56, + 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, + -1, -1, -1, 70, 100, -1, -1, -1, -1, -1, + 77, -1, -1, 10, 11, 12, -1, 84, -1, -1, + -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, + 11, -1, -1, 100, -1, -1, -1, 133, 134, 135, + 136, -1, -1, 139, -1, 141, -1, -1, -1, -1, + -1, -1, 119, 120, 11, -1, -1, -1, 125, -1, + -1, -1, 10, 11, 12, -1, 133, 134, 135, 136, + 51, -1, 139, 54, 141, 56, 57, 58, 59, 76, + 77, -1, 63, -1, -1, 66, -1, -1, -1, 70, + -1, -1, -1, -1, 51, -1, 77, 54, -1, 56, + 57, 58, 59, 84, -1, -1, 63, -1, -1, 66, + -1, -1, -1, 70, -1, 112, 113, -1, 115, 100, + 77, -1, -1, 120, -1, 122, -1, 84, 76, 77, + -1, -1, -1, -1, -1, -1, 133, -1, 119, 120, + -1, 138, -1, 100, 125, -1, -1, -1, -1, -1, + -1, -1, 133, 134, 135, 136, -1, -1, 139, -1, + 141, -1, 119, 120, 112, 113, -1, 115, 125, -1, + -1, -1, 120, -1, 122, -1, 133, 134, 135, 136, + -1, 47, 139, 49, 141, 133, 52, 53, -1, -1, + 138, -1, -1, -1, 60, 61, -1, -1, -1, -1, + -1, -1, -1, 69, -1, 71, 72, 73, 74, -1, + -1, -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, - -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, - -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, - -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, - 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, - 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, -1, -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, @@ -3348,42 +2825,45 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, - 138, -1, 140, 69, -1, 71, 72, 73, 74, 47, - 148, 49, 78, -1, -1, 53, -1, 83, -1, -1, - -1, -1, 60, 61, -1, -1, -1, -1, -1, 167, - -1, -1, -1, 71, 72, 73, 102, 103, 104, 105, - 106, 107, -1, -1, -1, 83, -1, 113, 114, 115, - 116, -1, -1, -1, -1, -1, 122, 123, -1, -1, - 126, 127, -1, -1, -1, 131, -1, -1, 106, -1, - -1, 137, 138, -1, 140, -1, -1, -1, 116, -1, - -1, -1, 148, -1, 122, -1, -1, -1, -1, 127, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 137, - 138, 167, 140, -1, -1, 47, -1, 49, -1, -1, - 52, 53, -1, -1, -1, -1, -1, 155, 60, 61, - -1, -1, -1, -1, -1, -1, -1, 69, -1, 71, - 72, 73, 74, 47, -1, 49, 78, -1, -1, 53, - -1, 83, -1, -1, -1, -1, 60, 61, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 71, 72, 73, - 102, 103, 104, 105, 106, 107, -1, -1, -1, 83, - -1, 113, 114, 115, 116, -1, -1, -1, -1, -1, - 122, 123, -1, -1, 126, 127, -1, -1, -1, 131, - -1, 47, 106, 49, -1, 137, 138, 53, 140, -1, - -1, -1, 116, -1, 60, 61, -1, -1, 122, -1, - -1, -1, 126, 127, -1, 71, 72, 73, -1, 47, - -1, 49, -1, 137, 138, 53, 140, 83, -1, -1, - -1, -1, 60, 61, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 71, 72, 73, -1, -1, -1, -1, - 106, 107, -1, -1, -1, 83, -1, -1, -1, -1, - 116, -1, -1, -1, -1, -1, 122, -1, -1, -1, - -1, 127, -1, -1, -1, -1, -1, -1, 106, -1, - -1, -1, 138, -1, 140, -1, -1, -1, 116, -1, - -1, -1, -1, -1, 122, -1, -1, -1, -1, 127, + 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, + 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, + -1, -1, -1, -1, -1, -1, 102, 103, 104, 105, + 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, + 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, + 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, + -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, + 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 138, -1, 140 + -1, 167, -1, -1, -1, -1, -1, -1, 102, 103, + 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, + 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, + -1, 53, 126, 127, 47, -1, 49, 131, 60, 61, + 53, -1, -1, 137, 138, -1, 140, 60, 61, 71, + 72, 73, -1, -1, 148, -1, 78, -1, 71, 72, + 73, 83, -1, -1, -1, 78, -1, -1, -1, -1, + 83, -1, -1, 167, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 106, -1, -1, -1, -1, -1, + -1, -1, -1, 106, 116, -1, -1, -1, -1, -1, + 122, -1, -1, 116, -1, 127, -1, -1, -1, 122, + -1, -1, -1, 126, 127, 137, 138, 47, 140, 49, + -1, -1, 52, 53, 137, 138, -1, 140, -1, -1, + 60, 61, -1, 155, -1, -1, -1, -1, -1, 69, + -1, 71, 72, 73, 74, 47, -1, 49, 78, -1, + -1, 53, -1, 83, 47, -1, 49, -1, 60, 61, + 53, -1, -1, -1, -1, -1, -1, 60, 61, 71, + 72, 73, 102, 103, 104, 105, 106, 107, 71, 72, + 73, 83, -1, 113, 114, 115, 116, -1, -1, -1, + 83, -1, 122, 123, -1, -1, 126, 127, -1, -1, + -1, 131, -1, -1, 106, 107, -1, 137, 138, -1, + 140, -1, -1, 106, 116, -1, -1, -1, -1, -1, + 122, -1, -1, 116, -1, 127, -1, -1, -1, 122, + -1, -1, -1, -1, 127, -1, 138, -1, 140, -1, + -1, -1, -1, -1, -1, 138, -1, 140 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { 0, 143, 144, 145, 171, 172, 277, 3, 4, 5, @@ -3418,154 +2898,302 @@ static const yytype_uint16 yystos[] = 277, 137, 181, 182, 274, 164, 72, 83, 180, 180, 180, 180, 6, 180, 201, 180, 149, 179, 107, 180, 164, 164, 164, 164, 180, 146, 274, 149, 149, 149, - 180, 180, 164, 180, 183, 202, 180, 180, 186, 107, - 274, 180, 180, 10, 11, 51, 63, 111, 133, 134, - 146, 162, 189, 192, 231, 233, 236, 238, 244, 249, - 250, 255, 264, 265, 277, 264, 234, 264, 264, 264, - 264, 234, 264, 234, 264, 234, 264, 234, 234, 234, + 180, 180, 164, 178, 180, 183, 202, 180, 180, 186, + 107, 274, 180, 180, 10, 11, 51, 63, 111, 133, + 134, 146, 162, 189, 192, 231, 233, 236, 238, 244, + 249, 250, 255, 264, 265, 277, 264, 234, 264, 264, + 264, 264, 234, 264, 234, 264, 234, 264, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 264, 164, 274, 164, 164, 274, 235, 234, - 264, 264, 164, 10, 234, 234, 234, 267, 264, 264, - 166, 147, 166, 274, 274, 147, 169, 150, 217, 277, + 234, 234, 234, 264, 164, 274, 164, 164, 274, 235, + 234, 264, 264, 164, 10, 234, 234, 234, 267, 264, + 264, 166, 147, 166, 274, 274, 147, 169, 150, 217, + 277, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 166, 265, 267, 228, 228, 51, 267, 234, + 159, 274, 13, 15, 17, 60, 140, 154, 159, 227, + 277, 227, 228, 227, 228, 227, 227, 15, 17, 47, + 60, 116, 154, 159, 212, 213, 222, 229, 230, 277, + 165, 247, 248, 277, 11, 246, 256, 149, 10, 11, + 12, 47, 49, 112, 146, 274, 275, 274, 48, 147, + 164, 11, 231, 267, 180, 177, 146, 274, 274, 274, + 274, 274, 172, 146, 267, 155, 10, 11, 192, 231, + 233, 274, 148, 150, 164, 164, 164, 60, 229, 274, + 164, 176, 274, 146, 148, 149, 150, 218, 146, 148, + 150, 219, 148, 184, 274, 275, 235, 167, 166, 166, + 166, 166, 166, 166, 156, 166, 156, 166, 166, 166, + 166, 147, 166, 147, 166, 147, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 267, 234, 264, + 274, 156, 166, 166, 274, 166, 166, 156, 166, 166, + 166, 166, 267, 267, 15, 154, 272, 164, 198, 277, + 267, 149, 166, 169, 166, 166, 166, 227, 159, 274, + 227, 227, 227, 227, 227, 165, 227, 181, 116, 229, + 230, 222, 227, 227, 166, 15, 147, 13, 17, 60, + 140, 154, 159, 164, 225, 275, 277, 13, 15, 17, + 60, 140, 154, 159, 164, 226, 263, 267, 277, 274, + 167, 246, 181, 164, 237, 239, 149, 180, 181, 3, + 4, 5, 9, 10, 15, 50, 62, 67, 75, 76, + 108, 110, 112, 117, 121, 124, 129, 132, 154, 157, + 158, 162, 164, 168, 214, 215, 222, 223, 269, 270, + 276, 277, 166, 166, 172, 146, 147, 147, 147, 147, + 167, 252, 147, 166, 10, 11, 12, 59, 60, 133, + 203, 204, 205, 206, 207, 255, 277, 164, 219, 187, + 148, 234, 190, 13, 159, 191, 51, 267, 229, 13, + 17, 60, 140, 154, 159, 224, 275, 277, 234, 172, + 164, 259, 260, 173, 174, 274, 64, 65, 259, 64, + 65, 146, 267, 13, 17, 60, 111, 140, 154, 159, + 164, 185, 208, 210, 275, 149, 274, 164, 164, 234, + 234, 234, 166, 166, 166, 164, 166, 164, 217, 212, + 17, 33, 47, 60, 61, 76, 106, 109, 112, 128, + 140, 154, 211, 277, 267, 227, 263, 166, 48, 229, + 230, 225, 226, 166, 166, 198, 15, 222, 159, 225, + 225, 225, 225, 225, 225, 165, 217, 159, 274, 226, + 226, 226, 226, 226, 226, 165, 217, 169, 147, 150, + 48, 231, 267, 172, 76, 240, 277, 182, 164, 155, + 155, 232, 155, 15, 164, 155, 164, 267, 267, 267, + 267, 234, 265, 267, 166, 15, 147, 16, 17, 18, + 19, 20, 21, 22, 23, 33, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 163, 164, 165, + 180, 180, 167, 253, 10, 10, 10, 10, 172, 276, + 148, 207, 156, 147, 15, 274, 13, 17, 60, 140, + 154, 159, 164, 225, 226, 188, 210, 148, 212, 159, + 208, 212, 166, 166, 224, 159, 224, 224, 224, 224, + 224, 164, 165, 166, 167, 193, 167, 261, 277, 146, + 147, 146, 164, 148, 148, 167, 148, 148, 146, 220, + 221, 267, 277, 148, 159, 208, 208, 6, 16, 17, + 18, 19, 20, 21, 22, 23, 33, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 65, + 108, 147, 150, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 164, 165, 168, 199, 208, 208, + 208, 208, 149, 164, 165, 211, 150, 217, 219, 246, + 265, 265, 166, 166, 166, 265, 265, 166, 60, 232, + 181, 164, 146, 169, 164, 222, 225, 226, 217, 217, + 164, 164, 211, 225, 166, 263, 226, 166, 263, 267, + 166, 166, 167, 149, 241, 242, 277, 234, 234, 234, + 164, 234, 164, 10, 234, 234, 234, 267, 166, 166, + 15, 223, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 166, 265, 267, 228, 228, 51, 267, 234, 159, - 274, 13, 15, 17, 60, 140, 154, 159, 227, 277, - 227, 228, 227, 228, 227, 227, 15, 17, 47, 60, - 116, 154, 159, 212, 213, 222, 229, 230, 277, 165, - 247, 248, 277, 11, 246, 256, 149, 10, 11, 12, - 47, 49, 112, 146, 274, 275, 274, 48, 147, 164, - 11, 231, 267, 180, 177, 146, 274, 274, 274, 274, - 274, 172, 146, 267, 155, 10, 11, 192, 231, 233, - 274, 148, 150, 164, 164, 164, 60, 229, 274, 164, - 176, 274, 146, 148, 149, 150, 218, 146, 148, 150, - 219, 148, 184, 274, 275, 235, 167, 166, 166, 166, - 166, 166, 166, 156, 166, 156, 166, 166, 166, 166, - 147, 166, 147, 166, 147, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 267, 234, 264, 274, - 156, 166, 166, 274, 166, 166, 156, 166, 166, 166, - 166, 267, 267, 15, 154, 272, 164, 198, 277, 267, - 149, 166, 169, 166, 166, 166, 227, 159, 274, 227, - 227, 227, 227, 227, 165, 227, 181, 116, 229, 230, - 222, 227, 227, 166, 15, 147, 13, 17, 60, 140, - 154, 159, 164, 225, 275, 277, 13, 15, 17, 60, - 140, 154, 159, 164, 226, 263, 267, 277, 274, 167, - 246, 181, 164, 237, 239, 149, 180, 181, 3, 4, - 5, 9, 10, 15, 50, 62, 67, 75, 76, 108, - 110, 112, 117, 121, 124, 129, 132, 154, 157, 158, - 162, 164, 168, 214, 215, 222, 223, 269, 270, 276, - 277, 166, 166, 172, 146, 147, 147, 147, 147, 167, - 252, 147, 166, 10, 11, 12, 59, 60, 133, 203, - 204, 205, 206, 207, 255, 277, 164, 219, 187, 148, - 234, 190, 13, 159, 191, 51, 267, 229, 13, 17, - 60, 140, 154, 159, 224, 275, 277, 234, 172, 164, - 259, 260, 173, 174, 274, 64, 65, 259, 64, 65, - 146, 267, 13, 17, 60, 111, 140, 154, 159, 164, - 185, 208, 210, 275, 149, 274, 164, 164, 234, 234, - 234, 166, 166, 166, 164, 166, 164, 217, 212, 17, - 33, 47, 60, 61, 76, 106, 109, 112, 128, 140, - 154, 211, 277, 267, 227, 263, 166, 48, 229, 230, - 225, 226, 166, 166, 198, 15, 222, 159, 225, 225, - 225, 225, 225, 225, 165, 217, 159, 274, 226, 226, - 226, 226, 226, 226, 165, 217, 169, 147, 150, 48, - 231, 267, 172, 76, 240, 277, 182, 164, 155, 155, - 232, 155, 15, 164, 155, 164, 267, 267, 267, 267, - 234, 265, 267, 166, 15, 147, 16, 17, 18, 19, - 20, 21, 22, 23, 33, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 163, 164, 165, 180, - 180, 167, 253, 10, 10, 10, 10, 172, 276, 148, - 207, 156, 147, 15, 274, 13, 17, 60, 140, 154, - 159, 164, 225, 226, 188, 210, 148, 212, 159, 208, - 212, 166, 166, 224, 159, 224, 224, 224, 224, 224, - 164, 165, 166, 167, 193, 167, 261, 277, 146, 147, - 146, 164, 148, 148, 167, 148, 148, 146, 220, 221, - 267, 277, 148, 159, 208, 208, 6, 16, 17, 18, - 19, 20, 21, 22, 23, 33, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 65, 108, - 147, 150, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 164, 165, 168, 199, 208, 208, 208, - 208, 149, 164, 165, 211, 150, 217, 219, 246, 265, - 265, 166, 166, 166, 265, 265, 166, 60, 232, 181, - 164, 146, 169, 164, 222, 225, 226, 217, 217, 164, - 164, 211, 225, 166, 263, 226, 166, 263, 267, 166, - 166, 167, 149, 241, 242, 277, 234, 234, 234, 164, - 234, 164, 10, 234, 234, 234, 267, 166, 166, 15, - 223, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 166, 265, 267, 172, 147, 166, 147, 147, - 147, 167, 166, 225, 226, 183, 200, 201, 206, 274, - 150, 159, 150, 216, 277, 217, 219, 166, 208, 166, - 166, 164, 224, 196, 263, 212, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 70, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 82, 83, 84, 100, 106, 107, 108, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 168, 169, 262, 259, 174, 264, 264, - 220, 167, 147, 208, 10, 166, 169, 166, 4, 209, - 263, 267, 147, 166, 166, 166, 166, 198, 232, 228, - 48, 166, 274, 259, 212, 217, 217, 212, 212, 164, - 169, 164, 169, 147, 113, 114, 115, 133, 138, 243, - 273, 274, 146, 147, 166, 156, 156, 264, 156, 274, - 166, 166, 156, 166, 166, 267, 149, 166, 169, 167, - 10, 148, 10, 10, 10, 148, 216, 234, 50, 62, - 67, 117, 121, 124, 154, 157, 158, 159, 162, 164, - 168, 266, 268, 147, 198, 166, 164, 198, 197, 212, - 169, 166, 261, 167, 167, 166, 167, 146, 267, 214, - 169, 185, 211, 228, 15, 166, 167, 166, 166, 166, - 212, 212, 138, 273, 138, 273, 138, 273, 274, 113, - 114, 115, 15, 172, 243, 164, 164, 166, 164, 166, - 164, 267, 147, 166, 147, 166, 166, 147, 166, 164, - 155, 155, 155, 15, 164, 155, 266, 266, 266, 266, - 266, 234, 265, 266, 16, 17, 18, 19, 20, 21, - 22, 23, 33, 151, 152, 153, 154, 157, 158, 159, - 160, 161, 163, 164, 165, 188, 164, 194, 212, 166, - 198, 167, 15, 220, 166, 146, 166, 198, 198, 198, - 166, 166, 273, 273, 273, 273, 273, 273, 167, 265, - 265, 265, 265, 10, 148, 10, 148, 148, 10, 148, - 234, 234, 234, 234, 164, 10, 234, 234, 166, 166, + 267, 267, 267, 166, 265, 267, 172, 147, 166, 147, + 147, 147, 167, 166, 225, 226, 178, 183, 200, 201, + 206, 274, 150, 159, 150, 216, 277, 217, 219, 166, + 208, 166, 166, 164, 224, 196, 263, 212, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 70, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 82, 83, 84, 100, 106, 107, + 108, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 168, 169, 262, 259, 174, + 264, 264, 220, 167, 147, 208, 10, 166, 169, 166, + 4, 209, 263, 267, 147, 166, 166, 166, 166, 198, + 232, 228, 48, 166, 274, 259, 212, 217, 217, 212, + 212, 164, 169, 164, 169, 147, 113, 114, 115, 133, + 138, 243, 273, 274, 146, 147, 166, 156, 156, 264, + 156, 274, 166, 166, 156, 166, 166, 267, 149, 166, + 169, 167, 10, 148, 10, 10, 10, 148, 216, 234, + 50, 62, 67, 117, 121, 124, 154, 157, 158, 159, + 162, 164, 168, 266, 268, 147, 198, 166, 164, 198, + 197, 212, 169, 166, 261, 167, 167, 166, 167, 146, + 267, 214, 169, 185, 211, 228, 15, 166, 167, 166, + 166, 166, 212, 212, 138, 273, 138, 273, 138, 273, + 274, 113, 114, 115, 15, 172, 243, 164, 164, 166, + 164, 166, 164, 267, 147, 166, 147, 166, 166, 147, + 166, 164, 155, 155, 155, 15, 164, 155, 266, 266, + 266, 266, 266, 234, 265, 266, 16, 17, 18, 19, + 20, 21, 22, 23, 33, 151, 152, 153, 154, 157, + 158, 159, 160, 161, 163, 164, 165, 188, 164, 194, + 212, 166, 198, 167, 15, 220, 166, 146, 166, 198, + 198, 198, 166, 166, 273, 273, 273, 273, 273, 273, + 167, 265, 265, 265, 265, 10, 148, 10, 148, 148, + 10, 148, 234, 234, 234, 234, 164, 10, 234, 234, + 166, 166, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 166, - 265, 267, 195, 212, 166, 198, 167, 198, 259, 211, - 211, 211, 198, 198, 166, 166, 166, 166, 166, 147, - 147, 166, 166, 156, 156, 156, 274, 166, 166, 156, - 266, 149, 166, 169, 212, 166, 198, 167, 148, 10, - 10, 148, 164, 164, 164, 166, 164, 266, 166, 198, - 166, 166, 265, 265, 265, 265, 198, 211, 148, 148, - 166, 166, 166, 166, 211 + 266, 166, 265, 267, 195, 212, 166, 198, 167, 198, + 259, 211, 211, 211, 198, 198, 166, 166, 166, 166, + 166, 147, 147, 166, 166, 156, 156, 156, 274, 166, + 166, 156, 266, 149, 166, 169, 212, 166, 198, 167, + 148, 10, 10, 148, 164, 164, 164, 166, 164, 266, + 166, 198, 166, 166, 265, 265, 265, 265, 198, 211, + 148, 148, 166, 166, 166, 166, 211 }; -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint16 yyr1[] = +{ + 0, 170, 171, 171, 171, 172, 172, 172, 173, 173, + 174, 174, 174, 176, 175, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 179, 178, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, + 182, 182, 182, 184, 183, 183, 183, 183, 183, 185, + 185, 187, 186, 186, 188, 188, 190, 189, 191, 189, + 193, 192, 194, 192, 195, 192, 196, 192, 197, 192, + 192, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 200, 200, 200, 201, 202, 201, + 201, 201, 203, 203, 204, 204, 205, 205, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, + 207, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 209, 208, 210, 210, 211, 211, 211, 212, + 212, 212, 212, 212, 213, 213, 214, 214, 214, 214, + 214, 215, 215, 216, 216, 217, 217, 218, 218, 218, + 218, 218, 219, 219, 219, 219, 219, 219, 220, 220, + 220, 221, 221, 221, 221, 222, 222, 222, 222, 222, + 222, 222, 222, 223, 223, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 230, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 232, 232, 232, 232, + 232, 232, 232, 232, 233, 233, 234, 234, 234, 234, + 235, 235, 235, 235, 237, 236, 239, 238, 240, 240, + 241, 241, 242, 242, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 244, 245, 245, 245, 245, 246, + 246, 247, 247, 247, 248, 248, 248, 249, 249, 249, + 250, 250, 250, 252, 251, 253, 251, 251, 251, 254, + 254, 254, 255, 255, 255, 256, 256, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 257, + 257, 257, 258, 260, 259, 261, 261, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 263, 263, 264, 264, + 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, + 272, 272, 272, 272, 273, 273, 273, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, + 275, 276, 276, 276, 276, 277 +}; -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 2, 2, 2, 1, 2, 2, 1, 3, + 4, 5, 4, 0, 5, 1, 1, 1, 1, 1, + 2, 1, 1, 2, 2, 2, 2, 7, 9, 11, + 9, 11, 13, 9, 13, 9, 7, 5, 0, 3, + 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 4, 5, 5, 1, 3, + 1, 4, 4, 0, 4, 3, 3, 3, 1, 2, + 4, 0, 4, 3, 2, 4, 0, 6, 0, 6, + 0, 7, 0, 11, 0, 12, 0, 8, 0, 9, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 4, 5, 6, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 2, 0, 6, + 2, 2, 1, 1, 1, 3, 1, 1, 1, 2, + 4, 2, 3, 3, 4, 2, 3, 1, 1, 1, + 1, 1, 2, 3, 2, 2, 2, 2, 2, 3, + 4, 3, 0, 6, 2, 3, 1, 3, 4, 1, + 1, 1, 3, 2, 1, 3, 1, 1, 1, 3, + 2, 1, 3, 1, 2, 1, 2, 1, 3, 5, + 3, 3, 1, 3, 3, 3, 3, 4, 1, 1, + 2, 1, 3, 3, 5, 3, 4, 5, 3, 4, + 5, 2, 4, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 3, 4, 1, 1, 2, 2, 2, 2, + 2, 3, 4, 7, 3, 1, 2, 2, 2, 2, + 2, 2, 3, 4, 7, 3, 1, 1, 2, 2, + 2, 2, 2, 2, 3, 4, 1, 1, 2, 2, + 2, 2, 2, 2, 3, 4, 5, 9, 9, 9, + 1, 1, 2, 1, 1, 1, 3, 4, 4, 4, + 4, 1, 1, 1, 1, 2, 1, 1, 1, 3, + 4, 2, 4, 4, 4, 1, 1, 1, 2, 3, + 2, 4, 4, 1, 1, 1, 2, 3, 2, 3, + 1, 4, 5, 5, 0, 6, 0, 9, 1, 1, + 1, 1, 2, 3, 1, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 4, 3, 1, 4, 2, 1, + 1, 1, 3, 5, 1, 2, 4, 1, 2, 2, + 1, 1, 1, 0, 6, 0, 7, 4, 5, 3, + 5, 4, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, + 1, 2, 1, 0, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, + 1, 3, 1, 4, 7, 7, 7, 7, 4, 4, + 5, 4, 2, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 5, 4, 4, 3, 3, 3, + 3, 1, 4, 7, 7, 7, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 5, 4, 2, 5, 4, 4, 2, + 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 5, 4, 4, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 8, 11, 4, 4, 6, 4, 4, 6, 6, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 4, 7, 7, 7, 7, 4, 4, 5, 4, + 2, 5, 4, 4, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, + 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, + 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 0 +}; -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. However, - YYFAIL appears to be in use. Nevertheless, it is formally deprecated - in Bison 2.4.2's NEWS entry, where a plan to phase it out is - discussed. */ +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab -#define YYFAIL goto yyerrlab -#if defined YYFAIL - /* This is here to suppress warnings from the GCC cpp's - -Wunused-macros. Normally we don't worry about that warning, but - some users do, and we want to make it easy for users to remove - YYFAIL uses, which will produce warnings from Bison 2.5. */ -#endif #define YYRECOVERING() (!!yyerrstatus) @@ -3581,14 +3209,14 @@ do \ } \ else \ { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) + yyerror (&yylloc, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (0) /* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 +#define YYTERROR 1 +#define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. @@ -3598,7 +3226,7 @@ while (YYID (0)) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ - if (YYID (N)) \ + if (N) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ @@ -3612,59 +3240,58 @@ while (YYID (0)) (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ - while (YYID (0)) + while (0) #endif #define YYRHSLOC(Rhs, K) ((Rhs)[K]) +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ -#ifndef __attribute__ -/* This feature is available in gcc versions 2.5 and later. */ -# if (! defined __GNUC__ || __GNUC__ < 2 \ - || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) -# define __attribute__(Spec) /* empty */ -# endif -#endif - #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ -__attribute__((__unused__)) -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +YY_ATTRIBUTE_UNUSED static unsigned yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) -#else -static unsigned -yy_location_print_ (yyo, yylocp) - FILE *yyo; - YYLTYPE const * const yylocp; -#endif { unsigned res = 0; int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; if (0 <= yylocp->first_line) { - res += fprintf (yyo, "%d", yylocp->first_line); + res += YYFPRINTF (yyo, "%d", yylocp->first_line); if (0 <= yylocp->first_column) - res += fprintf (yyo, ".%d", yylocp->first_column); + res += YYFPRINTF (yyo, ".%d", yylocp->first_column); } if (0 <= yylocp->last_line) { if (yylocp->first_line < yylocp->last_line) { - res += fprintf (yyo, "-%d", yylocp->last_line); + res += YYFPRINTF (yyo, "-%d", yylocp->last_line); if (0 <= end_col) - res += fprintf (yyo, ".%d", end_col); + res += YYFPRINTF (yyo, ".%d", end_col); } else if (0 <= end_col && yylocp->first_column < end_col) - res += fprintf (yyo, "-%d", end_col); + res += YYFPRINTF (yyo, "-%d", end_col); } return res; } @@ -3678,73 +3305,35 @@ yy_location_print_ (yyo, yylocp) #endif -/* YYLEX -- calling `yylex' with the right arguments. */ -#ifdef YYLEX_PARAM -# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) -#else -# define YYLEX yylex (&yylval, &yylloc) -#endif - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value, Location); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, Location); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +/*----------------------------------------. +| Print this symbol's value on YYOUTPUT. | +`----------------------------------------*/ -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; - YYLTYPE const * const yylocationp; -#endif { FILE *yyo = yyoutput; YYUSE (yyo); + YYUSE (yylocationp); if (!yyvaluep) return; - YYUSE (yylocationp); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); # endif - switch (yytype) - { - default: - break; - } + YYUSE (yytype); } @@ -3752,23 +3341,11 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) | Print this symbol on YYOUTPUT. | `--------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; - YYLTYPE const * const yylocationp; -#endif { - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + YYFPRINTF (yyoutput, "%s %s (", + yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); YY_LOCATION_PRINT (yyoutput, *yylocationp); YYFPRINTF (yyoutput, ": "); @@ -3781,16 +3358,8 @@ yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp) | TOP (included). | `------------------------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else -static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) @@ -3801,50 +3370,42 @@ yy_stack_print (yybottom, yytop) YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void -yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yylsp, yyrule) - YYSTYPE *yyvsp; - YYLTYPE *yylsp; - int yyrule; -#endif +yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule) { + unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; - unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - , &(yylsp[(yyi + 1) - (yynrhs)]) ); + yy_symbol_print (stderr, + yystos[yyssp[yyi + 1 - yynrhs]], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , &(yylsp[(yyi + 1) - (yynrhs)]) ); YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, yylsp, Rule); \ -} while (YYID (0)) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, yylsp, Rule); \ +} while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ @@ -3858,7 +3419,7 @@ int yydebug; /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif @@ -3881,15 +3442,8 @@ int yydebug; # define yystrlen strlen # else /* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) @@ -3905,16 +3459,8 @@ yystrlen (yystr) # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif { char *yyd = yydest; const char *yys = yysrc; @@ -3944,27 +3490,27 @@ yytnamerr (char *yyres, const char *yystr) char const *yyp = yystr; for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } do_not_strip_quotes: ; } @@ -3987,11 +3533,11 @@ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { - YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ - const char *yyformat = YY_NULL; + const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per @@ -3999,10 +3545,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, int yycount = 0; /* There are many possibilities here to consider: - - Assume YYFAIL is not used. It's too flawed to consider. See - - for details. YYERROR is fine as it does not invoke this - function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected @@ -4052,7 +3594,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, } yyarg[yycount++] = yytname[yyx]; { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; @@ -4119,33 +3661,18 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, | Release the memory associated to this symbol. | `-----------------------------------------------*/ -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) -#else -static void -yydestruct (yymsg, yytype, yyvaluep, yylocationp) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; - YYLTYPE *yylocationp; -#endif { YYUSE (yyvaluep); YYUSE (yylocationp); - if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - switch (yytype) - { - - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yytype); + YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -4155,66 +3682,27 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp) | yyparse. | `----------*/ -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) int yyparse (void) -#else -int -yyparse () - -#endif -#endif { /* The lookahead symbol. */ int yychar; -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else +/* The semantic value of the lookahead symbol. */ /* Default value used for initialization, for pacifying older GCCs or non-GCC compilers. */ -static YYSTYPE yyval_default; -# define YY_INITIAL_VALUE(Value) = Value -#endif +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + +/* Location data for the lookahead symbol. */ static YYLTYPE yyloc_default # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL = { 1, 1, 1, 1 } # endif ; -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); - -/* Location data for the lookahead symbol. */ YYLTYPE yylloc = yyloc_default; - /* Number of syntax errors so far. */ int yynerrs; @@ -4223,9 +3711,9 @@ YYLTYPE yylloc = yyloc_default; int yyerrstatus; /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. - `yyls': related to locations. + 'yyss': related to states. + 'yyvs': related to semantic values. + 'yyls': related to locations. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ @@ -4304,26 +3792,26 @@ YYLTYPE yylloc = yyloc_default; #ifdef yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - YYLTYPE *yyls1 = yyls; + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + YYLTYPE *yyls1 = yyls; - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yyls1, yysize * sizeof (*yylsp), - &yystacksize); + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yyls1, yysize * sizeof (*yylsp), + &yystacksize); - yyls = yyls1; - yyss = yyss1; - yyvs = yyvs1; + yyls = yyls1; + yyss = yyss1; + yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE @@ -4331,23 +3819,23 @@ YYLTYPE yylloc = yyloc_default; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); - YYSTACK_RELOCATE (yyls_alloc, yyls); + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); + YYSTACK_RELOCATE (yyls_alloc, yyls); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ @@ -4357,10 +3845,10 @@ YYLTYPE yylloc = yyloc_default; yylsp = yyls + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); @@ -4389,7 +3877,7 @@ yybackup: if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; + yychar = yylex (&yylval, &yylloc); } if (yychar <= YYEOF) @@ -4454,7 +3942,7 @@ yyreduce: yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. + '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison @@ -4469,65 +3957,64 @@ yyreduce: switch (yyn) { case 3: -/* Line 1792 of yacc.c */ -#line 450 "dtool/src/cppparser/cppBison.yxx" +#line 450 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_expr = (yyvsp[(2) - (2)].u.expr); + current_expr = (yyvsp[0].u.expr); } +#line 3965 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 4: -/* Line 1792 of yacc.c */ -#line 454 "dtool/src/cppparser/cppBison.yxx" +#line 454 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_type = (yyvsp[(2) - (2)].u.type); + current_type = (yyvsp[0].u.type); } +#line 3973 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 10: -/* Line 1792 of yacc.c */ -#line 472 "dtool/src/cppparser/cppBison.yxx" +#line 472 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - delete (yyvsp[(3) - (4)].u.expr); + delete (yyvsp[-1].u.expr); } +#line 3981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 11: -/* Line 1792 of yacc.c */ -#line 476 "dtool/src/cppparser/cppBison.yxx" +#line 476 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - delete (yyvsp[(3) - (5)].u.expr); + delete (yyvsp[-2].u.expr); } +#line 3989 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 12: -/* Line 1792 of yacc.c */ -#line 480 "dtool/src/cppparser/cppBison.yxx" +#line 480 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - delete (yyvsp[(3) - (4)].u.expr); + delete (yyvsp[-1].u.expr); } +#line 3997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 13: -/* Line 1792 of yacc.c */ -#line 492 "dtool/src/cppparser/cppBison.yxx" +#line 492 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { push_storage_class((current_storage_class & ~CPPInstance::SC_c_binding) | - ((yyvsp[(1) - (2)].u.integer) & CPPInstance::SC_c_binding)); + ((yyvsp[-1].u.integer) & CPPInstance::SC_c_binding)); } +#line 4006 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 14: -/* Line 1792 of yacc.c */ -#line 497 "dtool/src/cppparser/cppBison.yxx" +#line 497 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_storage_class(); } +#line 4014 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 21: -/* Line 1792 of yacc.c */ -#line 510 "dtool/src/cppparser/cppBison.yxx" +#line 510 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (publish_nest_level != 0) { yyerror("Unclosed __begin_publish", publish_loc); @@ -4536,36 +4023,36 @@ yyreduce: } publish_previous = current_scope->get_current_vis(); - publish_loc = (yylsp[(1) - (1)]); + publish_loc = (yylsp[0]); publish_nest_level++; current_scope->set_current_vis(V_published); } +#line 4031 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 22: -/* Line 1792 of yacc.c */ -#line 523 "dtool/src/cppparser/cppBison.yxx" +#line 523 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (publish_nest_level != 1) { - yyerror("Unmatched __end_publish", (yylsp[(1) - (1)])); + yyerror("Unmatched __end_publish", (yylsp[0])); } else { current_scope->set_current_vis(publish_previous); } publish_nest_level = 0; } +#line 4044 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 23: -/* Line 1792 of yacc.c */ -#line 532 "dtool/src/cppparser/cppBison.yxx" +#line 532 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_scope->set_current_vis(V_published); } +#line 4052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 24: -/* Line 1792 of yacc.c */ -#line 536 "dtool/src/cppparser/cppBison.yxx" +#line 536 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (publish_nest_level > 0) { current_scope->set_current_vis(V_published); @@ -4573,684 +4060,684 @@ yyreduce: current_scope->set_current_vis(V_public); } } +#line 4064 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 25: -/* Line 1792 of yacc.c */ -#line 544 "dtool/src/cppparser/cppBison.yxx" +#line 544 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_scope->set_current_vis(V_protected); } +#line 4072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 26: -/* Line 1792 of yacc.c */ -#line 548 "dtool/src/cppparser/cppBison.yxx" +#line 548 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_scope->set_current_vis(V_private); } +#line 4080 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 27: -/* Line 1792 of yacc.c */ -#line 552 "dtool/src/cppparser/cppBison.yxx" +#line 552 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *getter = (yyvsp[(5) - (7)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[(5) - (7)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (7)])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (7)].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[(1) - (7)]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (7)])); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-4].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[-6]).file); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-6])); } +#line 4095 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 28: -/* Line 1792 of yacc.c */ -#line 563 "dtool/src/cppparser/cppBison.yxx" +#line 563 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *getter = (yyvsp[(5) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[-4].u.identifier)->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: " + (yyvsp[(5) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } else { - CPPDeclaration *setter = (yyvsp[(7) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[(7) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (9)])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); } else { setter_func = setter->as_function_group(); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (9)].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[(1) - (9)]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (9)])); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), getter->as_function_group(), + setter_func, current_scope, (yylsp[-8]).file); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } } +#line 4120 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 29: -/* Line 1792 of yacc.c */ -#line 584 "dtool/src/cppparser/cppBison.yxx" +#line 584 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *getter = (yyvsp[(5) - (11)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[-6].u.identifier)->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: " + (yyvsp[(5) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (11)])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); } else { - CPPDeclaration *setter = (yyvsp[(7) - (11)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[-4].u.identifier)->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: " + (yyvsp[(7) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (11)])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } else { setter_func = setter->as_function_group(); } - CPPDeclaration *deleter = (yyvsp[(9) - (11)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *deleter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[(9) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(9) - (11)])); + yyerror("reference to non-existent or invalid delete method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); deleter = NULL; } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (11)].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[(1) - (11)]).file); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-8].u.identifier), getter->as_function_group(), + setter_func, current_scope, (yylsp[-10]).file); if (deleter) { make_property->_del_function = deleter->as_function_group(); } - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (11)])); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); } } +#line 4154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 30: -/* Line 1792 of yacc.c */ -#line 614 "dtool/src/cppparser/cppBison.yxx" +#line 614 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *length_getter = (yyvsp[(5) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *length_getter = (yyvsp[-4].u.identifier)->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: " + (yyvsp[(5) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); + yyerror("reference to non-existent or invalid length method: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); length_getter = NULL; } - CPPDeclaration *getter = (yyvsp[(7) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[(7) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (9)])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (9)].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[(1) - (9)]).file); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[-8]).file); make_property->_length_function = length_getter->as_function_group(); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (9)])); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } +#line 4175 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 31: -/* Line 1792 of yacc.c */ -#line 631 "dtool/src/cppparser/cppBison.yxx" +#line 631 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *length_getter = (yyvsp[(5) - (11)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *length_getter = (yyvsp[-6].u.identifier)->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: " + (yyvsp[(5) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (11)])); + yyerror("reference to non-existent or invalid length method: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); length_getter = NULL; } - CPPDeclaration *getter = (yyvsp[(7) - (11)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[-4].u.identifier)->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: " + (yyvsp[(7) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (11)])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } else { - CPPDeclaration *setter = (yyvsp[(9) - (11)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[(9) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(9) - (11)])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); } else { setter_func = setter->as_function_group(); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (11)].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[(1) - (11)]).file); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-8].u.identifier), getter->as_function_group(), + setter_func, current_scope, (yylsp[-10]).file); make_property->_length_function = length_getter->as_function_group(); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (11)])); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); } } +#line 4207 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 32: -/* Line 1792 of yacc.c */ -#line 659 "dtool/src/cppparser/cppBison.yxx" +#line 659 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *length_getter = (yyvsp[(5) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *length_getter = (yyvsp[-8].u.identifier)->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: " + (yyvsp[(5) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (13)])); + yyerror("reference to non-existent or invalid length method: " + (yyvsp[-8].u.identifier)->get_fully_scoped_name(), (yylsp[-8])); length_getter = NULL; } - CPPDeclaration *getter = (yyvsp[(7) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[-6].u.identifier)->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: " + (yyvsp[(7) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (13)])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); } else { - CPPDeclaration *setter = (yyvsp[(9) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[-4].u.identifier)->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: " + (yyvsp[(9) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(9) - (13)])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } else { setter_func = setter->as_function_group(); } - CPPDeclaration *deleter = (yyvsp[(11) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *deleter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[(11) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(11) - (13)])); + yyerror("reference to non-existent or invalid delete method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); deleter = NULL; } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[(3) - (13)].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[(1) - (13)]).file); + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-10].u.identifier), getter->as_function_group(), + setter_func, current_scope, (yylsp[-12]).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, (yylsp[(1) - (13)])); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); } } +#line 4248 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 33: -/* Line 1792 of yacc.c */ -#line 696 "dtool/src/cppparser/cppBison.yxx" +#line 696 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *hasser = (yyvsp[(5) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *hasser = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (hasser == (CPPDeclaration *)NULL || hasser->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[(5) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); + yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } - CPPDeclaration *getter = (yyvsp[(7) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[(7) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (9)])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); } if (hasser && getter) { CPPMakeProperty *make_property; - make_property = new CPPMakeProperty((yyvsp[(3) - (9)].u.identifier), + make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), hasser->as_function_group(), getter->as_function_group(), NULL, NULL, - current_scope, (yylsp[(1) - (9)]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (9)])); + current_scope, (yylsp[-8]).file); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } } +#line 4274 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 34: -/* Line 1792 of yacc.c */ -#line 718 "dtool/src/cppparser/cppBison.yxx" +#line 718 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *hasser = (yyvsp[(5) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *hasser = (yyvsp[-8].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (hasser == (CPPDeclaration *)NULL || hasser->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[(5) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (13)])); + yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[-8].u.identifier)->get_fully_scoped_name(), (yylsp[-8])); } - CPPDeclaration *getter = (yyvsp[(7) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *getter = (yyvsp[-6].u.identifier)->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: " + (yyvsp[(7) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(7) - (13)])); + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); } - CPPDeclaration *setter = (yyvsp[(9) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid setter: " + (yyvsp[(9) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(9) - (13)])); + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } - CPPDeclaration *clearer = (yyvsp[(11) - (13)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *clearer = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (clearer == (CPPDeclaration *)NULL || clearer->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid clear-function: " + (yyvsp[(11) - (13)].u.identifier)->get_fully_scoped_name(), (yylsp[(11) - (13)])); + yyerror("Reference to non-existent or invalid clear-function: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); } if (hasser && getter && setter && clearer) { CPPMakeProperty *make_property; - make_property = new CPPMakeProperty((yyvsp[(3) - (13)].u.identifier), + make_property = new CPPMakeProperty((yyvsp[-10].u.identifier), hasser->as_function_group(), getter->as_function_group(), setter->as_function_group(), clearer->as_function_group(), - current_scope, (yylsp[(1) - (13)]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[(1) - (13)])); + current_scope, (yylsp[-12]).file); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); } } +#line 4311 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 35: -/* Line 1792 of yacc.c */ -#line 751 "dtool/src/cppparser/cppBison.yxx" +#line 751 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *length_getter = (yyvsp[(5) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *length_getter = (yyvsp[-4].u.identifier)->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: " + (yyvsp[(5) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); + yyerror("reference to non-existent or invalid length method: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); length_getter = NULL; } - CPPDeclaration *element_getter = (yyvsp[(7) - (9)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *element_getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (element_getter == (CPPDeclaration *)NULL || element_getter->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("reference to non-existent or invalid element method: " + (yyvsp[(7) - (9)].u.identifier)->get_fully_scoped_name(), (yylsp[(5) - (9)])); + yyerror("reference to non-existent or invalid element method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); element_getter = NULL; } if (length_getter != (CPPDeclaration *)NULL && element_getter != (CPPDeclaration *)NULL) { - CPPMakeSeq *make_seq = new CPPMakeSeq((yyvsp[(3) - (9)].u.identifier), + CPPMakeSeq *make_seq = new CPPMakeSeq((yyvsp[-6].u.identifier), length_getter->as_function_group(), element_getter->as_function_group(), - current_scope, (yylsp[(1) - (9)]).file); - current_scope->add_declaration(make_seq, global_scope, current_lexer, (yylsp[(1) - (9)])); + current_scope, (yylsp[-8]).file); + current_scope->add_declaration(make_seq, global_scope, current_lexer, (yylsp[-8])); } } +#line 4337 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 36: -/* Line 1792 of yacc.c */ -#line 773 "dtool/src/cppparser/cppBison.yxx" +#line 773 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPExpression::Result result = (yyvsp[(3) - (7)].u.expr)->evaluate(); + CPPExpression::Result result = (yyvsp[-4].u.expr)->evaluate(); if (result._type == CPPExpression::RT_error) { - yywarning("static_assert requires a constant expression", (yylsp[(3) - (7)])); + yywarning("static_assert requires a constant expression", (yylsp[-4])); } else if (!result.as_boolean()) { stringstream str; - str << *(yyvsp[(5) - (7)].u.expr); - yywarning("static_assert failed: " + str.str(), (yylsp[(3) - (7)])); + str << *(yyvsp[-2].u.expr); + yywarning("static_assert failed: " + str.str(), (yylsp[-4])); } } +#line 4352 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 37: -/* Line 1792 of yacc.c */ -#line 784 "dtool/src/cppparser/cppBison.yxx" +#line 784 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This alternative version of static_assert was introduced in C++17. - CPPExpression::Result result = (yyvsp[(3) - (5)].u.expr)->evaluate(); + CPPExpression::Result result = (yyvsp[-2].u.expr)->evaluate(); if (result._type == CPPExpression::RT_error) { - yywarning("static_assert requires a constant expression", (yylsp[(3) - (5)])); + yywarning("static_assert requires a constant expression", (yylsp[-2])); } else if (!result.as_boolean()) { - yywarning("static_assert failed", (yylsp[(3) - (5)])); + yywarning("static_assert failed", (yylsp[-2])); } } +#line 4366 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 38: -/* Line 1792 of yacc.c */ -#line 797 "dtool/src/cppparser/cppBison.yxx" +#line 797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPScope *new_scope = new CPPScope(current_scope, CPPNameComponent("temp"), V_public); push_scope(new_scope); } +#line 4376 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 39: -/* Line 1792 of yacc.c */ -#line 803 "dtool/src/cppparser/cppBison.yxx" +#line 803 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { delete current_scope; pop_scope(); } +#line 4385 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 40: -/* Line 1792 of yacc.c */ -#line 812 "dtool/src/cppparser/cppBison.yxx" +#line 812 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = 0; } +#line 4393 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 41: -/* Line 1792 of yacc.c */ -#line 816 "dtool/src/cppparser/cppBison.yxx" +#line 816 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This isn't really a storage class, but it helps with parsing. - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_const; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_const; } +#line 4402 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 42: -/* Line 1792 of yacc.c */ -#line 821 "dtool/src/cppparser/cppBison.yxx" +#line 821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_extern; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extern; } +#line 4410 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 43: -/* Line 1792 of yacc.c */ -#line 825 "dtool/src/cppparser/cppBison.yxx" +#line 825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(3) - (3)].u.integer) | (int)CPPInstance::SC_extern; - if ((yyvsp[(2) - (3)].str) == "C") { + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extern; + if ((yyvsp[-1].str) == "C") { (yyval.u.integer) |= (int)CPPInstance::SC_c_binding; - } else if ((yyvsp[(2) - (3)].str) == "C++") { + } else if ((yyvsp[-1].str) == "C++") { (yyval.u.integer) &= ~(int)CPPInstance::SC_c_binding; } else { - yywarning("Ignoring unknown linkage type \"" + (yyvsp[(2) - (3)].str) + "\"", (yylsp[(2) - (3)])); + yywarning("Ignoring unknown linkage type \"" + (yyvsp[-1].str) + "\"", (yylsp[-1])); } } +#line 4425 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 44: -/* Line 1792 of yacc.c */ -#line 836 "dtool/src/cppparser/cppBison.yxx" +#line 836 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_static; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_static; } +#line 4433 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 45: -/* Line 1792 of yacc.c */ -#line 840 "dtool/src/cppparser/cppBison.yxx" +#line 840 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_inline; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_inline; } +#line 4441 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 46: -/* Line 1792 of yacc.c */ -#line 844 "dtool/src/cppparser/cppBison.yxx" +#line 844 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_virtual; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_virtual; } +#line 4449 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 47: -/* Line 1792 of yacc.c */ -#line 848 "dtool/src/cppparser/cppBison.yxx" +#line 848 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_explicit; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_explicit; } +#line 4457 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 48: -/* Line 1792 of yacc.c */ -#line 852 "dtool/src/cppparser/cppBison.yxx" +#line 852 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_register; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_register; } +#line 4465 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 49: -/* Line 1792 of yacc.c */ -#line 856 "dtool/src/cppparser/cppBison.yxx" +#line 856 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_volatile; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_volatile; } +#line 4473 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 50: -/* Line 1792 of yacc.c */ -#line 860 "dtool/src/cppparser/cppBison.yxx" +#line 860 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_mutable; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_mutable; } +#line 4481 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 51: -/* Line 1792 of yacc.c */ -#line 864 "dtool/src/cppparser/cppBison.yxx" +#line 864 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_constexpr; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_constexpr; } +#line 4489 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 52: -/* Line 1792 of yacc.c */ -#line 868 "dtool/src/cppparser/cppBison.yxx" +#line 868 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_blocking; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_blocking; } +#line 4497 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 53: -/* Line 1792 of yacc.c */ -#line 872 "dtool/src/cppparser/cppBison.yxx" +#line 872 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_extension; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extension; } +#line 4505 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 54: -/* Line 1792 of yacc.c */ -#line 876 "dtool/src/cppparser/cppBison.yxx" +#line 876 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(2) - (2)].u.integer) | (int)CPPInstance::SC_thread_local; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_thread_local; } +#line 4513 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 55: -/* Line 1792 of yacc.c */ -#line 880 "dtool/src/cppparser/cppBison.yxx" +#line 880 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Ignore attribute specifiers for now. - (yyval.u.integer) = (yyvsp[(4) - (4)].u.integer); + (yyval.u.integer) = (yyvsp[0].u.integer); } +#line 4522 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 56: -/* Line 1792 of yacc.c */ -#line 885 "dtool/src/cppparser/cppBison.yxx" +#line 885 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(5) - (5)].u.integer); + (yyval.u.integer) = (yyvsp[0].u.integer); } +#line 4530 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 57: -/* Line 1792 of yacc.c */ -#line 889 "dtool/src/cppparser/cppBison.yxx" +#line 889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(5) - (5)].u.integer); + (yyval.u.integer) = (yyvsp[0].u.integer); } +#line 4538 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 63: -/* Line 1792 of yacc.c */ -#line 907 "dtool/src/cppparser/cppBison.yxx" +#line 907 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We don't need to push/pop type, because we can't nest // type_like_declaration. - if ((yyvsp[(2) - (2)].u.decl)->as_type_declaration()) { - current_type = (yyvsp[(2) - (2)].u.decl)->as_type_declaration()->_type; + if ((yyvsp[0].u.decl)->as_type_declaration()) { + current_type = (yyvsp[0].u.decl)->as_type_declaration()->_type; } else { - current_type = (yyvsp[(2) - (2)].u.decl)->as_type(); + current_type = (yyvsp[0].u.decl)->as_type(); } - push_storage_class((yyvsp[(1) - (2)].u.integer)); + push_storage_class((yyvsp[-1].u.integer)); } +#line 4553 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 64: -/* Line 1792 of yacc.c */ -#line 918 "dtool/src/cppparser/cppBison.yxx" +#line 918 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_storage_class(); } +#line 4561 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 65: -/* Line 1792 of yacc.c */ -#line 923 "dtool/src/cppparser/cppBison.yxx" +#line 923 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We don't really care about the storage class here. In fact, it's // not actually legal to define a class or struct using a particular // storage class, but we require it just to help yacc out in its // parsing. - current_scope->add_declaration((yyvsp[(2) - (3)].u.decl), global_scope, current_lexer, (yylsp[(2) - (3)])); + current_scope->add_declaration((yyvsp[-1].u.decl), global_scope, current_lexer, (yylsp[-1])); } +#line 4574 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 66: -/* Line 1792 of yacc.c */ -#line 932 "dtool/src/cppparser/cppBison.yxx" +#line 932 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - if ((yyvsp[(2) - (3)].u.instance) != (CPPInstance *)NULL) { - (yyvsp[(2) - (3)].u.instance)->_storage_class |= (current_storage_class | (yyvsp[(1) - (3)].u.integer)); - current_scope->add_declaration((yyvsp[(2) - (3)].u.instance), global_scope, current_lexer, (yylsp[(2) - (3)])); - (yyvsp[(2) - (3)].u.instance)->set_initializer((yyvsp[(3) - (3)].u.expr)); + if ((yyvsp[-1].u.instance) != (CPPInstance *)NULL) { + (yyvsp[-1].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); + current_scope->add_declaration((yyvsp[-1].u.instance), global_scope, current_lexer, (yylsp[-1])); + (yyvsp[-1].u.instance)->set_initializer((yyvsp[0].u.expr)); } } +#line 4586 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 67: -/* Line 1792 of yacc.c */ -#line 940 "dtool/src/cppparser/cppBison.yxx" +#line 940 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - if ((yyvsp[(2) - (3)].u.instance) != (CPPInstance *)NULL) { - (yyvsp[(2) - (3)].u.instance)->_storage_class |= (current_storage_class | (yyvsp[(1) - (3)].u.integer)); - current_scope->add_declaration((yyvsp[(2) - (3)].u.instance), global_scope, current_lexer, (yylsp[(2) - (3)])); - (yyvsp[(2) - (3)].u.instance)->set_initializer((yyvsp[(3) - (3)].u.expr)); + if ((yyvsp[-1].u.instance) != (CPPInstance *)NULL) { + (yyvsp[-1].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); + current_scope->add_declaration((yyvsp[-1].u.instance), global_scope, current_lexer, (yylsp[-1])); + (yyvsp[-1].u.instance)->set_initializer((yyvsp[0].u.expr)); } } +#line 4598 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 69: -/* Line 1792 of yacc.c */ -#line 956 "dtool/src/cppparser/cppBison.yxx" +#line 956 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { - (yyvsp[(1) - (2)].u.inst_ident)->add_modifier(IIT_const); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); } - CPPInstance *inst = new CPPInstance(current_type, (yyvsp[(1) - (2)].u.inst_ident), + CPPInstance *inst = new CPPInstance(current_type, (yyvsp[-1].u.inst_ident), current_storage_class, - (yylsp[(1) - (2)]).file); - inst->set_initializer((yyvsp[(2) - (2)].u.expr)); - current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[(1) - (2)])); + (yylsp[-1]).file); + inst->set_initializer((yyvsp[0].u.expr)); + current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-1])); } +#line 4613 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 70: -/* Line 1792 of yacc.c */ -#line 967 "dtool/src/cppparser/cppBison.yxx" +#line 967 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { - (yyvsp[(1) - (4)].u.inst_ident)->add_modifier(IIT_const); + (yyvsp[-3].u.inst_ident)->add_modifier(IIT_const); } - CPPInstance *inst = new CPPInstance(current_type, (yyvsp[(1) - (4)].u.inst_ident), + CPPInstance *inst = new CPPInstance(current_type, (yyvsp[-3].u.inst_ident), current_storage_class, - (yylsp[(1) - (4)]).file); - inst->set_initializer((yyvsp[(2) - (4)].u.expr)); - current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[(1) - (4)])); + (yylsp[-3]).file); + inst->set_initializer((yyvsp[-2].u.expr)); + current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-3])); } +#line 4628 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 71: -/* Line 1792 of yacc.c */ -#line 982 "dtool/src/cppparser/cppBison.yxx" +#line 982 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We don't need to push/pop type, because we can't nest // multiple_var_declarations. - if ((yyvsp[(2) - (2)].u.decl)->as_type_declaration()) { - current_type = (yyvsp[(2) - (2)].u.decl)->as_type_declaration()->_type; + if ((yyvsp[0].u.decl)->as_type_declaration()) { + current_type = (yyvsp[0].u.decl)->as_type_declaration()->_type; } else { - current_type = (yyvsp[(2) - (2)].u.decl)->as_type(); + current_type = (yyvsp[0].u.decl)->as_type(); } - push_storage_class((yyvsp[(1) - (2)].u.integer)); + push_storage_class((yyvsp[-1].u.integer)); } +#line 4643 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 72: -/* Line 1792 of yacc.c */ -#line 993 "dtool/src/cppparser/cppBison.yxx" +#line 993 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_storage_class(); } +#line 4651 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 73: -/* Line 1792 of yacc.c */ -#line 997 "dtool/src/cppparser/cppBison.yxx" +#line 997 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - if ((yyvsp[(2) - (3)].u.instance) != (CPPDeclaration *)NULL) { - CPPInstance *inst = (yyvsp[(2) - (3)].u.instance)->as_instance(); + if ((yyvsp[-1].u.instance) != (CPPDeclaration *)NULL) { + CPPInstance *inst = (yyvsp[-1].u.instance)->as_instance(); if (inst != (CPPInstance *)NULL) { - inst->_storage_class |= (current_storage_class | (yyvsp[(1) - (3)].u.integer)); - current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[(2) - (3)])); + inst->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); + current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-1])); CPPTypedefType *typedef_type = new CPPTypedefType(inst->_type, inst->_ident, current_scope); - current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[(2) - (3)])); + current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-1])); } } } +#line 4667 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 74: -/* Line 1792 of yacc.c */ -#line 1012 "dtool/src/cppparser/cppBison.yxx" +#line 1012 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { - (yyvsp[(1) - (2)].u.inst_ident)->add_modifier(IIT_const); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); } CPPType *target_type = current_type; - CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[(1) - (2)].u.inst_ident), current_scope, (yylsp[(1) - (2)]).file); - current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[(1) - (2)])); + CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-1].u.inst_ident), current_scope, (yylsp[-1]).file); + current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-1])); } +#line 4680 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 75: -/* Line 1792 of yacc.c */ -#line 1021 "dtool/src/cppparser/cppBison.yxx" +#line 1021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { - (yyvsp[(1) - (4)].u.inst_ident)->add_modifier(IIT_const); + (yyvsp[-3].u.inst_ident)->add_modifier(IIT_const); } CPPType *target_type = current_type; - CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[(1) - (4)].u.inst_ident), current_scope, (yylsp[(1) - (4)]).file); - current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[(1) - (4)])); + CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-3].u.inst_ident), current_scope, (yylsp[-3]).file); + current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-3])); } +#line 4693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 76: -/* Line 1792 of yacc.c */ -#line 1035 "dtool/src/cppparser/cppBison.yxx" +#line 1035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - push_scope((yyvsp[(1) - (2)].u.identifier)->get_scope(current_scope, global_scope)); + push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } +#line 4701 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 77: -/* Line 1792 of yacc.c */ -#line 1039 "dtool/src/cppparser/cppBison.yxx" +#line 1039 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type; - if ((yyvsp[(1) - (6)].u.identifier)->get_simple_name() == current_scope->get_simple_name() || - (yyvsp[(1) - (6)].u.identifier)->get_simple_name() == string("~") + current_scope->get_simple_name()) { + if ((yyvsp[-5].u.identifier)->get_simple_name() == current_scope->get_simple_name() || + (yyvsp[-5].u.identifier)->get_simple_name() == string("~") + current_scope->get_simple_name()) { // This is a constructor, and has no return. type = new CPPSimpleType(CPPSimpleType::T_void); } else { // This isn't a constructor, so it has an implicit return type of // int. - yywarning("function has no return type, assuming int", (yylsp[(1) - (6)])); + yywarning("function has no return type, assuming int", (yylsp[-5])); type = new CPPSimpleType(CPPSimpleType::T_int); } pop_scope(); - CPPInstanceIdentifier *ii = new CPPInstanceIdentifier((yyvsp[(1) - (6)].u.identifier)); - ii->add_func_modifier((yyvsp[(4) - (6)].u.param_list), (yyvsp[(6) - (6)].u.integer)); + CPPInstanceIdentifier *ii = new CPPInstanceIdentifier((yyvsp[-5].u.identifier)); + ii->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(1) - (6)]).file); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } +#line 4725 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 78: -/* Line 1792 of yacc.c */ -#line 1059 "dtool/src/cppparser/cppBison.yxx" +#line 1059 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - push_scope((yyvsp[(1) - (2)].u.identifier)->get_scope(current_scope, global_scope)); + push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } +#line 4733 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 79: -/* Line 1792 of yacc.c */ -#line 1063 "dtool/src/cppparser/cppBison.yxx" +#line 1063 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); CPPType *type; - if ((yyvsp[(1) - (6)].u.identifier)->get_simple_name() == current_scope->get_simple_name()) { + if ((yyvsp[-5].u.identifier)->get_simple_name() == current_scope->get_simple_name()) { // This is a constructor, and has no return. type = new CPPSimpleType(CPPSimpleType::T_void); } else { @@ -5259,111 +4746,111 @@ yyreduce: type = new CPPSimpleType(CPPSimpleType::T_int); } - CPPInstanceIdentifier *ii = new CPPInstanceIdentifier((yyvsp[(1) - (6)].u.identifier)); - ii->add_func_modifier((yyvsp[(4) - (6)].u.param_list), (yyvsp[(6) - (6)].u.integer)); + CPPInstanceIdentifier *ii = new CPPInstanceIdentifier((yyvsp[-5].u.identifier)); + ii->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(1) - (6)]).file); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } +#line 4755 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 80: -/* Line 1792 of yacc.c */ -#line 1086 "dtool/src/cppparser/cppBison.yxx" +#line 1086 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - push_scope((yyvsp[(2) - (3)].u.identifier)->get_scope(current_scope, global_scope)); + push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } +#line 4763 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 81: -/* Line 1792 of yacc.c */ -#line 1090 "dtool/src/cppparser/cppBison.yxx" +#line 1090 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); - if ((yyvsp[(2) - (7)].u.identifier)->is_scoped()) { - yyerror("Invalid destructor name: ~" + (yyvsp[(2) - (7)].u.identifier)->get_fully_scoped_name(), (yylsp[(2) - (7)])); + if ((yyvsp[-5].u.identifier)->is_scoped()) { + yyerror("Invalid destructor name: ~" + (yyvsp[-5].u.identifier)->get_fully_scoped_name(), (yylsp[-5])); } else { CPPIdentifier *ident = - new CPPIdentifier("~" + (yyvsp[(2) - (7)].u.identifier)->get_simple_name(), (yylsp[(2) - (7)])); - delete (yyvsp[(2) - (7)].u.identifier); + new CPPIdentifier("~" + (yyvsp[-5].u.identifier)->get_simple_name(), (yylsp[-5])); + delete (yyvsp[-5].u.identifier); CPPType *type; type = new CPPSimpleType(CPPSimpleType::T_void); CPPInstanceIdentifier *ii = new CPPInstanceIdentifier(ident); - ii->add_func_modifier((yyvsp[(5) - (7)].u.param_list), (yyvsp[(7) - (7)].u.integer)); + ii->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(2) - (7)]).file); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } } +#line 4786 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 82: -/* Line 1792 of yacc.c */ -#line 1116 "dtool/src/cppparser/cppBison.yxx" +#line 1116 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - push_scope((yyvsp[(4) - (6)].u.inst_ident)->get_scope(current_scope, global_scope)); + push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); } +#line 4794 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 83: -/* Line 1792 of yacc.c */ -#line 1120 "dtool/src/cppparser/cppBison.yxx" +#line 1120 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); - CPPType *type = (yyvsp[(1) - (11)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + CPPType *type = (yyvsp[-10].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (11)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (11)])); + yyerror(string("internal error resolving type ") + (yyvsp[-10].u.identifier)->get_fully_scoped_name(), (yylsp[-10])); } assert(type != NULL); - CPPInstanceIdentifier *ii = (yyvsp[(4) - (11)].u.inst_ident); + CPPInstanceIdentifier *ii = (yyvsp[-7].u.inst_ident); ii->add_modifier(IIT_pointer); - ii->add_func_modifier((yyvsp[(8) - (11)].u.param_list), (yyvsp[(10) - (11)].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(1) - (11)]).file); + ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-10]).file); } +#line 4812 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 84: -/* Line 1792 of yacc.c */ -#line 1134 "dtool/src/cppparser/cppBison.yxx" +#line 1134 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - push_scope((yyvsp[(5) - (7)].u.inst_ident)->get_scope(current_scope, global_scope)); + push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); } +#line 4820 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 85: -/* Line 1792 of yacc.c */ -#line 1138 "dtool/src/cppparser/cppBison.yxx" +#line 1138 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); - CPPType *type = (yyvsp[(1) - (12)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + CPPType *type = (yyvsp[-11].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (12)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (12)])); + yyerror(string("internal error resolving type ") + (yyvsp[-11].u.identifier)->get_fully_scoped_name(), (yylsp[-11])); } assert(type != NULL); - CPPInstanceIdentifier *ii = (yyvsp[(5) - (12)].u.inst_ident); - ii->add_scoped_pointer_modifier((yyvsp[(3) - (12)].u.identifier)); - ii->add_func_modifier((yyvsp[(9) - (12)].u.param_list), (yyvsp[(11) - (12)].u.integer)); - (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[(1) - (12)]).file); + CPPInstanceIdentifier *ii = (yyvsp[-7].u.inst_ident); + ii->add_scoped_pointer_modifier((yyvsp[-9].u.identifier)); + ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); + (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-11]).file); } +#line 4838 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 86: -/* Line 1792 of yacc.c */ -#line 1154 "dtool/src/cppparser/cppBison.yxx" +#line 1154 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - if ((yyvsp[(1) - (4)].u.identifier) != NULL) { - push_scope((yyvsp[(1) - (4)].u.identifier)->get_scope(current_scope, global_scope)); + if ((yyvsp[-3].u.identifier) != NULL) { + push_scope((yyvsp[-3].u.identifier)->get_scope(current_scope, global_scope)); } } +#line 4848 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 87: -/* Line 1792 of yacc.c */ -#line 1160 "dtool/src/cppparser/cppBison.yxx" +#line 1160 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - if ((yyvsp[(1) - (8)].u.identifier) != NULL) { + if ((yyvsp[-7].u.identifier) != NULL) { pop_scope(); } @@ -5376,772 +4863,772 @@ yyreduce: // We give typecast operators the name "operator typecast ", // where is a simple name of the type to be typecast. Use // the method's return type to determine the full type description. - string name = "operator typecast " + (yyvsp[(2) - (8)].u.type)->get_simple_name(); - CPPIdentifier *ident = (yyvsp[(1) - (8)].u.identifier); + string name = "operator typecast " + (yyvsp[-6].u.type)->get_simple_name(); + CPPIdentifier *ident = (yyvsp[-7].u.identifier); if (ident == NULL) { - ident = new CPPIdentifier(name, (yylsp[(2) - (8)])); + ident = new CPPIdentifier(name, (yylsp[-6])); } else { ident->add_name(name); } (yyval.u.instance) = CPPInstance::make_typecast_function - (new CPPInstance((yyvsp[(2) - (8)].u.type), (yyvsp[(3) - (8)].u.inst_ident), 0, (yylsp[(3) - (8)]).file), ident, (yyvsp[(6) - (8)].u.param_list), (yyvsp[(8) - (8)].u.integer)); + (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } +#line 4877 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 88: -/* Line 1792 of yacc.c */ -#line 1185 "dtool/src/cppparser/cppBison.yxx" +#line 1185 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - if ((yyvsp[(1) - (5)].u.identifier) != NULL) { - push_scope((yyvsp[(1) - (5)].u.identifier)->get_scope(current_scope, global_scope)); + if ((yyvsp[-4].u.identifier) != NULL) { + push_scope((yyvsp[-4].u.identifier)->get_scope(current_scope, global_scope)); } } +#line 4887 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 89: -/* Line 1792 of yacc.c */ -#line 1191 "dtool/src/cppparser/cppBison.yxx" +#line 1191 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - if ((yyvsp[(1) - (9)].u.identifier) != NULL) { + if ((yyvsp[-8].u.identifier) != NULL) { pop_scope(); } - CPPIdentifier *ident = (yyvsp[(1) - (9)].u.identifier); + CPPIdentifier *ident = (yyvsp[-8].u.identifier); if (ident == NULL) { - ident = new CPPIdentifier("operator typecast", (yylsp[(4) - (9)])); + ident = new CPPIdentifier("operator typecast", (yylsp[-5])); } else { ident->add_name("operator typecast"); } - (yyvsp[(4) - (9)].u.inst_ident)->add_modifier(IIT_const); + (yyvsp[-5].u.inst_ident)->add_modifier(IIT_const); (yyval.u.instance) = CPPInstance::make_typecast_function - (new CPPInstance((yyvsp[(3) - (9)].u.type), (yyvsp[(4) - (9)].u.inst_ident), 0, (yylsp[(4) - (9)]).file), ident, (yyvsp[(7) - (9)].u.param_list), (yyvsp[(9) - (9)].u.integer)); + (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } +#line 4907 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 90: -/* Line 1792 of yacc.c */ -#line 1211 "dtool/src/cppparser/cppBison.yxx" +#line 1211 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *decl = - (yyvsp[(1) - (1)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + (yyvsp[0].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (decl != (CPPDeclaration *)NULL) { (yyval.u.instance) = decl->as_instance(); } else { (yyval.u.instance) = (CPPInstance *)NULL; } } +#line 4921 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 91: -/* Line 1792 of yacc.c */ -#line 1224 "dtool/src/cppparser/cppBison.yxx" +#line 1224 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = 0; } +#line 4929 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 92: -/* Line 1792 of yacc.c */ -#line 1228 "dtool/src/cppparser/cppBison.yxx" +#line 1228 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_const_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_const_method; } +#line 4937 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 93: -/* Line 1792 of yacc.c */ -#line 1232 "dtool/src/cppparser/cppBison.yxx" +#line 1232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_volatile_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_volatile_method; } +#line 4945 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 94: -/* Line 1792 of yacc.c */ -#line 1236 "dtool/src/cppparser/cppBison.yxx" +#line 1236 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_noexcept; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_noexcept; } +#line 4953 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 95: -/* Line 1792 of yacc.c */ -#line 1249 "dtool/src/cppparser/cppBison.yxx" +#line 1249 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_final; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_final; } +#line 4961 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 96: -/* Line 1792 of yacc.c */ -#line 1253 "dtool/src/cppparser/cppBison.yxx" +#line 1253 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_override; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_override; } +#line 4969 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 97: -/* Line 1792 of yacc.c */ -#line 1257 "dtool/src/cppparser/cppBison.yxx" +#line 1257 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_lvalue_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_lvalue_method; } +#line 4977 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 98: -/* Line 1792 of yacc.c */ -#line 1261 "dtool/src/cppparser/cppBison.yxx" +#line 1261 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer) | (int)CPPFunctionType::F_rvalue_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_rvalue_method; } +#line 4985 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 99: -/* Line 1792 of yacc.c */ -#line 1265 "dtool/src/cppparser/cppBison.yxx" +#line 1265 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Used for lambdas, currently ignored. - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer); + (yyval.u.integer) = (yyvsp[-1].u.integer); } +#line 4994 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 100: -/* Line 1792 of yacc.c */ -#line 1270 "dtool/src/cppparser/cppBison.yxx" +#line 1270 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Used for lambdas in C++17, currently ignored. - (yyval.u.integer) = (yyvsp[(1) - (2)].u.integer); + (yyval.u.integer) = (yyvsp[-1].u.integer); } +#line 5003 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 101: -/* Line 1792 of yacc.c */ -#line 1275 "dtool/src/cppparser/cppBison.yxx" +#line 1275 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (4)].u.integer); + (yyval.u.integer) = (yyvsp[-3].u.integer); } +#line 5011 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 102: -/* Line 1792 of yacc.c */ -#line 1279 "dtool/src/cppparser/cppBison.yxx" +#line 1279 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (5)].u.integer); + (yyval.u.integer) = (yyvsp[-4].u.integer); } +#line 5019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 103: -/* Line 1792 of yacc.c */ -#line 1283 "dtool/src/cppparser/cppBison.yxx" +#line 1283 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (6)].u.integer); + (yyval.u.integer) = (yyvsp[-5].u.integer); } +#line 5027 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 104: -/* Line 1792 of yacc.c */ -#line 1287 "dtool/src/cppparser/cppBison.yxx" +#line 1287 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[(1) - (4)].u.integer); + (yyval.u.integer) = (yyvsp[-3].u.integer); } +#line 5035 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 105: -/* Line 1792 of yacc.c */ -#line 1294 "dtool/src/cppparser/cppBison.yxx" +#line 1294 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "!"; } +#line 5043 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 106: -/* Line 1792 of yacc.c */ -#line 1298 "dtool/src/cppparser/cppBison.yxx" +#line 1298 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "~"; } +#line 5051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 107: -/* Line 1792 of yacc.c */ -#line 1302 "dtool/src/cppparser/cppBison.yxx" +#line 1302 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "*"; } +#line 5059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 108: -/* Line 1792 of yacc.c */ -#line 1306 "dtool/src/cppparser/cppBison.yxx" +#line 1306 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "/"; } +#line 5067 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 109: -/* Line 1792 of yacc.c */ -#line 1310 "dtool/src/cppparser/cppBison.yxx" +#line 1310 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "%"; } +#line 5075 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 110: -/* Line 1792 of yacc.c */ -#line 1314 "dtool/src/cppparser/cppBison.yxx" +#line 1314 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "+"; } +#line 5083 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 111: -/* Line 1792 of yacc.c */ -#line 1318 "dtool/src/cppparser/cppBison.yxx" +#line 1318 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "-"; } +#line 5091 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 112: -/* Line 1792 of yacc.c */ -#line 1322 "dtool/src/cppparser/cppBison.yxx" +#line 1322 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "|"; } +#line 5099 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 113: -/* Line 1792 of yacc.c */ -#line 1326 "dtool/src/cppparser/cppBison.yxx" +#line 1326 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "&"; } +#line 5107 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 114: -/* Line 1792 of yacc.c */ -#line 1330 "dtool/src/cppparser/cppBison.yxx" +#line 1330 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "^"; } +#line 5115 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 115: -/* Line 1792 of yacc.c */ -#line 1334 "dtool/src/cppparser/cppBison.yxx" +#line 1334 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "||"; } +#line 5123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 116: -/* Line 1792 of yacc.c */ -#line 1338 "dtool/src/cppparser/cppBison.yxx" +#line 1338 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "&&"; } +#line 5131 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 117: -/* Line 1792 of yacc.c */ -#line 1342 "dtool/src/cppparser/cppBison.yxx" +#line 1342 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "=="; } +#line 5139 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 118: -/* Line 1792 of yacc.c */ -#line 1346 "dtool/src/cppparser/cppBison.yxx" +#line 1346 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "!="; } +#line 5147 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 119: -/* Line 1792 of yacc.c */ -#line 1350 "dtool/src/cppparser/cppBison.yxx" +#line 1350 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "<="; } +#line 5155 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 120: -/* Line 1792 of yacc.c */ -#line 1354 "dtool/src/cppparser/cppBison.yxx" +#line 1354 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = ">="; } +#line 5163 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 121: -/* Line 1792 of yacc.c */ -#line 1358 "dtool/src/cppparser/cppBison.yxx" +#line 1358 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "<"; } +#line 5171 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 122: -/* Line 1792 of yacc.c */ -#line 1362 "dtool/src/cppparser/cppBison.yxx" +#line 1362 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = ">"; } +#line 5179 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 123: -/* Line 1792 of yacc.c */ -#line 1366 "dtool/src/cppparser/cppBison.yxx" +#line 1366 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "<<"; } +#line 5187 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 124: -/* Line 1792 of yacc.c */ -#line 1370 "dtool/src/cppparser/cppBison.yxx" +#line 1370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = ">>"; } +#line 5195 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 125: -/* Line 1792 of yacc.c */ -#line 1374 "dtool/src/cppparser/cppBison.yxx" +#line 1374 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "="; } +#line 5203 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 126: -/* Line 1792 of yacc.c */ -#line 1378 "dtool/src/cppparser/cppBison.yxx" +#line 1378 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = ","; } +#line 5211 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 127: -/* Line 1792 of yacc.c */ -#line 1382 "dtool/src/cppparser/cppBison.yxx" +#line 1382 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "++"; } +#line 5219 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 128: -/* Line 1792 of yacc.c */ -#line 1386 "dtool/src/cppparser/cppBison.yxx" +#line 1386 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "--"; } +#line 5227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 129: -/* Line 1792 of yacc.c */ -#line 1390 "dtool/src/cppparser/cppBison.yxx" +#line 1390 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "*="; } +#line 5235 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 130: -/* Line 1792 of yacc.c */ -#line 1394 "dtool/src/cppparser/cppBison.yxx" +#line 1394 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "/="; } +#line 5243 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 131: -/* Line 1792 of yacc.c */ -#line 1398 "dtool/src/cppparser/cppBison.yxx" +#line 1398 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "%="; } +#line 5251 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 132: -/* Line 1792 of yacc.c */ -#line 1402 "dtool/src/cppparser/cppBison.yxx" +#line 1402 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "+="; } +#line 5259 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 133: -/* Line 1792 of yacc.c */ -#line 1406 "dtool/src/cppparser/cppBison.yxx" +#line 1406 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "-="; } +#line 5267 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 134: -/* Line 1792 of yacc.c */ -#line 1410 "dtool/src/cppparser/cppBison.yxx" +#line 1410 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "|="; } +#line 5275 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 135: -/* Line 1792 of yacc.c */ -#line 1414 "dtool/src/cppparser/cppBison.yxx" +#line 1414 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "&="; } +#line 5283 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 136: -/* Line 1792 of yacc.c */ -#line 1418 "dtool/src/cppparser/cppBison.yxx" +#line 1418 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "^="; } +#line 5291 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 137: -/* Line 1792 of yacc.c */ -#line 1422 "dtool/src/cppparser/cppBison.yxx" +#line 1422 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "<<="; } +#line 5299 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 138: -/* Line 1792 of yacc.c */ -#line 1426 "dtool/src/cppparser/cppBison.yxx" +#line 1426 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = ">>="; } +#line 5307 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 139: -/* Line 1792 of yacc.c */ -#line 1430 "dtool/src/cppparser/cppBison.yxx" +#line 1430 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "->"; } +#line 5315 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 140: -/* Line 1792 of yacc.c */ -#line 1434 "dtool/src/cppparser/cppBison.yxx" +#line 1434 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "[]"; } +#line 5323 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 141: -/* Line 1792 of yacc.c */ -#line 1438 "dtool/src/cppparser/cppBison.yxx" +#line 1438 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "()"; } +#line 5331 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 142: -/* Line 1792 of yacc.c */ -#line 1442 "dtool/src/cppparser/cppBison.yxx" +#line 1442 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "new"; } +#line 5339 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 143: -/* Line 1792 of yacc.c */ -#line 1446 "dtool/src/cppparser/cppBison.yxx" +#line 1446 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "delete"; } - break; - - case 147: -/* Line 1792 of yacc.c */ -#line 1459 "dtool/src/cppparser/cppBison.yxx" - { - push_scope(new CPPTemplateScope(current_scope)); -} +#line 5347 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 148: -/* Line 1792 of yacc.c */ -#line 1463 "dtool/src/cppparser/cppBison.yxx" +#line 1460 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + push_scope(new CPPTemplateScope(current_scope)); +} +#line 5355 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 149: +#line 1464 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); } +#line 5363 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 152: -/* Line 1792 of yacc.c */ -#line 1476 "dtool/src/cppparser/cppBison.yxx" + case 154: +#line 1478 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPTemplateScope *ts = current_scope->as_template_scope(); assert(ts != NULL); - ts->add_template_parameter((yyvsp[(1) - (1)].u.decl)); + ts->add_template_parameter((yyvsp[0].u.decl)); } +#line 5373 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 153: -/* Line 1792 of yacc.c */ -#line 1482 "dtool/src/cppparser/cppBison.yxx" + case 155: +#line 1484 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPTemplateScope *ts = current_scope->as_template_scope(); assert(ts != NULL); - ts->add_template_parameter((yyvsp[(3) - (3)].u.decl)); -} - break; - - case 156: -/* Line 1792 of yacc.c */ -#line 1496 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); -} - break; - - case 157: -/* Line 1792 of yacc.c */ -#line 1500 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[(2) - (2)].u.identifier))); + ts->add_template_parameter((yyvsp[0].u.decl)); } +#line 5383 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 158: -/* Line 1792 of yacc.c */ -#line 1504 "dtool/src/cppparser/cppBison.yxx" +#line 1498 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[(2) - (4)].u.identifier), (yyvsp[(4) - (4)].u.type))); + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); } +#line 5391 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 159: -/* Line 1792 of yacc.c */ -#line 1508 "dtool/src/cppparser/cppBison.yxx" +#line 1502 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[0].u.identifier))); +} +#line 5399 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 160: +#line 1506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[-2].u.identifier), (yyvsp[0].u.type))); +} +#line 5407 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 161: +#line 1510 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((CPPIdentifier *)NULL); ctp->_packed = true; (yyval.u.decl) = CPPType::new_type(ctp); } - break; - - case 160: -/* Line 1792 of yacc.c */ -#line 1514 "dtool/src/cppparser/cppBison.yxx" - { - CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[(3) - (3)].u.identifier)); - ctp->_packed = true; - (yyval.u.decl) = CPPType::new_type(ctp); -} - break; - - case 161: -/* Line 1792 of yacc.c */ -#line 1520 "dtool/src/cppparser/cppBison.yxx" - { - CPPInstance *inst = new CPPInstance((yyvsp[(1) - (3)].u.type), (yyvsp[(2) - (3)].u.inst_ident), 0, (yylsp[(2) - (3)]).file); - inst->set_initializer((yyvsp[(3) - (3)].u.expr)); - (yyval.u.decl) = inst; -} +#line 5417 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 162: -/* Line 1792 of yacc.c */ -#line 1526 "dtool/src/cppparser/cppBison.yxx" +#line 1516 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(3) - (4)].u.inst_ident)->add_modifier(IIT_const); - CPPInstance *inst = new CPPInstance((yyvsp[(2) - (4)].u.type), (yyvsp[(3) - (4)].u.inst_ident), 0, (yylsp[(3) - (4)]).file); - inst->set_initializer((yyvsp[(4) - (4)].u.expr)); - (yyval.u.decl) = inst; + CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[0].u.identifier)); + ctp->_packed = true; + (yyval.u.decl) = CPPType::new_type(ctp); } +#line 5427 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 163: -/* Line 1792 of yacc.c */ -#line 1533 "dtool/src/cppparser/cppBison.yxx" +#line 1522 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPInstance *inst = new CPPInstance((yyvsp[(1) - (2)].u.type), (yyvsp[(2) - (2)].u.inst_ident), 0, (yylsp[(2) - (2)]).file); + CPPInstance *inst = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + inst->set_initializer((yyvsp[0].u.expr)); (yyval.u.decl) = inst; } +#line 5437 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 164: -/* Line 1792 of yacc.c */ -#line 1538 "dtool/src/cppparser/cppBison.yxx" +#line 1528 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(3) - (3)].u.inst_ident)->add_modifier(IIT_const); - CPPInstance *inst = new CPPInstance((yyvsp[(2) - (3)].u.type), (yyvsp[(3) - (3)].u.inst_ident), 0, (yylsp[(3) - (3)]).file); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + CPPInstance *inst = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + inst->set_initializer((yyvsp[0].u.expr)); (yyval.u.decl) = inst; } +#line 5448 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 165: -/* Line 1792 of yacc.c */ -#line 1547 "dtool/src/cppparser/cppBison.yxx" +#line 1535 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); + CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); + (yyval.u.decl) = inst; } +#line 5457 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 166: -/* Line 1792 of yacc.c */ -#line 1551 "dtool/src/cppparser/cppBison.yxx" +#line 1540 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - yywarning("Not a type: " + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); + (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); + CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); + (yyval.u.decl) = inst; } +#line 5467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 167: -/* Line 1792 of yacc.c */ -#line 1556 "dtool/src/cppparser/cppBison.yxx" +#line 1549 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); - } - assert((yyval.u.type) != NULL); + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } +#line 5475 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 168: -/* Line 1792 of yacc.c */ -#line 1564 "dtool/src/cppparser/cppBison.yxx" +#line 1553 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); - } - assert((yyval.u.type) != NULL); + yywarning("Not a type: " + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } +#line 5484 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 169: -/* Line 1792 of yacc.c */ -#line 1576 "dtool/src/cppparser/cppBison.yxx" +#line 1558 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(1) - (1)].u.identifier)); + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + } + assert((yyval.u.type) != NULL); } +#line 5496 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 170: -/* Line 1792 of yacc.c */ -#line 1580 "dtool/src/cppparser/cppBison.yxx" +#line 1566 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + } + assert((yyval.u.type) != NULL); +} +#line 5508 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 171: +#line 1578 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); +} +#line 5516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 172: +#line 1582 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // For an operator function. We implement this simply by building a // ficticious name for the function; in other respects it's just // like a regular function. - CPPIdentifier *ident = (yyvsp[(1) - (2)].u.identifier); + CPPIdentifier *ident = (yyvsp[-1].u.identifier); if (ident == NULL) { - ident = new CPPIdentifier("operator "+(yyvsp[(2) - (2)].str), (yylsp[(2) - (2)])); + ident = new CPPIdentifier("operator "+(yyvsp[0].str), (yylsp[0])); } else { - ident->_names.push_back("operator "+(yyvsp[(2) - (2)].str)); + ident->_names.push_back("operator "+(yyvsp[0].str)); } (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } - break; - - case 171: -/* Line 1792 of yacc.c */ -#line 1594 "dtool/src/cppparser/cppBison.yxx" - { - // A C++11 literal operator. - if (!(yyvsp[(2) - (3)].str).empty()) { - yyerror("expected empty string", (yylsp[(2) - (3)])); - } - CPPIdentifier *ident = (yyvsp[(1) - (3)].u.identifier); - if (ident == NULL) { - ident = new CPPIdentifier("operator \"\" "+(yyvsp[(3) - (3)].u.identifier)->get_simple_name(), (yylsp[(3) - (3)])); - } else { - ident->_names.push_back("operator \"\" "+(yyvsp[(3) - (3)].u.identifier)->get_simple_name()); - } - - (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); -} - break; - - case 172: -/* Line 1792 of yacc.c */ -#line 1609 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); -} +#line 5534 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 173: -/* Line 1792 of yacc.c */ -#line 1614 "dtool/src/cppparser/cppBison.yxx" +#line 1596 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + // A C++11 literal operator. + if (!(yyvsp[-1].str).empty()) { + yyerror("expected empty string", (yylsp[-1])); + } + CPPIdentifier *ident = (yyvsp[-2].u.identifier); + if (ident == NULL) { + ident = new CPPIdentifier("operator \"\" "+(yyvsp[0].u.identifier)->get_simple_name(), (yylsp[0])); + } else { + ident->_names.push_back("operator \"\" "+(yyvsp[0].u.identifier)->get_simple_name()); + } + + (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } +#line 5553 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 174: -/* Line 1792 of yacc.c */ -#line 1619 "dtool/src/cppparser/cppBison.yxx" +#line 1611 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } +#line 5562 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 175: -/* Line 1792 of yacc.c */ -#line 1624 "dtool/src/cppparser/cppBison.yxx" +#line 1616 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } +#line 5571 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 176: -/* Line 1792 of yacc.c */ -#line 1629 "dtool/src/cppparser/cppBison.yxx" +#line 1621 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } +#line 5580 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 177: -/* Line 1792 of yacc.c */ -#line 1634 "dtool/src/cppparser/cppBison.yxx" +#line 1626 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } +#line 5589 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 178: -/* Line 1792 of yacc.c */ -#line 1639 "dtool/src/cppparser/cppBison.yxx" +#line 1631 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } +#line 5598 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 179: -/* Line 1792 of yacc.c */ -#line 1644 "dtool/src/cppparser/cppBison.yxx" +#line 1636 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } +#line 5607 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 180: -/* Line 1792 of yacc.c */ -#line 1649 "dtool/src/cppparser/cppBison.yxx" +#line 1641 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); +} +#line 5616 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 181: +#line 1646 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); +} +#line 5625 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 182: +#line 1651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Create a scope for this function (in case it is a function) - CPPScope *scope = new CPPScope((yyvsp[(1) - (2)].u.inst_ident)->get_scope(current_scope, global_scope), + CPPScope *scope = new CPPScope((yyvsp[-1].u.inst_ident)->get_scope(current_scope, global_scope), CPPNameComponent(""), V_private); // It still needs to be able to pick up any template arguments, if this is @@ -6151,2052 +5638,2052 @@ yyreduce: push_scope(scope); } +#line 5642 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 181: -/* Line 1792 of yacc.c */ -#line 1662 "dtool/src/cppparser/cppBison.yxx" + case 183: +#line 1664 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); - (yyval.u.inst_ident) = (yyvsp[(1) - (6)].u.inst_ident); - if ((yyvsp[(4) - (6)].u.param_list)->is_parameter_expr() && (yyvsp[(6) - (6)].u.integer) == 0) { + (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); + if ((yyvsp[-2].u.param_list)->is_parameter_expr() && (yyvsp[0].u.integer) == 0) { // Oops, this must have been an instance declaration with a // parameter list, not a function prototype. - (yyval.u.inst_ident)->add_initializer_modifier((yyvsp[(4) - (6)].u.param_list)); + (yyval.u.inst_ident)->add_initializer_modifier((yyvsp[-2].u.param_list)); } else { // This was (probably) a function prototype. - (yyval.u.inst_ident)->add_func_modifier((yyvsp[(4) - (6)].u.param_list), (yyvsp[(6) - (6)].u.integer)); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } } +#line 5660 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 182: -/* Line 1792 of yacc.c */ -#line 1680 "dtool/src/cppparser/cppBison.yxx" + case 184: +#line 1682 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This is handled a bit awkwardly right now. Ideally it'd be wrapped // up in the instance_identifier rule, but then more needs to happen in // order to avoid shift/reduce conflicts. - if ((yyvsp[(2) - (2)].u.type) != NULL) { - (yyvsp[(1) - (2)].u.inst_ident)->add_trailing_return_type((yyvsp[(2) - (2)].u.type)); + if ((yyvsp[0].u.type) != NULL) { + (yyvsp[-1].u.inst_ident)->add_trailing_return_type((yyvsp[0].u.type)); } - (yyval.u.inst_ident) = (yyvsp[(1) - (2)].u.inst_ident); -} - break; - - case 183: -/* Line 1792 of yacc.c */ -#line 1690 "dtool/src/cppparser/cppBison.yxx" - { - // Bitfield definition. - (yyvsp[(1) - (3)].u.inst_ident)->_bit_width = (yyvsp[(3) - (3)].u.integer); - (yyval.u.inst_ident) = (yyvsp[(1) - (3)].u.inst_ident); -} - break; - - case 184: -/* Line 1792 of yacc.c */ -#line 1700 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.type) = NULL; + (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); } +#line 5674 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 185: -/* Line 1792 of yacc.c */ -#line 1704 "dtool/src/cppparser/cppBison.yxx" +#line 1692 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[(3) - (3)].u.inst_ident)->unroll_type((yyvsp[(2) - (3)].u.type)); + // Bitfield definition. + (yyvsp[-2].u.inst_ident)->_bit_width = (yyvsp[0].u.integer); + (yyval.u.inst_ident) = (yyvsp[-2].u.inst_ident); } +#line 5684 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 186: -/* Line 1792 of yacc.c */ -#line 1708 "dtool/src/cppparser/cppBison.yxx" +#line 1702 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(4) - (4)].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.type) = (yyvsp[(4) - (4)].u.inst_ident)->unroll_type((yyvsp[(3) - (4)].u.type)); + (yyval.u.type) = NULL; } +#line 5692 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 187: -/* Line 1792 of yacc.c */ -#line 1717 "dtool/src/cppparser/cppBison.yxx" +#line 1706 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = new CPPParameterList; + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } +#line 5700 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 188: -/* Line 1792 of yacc.c */ -#line 1721 "dtool/src/cppparser/cppBison.yxx" +#line 1710 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_includes_ellipsis = true; + (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } +#line 5709 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 189: -/* Line 1792 of yacc.c */ -#line 1726 "dtool/src/cppparser/cppBison.yxx" +#line 1719 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[(1) - (1)].u.param_list); + (yyval.u.param_list) = new CPPParameterList; } +#line 5717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 190: -/* Line 1792 of yacc.c */ -#line 1730 "dtool/src/cppparser/cppBison.yxx" +#line 1723 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[(1) - (3)].u.param_list); + (yyval.u.param_list) = new CPPParameterList; (yyval.u.param_list)->_includes_ellipsis = true; } +#line 5726 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 191: -/* Line 1792 of yacc.c */ -#line 1735 "dtool/src/cppparser/cppBison.yxx" +#line 1728 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[(1) - (2)].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.param_list) = (yyvsp[0].u.param_list); } +#line 5734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 192: -/* Line 1792 of yacc.c */ -#line 1743 "dtool/src/cppparser/cppBison.yxx" +#line 1732 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_parameters.push_back((yyvsp[(1) - (1)].u.instance)); + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; } +#line 5743 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 193: -/* Line 1792 of yacc.c */ -#line 1748 "dtool/src/cppparser/cppBison.yxx" +#line 1737 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[(1) - (3)].u.param_list); - (yyval.u.param_list)->_parameters.push_back((yyvsp[(3) - (3)].u.instance)); + (yyval.u.param_list) = (yyvsp[-1].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; } +#line 5752 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 194: -/* Line 1792 of yacc.c */ -#line 1756 "dtool/src/cppparser/cppBison.yxx" +#line 1745 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } +#line 5761 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 195: -/* Line 1792 of yacc.c */ -#line 1760 "dtool/src/cppparser/cppBison.yxx" +#line 1750 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } +#line 5770 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 196: -/* Line 1792 of yacc.c */ -#line 1765 "dtool/src/cppparser/cppBison.yxx" +#line 1758 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[(1) - (1)].u.param_list); + (yyval.u.param_list) = new CPPParameterList; } +#line 5778 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 197: -/* Line 1792 of yacc.c */ -#line 1769 "dtool/src/cppparser/cppBison.yxx" +#line 1762 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[(1) - (3)].u.param_list); + (yyval.u.param_list) = new CPPParameterList; (yyval.u.param_list)->_includes_ellipsis = true; } +#line 5787 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 198: -/* Line 1792 of yacc.c */ -#line 1774 "dtool/src/cppparser/cppBison.yxx" +#line 1767 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[(1) - (2)].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.param_list) = (yyvsp[0].u.param_list); } +#line 5795 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 199: -/* Line 1792 of yacc.c */ -#line 1782 "dtool/src/cppparser/cppBison.yxx" +#line 1771 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_parameters.push_back((yyvsp[(1) - (1)].u.instance)); + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; } +#line 5804 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 200: -/* Line 1792 of yacc.c */ -#line 1787 "dtool/src/cppparser/cppBison.yxx" +#line 1776 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[(1) - (3)].u.param_list); - (yyval.u.param_list)->_parameters.push_back((yyvsp[(3) - (3)].u.instance)); + (yyval.u.param_list) = (yyvsp[-1].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; } +#line 5813 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 201: -/* Line 1792 of yacc.c */ -#line 1795 "dtool/src/cppparser/cppBison.yxx" +#line 1784 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } +#line 5822 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 202: -/* Line 1792 of yacc.c */ -#line 1799 "dtool/src/cppparser/cppBison.yxx" +#line 1789 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(2) - (2)].u.expr); + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } +#line 5831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 203: -/* Line 1792 of yacc.c */ -#line 1806 "dtool/src/cppparser/cppBison.yxx" +#line 1797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } +#line 5839 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 204: -/* Line 1792 of yacc.c */ -#line 1810 "dtool/src/cppparser/cppBison.yxx" +#line 1801 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(2) - (2)].u.expr); + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 5847 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 205: -/* Line 1792 of yacc.c */ -#line 1817 "dtool/src/cppparser/cppBison.yxx" +#line 1808 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } +#line 5855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 206: -/* Line 1792 of yacc.c */ -#line 1821 "dtool/src/cppparser/cppBison.yxx" +#line 1812 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 5863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 207: -/* Line 1792 of yacc.c */ -#line 1825 "dtool/src/cppparser/cppBison.yxx" +#line 1819 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } +#line 5871 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 208: -/* Line 1792 of yacc.c */ -#line 1829 "dtool/src/cppparser/cppBison.yxx" +#line 1823 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); + (yyval.u.expr) = (CPPExpression *)NULL; } +#line 5879 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 209: -/* Line 1792 of yacc.c */ -#line 1833 "dtool/src/cppparser/cppBison.yxx" +#line 1827 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); + (yyval.u.expr) = (CPPExpression *)NULL; } +#line 5887 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 210: -/* Line 1792 of yacc.c */ -#line 1840 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (CPPExpression *)NULL; -} - break; - - case 211: -/* Line 1792 of yacc.c */ -#line 1844 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (CPPExpression *)NULL; -} - break; - - case 212: -/* Line 1792 of yacc.c */ -#line 1848 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); -} - break; - - case 213: -/* Line 1792 of yacc.c */ -#line 1852 "dtool/src/cppparser/cppBison.yxx" +#line 1831 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); } +#line 5895 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 214: -/* Line 1792 of yacc.c */ -#line 1856 "dtool/src/cppparser/cppBison.yxx" + case 211: +#line 1835 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); } +#line 5903 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 215: -/* Line 1792 of yacc.c */ -#line 1860 "dtool/src/cppparser/cppBison.yxx" + case 212: +#line 1842 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } +#line 5911 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 219: -/* Line 1792 of yacc.c */ -#line 1873 "dtool/src/cppparser/cppBison.yxx" + case 213: +#line 1846 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { + (yyval.u.expr) = (CPPExpression *)NULL; } +#line 5919 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 223: -/* Line 1792 of yacc.c */ -#line 1882 "dtool/src/cppparser/cppBison.yxx" + case 214: +#line 1850 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = new CPPInstance((yyvsp[(1) - (3)].u.type), (yyvsp[(2) - (3)].u.inst_ident), 0, (yylsp[(2) - (3)]).file); - (yyval.u.instance)->set_initializer((yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = (yyvsp[-1].u.expr); } +#line 5927 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 224: -/* Line 1792 of yacc.c */ -#line 1887 "dtool/src/cppparser/cppBison.yxx" + case 215: +#line 1854 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(3) - (4)].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[(2) - (4)].u.type), (yyvsp[(3) - (4)].u.inst_ident), 0, (yylsp[(3) - (4)]).file); - (yyval.u.instance)->set_initializer((yyvsp[(4) - (4)].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); } +#line 5935 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 216: +#line 1858 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); +} +#line 5943 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 217: +#line 1862 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (CPPExpression *)NULL; +} +#line 5951 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 221: +#line 1875 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { +} +#line 5958 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 225: -/* Line 1792 of yacc.c */ -#line 1893 "dtool/src/cppparser/cppBison.yxx" +#line 1884 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(4) - (5)].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[(3) - (5)].u.type), (yyvsp[(4) - (5)].u.inst_ident), 0, (yylsp[(3) - (5)]).file); - (yyval.u.instance)->set_initializer((yyvsp[(5) - (5)].u.expr)); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } +#line 5967 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 226: -/* Line 1792 of yacc.c */ -#line 1899 "dtool/src/cppparser/cppBison.yxx" +#line 1889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = new CPPInstance((yyvsp[(1) - (3)].u.type), (yyvsp[(2) - (3)].u.inst_ident), 0, (yylsp[(2) - (3)]).file); - (yyval.u.instance)->set_initializer((yyvsp[(3) - (3)].u.expr)); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } +#line 5977 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 227: -/* Line 1792 of yacc.c */ -#line 1904 "dtool/src/cppparser/cppBison.yxx" +#line 1895 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(3) - (4)].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[(2) - (4)].u.type), (yyvsp[(3) - (4)].u.inst_ident), 0, (yylsp[(3) - (4)]).file); - (yyval.u.instance)->set_initializer((yyvsp[(4) - (4)].u.expr)); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } +#line 5987 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 228: -/* Line 1792 of yacc.c */ -#line 1910 "dtool/src/cppparser/cppBison.yxx" +#line 1901 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(4) - (5)].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[(3) - (5)].u.type), (yyvsp[(4) - (5)].u.inst_ident), 0, (yylsp[(3) - (5)]).file); - (yyval.u.instance)->set_initializer((yyvsp[(5) - (5)].u.expr)); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } +#line 5996 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 229: -/* Line 1792 of yacc.c */ -#line 1916 "dtool/src/cppparser/cppBison.yxx" +#line 1906 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = (yyvsp[(2) - (2)].u.instance); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } +#line 6006 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 230: -/* Line 1792 of yacc.c */ -#line 1920 "dtool/src/cppparser/cppBison.yxx" +#line 1912 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = (yyvsp[(4) - (4)].u.instance); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } +#line 6016 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 231: -/* Line 1792 of yacc.c */ -#line 1931 "dtool/src/cppparser/cppBison.yxx" +#line 1918 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = (yyvsp[(1) - (1)].u.instance); + (yyval.u.instance) = (yyvsp[0].u.instance); } +#line 6024 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 232: -/* Line 1792 of yacc.c */ -#line 1935 "dtool/src/cppparser/cppBison.yxx" +#line 1922 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.instance) = (yyvsp[0].u.instance); +} +#line 6032 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 233: +#line 1933 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.instance) = (yyvsp[0].u.instance); +} +#line 6040 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 234: +#line 1937 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_parameter)); (yyval.u.instance) = new CPPInstance(type, "expr"); - (yyval.u.instance)->set_initializer((yyvsp[(1) - (1)].u.expr)); -} - break; - - case 233: -/* Line 1792 of yacc.c */ -#line 1945 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); -} - break; - - case 234: -/* Line 1792 of yacc.c */ -#line 1949 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(1) - (1)].u.identifier)); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } +#line 6051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 235: -/* Line 1792 of yacc.c */ -#line 1953 "dtool/src/cppparser/cppBison.yxx" +#line 1947 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } +#line 6059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 236: -/* Line 1792 of yacc.c */ -#line 1958 "dtool/src/cppparser/cppBison.yxx" +#line 1951 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); } +#line 6067 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 237: -/* Line 1792 of yacc.c */ -#line 1963 "dtool/src/cppparser/cppBison.yxx" +#line 1955 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } +#line 6076 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 238: -/* Line 1792 of yacc.c */ -#line 1968 "dtool/src/cppparser/cppBison.yxx" +#line 1960 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } +#line 6085 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 239: -/* Line 1792 of yacc.c */ -#line 1973 "dtool/src/cppparser/cppBison.yxx" +#line 1965 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } +#line 6094 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 240: -/* Line 1792 of yacc.c */ -#line 1978 "dtool/src/cppparser/cppBison.yxx" +#line 1970 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } +#line 6103 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 241: -/* Line 1792 of yacc.c */ -#line 1983 "dtool/src/cppparser/cppBison.yxx" +#line 1975 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } +#line 6112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 242: -/* Line 1792 of yacc.c */ -#line 1991 "dtool/src/cppparser/cppBison.yxx" +#line 1980 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } +#line 6121 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 243: -/* Line 1792 of yacc.c */ -#line 1995 "dtool/src/cppparser/cppBison.yxx" +#line 1985 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(1) - (1)].u.identifier)); + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } +#line 6130 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 244: -/* Line 1792 of yacc.c */ -#line 1999 "dtool/src/cppparser/cppBison.yxx" +#line 1993 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } +#line 6138 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 245: -/* Line 1792 of yacc.c */ -#line 2004 "dtool/src/cppparser/cppBison.yxx" +#line 1997 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); } +#line 6146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 246: -/* Line 1792 of yacc.c */ -#line 2009 "dtool/src/cppparser/cppBison.yxx" +#line 2001 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } +#line 6155 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 247: -/* Line 1792 of yacc.c */ -#line 2014 "dtool/src/cppparser/cppBison.yxx" +#line 2006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } +#line 6164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 248: -/* Line 1792 of yacc.c */ -#line 2019 "dtool/src/cppparser/cppBison.yxx" +#line 2011 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } +#line 6173 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 249: -/* Line 1792 of yacc.c */ -#line 2024 "dtool/src/cppparser/cppBison.yxx" +#line 2016 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } +#line 6182 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 250: -/* Line 1792 of yacc.c */ -#line 2029 "dtool/src/cppparser/cppBison.yxx" +#line 2021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } +#line 6191 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 251: -/* Line 1792 of yacc.c */ -#line 2034 "dtool/src/cppparser/cppBison.yxx" +#line 2026 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (7)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[(5) - (7)].u.param_list), (yyvsp[(7) - (7)].u.integer)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } +#line 6200 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 252: -/* Line 1792 of yacc.c */ -#line 2040 "dtool/src/cppparser/cppBison.yxx" +#line 2031 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } +#line 6209 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 253: -/* Line 1792 of yacc.c */ -#line 2048 "dtool/src/cppparser/cppBison.yxx" +#line 2036 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } +#line 6219 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 254: -/* Line 1792 of yacc.c */ -#line 2053 "dtool/src/cppparser/cppBison.yxx" +#line 2042 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(2) - (2)].u.identifier)); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); } +#line 6228 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 255: -/* Line 1792 of yacc.c */ -#line 2058 "dtool/src/cppparser/cppBison.yxx" +#line 2050 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; } +#line 6237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 256: -/* Line 1792 of yacc.c */ -#line 2063 "dtool/src/cppparser/cppBison.yxx" +#line 2055 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident)->_packed = true; } +#line 6246 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 257: -/* Line 1792 of yacc.c */ -#line 2068 "dtool/src/cppparser/cppBison.yxx" +#line 2060 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } +#line 6255 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 258: -/* Line 1792 of yacc.c */ -#line 2073 "dtool/src/cppparser/cppBison.yxx" +#line 2065 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } +#line 6264 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 259: -/* Line 1792 of yacc.c */ -#line 2078 "dtool/src/cppparser/cppBison.yxx" +#line 2070 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } +#line 6273 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 260: -/* Line 1792 of yacc.c */ -#line 2083 "dtool/src/cppparser/cppBison.yxx" +#line 2075 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } +#line 6282 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 261: -/* Line 1792 of yacc.c */ -#line 2088 "dtool/src/cppparser/cppBison.yxx" +#line 2080 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } +#line 6291 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 262: -/* Line 1792 of yacc.c */ -#line 2093 "dtool/src/cppparser/cppBison.yxx" +#line 2085 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (7)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[(5) - (7)].u.param_list), (yyvsp[(7) - (7)].u.integer)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } +#line 6300 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 263: -/* Line 1792 of yacc.c */ -#line 2099 "dtool/src/cppparser/cppBison.yxx" +#line 2090 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } +#line 6309 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 264: -/* Line 1792 of yacc.c */ -#line 2107 "dtool/src/cppparser/cppBison.yxx" +#line 2095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } +#line 6319 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 265: -/* Line 1792 of yacc.c */ -#line 2111 "dtool/src/cppparser/cppBison.yxx" +#line 2101 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); } +#line 6328 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 266: -/* Line 1792 of yacc.c */ -#line 2116 "dtool/src/cppparser/cppBison.yxx" +#line 2109 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(2) - (2)].u.identifier)); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } +#line 6336 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 267: -/* Line 1792 of yacc.c */ -#line 2121 "dtool/src/cppparser/cppBison.yxx" +#line 2113 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; } +#line 6345 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 268: -/* Line 1792 of yacc.c */ -#line 2126 "dtool/src/cppparser/cppBison.yxx" +#line 2118 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident)->_packed = true; } +#line 6354 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 269: -/* Line 1792 of yacc.c */ -#line 2131 "dtool/src/cppparser/cppBison.yxx" +#line 2123 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } +#line 6363 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 270: -/* Line 1792 of yacc.c */ -#line 2136 "dtool/src/cppparser/cppBison.yxx" +#line 2128 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } +#line 6372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 271: -/* Line 1792 of yacc.c */ -#line 2141 "dtool/src/cppparser/cppBison.yxx" +#line 2133 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } +#line 6381 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 272: -/* Line 1792 of yacc.c */ -#line 2146 "dtool/src/cppparser/cppBison.yxx" +#line 2138 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } +#line 6390 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 273: -/* Line 1792 of yacc.c */ -#line 2151 "dtool/src/cppparser/cppBison.yxx" +#line 2143 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } +#line 6399 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 274: -/* Line 1792 of yacc.c */ -#line 2159 "dtool/src/cppparser/cppBison.yxx" +#line 2148 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } +#line 6408 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 275: -/* Line 1792 of yacc.c */ -#line 2163 "dtool/src/cppparser/cppBison.yxx" +#line 2153 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } +#line 6417 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 276: -/* Line 1792 of yacc.c */ -#line 2168 "dtool/src/cppparser/cppBison.yxx" +#line 2161 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[(2) - (2)].u.identifier)); - (yyval.u.inst_ident)->_packed = true; + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } +#line 6425 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 277: -/* Line 1792 of yacc.c */ -#line 2173 "dtool/src/cppparser/cppBison.yxx" +#line 2165 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; } +#line 6434 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 278: -/* Line 1792 of yacc.c */ -#line 2178 "dtool/src/cppparser/cppBison.yxx" +#line 2170 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident)->_packed = true; } +#line 6443 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 279: -/* Line 1792 of yacc.c */ -#line 2183 "dtool/src/cppparser/cppBison.yxx" +#line 2175 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); } +#line 6452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 280: -/* Line 1792 of yacc.c */ -#line 2188 "dtool/src/cppparser/cppBison.yxx" +#line 2180 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } +#line 6461 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 281: -/* Line 1792 of yacc.c */ -#line 2193 "dtool/src/cppparser/cppBison.yxx" +#line 2185 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(2) - (2)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } +#line 6470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 282: -/* Line 1792 of yacc.c */ -#line 2198 "dtool/src/cppparser/cppBison.yxx" +#line 2190 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (3)].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[(1) - (3)].u.identifier)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } +#line 6479 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 283: -/* Line 1792 of yacc.c */ -#line 2203 "dtool/src/cppparser/cppBison.yxx" +#line 2195 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(1) - (4)].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[(3) - (4)].u.expr)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } +#line 6488 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 284: -/* Line 1792 of yacc.c */ -#line 2208 "dtool/src/cppparser/cppBison.yxx" +#line 2200 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[(2) - (5)].u.param_list), (yyvsp[(4) - (5)].u.integer), (yyvsp[(5) - (5)].u.type)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } +#line 6497 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 285: -/* Line 1792 of yacc.c */ -#line 2214 "dtool/src/cppparser/cppBison.yxx" +#line 2205 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (9)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[(6) - (9)].u.param_list), (yyvsp[(8) - (9)].u.integer), (yyvsp[(9) - (9)].u.type)); + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } +#line 6506 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 286: -/* Line 1792 of yacc.c */ -#line 2221 "dtool/src/cppparser/cppBison.yxx" +#line 2210 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (9)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[(6) - (9)].u.param_list), (yyvsp[(8) - (9)].u.integer), (yyvsp[(9) - (9)].u.type)); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } +#line 6516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 287: -/* Line 1792 of yacc.c */ -#line 2228 "dtool/src/cppparser/cppBison.yxx" +#line 2216 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[(3) - (9)].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[(6) - (9)].u.param_list), (yyvsp[(8) - (9)].u.integer), (yyvsp[(9) - (9)].u.type)); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } +#line 6527 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 288: -/* Line 1792 of yacc.c */ -#line 2238 "dtool/src/cppparser/cppBison.yxx" +#line 2223 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); + (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } +#line 6538 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 289: -/* Line 1792 of yacc.c */ -#line 2242 "dtool/src/cppparser/cppBison.yxx" +#line 2230 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); - } - assert((yyval.u.type) != NULL); + (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } +#line 6549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 290: -/* Line 1792 of yacc.c */ -#line 2250 "dtool/src/cppparser/cppBison.yxx" +#line 2240 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[(2) - (2)].u.identifier))); + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } +#line 6557 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 291: -/* Line 1792 of yacc.c */ -#line 2254 "dtool/src/cppparser/cppBison.yxx" +#line 2244 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.struct_type)); + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + } + assert((yyval.u.type) != NULL); } +#line 6569 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 292: -/* Line 1792 of yacc.c */ -#line 2258 "dtool/src/cppparser/cppBison.yxx" +#line 2252 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.struct_type)); + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } +#line 6577 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 293: -/* Line 1792 of yacc.c */ -#line 2262 "dtool/src/cppparser/cppBison.yxx" +#line 2256 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.enum_type)); + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); } +#line 6585 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 294: -/* Line 1792 of yacc.c */ -#line 2266 "dtool/src/cppparser/cppBison.yxx" +#line 2260 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPType *type = (yyvsp[(3) - (3)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type != NULL) { - (yyval.u.type) = type; - } else { - CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (3)].u.extension_enum), (yyvsp[(3) - (3)].u.identifier), current_scope, (yylsp[(1) - (3)]).file)) - ->as_extension_type(); - CPPScope *scope = (yyvsp[(3) - (3)].u.identifier)->get_scope(current_scope, global_scope); - if (scope != NULL) { - scope->define_extension_type(et); - } - (yyval.u.type) = et; - } + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); } +#line 6593 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 295: -/* Line 1792 of yacc.c */ -#line 2282 "dtool/src/cppparser/cppBison.yxx" +#line 2264 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPType *type = (yyvsp[(2) - (4)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.enum_type)); +} +#line 6601 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 296: +#line 2268 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { (yyval.u.type) = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (4)].u.extension_enum), (yyvsp[(2) - (4)].u.identifier), current_scope, (yylsp[(1) - (4)]).file)) + CPPType::new_type(new CPPExtensionType((yyvsp[-2].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-2]).file)) ->as_extension_type(); - CPPScope *scope = (yyvsp[(2) - (4)].u.identifier)->get_scope(current_scope, global_scope); + CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } (yyval.u.type) = et; } } - break; - - case 296: -/* Line 1792 of yacc.c */ -#line 2298 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.type) = (yyvsp[(3) - (4)].u.expr)->determine_type(); - if ((yyval.u.type) == (CPPType *)NULL) { - stringstream str; - str << *(yyvsp[(3) - (4)].u.expr); - yyerror("could not determine type of " + str.str(), (yylsp[(3) - (4)])); - } -} +#line 6621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 297: -/* Line 1792 of yacc.c */ -#line 2307 "dtool/src/cppparser/cppBison.yxx" +#line 2284 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); + CPPType *type = (yyvsp[-2].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type != NULL) { + (yyval.u.type) = type; + } else { + CPPExtensionType *et = + CPPType::new_type(new CPPExtensionType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), current_scope, (yylsp[-3]).file)) + ->as_extension_type(); + CPPScope *scope = (yyvsp[-2].u.identifier)->get_scope(current_scope, global_scope); + if (scope != NULL) { + scope->define_extension_type(et); + } + (yyval.u.type) = et; + } } +#line 6641 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 298: -/* Line 1792 of yacc.c */ -#line 2311 "dtool/src/cppparser/cppBison.yxx" +#line 2300 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPEnumType *enum_type = (yyvsp[(3) - (4)].u.type)->as_enum_type(); + (yyval.u.type) = (yyvsp[-1].u.expr)->determine_type(); + if ((yyval.u.type) == (CPPType *)NULL) { + stringstream str; + str << *(yyvsp[-1].u.expr); + yyerror("could not determine type of " + str.str(), (yylsp[-1])); + } +} +#line 6654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 299: +#line 2309 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); +} +#line 6662 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 300: +#line 2313 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { - yyerror("an enumeration type is required", (yylsp[(3) - (4)])); - (yyval.u.type) = (yyvsp[(3) - (4)].u.type); + yyerror("an enumeration type is required", (yylsp[-1])); + (yyval.u.type) = (yyvsp[-1].u.type); } else { (yyval.u.type) = enum_type->get_underlying_type(); } } - break; - - case 299: -/* Line 1792 of yacc.c */ -#line 2321 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} - break; - - case 300: -/* Line 1792 of yacc.c */ -#line 2328 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); - } - assert((yyval.u.type) != NULL); -} +#line 6676 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 301: -/* Line 1792 of yacc.c */ -#line 2339 "dtool/src/cppparser/cppBison.yxx" +#line 2323 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } +#line 6684 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 302: -/* Line 1792 of yacc.c */ -#line 2343 "dtool/src/cppparser/cppBison.yxx" +#line 2330 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.decl) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); } - assert((yyval.u.decl) != NULL); + assert((yyval.u.type) != NULL); } +#line 6696 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 303: -/* Line 1792 of yacc.c */ -#line 2351 "dtool/src/cppparser/cppBison.yxx" +#line 2341 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[(2) - (2)].u.identifier))); + (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.simple_type)); } +#line 6704 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 304: -/* Line 1792 of yacc.c */ -#line 2355 "dtool/src/cppparser/cppBison.yxx" +#line 2345 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type((yyvsp[(1) - (1)].u.struct_type)); + (yyval.u.decl) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.decl) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + } + assert((yyval.u.decl) != NULL); } +#line 6716 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 305: -/* Line 1792 of yacc.c */ -#line 2359 "dtool/src/cppparser/cppBison.yxx" +#line 2353 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[(1) - (1)].u.struct_type))); + (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } +#line 6724 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 306: -/* Line 1792 of yacc.c */ -#line 2363 "dtool/src/cppparser/cppBison.yxx" +#line 2357 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[(1) - (1)].u.enum_type))); + (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.struct_type)); } +#line 6732 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 307: -/* Line 1792 of yacc.c */ -#line 2367 "dtool/src/cppparser/cppBison.yxx" +#line 2361 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPType *type = (yyvsp[(3) - (3)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type != NULL) { - (yyval.u.decl) = type; - } else { - CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (3)].u.extension_enum), (yyvsp[(3) - (3)].u.identifier), current_scope, (yylsp[(1) - (3)]).file)) - ->as_extension_type(); - CPPScope *scope = (yyvsp[(3) - (3)].u.identifier)->get_scope(current_scope, global_scope); - if (scope != NULL) { - scope->define_extension_type(et); - } - (yyval.u.decl) = et; - } + (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.struct_type))); } +#line 6740 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 308: -/* Line 1792 of yacc.c */ -#line 2383 "dtool/src/cppparser/cppBison.yxx" +#line 2365 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPType *type = (yyvsp[(2) - (4)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type != NULL) { - (yyval.u.decl) = type; - } else { - CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (4)].u.extension_enum), (yyvsp[(2) - (4)].u.identifier), current_scope, (yylsp[(1) - (4)]).file)) - ->as_extension_type(); - CPPScope *scope = (yyvsp[(2) - (4)].u.identifier)->get_scope(current_scope, global_scope); - if (scope != NULL) { - scope->define_extension_type(et); - } - (yyval.u.decl) = et; - } + (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.enum_type))); } +#line 6748 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 309: -/* Line 1792 of yacc.c */ -#line 2399 "dtool/src/cppparser/cppBison.yxx" +#line 2369 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - yywarning(string("C++ does not permit forward declaration of untyped enum ") + (yyvsp[(2) - (2)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (2)])); - - CPPType *type = (yyvsp[(2) - (2)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { (yyval.u.decl) = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (2)].u.extension_enum), (yyvsp[(2) - (2)].u.identifier), current_scope, (yylsp[(1) - (2)]).file)) + CPPType::new_type(new CPPExtensionType((yyvsp[-2].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-2]).file)) ->as_extension_type(); - CPPScope *scope = (yyvsp[(2) - (2)].u.identifier)->get_scope(current_scope, global_scope); + CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } (yyval.u.decl) = et; } } +#line 6768 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 310: -/* Line 1792 of yacc.c */ -#line 2417 "dtool/src/cppparser/cppBison.yxx" +#line 2385 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = (yyvsp[(3) - (4)].u.expr)->determine_type(); - if ((yyval.u.decl) == (CPPType *)NULL) { - stringstream str; - str << *(yyvsp[(3) - (4)].u.expr); - yyerror("could not determine type of " + str.str(), (yylsp[(3) - (4)])); + CPPType *type = (yyvsp[-2].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type != NULL) { + (yyval.u.decl) = type; + } else { + CPPExtensionType *et = + CPPType::new_type(new CPPExtensionType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), current_scope, (yylsp[-3]).file)) + ->as_extension_type(); + CPPScope *scope = (yyvsp[-2].u.identifier)->get_scope(current_scope, global_scope); + if (scope != NULL) { + scope->define_extension_type(et); + } + (yyval.u.decl) = et; } } +#line 6788 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 311: -/* Line 1792 of yacc.c */ -#line 2426 "dtool/src/cppparser/cppBison.yxx" +#line 2401 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); + yywarning(string("C++ does not permit forward declaration of untyped enum ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[-1])); + + CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type != NULL) { + (yyval.u.decl) = type; + } else { + CPPExtensionType *et = + CPPType::new_type(new CPPExtensionType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-1]).file)) + ->as_extension_type(); + CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); + if (scope != NULL) { + scope->define_extension_type(et); + } + (yyval.u.decl) = et; + } } +#line 6810 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 312: -/* Line 1792 of yacc.c */ -#line 2430 "dtool/src/cppparser/cppBison.yxx" +#line 2419 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPEnumType *enum_type = (yyvsp[(3) - (4)].u.type)->as_enum_type(); + (yyval.u.decl) = (yyvsp[-1].u.expr)->determine_type(); + if ((yyval.u.decl) == (CPPType *)NULL) { + stringstream str; + str << *(yyvsp[-1].u.expr); + yyerror("could not determine type of " + str.str(), (yylsp[-1])); + } +} +#line 6823 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 313: +#line 2428 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); +} +#line 6831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 314: +#line 2432 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { - yyerror("an enumeration type is required", (yylsp[(3) - (4)])); - (yyval.u.decl) = (yyvsp[(3) - (4)].u.type); + yyerror("an enumeration type is required", (yylsp[-1])); + (yyval.u.decl) = (yyvsp[-1].u.type); } else { (yyval.u.decl) = enum_type->get_underlying_type(); } } - break; - - case 313: -/* Line 1792 of yacc.c */ -#line 2440 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} - break; - - case 314: -/* Line 1792 of yacc.c */ -#line 2447 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); -} +#line 6845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 315: -/* Line 1792 of yacc.c */ -#line 2451 "dtool/src/cppparser/cppBison.yxx" +#line 2442 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (1)])); - } - assert((yyval.u.type) != NULL); + (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } +#line 6853 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 316: -/* Line 1792 of yacc.c */ -#line 2459 "dtool/src/cppparser/cppBison.yxx" +#line 2449 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[(2) - (2)].u.identifier))); + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } +#line 6861 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 317: -/* Line 1792 of yacc.c */ -#line 2463 "dtool/src/cppparser/cppBison.yxx" +#line 2453 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPType *type = (yyvsp[(3) - (3)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type != NULL) { - (yyval.u.type) = type; - } else { - CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (3)].u.extension_enum), (yyvsp[(3) - (3)].u.identifier), current_scope, (yylsp[(1) - (3)]).file)) - ->as_extension_type(); - CPPScope *scope = (yyvsp[(3) - (3)].u.identifier)->get_scope(current_scope, global_scope); - if (scope != NULL) { - scope->define_extension_type(et); - } - (yyval.u.type) = et; + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); } + assert((yyval.u.type) != NULL); } +#line 6873 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 318: -/* Line 1792 of yacc.c */ -#line 2479 "dtool/src/cppparser/cppBison.yxx" +#line 2461 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPType *type = (yyvsp[(2) - (2)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); +} +#line 6881 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 319: +#line 2465 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { (yyval.u.type) = type; } else { CPPExtensionType *et = - CPPType::new_type(new CPPExtensionType((yyvsp[(1) - (2)].u.extension_enum), (yyvsp[(2) - (2)].u.identifier), current_scope, (yylsp[(1) - (2)]).file)) + CPPType::new_type(new CPPExtensionType((yyvsp[-2].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-2]).file)) ->as_extension_type(); - CPPScope *scope = (yyvsp[(2) - (2)].u.identifier)->get_scope(current_scope, global_scope); + CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); if (scope != NULL) { scope->define_extension_type(et); } (yyval.u.type) = et; } } - break; - - case 319: -/* Line 1792 of yacc.c */ -#line 2495 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.type) = (yyvsp[(3) - (4)].u.expr)->determine_type(); - if ((yyval.u.type) == (CPPType *)NULL) { - stringstream str; - str << *(yyvsp[(3) - (4)].u.expr); - yyerror("could not determine type of " + str.str(), (yylsp[(3) - (4)])); - } -} +#line 6901 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 320: -/* Line 1792 of yacc.c */ -#line 2504 "dtool/src/cppparser/cppBison.yxx" +#line 2481 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPEnumType *enum_type = (yyvsp[(3) - (4)].u.type)->as_enum_type(); + CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type != NULL) { + (yyval.u.type) = type; + } else { + CPPExtensionType *et = + CPPType::new_type(new CPPExtensionType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, (yylsp[-1]).file)) + ->as_extension_type(); + CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope); + if (scope != NULL) { + scope->define_extension_type(et); + } + (yyval.u.type) = et; + } +} +#line 6921 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 321: +#line 2497 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = (yyvsp[-1].u.expr)->determine_type(); + if ((yyval.u.type) == (CPPType *)NULL) { + stringstream str; + str << *(yyvsp[-1].u.expr); + yyerror("could not determine type of " + str.str(), (yylsp[-1])); + } +} +#line 6934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 322: +#line 2506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { - yyerror("an enumeration type is required", (yylsp[(3) - (4)])); - (yyval.u.type) = (yyvsp[(3) - (4)].u.type); + yyerror("an enumeration type is required", (yylsp[-1])); + (yyval.u.type) = (yyvsp[-1].u.type); } else { (yyval.u.type) = enum_type->get_underlying_type(); } } - break; - - case 321: -/* Line 1792 of yacc.c */ -#line 2514 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} - break; - - case 322: -/* Line 1792 of yacc.c */ -#line 2521 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.decl) = (yyvsp[(1) - (1)].u.decl); -} +#line 6948 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 323: -/* Line 1792 of yacc.c */ -#line 2525 "dtool/src/cppparser/cppBison.yxx" +#line 2516 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - yyerror(string("unknown type '") + (yyvsp[(1) - (1)].u.identifier)->get_fully_scoped_name() + "'", (yylsp[(1) - (1)])); - - (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } +#line 6956 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 324: -/* Line 1792 of yacc.c */ -#line 2533 "dtool/src/cppparser/cppBison.yxx" +#line 2523 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[(2) - (2)].u.inst_ident)->unroll_type((yyvsp[(1) - (2)].u.type)); + (yyval.u.decl) = (yyvsp[0].u.decl); } +#line 6964 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 325: -/* Line 1792 of yacc.c */ -#line 2537 "dtool/src/cppparser/cppBison.yxx" +#line 2527 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(3) - (3)].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.type) = (yyvsp[(3) - (3)].u.inst_ident)->unroll_type((yyvsp[(2) - (3)].u.type)); + yyerror(string("unknown type '") + (yyvsp[0].u.identifier)->get_fully_scoped_name() + "'", (yylsp[0])); + + (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } +#line 6974 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 326: -/* Line 1792 of yacc.c */ -#line 2542 "dtool/src/cppparser/cppBison.yxx" +#line 2535 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[(2) - (2)].u.inst_ident)->unroll_type((yyvsp[(1) - (2)].u.type)); + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } +#line 6982 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 327: -/* Line 1792 of yacc.c */ -#line 2546 "dtool/src/cppparser/cppBison.yxx" +#line 2539 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[(3) - (3)].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.type) = (yyvsp[(3) - (3)].u.inst_ident)->unroll_type((yyvsp[(2) - (3)].u.type)); + (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } +#line 6991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 332: -/* Line 1792 of yacc.c */ -#line 2561 "dtool/src/cppparser/cppBison.yxx" + case 328: +#line 2544 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); +} +#line 6999 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 329: +#line 2548 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); +} +#line 7008 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 334: +#line 2563 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPVisibility starting_vis = - ((yyvsp[(1) - (3)].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; + ((yyvsp[-2].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; CPPScope *new_scope = new CPPScope(current_scope, CPPNameComponent("anon"), starting_vis); - CPPStructType *st = new CPPStructType((yyvsp[(1) - (3)].u.extension_enum), NULL, current_scope, - new_scope, (yylsp[(1) - (3)]).file); + CPPStructType *st = new CPPStructType((yyvsp[-2].u.extension_enum), NULL, current_scope, + new_scope, (yylsp[-2]).file); new_scope->set_struct_type(st); push_scope(new_scope); push_struct(st); } +#line 7026 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 333: -/* Line 1792 of yacc.c */ -#line 2575 "dtool/src/cppparser/cppBison.yxx" + case 335: +#line 2577 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.struct_type) = current_struct; current_struct->_incomplete = false; pop_struct(); pop_scope(); } +#line 7037 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 334: -/* Line 1792 of yacc.c */ -#line 2585 "dtool/src/cppparser/cppBison.yxx" + case 336: +#line 2587 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPVisibility starting_vis = - ((yyvsp[(1) - (3)].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; + ((yyvsp[-2].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; - CPPScope *scope = (yyvsp[(3) - (3)].u.identifier)->get_scope(current_scope, global_scope, current_lexer); + CPPScope *scope = (yyvsp[0].u.identifier)->get_scope(current_scope, global_scope, current_lexer); if (scope == NULL) { scope = current_scope; } - CPPScope *new_scope = new CPPScope(scope, (yyvsp[(3) - (3)].u.identifier)->_names.back(), + CPPScope *new_scope = new CPPScope(scope, (yyvsp[0].u.identifier)->_names.back(), starting_vis); - CPPStructType *st = new CPPStructType((yyvsp[(1) - (3)].u.extension_enum), (yyvsp[(3) - (3)].u.identifier), current_scope, - new_scope, (yylsp[(1) - (3)]).file); + CPPStructType *st = new CPPStructType((yyvsp[-2].u.extension_enum), (yyvsp[0].u.identifier), current_scope, + new_scope, (yylsp[-2]).file); new_scope->set_struct_type(st); current_scope->define_extension_type(st); push_scope(new_scope); push_struct(st); } +#line 7061 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 335: -/* Line 1792 of yacc.c */ -#line 2605 "dtool/src/cppparser/cppBison.yxx" + case 337: +#line 2607 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.struct_type) = current_struct; current_struct->_incomplete = false; pop_struct(); pop_scope(); } +#line 7072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 337: -/* Line 1792 of yacc.c */ -#line 2616 "dtool/src/cppparser/cppBison.yxx" + case 339: +#line 2618 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_struct->_final = true; } - break; - - case 342: -/* Line 1792 of yacc.c */ -#line 2633 "dtool/src/cppparser/cppBison.yxx" - { - current_struct->append_derivation((yyvsp[(1) - (1)].u.type), V_unknown, false); -} - break; - - case 343: -/* Line 1792 of yacc.c */ -#line 2637 "dtool/src/cppparser/cppBison.yxx" - { - current_struct->append_derivation((yyvsp[(2) - (2)].u.type), V_public, false); -} +#line 7080 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 344: -/* Line 1792 of yacc.c */ -#line 2641 "dtool/src/cppparser/cppBison.yxx" +#line 2635 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[(2) - (2)].u.type), V_protected, false); + current_struct->append_derivation((yyvsp[0].u.type), V_unknown, false); } +#line 7088 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 345: -/* Line 1792 of yacc.c */ -#line 2645 "dtool/src/cppparser/cppBison.yxx" +#line 2639 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[(2) - (2)].u.type), V_private, false); + current_struct->append_derivation((yyvsp[0].u.type), V_public, false); } +#line 7096 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 346: -/* Line 1792 of yacc.c */ -#line 2649 "dtool/src/cppparser/cppBison.yxx" +#line 2643 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_public, true); + current_struct->append_derivation((yyvsp[0].u.type), V_protected, false); } +#line 7104 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 347: -/* Line 1792 of yacc.c */ -#line 2653 "dtool/src/cppparser/cppBison.yxx" +#line 2647 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_protected, true); + current_struct->append_derivation((yyvsp[0].u.type), V_private, false); } +#line 7112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 348: -/* Line 1792 of yacc.c */ -#line 2657 "dtool/src/cppparser/cppBison.yxx" +#line 2651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_private, true); + current_struct->append_derivation((yyvsp[0].u.type), V_public, true); } +#line 7120 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 349: -/* Line 1792 of yacc.c */ -#line 2661 "dtool/src/cppparser/cppBison.yxx" +#line 2655 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_public, true); + current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); } +#line 7128 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 350: -/* Line 1792 of yacc.c */ -#line 2665 "dtool/src/cppparser/cppBison.yxx" +#line 2659 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_protected, true); + current_struct->append_derivation((yyvsp[0].u.type), V_private, true); } +#line 7136 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 351: -/* Line 1792 of yacc.c */ -#line 2669 "dtool/src/cppparser/cppBison.yxx" +#line 2663 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[(3) - (3)].u.type), V_private, true); + current_struct->append_derivation((yyvsp[0].u.type), V_public, true); } +#line 7144 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 352: -/* Line 1792 of yacc.c */ -#line 2676 "dtool/src/cppparser/cppBison.yxx" +#line 2667 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); +} +#line 7152 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 353: +#line 2671 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_struct->append_derivation((yyvsp[0].u.type), V_private, true); +} +#line 7160 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 354: +#line 2678 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.enum_type) = current_enum; current_enum = NULL; } - break; - - case 353: -/* Line 1792 of yacc.c */ -#line 2684 "dtool/src/cppparser/cppBison.yxx" - { - current_enum = new CPPEnumType((yyvsp[(1) - (3)].u.extension_enum), NULL, (yyvsp[(3) - (3)].u.type), current_scope, NULL, (yylsp[(1) - (3)]).file); -} - break; - - case 354: -/* Line 1792 of yacc.c */ -#line 2688 "dtool/src/cppparser/cppBison.yxx" - { - current_enum = new CPPEnumType((yyvsp[(1) - (1)].u.extension_enum), NULL, current_scope, NULL, (yylsp[(1) - (1)]).file); -} +#line 7169 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 355: -/* Line 1792 of yacc.c */ -#line 2692 "dtool/src/cppparser/cppBison.yxx" +#line 2686 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[(2) - (4)].u.identifier)->_names.back(), V_public); - current_enum = new CPPEnumType((yyvsp[(1) - (4)].u.extension_enum), (yyvsp[(2) - (4)].u.identifier), (yyvsp[(4) - (4)].u.type), current_scope, new_scope, (yylsp[(1) - (4)]).file); + current_enum = new CPPEnumType((yyvsp[-2].u.extension_enum), NULL, (yyvsp[0].u.type), current_scope, NULL, (yylsp[-2]).file); } +#line 7177 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 356: -/* Line 1792 of yacc.c */ -#line 2697 "dtool/src/cppparser/cppBison.yxx" +#line 2690 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[(2) - (2)].u.identifier)->_names.back(), V_public); - current_enum = new CPPEnumType((yyvsp[(1) - (2)].u.extension_enum), (yyvsp[(2) - (2)].u.identifier), current_scope, new_scope, (yylsp[(1) - (2)]).file); + current_enum = new CPPEnumType((yyvsp[0].u.extension_enum), NULL, current_scope, NULL, (yylsp[0]).file); } +#line 7185 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 357: -/* Line 1792 of yacc.c */ -#line 2705 "dtool/src/cppparser/cppBison.yxx" +#line 2694 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[(1) - (1)].u.simple_type)); + CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[-2].u.identifier)->_names.back(), V_public); + current_enum = new CPPEnumType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), (yyvsp[0].u.type), current_scope, new_scope, (yylsp[-3]).file); } +#line 7194 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 358: -/* Line 1792 of yacc.c */ -#line 2709 "dtool/src/cppparser/cppBison.yxx" +#line 2699 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[0].u.identifier)->_names.back(), V_public); + current_enum = new CPPEnumType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, new_scope, (yylsp[-1]).file); } +#line 7203 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 359: +#line 2707 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); +} +#line 7211 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 360: -/* Line 1792 of yacc.c */ -#line 2717 "dtool/src/cppparser/cppBison.yxx" +#line 2711 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[(2) - (3)].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[(2) - (3)])); + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); } +#line 7219 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 361: -/* Line 1792 of yacc.c */ -#line 2722 "dtool/src/cppparser/cppBison.yxx" + case 362: +#line 2719 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { assert(current_enum != NULL); - current_enum->add_element((yyvsp[(2) - (5)].u.identifier)->get_simple_name(), (yyvsp[(4) - (5)].u.expr), current_lexer, (yylsp[(2) - (5)])); + current_enum->add_element((yyvsp[-1].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[-1])); } +#line 7228 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 363: -/* Line 1792 of yacc.c */ -#line 2730 "dtool/src/cppparser/cppBison.yxx" +#line 2724 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { assert(current_enum != NULL); - current_enum->add_element((yyvsp[(2) - (2)].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[(2) - (2)])); -} - break; - - case 364: -/* Line 1792 of yacc.c */ -#line 2735 "dtool/src/cppparser/cppBison.yxx" - { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[(2) - (4)].u.identifier)->get_simple_name(), (yyvsp[(4) - (4)].u.expr), current_lexer, (yylsp[(2) - (4)])); + current_enum->add_element((yyvsp[-3].u.identifier)->get_simple_name(), (yyvsp[-1].u.expr), current_lexer, (yylsp[-3])); } +#line 7237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 365: -/* Line 1792 of yacc.c */ -#line 2743 "dtool/src/cppparser/cppBison.yxx" +#line 2732 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_enum; + assert(current_enum != NULL); + current_enum->add_element((yyvsp[0].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[0])); } +#line 7246 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 366: -/* Line 1792 of yacc.c */ -#line 2747 "dtool/src/cppparser/cppBison.yxx" +#line 2737 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; + assert(current_enum != NULL); + current_enum->add_element((yyvsp[-2].u.identifier)->get_simple_name(), (yyvsp[0].u.expr), current_lexer, (yylsp[-2])); } +#line 7255 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 367: -/* Line 1792 of yacc.c */ -#line 2751 "dtool/src/cppparser/cppBison.yxx" +#line 2745 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; + (yyval.u.extension_enum) = CPPExtensionType::T_enum; } +#line 7263 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 368: -/* Line 1792 of yacc.c */ -#line 2758 "dtool/src/cppparser/cppBison.yxx" +#line 2749 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_class; + (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; } +#line 7271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 369: -/* Line 1792 of yacc.c */ -#line 2762 "dtool/src/cppparser/cppBison.yxx" +#line 2753 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_struct; + (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; } +#line 7279 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 370: -/* Line 1792 of yacc.c */ -#line 2766 "dtool/src/cppparser/cppBison.yxx" +#line 2760 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_union; + (yyval.u.extension_enum) = CPPExtensionType::T_class; } +#line 7287 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 371: -/* Line 1792 of yacc.c */ -#line 2773 "dtool/src/cppparser/cppBison.yxx" +#line 2764 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPScope *scope = (yyvsp[(2) - (3)].u.identifier)->find_scope(current_scope, global_scope, current_lexer); - if (scope == NULL) { - // This must be a new namespace declaration. - CPPScope *parent_scope = - (yyvsp[(2) - (3)].u.identifier)->get_scope(current_scope, global_scope, current_lexer); - if (parent_scope == NULL) { - parent_scope = current_scope; - } - scope = new CPPScope(parent_scope, (yyvsp[(2) - (3)].u.identifier)->_names.back(), V_public); - } - - CPPNamespace *nspace = new CPPNamespace((yyvsp[(2) - (3)].u.identifier), scope, (yylsp[(1) - (3)]).file); - current_scope->add_declaration(nspace, global_scope, current_lexer, (yylsp[(1) - (3)])); - current_scope->define_namespace(nspace); - push_scope(scope); + (yyval.u.extension_enum) = CPPExtensionType::T_struct; } +#line 7295 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 372: -/* Line 1792 of yacc.c */ -#line 2791 "dtool/src/cppparser/cppBison.yxx" +#line 2768 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - pop_scope(); + (yyval.u.extension_enum) = CPPExtensionType::T_union; } +#line 7303 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 373: -/* Line 1792 of yacc.c */ -#line 2795 "dtool/src/cppparser/cppBison.yxx" +#line 2775 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPScope *scope = (yyvsp[(3) - (4)].u.identifier)->find_scope(current_scope, global_scope, current_lexer); + CPPScope *scope = (yyvsp[-1].u.identifier)->find_scope(current_scope, global_scope, current_lexer); if (scope == NULL) { // This must be a new namespace declaration. CPPScope *parent_scope = - (yyvsp[(3) - (4)].u.identifier)->get_scope(current_scope, global_scope, current_lexer); + (yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope, current_lexer); if (parent_scope == NULL) { parent_scope = current_scope; } - scope = new CPPScope(parent_scope, (yyvsp[(3) - (4)].u.identifier)->_names.back(), V_public); + scope = new CPPScope(parent_scope, (yyvsp[-1].u.identifier)->_names.back(), V_public); } - CPPNamespace *nspace = new CPPNamespace((yyvsp[(3) - (4)].u.identifier), scope, (yylsp[(2) - (4)]).file); - nspace->_is_inline = true; - current_scope->add_declaration(nspace, global_scope, current_lexer, (yylsp[(2) - (4)])); + CPPNamespace *nspace = new CPPNamespace((yyvsp[-1].u.identifier), scope, (yylsp[-2]).file); + current_scope->add_declaration(nspace, global_scope, current_lexer, (yylsp[-2])); current_scope->define_namespace(nspace); push_scope(scope); } +#line 7325 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 374: -/* Line 1792 of yacc.c */ -#line 2814 "dtool/src/cppparser/cppBison.yxx" +#line 2793 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); } +#line 7333 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 377: -/* Line 1792 of yacc.c */ -#line 2823 "dtool/src/cppparser/cppBison.yxx" + case 375: +#line 2797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPUsing *using_decl = new CPPUsing((yyvsp[(2) - (3)].u.identifier), false, (yylsp[(1) - (3)]).file); - current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[(1) - (3)])); - current_scope->add_using(using_decl, global_scope, current_lexer); + CPPScope *scope = (yyvsp[-1].u.identifier)->find_scope(current_scope, global_scope, current_lexer); + if (scope == NULL) { + // This must be a new namespace declaration. + CPPScope *parent_scope = + (yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope, current_lexer); + if (parent_scope == NULL) { + parent_scope = current_scope; + } + scope = new CPPScope(parent_scope, (yyvsp[-1].u.identifier)->_names.back(), V_public); + } + + CPPNamespace *nspace = new CPPNamespace((yyvsp[-1].u.identifier), scope, (yylsp[-2]).file); + nspace->_is_inline = true; + current_scope->add_declaration(nspace, global_scope, current_lexer, (yylsp[-2])); + current_scope->define_namespace(nspace); + push_scope(scope); } +#line 7356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 378: -/* Line 1792 of yacc.c */ -#line 2829 "dtool/src/cppparser/cppBison.yxx" + case 376: +#line 2816 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - // This is really just an alternative way to declare a typedef. - CPPTypedefType *typedef_type = new CPPTypedefType((yyvsp[(4) - (5)].u.type), (yyvsp[(2) - (5)].u.identifier), current_scope); - typedef_type->_using = true; - current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[(1) - (5)])); + pop_scope(); } +#line 7364 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 379: -/* Line 1792 of yacc.c */ -#line 2836 "dtool/src/cppparser/cppBison.yxx" +#line 2825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPUsing *using_decl = new CPPUsing((yyvsp[(3) - (4)].u.identifier), true, (yylsp[(1) - (4)]).file); - current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[(1) - (4)])); + CPPUsing *using_decl = new CPPUsing((yyvsp[-1].u.identifier), false, (yylsp[-2]).file); + current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-2])); current_scope->add_using(using_decl, global_scope, current_lexer); } +#line 7374 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 383: -/* Line 1792 of yacc.c */ -#line 2851 "dtool/src/cppparser/cppBison.yxx" + case 380: +#line 2831 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); + // This is really just an alternative way to declare a typedef. + CPPTypedefType *typedef_type = new CPPTypedefType((yyvsp[-1].u.type), (yyvsp[-3].u.identifier), current_scope); + typedef_type->_using = true; + current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-4])); } +#line 7385 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 384: -/* Line 1792 of yacc.c */ -#line 2855 "dtool/src/cppparser/cppBison.yxx" + case 381: +#line 2838 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); + CPPUsing *using_decl = new CPPUsing((yyvsp[-1].u.identifier), true, (yylsp[-3]).file); + current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-3])); + current_scope->add_using(using_decl, global_scope, current_lexer); } +#line 7395 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 385: -/* Line 1792 of yacc.c */ -#line 2859 "dtool/src/cppparser/cppBison.yxx" +#line 2853 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); } +#line 7403 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 386: -/* Line 1792 of yacc.c */ -#line 2863 "dtool/src/cppparser/cppBison.yxx" +#line 2857 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); } +#line 7411 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 387: -/* Line 1792 of yacc.c */ -#line 2867 "dtool/src/cppparser/cppBison.yxx" +#line 2861 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char32_t); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); } +#line 7419 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 388: -/* Line 1792 of yacc.c */ -#line 2871 "dtool/src/cppparser/cppBison.yxx" +#line 2865 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); +} +#line 7427 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 389: +#line 2869 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char32_t); +} +#line 7435 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 390: +#line 2873 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short); } +#line 7444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 389: -/* Line 1792 of yacc.c */ -#line 2876 "dtool/src/cppparser/cppBison.yxx" + case 391: +#line 2878 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long); } +#line 7453 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 390: -/* Line 1792 of yacc.c */ -#line 2881 "dtool/src/cppparser/cppBison.yxx" + case 392: +#line 2883 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned); } +#line 7462 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 391: -/* Line 1792 of yacc.c */ -#line 2886 "dtool/src/cppparser/cppBison.yxx" + case 393: +#line 2888 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed); } - break; - - case 392: -/* Line 1792 of yacc.c */ -#line 2891 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int); -} - break; - - case 393: -/* Line 1792 of yacc.c */ -#line 2895 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.simple_type) = (yyvsp[(2) - (2)].u.simple_type); - (yyval.u.simple_type)->_flags |= CPPSimpleType::F_short; -} +#line 7471 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 394: -/* Line 1792 of yacc.c */ -#line 2900 "dtool/src/cppparser/cppBison.yxx" +#line 2893 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = (yyvsp[(2) - (2)].u.simple_type); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int); +} +#line 7479 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 395: +#line 2897 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = (yyvsp[0].u.simple_type); + (yyval.u.simple_type)->_flags |= CPPSimpleType::F_short; +} +#line 7488 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 396: +#line 2902 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = (yyvsp[0].u.simple_type); if ((yyval.u.simple_type)->_flags & CPPSimpleType::F_long) { (yyval.u.simple_type)->_flags |= CPPSimpleType::F_longlong; } else { (yyval.u.simple_type)->_flags |= CPPSimpleType::F_long; } } - break; - - case 395: -/* Line 1792 of yacc.c */ -#line 2909 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.simple_type) = (yyvsp[(2) - (2)].u.simple_type); - (yyval.u.simple_type)->_flags |= CPPSimpleType::F_unsigned; -} - break; - - case 396: -/* Line 1792 of yacc.c */ -#line 2914 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.simple_type) = (yyvsp[(2) - (2)].u.simple_type); - (yyval.u.simple_type)->_flags |= CPPSimpleType::F_signed; -} +#line 7501 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 397: -/* Line 1792 of yacc.c */ -#line 2922 "dtool/src/cppparser/cppBison.yxx" +#line 2911 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_float); + (yyval.u.simple_type) = (yyvsp[0].u.simple_type); + (yyval.u.simple_type)->_flags |= CPPSimpleType::F_unsigned; } +#line 7510 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 398: -/* Line 1792 of yacc.c */ -#line 2926 "dtool/src/cppparser/cppBison.yxx" +#line 2916 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double); + (yyval.u.simple_type) = (yyvsp[0].u.simple_type); + (yyval.u.simple_type)->_flags |= CPPSimpleType::F_signed; } +#line 7519 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 399: -/* Line 1792 of yacc.c */ -#line 2930 "dtool/src/cppparser/cppBison.yxx" +#line 2924 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_float); +} +#line 7527 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 400: +#line 2928 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double); +} +#line 7535 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 401: +#line 2932 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double, CPPSimpleType::F_long); } - break; - - case 400: -/* Line 1792 of yacc.c */ -#line 2938 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_void); -} - break; - - case 401: -/* Line 1792 of yacc.c */ -#line 2947 "dtool/src/cppparser/cppBison.yxx" - { - current_lexer->_resolve_identifiers = false; -} +#line 7544 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 402: -/* Line 1792 of yacc.c */ -#line 2951 "dtool/src/cppparser/cppBison.yxx" +#line 2940 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_void); +} +#line 7552 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 403: +#line 2949 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_lexer->_resolve_identifiers = false; +} +#line 7560 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 404: +#line 2953 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_lexer->_resolve_identifiers = true; } +#line 7568 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 510: -/* Line 1792 of yacc.c */ -#line 2995 "dtool/src/cppparser/cppBison.yxx" + case 512: +#line 2997 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { } - break; - - case 534: -/* Line 1792 of yacc.c */ -#line 3004 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (CPPExpression *)NULL; -} - break; - - case 535: -/* Line 1792 of yacc.c */ -#line 3008 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); -} +#line 7575 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 536: -/* Line 1792 of yacc.c */ -#line 3015 "dtool/src/cppparser/cppBison.yxx" +#line 3006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } +#line 7583 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 537: -/* Line 1792 of yacc.c */ -#line 3019 "dtool/src/cppparser/cppBison.yxx" +#line 3010 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 7591 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 538: -/* Line 1792 of yacc.c */ -#line 3026 "dtool/src/cppparser/cppBison.yxx" +#line 3017 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); + (yyval.u.expr) = (CPPExpression *)NULL; } +#line 7599 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 539: -/* Line 1792 of yacc.c */ -#line 3030 "dtool/src/cppparser/cppBison.yxx" +#line 3021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(',', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 7607 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 540: -/* Line 1792 of yacc.c */ -#line 3037 "dtool/src/cppparser/cppBison.yxx" +#line 3028 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 7615 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 541: -/* Line 1792 of yacc.c */ -#line 3041 "dtool/src/cppparser/cppBison.yxx" +#line 3032 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(2) - (4)].u.type), (yyvsp[(4) - (4)].u.expr))); + (yyval.u.expr) = new CPPExpression(',', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7623 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 542: -/* Line 1792 of yacc.c */ -#line 3045 "dtool/src/cppparser/cppBison.yxx" +#line 3039 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 7631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 543: -/* Line 1792 of yacc.c */ -#line 3049 "dtool/src/cppparser/cppBison.yxx" +#line 3043 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } +#line 7639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 544: -/* Line 1792 of yacc.c */ -#line 3053 "dtool/src/cppparser/cppBison.yxx" +#line 3047 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } +#line 7647 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 545: -/* Line 1792 of yacc.c */ -#line 3057 "dtool/src/cppparser/cppBison.yxx" +#line 3051 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); } +#line 7655 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 546: -/* Line 1792 of yacc.c */ -#line 3061 "dtool/src/cppparser/cppBison.yxx" +#line 3055 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[(3) - (4)].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); } +#line 7663 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 547: -/* Line 1792 of yacc.c */ -#line 3065 "dtool/src/cppparser/cppBison.yxx" +#line 3059 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *arg = (yyvsp[(3) - (4)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); +} +#line 7671 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 548: +#line 3063 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); +} +#line 7679 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 549: +#line 3067 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (arg == (CPPDeclaration *)NULL) { - yyerror("undefined sizeof argument: " + (yyvsp[(3) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(3) - (4)])); + yyerror("undefined sizeof argument: " + (yyvsp[-1].u.identifier)->get_fully_scoped_name(), (yylsp[-1])); } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { CPPInstance *inst = arg->as_instance(); (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); @@ -8204,1102 +7691,471 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } - break; - - case 548: -/* Line 1792 of yacc.c */ -#line 3077 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[(4) - (5)].u.identifier))); -} - break; - - case 549: -/* Line 1792 of yacc.c */ -#line 3081 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[(3) - (4)].u.type))); -} +#line 7695 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 550: -/* Line 1792 of yacc.c */ -#line 3085 "dtool/src/cppparser/cppBison.yxx" +#line 3079 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } +#line 7703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 551: -/* Line 1792 of yacc.c */ -#line 3089 "dtool/src/cppparser/cppBison.yxx" +#line 3083 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } +#line 7711 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 552: -/* Line 1792 of yacc.c */ -#line 3093 "dtool/src/cppparser/cppBison.yxx" +#line 3087 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } +#line 7719 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 553: -/* Line 1792 of yacc.c */ -#line 3097 "dtool/src/cppparser/cppBison.yxx" +#line 3091 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } +#line 7727 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 554: -/* Line 1792 of yacc.c */ -#line 3101 "dtool/src/cppparser/cppBison.yxx" +#line 3095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } +#line 7735 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 555: -/* Line 1792 of yacc.c */ -#line 3105 "dtool/src/cppparser/cppBison.yxx" +#line 3099 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } +#line 7743 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 556: -/* Line 1792 of yacc.c */ -#line 3109 "dtool/src/cppparser/cppBison.yxx" +#line 3103 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); } +#line 7751 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 557: -/* Line 1792 of yacc.c */ -#line 3113 "dtool/src/cppparser/cppBison.yxx" +#line 3107 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } +#line 7759 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 558: -/* Line 1792 of yacc.c */ -#line 3117 "dtool/src/cppparser/cppBison.yxx" +#line 3111 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7767 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 559: -/* Line 1792 of yacc.c */ -#line 3121 "dtool/src/cppparser/cppBison.yxx" +#line 3115 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7775 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 560: -/* Line 1792 of yacc.c */ -#line 3125 "dtool/src/cppparser/cppBison.yxx" +#line 3119 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7783 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 561: -/* Line 1792 of yacc.c */ -#line 3129 "dtool/src/cppparser/cppBison.yxx" +#line 3123 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7791 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 562: -/* Line 1792 of yacc.c */ -#line 3133 "dtool/src/cppparser/cppBison.yxx" +#line 3127 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7799 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 563: -/* Line 1792 of yacc.c */ -#line 3137 "dtool/src/cppparser/cppBison.yxx" +#line 3131 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7807 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 564: -/* Line 1792 of yacc.c */ -#line 3141 "dtool/src/cppparser/cppBison.yxx" +#line 3135 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7815 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 565: -/* Line 1792 of yacc.c */ -#line 3145 "dtool/src/cppparser/cppBison.yxx" +#line 3139 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7823 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 566: -/* Line 1792 of yacc.c */ -#line 3149 "dtool/src/cppparser/cppBison.yxx" +#line 3143 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 567: -/* Line 1792 of yacc.c */ -#line 3153 "dtool/src/cppparser/cppBison.yxx" +#line 3147 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7839 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 568: -/* Line 1792 of yacc.c */ -#line 3157 "dtool/src/cppparser/cppBison.yxx" +#line 3151 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7847 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 569: -/* Line 1792 of yacc.c */ -#line 3161 "dtool/src/cppparser/cppBison.yxx" +#line 3155 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 570: -/* Line 1792 of yacc.c */ -#line 3165 "dtool/src/cppparser/cppBison.yxx" +#line 3159 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 571: -/* Line 1792 of yacc.c */ -#line 3169 "dtool/src/cppparser/cppBison.yxx" +#line 3163 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7871 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 572: -/* Line 1792 of yacc.c */ -#line 3173 "dtool/src/cppparser/cppBison.yxx" +#line 3167 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[(1) - (5)].u.expr), (yyvsp[(3) - (5)].u.expr), (yyvsp[(5) - (5)].u.expr)); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7879 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 573: -/* Line 1792 of yacc.c */ -#line 3177 "dtool/src/cppparser/cppBison.yxx" +#line 3171 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7887 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 574: -/* Line 1792 of yacc.c */ -#line 3181 "dtool/src/cppparser/cppBison.yxx" +#line 3175 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7895 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 575: -/* Line 1792 of yacc.c */ -#line 3185 "dtool/src/cppparser/cppBison.yxx" +#line 3179 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } +#line 7903 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 576: -/* Line 1792 of yacc.c */ -#line 3189 "dtool/src/cppparser/cppBison.yxx" +#line 3183 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } +#line 7911 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 577: -/* Line 1792 of yacc.c */ -#line 3193 "dtool/src/cppparser/cppBison.yxx" +#line 3187 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } +#line 7919 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 578: -/* Line 1792 of yacc.c */ -#line 3197 "dtool/src/cppparser/cppBison.yxx" +#line 3191 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7927 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 579: -/* Line 1792 of yacc.c */ -#line 3205 "dtool/src/cppparser/cppBison.yxx" +#line 3195 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 7935 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 580: -/* Line 1792 of yacc.c */ -#line 3209 "dtool/src/cppparser/cppBison.yxx" +#line 3199 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(2) - (4)].u.type), (yyvsp[(4) - (4)].u.expr))); + (yyval.u.expr) = (yyvsp[-1].u.expr); } +#line 7943 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 581: -/* Line 1792 of yacc.c */ -#line 3213 "dtool/src/cppparser/cppBison.yxx" +#line 3207 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 7951 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 582: -/* Line 1792 of yacc.c */ -#line 3217 "dtool/src/cppparser/cppBison.yxx" +#line 3211 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } +#line 7959 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 583: -/* Line 1792 of yacc.c */ -#line 3221 "dtool/src/cppparser/cppBison.yxx" +#line 3215 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } +#line 7967 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 584: -/* Line 1792 of yacc.c */ -#line 3225 "dtool/src/cppparser/cppBison.yxx" +#line 3219 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); } +#line 7975 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 585: -/* Line 1792 of yacc.c */ -#line 3229 "dtool/src/cppparser/cppBison.yxx" +#line 3223 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - // A constructor call. - CPPType *type = (yyvsp[(1) - (4)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (4)])); - } - assert(type != NULL); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); } +#line 7983 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 586: -/* Line 1792 of yacc.c */ -#line 3239 "dtool/src/cppparser/cppBison.yxx" +#line 3227 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - // Aggregate initialization. - CPPType *type = (yyvsp[(1) - (4)].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if (type == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[(1) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(1) - (4)])); - } - assert(type != NULL); - (yyval.u.expr) = new CPPExpression(CPPExpression::aggregate_init_op(type, (yyvsp[(3) - (4)].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); } +#line 7991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 587: -/* Line 1792 of yacc.c */ -#line 3249 "dtool/src/cppparser/cppBison.yxx" +#line 3231 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + // A constructor call. + CPPType *type = (yyvsp[-3].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[-3].u.identifier)->get_fully_scoped_name(), (yylsp[-3])); + } + assert(type != NULL); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8005 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 588: -/* Line 1792 of yacc.c */ -#line 3255 "dtool/src/cppparser/cppBison.yxx" +#line 3241 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + // Aggregate initialization. + CPPType *type = (yyvsp[-3].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if (type == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[-3].u.identifier)->get_fully_scoped_name(), (yylsp[-3])); + } + assert(type != NULL); + (yyval.u.expr) = new CPPExpression(CPPExpression::aggregate_init_op(type, (yyvsp[-1].u.expr))); } +#line 8019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 589: -/* Line 1792 of yacc.c */ -#line 3261 "dtool/src/cppparser/cppBison.yxx" +#line 3251 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_wchar_t)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 590: -/* Line 1792 of yacc.c */ -#line 3267 "dtool/src/cppparser/cppBison.yxx" +#line 3257 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char16_t)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8039 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 591: -/* Line 1792 of yacc.c */ -#line 3273 "dtool/src/cppparser/cppBison.yxx" +#line 3263 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char32_t)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_wchar_t)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8049 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 592: -/* Line 1792 of yacc.c */ -#line 3279 "dtool/src/cppparser/cppBison.yxx" +#line 3269 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_bool)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char16_t)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 593: -/* Line 1792 of yacc.c */ -#line 3285 "dtool/src/cppparser/cppBison.yxx" +#line 3275 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char32_t)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); +} +#line 8069 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 594: +#line 3281 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_bool)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); +} +#line 8079 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 595: +#line 3287 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 594: -/* Line 1792 of yacc.c */ -#line 3292 "dtool/src/cppparser/cppBison.yxx" + case 596: +#line 3294 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8101 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 595: -/* Line 1792 of yacc.c */ -#line 3299 "dtool/src/cppparser/cppBison.yxx" + case 597: +#line 3301 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 596: -/* Line 1792 of yacc.c */ -#line 3306 "dtool/src/cppparser/cppBison.yxx" + case 598: +#line 3308 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); -} - break; - - case 597: -/* Line 1792 of yacc.c */ -#line 3313 "dtool/src/cppparser/cppBison.yxx" - { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_float)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); -} - break; - - case 598: -/* Line 1792 of yacc.c */ -#line 3319 "dtool/src/cppparser/cppBison.yxx" - { - CPPType *type = - CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_double)); - (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[(3) - (4)].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 599: -/* Line 1792 of yacc.c */ -#line 3325 "dtool/src/cppparser/cppBison.yxx" +#line 3315 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[(3) - (4)].u.type))); + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_float)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8133 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 600: -/* Line 1792 of yacc.c */ -#line 3329 "dtool/src/cppparser/cppBison.yxx" +#line 3321 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *arg = (yyvsp[(3) - (4)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (arg == (CPPDeclaration *)NULL) { - yyerror("undefined sizeof argument: " + (yyvsp[(3) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(3) - (4)])); - } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { - CPPInstance *inst = arg->as_instance(); - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); - } else { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); - } + CPPType *type = + CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_double)); + (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } +#line 8143 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 601: -/* Line 1792 of yacc.c */ -#line 3341 "dtool/src/cppparser/cppBison.yxx" +#line 3327 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[(4) - (5)].u.identifier))); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); } +#line 8151 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 602: -/* Line 1792 of yacc.c */ -#line 3345 "dtool/src/cppparser/cppBison.yxx" +#line 3331 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[(3) - (4)].u.type))); -} - break; - - case 603: -/* Line 1792 of yacc.c */ -#line 3349 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[(2) - (2)].u.type))); -} - break; - - case 604: -/* Line 1792 of yacc.c */ -#line 3353 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[(2) - (5)].u.type), (yyvsp[(4) - (5)].u.expr))); -} - break; - - case 605: -/* Line 1792 of yacc.c */ -#line 3357 "dtool/src/cppparser/cppBison.yxx" - { - CPPIdentifier ident(""); - ident.add_name("std"); - ident.add_name("type_info"); - CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); - if (!std_type_info) { - yywarning("cannot use typeid before including ", (yylsp[(1) - (4)])); - } - (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[(3) - (4)].u.type), std_type_info)); -} - break; - - case 606: -/* Line 1792 of yacc.c */ -#line 3368 "dtool/src/cppparser/cppBison.yxx" - { - CPPIdentifier ident(""); - ident.add_name("std"); - ident.add_name("type_info"); - CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); - if (!std_type_info) { - yywarning("cannot use typeid before including ", (yylsp[(1) - (4)])); - } - (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[(3) - (4)].u.expr), std_type_info)); -} - break; - - case 607: -/* Line 1792 of yacc.c */ -#line 3379 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[(2) - (2)].u.expr)); -} - break; - - case 608: -/* Line 1792 of yacc.c */ -#line 3383 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[(2) - (2)].u.expr)); -} - break; - - case 609: -/* Line 1792 of yacc.c */ -#line 3387 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[(2) - (2)].u.expr)); -} - break; - - case 610: -/* Line 1792 of yacc.c */ -#line 3391 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[(2) - (2)].u.expr)); -} - break; - - case 611: -/* Line 1792 of yacc.c */ -#line 3395 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[(2) - (2)].u.expr)); -} - break; - - case 612: -/* Line 1792 of yacc.c */ -#line 3399 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[(2) - (2)].u.expr)); -} - break; - - case 613: -/* Line 1792 of yacc.c */ -#line 3403 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 614: -/* Line 1792 of yacc.c */ -#line 3407 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 615: -/* Line 1792 of yacc.c */ -#line 3411 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 616: -/* Line 1792 of yacc.c */ -#line 3415 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 617: -/* Line 1792 of yacc.c */ -#line 3419 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 618: -/* Line 1792 of yacc.c */ -#line 3423 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 619: -/* Line 1792 of yacc.c */ -#line 3427 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 620: -/* Line 1792 of yacc.c */ -#line 3431 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 621: -/* Line 1792 of yacc.c */ -#line 3435 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 622: -/* Line 1792 of yacc.c */ -#line 3439 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 623: -/* Line 1792 of yacc.c */ -#line 3443 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 624: -/* Line 1792 of yacc.c */ -#line 3447 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 625: -/* Line 1792 of yacc.c */ -#line 3451 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 626: -/* Line 1792 of yacc.c */ -#line 3455 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 627: -/* Line 1792 of yacc.c */ -#line 3459 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('<', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 628: -/* Line 1792 of yacc.c */ -#line 3463 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('>', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 629: -/* Line 1792 of yacc.c */ -#line 3467 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 630: -/* Line 1792 of yacc.c */ -#line 3471 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 631: -/* Line 1792 of yacc.c */ -#line 3475 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[(1) - (5)].u.expr), (yyvsp[(3) - (5)].u.expr), (yyvsp[(5) - (5)].u.expr)); -} - break; - - case 632: -/* Line 1792 of yacc.c */ -#line 3479 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); -} - break; - - case 633: -/* Line 1792 of yacc.c */ -#line 3483 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); -} - break; - - case 634: -/* Line 1792 of yacc.c */ -#line 3487 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (3)].u.expr)); -} - break; - - case 635: -/* Line 1792 of yacc.c */ -#line 3491 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 636: -/* Line 1792 of yacc.c */ -#line 3495 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); -} - break; - - case 637: -/* Line 1792 of yacc.c */ -#line 3499 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); -} - break; - - case 638: -/* Line 1792 of yacc.c */ -#line 3506 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.integer)); -} - break; - - case 639: -/* Line 1792 of yacc.c */ -#line 3510 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(true); -} - break; - - case 640: -/* Line 1792 of yacc.c */ -#line 3514 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(false); -} - break; - - case 641: -/* Line 1792 of yacc.c */ -#line 3518 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.integer)); -} - break; - - case 642: -/* Line 1792 of yacc.c */ -#line 3522 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.real)); -} - break; - - case 643: -/* Line 1792 of yacc.c */ -#line 3526 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); -} - break; - - case 644: -/* Line 1792 of yacc.c */ -#line 3530 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); -} - break; - - case 645: -/* Line 1792 of yacc.c */ -#line 3534 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.identifier), current_scope, global_scope, current_lexer); -} - break; - - case 646: -/* Line 1792 of yacc.c */ -#line 3538 "dtool/src/cppparser/cppBison.yxx" - { - // A variable named "final". C++11 explicitly permits this. - CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[(1) - (1)])); - (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); -} - break; - - case 647: -/* Line 1792 of yacc.c */ -#line 3544 "dtool/src/cppparser/cppBison.yxx" - { - // A variable named "override". C++11 explicitly permits this. - CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[(1) - (1)])); - (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); -} - break; - - case 648: -/* Line 1792 of yacc.c */ -#line 3550 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); -} - break; - - case 649: -/* Line 1792 of yacc.c */ -#line 3554 "dtool/src/cppparser/cppBison.yxx" - { - (yyvsp[(2) - (8)].u.closure_type)->_flags = (yyvsp[(4) - (8)].u.integer); - (yyvsp[(2) - (8)].u.closure_type)->_return_type = (yyvsp[(5) - (8)].u.type); - (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[(2) - (8)].u.closure_type))); -} - break; - - case 650: -/* Line 1792 of yacc.c */ -#line 3560 "dtool/src/cppparser/cppBison.yxx" - { - (yyvsp[(2) - (11)].u.closure_type)->_parameters = (yyvsp[(5) - (11)].u.param_list); - (yyvsp[(2) - (11)].u.closure_type)->_flags = (yyvsp[(7) - (11)].u.integer); - (yyvsp[(2) - (11)].u.closure_type)->_return_type = (yyvsp[(8) - (11)].u.type); - (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[(2) - (11)].u.closure_type))); -} - break; - - case 651: -/* Line 1792 of yacc.c */ -#line 3567 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 652: -/* Line 1792 of yacc.c */ -#line 3571 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 653: -/* Line 1792 of yacc.c */ -#line 3575 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[(3) - (6)].u.type), (yyvsp[(5) - (6)].u.type))); -} - break; - - case 654: -/* Line 1792 of yacc.c */ -#line 3579 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 655: -/* Line 1792 of yacc.c */ -#line 3583 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 656: -/* Line 1792 of yacc.c */ -#line 3587 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[(3) - (6)].u.type), (yyvsp[(5) - (6)].u.type))); -} - break; - - case 657: -/* Line 1792 of yacc.c */ -#line 3591 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[(3) - (6)].u.type), (yyvsp[(5) - (6)].u.type))); -} - break; - - case 658: -/* Line 1792 of yacc.c */ -#line 3595 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 659: -/* Line 1792 of yacc.c */ -#line 3599 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 660: -/* Line 1792 of yacc.c */ -#line 3603 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 661: -/* Line 1792 of yacc.c */ -#line 3607 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 662: -/* Line 1792 of yacc.c */ -#line 3611 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 663: -/* Line 1792 of yacc.c */ -#line 3615 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 664: -/* Line 1792 of yacc.c */ -#line 3619 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 665: -/* Line 1792 of yacc.c */ -#line 3623 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 666: -/* Line 1792 of yacc.c */ -#line 3627 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 667: -/* Line 1792 of yacc.c */ -#line 3631 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[(3) - (4)].u.type))); -} - break; - - case 668: -/* Line 1792 of yacc.c */ -#line 3645 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); -} - break; - - case 669: -/* Line 1792 of yacc.c */ -#line 3649 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(2) - (4)].u.type), (yyvsp[(4) - (4)].u.expr))); -} - break; - - case 670: -/* Line 1792 of yacc.c */ -#line 3653 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_static_cast)); -} - break; - - case 671: -/* Line 1792 of yacc.c */ -#line 3657 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_dynamic_cast)); -} - break; - - case 672: -/* Line 1792 of yacc.c */ -#line 3661 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_const_cast)); -} - break; - - case 673: -/* Line 1792 of yacc.c */ -#line 3665 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[(3) - (7)].u.type), (yyvsp[(6) - (7)].u.expr), CPPExpression::T_reinterpret_cast)); -} - break; - - case 674: -/* Line 1792 of yacc.c */ -#line 3669 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[(3) - (4)].u.type))); -} - break; - - case 675: -/* Line 1792 of yacc.c */ -#line 3673 "dtool/src/cppparser/cppBison.yxx" - { - CPPDeclaration *arg = (yyvsp[(3) - (4)].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (arg == (CPPDeclaration *)NULL) { - yyerror("undefined sizeof argument: " + (yyvsp[(3) - (4)].u.identifier)->get_fully_scoped_name(), (yylsp[(3) - (4)])); + yyerror("undefined sizeof argument: " + (yyvsp[-1].u.identifier)->get_fully_scoped_name(), (yylsp[-1])); } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { CPPInstance *inst = arg->as_instance(); (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); @@ -9307,681 +8163,1312 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } +#line 8167 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 676: -/* Line 1792 of yacc.c */ -#line 3685 "dtool/src/cppparser/cppBison.yxx" + case 603: +#line 3343 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[(4) - (5)].u.identifier))); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } +#line 8175 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 677: -/* Line 1792 of yacc.c */ -#line 3689 "dtool/src/cppparser/cppBison.yxx" + case 604: +#line 3347 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[(3) - (4)].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } +#line 8183 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 678: -/* Line 1792 of yacc.c */ -#line 3693 "dtool/src/cppparser/cppBison.yxx" + case 605: +#line 3351 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[(2) - (2)].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); } +#line 8191 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 679: -/* Line 1792 of yacc.c */ -#line 3697 "dtool/src/cppparser/cppBison.yxx" + case 606: +#line 3355 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[(2) - (5)].u.type), (yyvsp[(4) - (5)].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); } +#line 8199 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 680: -/* Line 1792 of yacc.c */ -#line 3701 "dtool/src/cppparser/cppBison.yxx" + case 607: +#line 3359 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); ident.add_name("type_info"); CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); if (!std_type_info) { - yywarning("cannot use typeid before including ", (yylsp[(1) - (4)])); + yywarning("cannot use typeid before including ", (yylsp[-3])); } - (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[(3) - (4)].u.type), std_type_info)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); } +#line 8214 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 681: -/* Line 1792 of yacc.c */ -#line 3712 "dtool/src/cppparser/cppBison.yxx" + case 608: +#line 3370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); ident.add_name("type_info"); CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); if (!std_type_info) { - yywarning("cannot use typeid before including ", (yylsp[(1) - (4)])); + yywarning("cannot use typeid before including ", (yylsp[-3])); } - (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[(3) - (4)].u.expr), std_type_info)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); } +#line 8229 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 682: -/* Line 1792 of yacc.c */ -#line 3723 "dtool/src/cppparser/cppBison.yxx" + case 609: +#line 3381 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } +#line 8237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 683: -/* Line 1792 of yacc.c */ -#line 3727 "dtool/src/cppparser/cppBison.yxx" + case 610: +#line 3385 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } +#line 8245 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 684: -/* Line 1792 of yacc.c */ -#line 3731 "dtool/src/cppparser/cppBison.yxx" + case 611: +#line 3389 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } +#line 8253 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 685: -/* Line 1792 of yacc.c */ -#line 3735 "dtool/src/cppparser/cppBison.yxx" + case 612: +#line 3393 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } +#line 8261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 686: -/* Line 1792 of yacc.c */ -#line 3739 "dtool/src/cppparser/cppBison.yxx" + case 613: +#line 3397 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[(2) - (2)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); } +#line 8269 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 687: -/* Line 1792 of yacc.c */ -#line 3743 "dtool/src/cppparser/cppBison.yxx" + case 614: +#line 3401 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } +#line 8277 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 688: -/* Line 1792 of yacc.c */ -#line 3747 "dtool/src/cppparser/cppBison.yxx" + case 615: +#line 3405 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8285 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 689: -/* Line 1792 of yacc.c */ -#line 3751 "dtool/src/cppparser/cppBison.yxx" + case 616: +#line 3409 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8293 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 690: -/* Line 1792 of yacc.c */ -#line 3755 "dtool/src/cppparser/cppBison.yxx" + case 617: +#line 3413 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8301 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 691: -/* Line 1792 of yacc.c */ -#line 3759 "dtool/src/cppparser/cppBison.yxx" + case 618: +#line 3417 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8309 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 692: -/* Line 1792 of yacc.c */ -#line 3763 "dtool/src/cppparser/cppBison.yxx" + case 619: +#line 3421 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8317 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 693: -/* Line 1792 of yacc.c */ -#line 3767 "dtool/src/cppparser/cppBison.yxx" + case 620: +#line 3425 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8325 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 694: -/* Line 1792 of yacc.c */ -#line 3771 "dtool/src/cppparser/cppBison.yxx" + case 621: +#line 3429 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8333 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 695: -/* Line 1792 of yacc.c */ -#line 3775 "dtool/src/cppparser/cppBison.yxx" + case 622: +#line 3433 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8341 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 696: -/* Line 1792 of yacc.c */ -#line 3779 "dtool/src/cppparser/cppBison.yxx" + case 623: +#line 3437 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8349 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 697: -/* Line 1792 of yacc.c */ -#line 3783 "dtool/src/cppparser/cppBison.yxx" + case 624: +#line 3441 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8357 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 698: -/* Line 1792 of yacc.c */ -#line 3787 "dtool/src/cppparser/cppBison.yxx" + case 625: +#line 3445 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8365 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 699: -/* Line 1792 of yacc.c */ -#line 3791 "dtool/src/cppparser/cppBison.yxx" + case 626: +#line 3449 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8373 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 700: -/* Line 1792 of yacc.c */ -#line 3795 "dtool/src/cppparser/cppBison.yxx" + case 627: +#line 3453 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8381 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 701: -/* Line 1792 of yacc.c */ -#line 3799 "dtool/src/cppparser/cppBison.yxx" + case 628: +#line 3457 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('<', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8389 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 702: -/* Line 1792 of yacc.c */ -#line 3803 "dtool/src/cppparser/cppBison.yxx" + case 629: +#line 3461 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('>', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 703: -/* Line 1792 of yacc.c */ -#line 3807 "dtool/src/cppparser/cppBison.yxx" + case 630: +#line 3465 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 704: -/* Line 1792 of yacc.c */ -#line 3811 "dtool/src/cppparser/cppBison.yxx" + case 631: +#line 3469 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 705: -/* Line 1792 of yacc.c */ -#line 3815 "dtool/src/cppparser/cppBison.yxx" + case 632: +#line 3473 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[(1) - (5)].u.expr), (yyvsp[(3) - (5)].u.expr), (yyvsp[(5) - (5)].u.expr)); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8421 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 706: -/* Line 1792 of yacc.c */ -#line 3819 "dtool/src/cppparser/cppBison.yxx" + case 633: +#line 3477 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8429 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 707: -/* Line 1792 of yacc.c */ -#line 3823 "dtool/src/cppparser/cppBison.yxx" + case 634: +#line 3481 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (4)].u.expr), (yyvsp[(3) - (4)].u.expr)); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } +#line 8437 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 708: -/* Line 1792 of yacc.c */ -#line 3827 "dtool/src/cppparser/cppBison.yxx" + case 635: +#line 3485 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[(1) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } +#line 8445 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 709: -/* Line 1792 of yacc.c */ -#line 3831 "dtool/src/cppparser/cppBison.yxx" + case 636: +#line 3489 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } +#line 8453 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 710: -/* Line 1792 of yacc.c */ -#line 3835 "dtool/src/cppparser/cppBison.yxx" + case 637: +#line 3493 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[(1) - (3)].u.expr), (yyvsp[(3) - (3)].u.expr)); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8461 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 711: -/* Line 1792 of yacc.c */ -#line 3839 "dtool/src/cppparser/cppBison.yxx" + case 638: +#line 3497 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(2) - (3)].u.expr); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } +#line 8469 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 712: -/* Line 1792 of yacc.c */ -#line 3846 "dtool/src/cppparser/cppBison.yxx" + case 639: +#line 3501 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.integer)); + (yyval.u.expr) = (yyvsp[-1].u.expr); } +#line 8477 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 713: -/* Line 1792 of yacc.c */ -#line 3850 "dtool/src/cppparser/cppBison.yxx" + case 640: +#line 3508 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); +} +#line 8485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 641: +#line 3512 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(true); } +#line 8493 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 714: -/* Line 1792 of yacc.c */ -#line 3854 "dtool/src/cppparser/cppBison.yxx" + case 642: +#line 3516 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(false); } +#line 8501 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 715: -/* Line 1792 of yacc.c */ -#line 3858 "dtool/src/cppparser/cppBison.yxx" + case 643: +#line 3520 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.integer)); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } +#line 8509 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 716: -/* Line 1792 of yacc.c */ -#line 3862 "dtool/src/cppparser/cppBison.yxx" + case 644: +#line 3524 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.real)); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); } +#line 8517 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 717: -/* Line 1792 of yacc.c */ -#line 3866 "dtool/src/cppparser/cppBison.yxx" + case 645: +#line 3528 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 8525 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 718: -/* Line 1792 of yacc.c */ -#line 3870 "dtool/src/cppparser/cppBison.yxx" + case 646: +#line 3532 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); + (yyval.u.expr) = (yyvsp[0].u.expr); } +#line 8533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 719: -/* Line 1792 of yacc.c */ -#line 3874 "dtool/src/cppparser/cppBison.yxx" + case 647: +#line 3536 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].u.identifier), current_scope, global_scope, current_lexer); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); } +#line 8541 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 720: -/* Line 1792 of yacc.c */ -#line 3878 "dtool/src/cppparser/cppBison.yxx" + case 648: +#line 3540 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "final". C++11 explicitly permits this. - CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[(1) - (1)])); + CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } +#line 8551 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 721: -/* Line 1792 of yacc.c */ -#line 3884 "dtool/src/cppparser/cppBison.yxx" + case 649: +#line 3546 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "override". C++11 explicitly permits this. - CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[(1) - (1)])); + CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } +#line 8561 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 722: -/* Line 1792 of yacc.c */ -#line 3890 "dtool/src/cppparser/cppBison.yxx" + case 650: +#line 3552 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); } +#line 8569 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 651: +#line 3556 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyvsp[-6].u.closure_type)->_flags = (yyvsp[-4].u.integer); + (yyvsp[-6].u.closure_type)->_return_type = (yyvsp[-3].u.type); + (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[-6].u.closure_type))); +} +#line 8579 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 652: +#line 3562 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyvsp[-9].u.closure_type)->_parameters = (yyvsp[-6].u.param_list); + (yyvsp[-9].u.closure_type)->_flags = (yyvsp[-4].u.integer); + (yyvsp[-9].u.closure_type)->_return_type = (yyvsp[-3].u.type); + (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[-9].u.closure_type))); +} +#line 8590 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 653: +#line 3569 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[-1].u.type))); +} +#line 8598 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 654: +#line 3573 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[-1].u.type))); +} +#line 8606 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 655: +#line 3577 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); +} +#line 8614 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 656: +#line 3581 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-1].u.type))); +} +#line 8622 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 657: +#line 3585 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-1].u.type))); +} +#line 8630 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 658: +#line 3589 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); +} +#line 8638 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 659: +#line 3593 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); +} +#line 8646 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 660: +#line 3597 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[-1].u.type))); +} +#line 8654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 661: +#line 3601 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[-1].u.type))); +} +#line 8662 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 662: +#line 3605 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[-1].u.type))); +} +#line 8670 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 663: +#line 3609 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[-1].u.type))); +} +#line 8678 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 664: +#line 3613 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[-1].u.type))); +} +#line 8686 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 665: +#line 3617 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[-1].u.type))); +} +#line 8694 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 666: +#line 3621 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[-1].u.type))); +} +#line 8702 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 667: +#line 3625 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[-1].u.type))); +} +#line 8710 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 668: +#line 3629 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[-1].u.type))); +} +#line 8718 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 669: +#line 3633 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[-1].u.type))); +} +#line 8726 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 670: +#line 3647 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 8734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 671: +#line 3651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); +} +#line 8742 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 672: +#line 3655 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); +} +#line 8750 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 673: +#line 3659 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); +} +#line 8758 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 674: +#line 3663 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); +} +#line 8766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 675: +#line 3667 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); +} +#line 8774 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 676: +#line 3671 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); +} +#line 8782 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 677: +#line 3675 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (arg == (CPPDeclaration *)NULL) { + yyerror("undefined sizeof argument: " + (yyvsp[-1].u.identifier)->get_fully_scoped_name(), (yylsp[-1])); + } else if (arg->get_subtype() == CPPDeclaration::ST_instance) { + CPPInstance *inst = arg->as_instance(); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(inst->_type)); + } else { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); + } +} +#line 8798 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 678: +#line 3687 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); +} +#line 8806 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 679: +#line 3691 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); +} +#line 8814 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 680: +#line 3695 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); +} +#line 8822 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 681: +#line 3699 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); +} +#line 8830 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 682: +#line 3703 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPIdentifier ident(""); + ident.add_name("std"); + ident.add_name("type_info"); + CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); + if (!std_type_info) { + yywarning("cannot use typeid before including ", (yylsp[-3])); + } + (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); +} +#line 8845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 683: +#line 3714 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPIdentifier ident(""); + ident.add_name("std"); + ident.add_name("type_info"); + CPPType *std_type_info = ident.find_type(current_scope, global_scope, false, current_lexer); + if (!std_type_info) { + yywarning("cannot use typeid before including ", (yylsp[-3])); + } + (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); +} +#line 8860 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 684: +#line 3725 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); +} +#line 8868 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 685: +#line 3729 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); +} +#line 8876 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 686: +#line 3733 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); +} +#line 8884 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 687: +#line 3737 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); +} +#line 8892 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 688: +#line 3741 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); +} +#line 8900 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 689: +#line 3745 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8908 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 690: +#line 3749 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8916 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 691: +#line 3753 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8924 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 692: +#line 3757 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8932 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 693: +#line 3761 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8940 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 694: +#line 3765 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8948 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 695: +#line 3769 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8956 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 696: +#line 3773 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8964 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 697: +#line 3777 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8972 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 698: +#line 3781 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8980 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 699: +#line 3785 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8988 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 700: +#line 3789 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 8996 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 701: +#line 3793 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9004 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 702: +#line 3797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9012 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 703: +#line 3801 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9020 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 704: +#line 3805 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9028 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 705: +#line 3809 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9036 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 706: +#line 3813 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9044 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 707: +#line 3817 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 708: +#line 3821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); +} +#line 9060 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 709: +#line 3825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); +} +#line 9068 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 710: +#line 3829 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); +} +#line 9076 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 711: +#line 3833 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 712: +#line 3837 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 9092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 713: +#line 3841 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[-1].u.expr); +} +#line 9100 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 714: +#line 3848 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); +} +#line 9108 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 715: +#line 3852 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(true); +} +#line 9116 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 716: +#line 3856 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(false); +} +#line 9124 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 717: +#line 3860 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); +} +#line 9132 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 718: +#line 3864 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); +} +#line 9140 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 719: +#line 3868 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 9148 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 720: +#line 3872 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 9156 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 721: +#line 3876 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); +} +#line 9164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 722: +#line 3880 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + // A variable named "final". C++11 explicitly permits this. + CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); + (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); +} +#line 9174 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 723: -/* Line 1792 of yacc.c */ -#line 3898 "dtool/src/cppparser/cppBison.yxx" +#line 3886 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.closure_type) = new CPPClosureType(); + // A variable named "override". C++11 explicitly permits this. + CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); + (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } +#line 9184 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 724: -/* Line 1792 of yacc.c */ -#line 3902 "dtool/src/cppparser/cppBison.yxx" +#line 3892 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_value); + (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); } +#line 9192 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 725: -/* Line 1792 of yacc.c */ -#line 3906 "dtool/src/cppparser/cppBison.yxx" +#line 3900 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_reference); + (yyval.u.closure_type) = new CPPClosureType(); } +#line 9200 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 726: -/* Line 1792 of yacc.c */ -#line 3910 "dtool/src/cppparser/cppBison.yxx" +#line 3904 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.closure_type) = new CPPClosureType(); - (yyvsp[(1) - (2)].u.capture)->_initializer = (yyvsp[(2) - (2)].u.expr); - (yyval.u.closure_type)->_captures.push_back(*(yyvsp[(1) - (2)].u.capture)); - delete (yyvsp[(1) - (2)].u.capture); + (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_value); } +#line 9208 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 727: -/* Line 1792 of yacc.c */ -#line 3917 "dtool/src/cppparser/cppBison.yxx" +#line 3908 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.closure_type) = (yyvsp[(1) - (4)].u.closure_type); - (yyvsp[(3) - (4)].u.capture)->_initializer = (yyvsp[(4) - (4)].u.expr); - (yyval.u.closure_type)->_captures.push_back(*(yyvsp[(3) - (4)].u.capture)); - delete (yyvsp[(3) - (4)].u.capture); + (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_reference); } +#line 9216 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 728: -/* Line 1792 of yacc.c */ -#line 3927 "dtool/src/cppparser/cppBison.yxx" +#line 3912 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.capture) = new CPPClosureType::Capture; - (yyval.u.capture)->_name = (yyvsp[(2) - (2)].u.identifier)->get_simple_name(); - (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; + (yyval.u.closure_type) = new CPPClosureType(); + (yyvsp[-1].u.capture)->_initializer = (yyvsp[0].u.expr); + (yyval.u.closure_type)->_captures.push_back(*(yyvsp[-1].u.capture)); + delete (yyvsp[-1].u.capture); } +#line 9227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 729: -/* Line 1792 of yacc.c */ -#line 3933 "dtool/src/cppparser/cppBison.yxx" +#line 3919 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.capture) = new CPPClosureType::Capture; - (yyval.u.capture)->_name = (yyvsp[(2) - (3)].u.identifier)->get_simple_name(); - (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; + (yyval.u.closure_type) = (yyvsp[-3].u.closure_type); + (yyvsp[-1].u.capture)->_initializer = (yyvsp[0].u.expr); + (yyval.u.closure_type)->_captures.push_back(*(yyvsp[-1].u.capture)); + delete (yyvsp[-1].u.capture); } +#line 9238 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 730: -/* Line 1792 of yacc.c */ -#line 3939 "dtool/src/cppparser/cppBison.yxx" +#line 3929 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; - (yyval.u.capture)->_name = (yyvsp[(1) - (1)].u.identifier)->get_simple_name(); + (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); + (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; +} +#line 9248 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 731: +#line 3935 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.capture) = new CPPClosureType::Capture; + (yyval.u.capture)->_name = (yyvsp[-1].u.identifier)->get_simple_name(); + (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; +} +#line 9258 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 732: +#line 3941 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.capture) = new CPPClosureType::Capture; + (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); if ((yyval.u.capture)->_name == "this") { (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } else { (yyval.u.capture)->_type = CPPClosureType::CT_by_value; } } - break; - - case 731: -/* Line 1792 of yacc.c */ -#line 3949 "dtool/src/cppparser/cppBison.yxx" - { - (yyval.u.capture) = new CPPClosureType::Capture; - (yyval.u.capture)->_name = (yyvsp[(2) - (2)].u.identifier)->get_simple_name(); - (yyval.u.capture)->_type = CPPClosureType::CT_by_value; - if ((yyval.u.capture)->_name != "this") { - yywarning("only capture name 'this' may be preceded by an asterisk", (yylsp[(2) - (2)])); - } -} - break; - - case 732: -/* Line 1792 of yacc.c */ -#line 3961 "dtool/src/cppparser/cppBison.yxx" - { - CPPType *type = (yyvsp[(1) - (1)].u.identifier)->find_type(current_scope, global_scope, true); - if (type == NULL) { - type = CPPType::new_type(new CPPTBDType((yyvsp[(1) - (1)].u.identifier))); - } - (yyval.u.type) = type; -} +#line 9272 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 733: -/* Line 1792 of yacc.c */ -#line 3969 "dtool/src/cppparser/cppBison.yxx" +#line 3951 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[(2) - (2)].u.identifier))); + (yyval.u.capture) = new CPPClosureType::Capture; + (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); + (yyval.u.capture)->_type = CPPClosureType::CT_by_value; + if ((yyval.u.capture)->_name != "this") { + yywarning("only capture name 'this' may be preceded by an asterisk", (yylsp[0])); + } } +#line 9285 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 734: -/* Line 1792 of yacc.c */ -#line 3973 "dtool/src/cppparser/cppBison.yxx" +#line 3963 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[(1) - (2)].u.identifier)); - ctp->_packed = true; - (yyval.u.type) = CPPType::new_type(ctp); + CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, true); + if (type == NULL) { + type = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); + } + (yyval.u.type) = type; } +#line 9297 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 735: -/* Line 1792 of yacc.c */ -#line 4003 "dtool/src/cppparser/cppBison.yxx" +#line 3971 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } +#line 9305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 736: -/* Line 1792 of yacc.c */ -#line 4007 "dtool/src/cppparser/cppBison.yxx" +#line 3975 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); + CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[-1].u.identifier)); + ctp->_packed = true; + (yyval.u.type) = CPPType::new_type(ctp); } +#line 9315 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 737: -/* Line 1792 of yacc.c */ -#line 4011 "dtool/src/cppparser/cppBison.yxx" +#line 4005 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } +#line 9323 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 738: -/* Line 1792 of yacc.c */ -#line 4015 "dtool/src/cppparser/cppBison.yxx" +#line 4009 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[(1) - (1)])); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } +#line 9331 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 739: -/* Line 1792 of yacc.c */ -#line 4019 "dtool/src/cppparser/cppBison.yxx" +#line 4013 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[(1) - (1)])); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } +#line 9339 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 740: -/* Line 1792 of yacc.c */ -#line 4023 "dtool/src/cppparser/cppBison.yxx" +#line 4017 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - // This is not a keyword in Python, so it is useful to be able to use this - // in MAKE_PROPERTY definitions, etc. - (yyval.u.identifier) = new CPPIdentifier("signed", (yylsp[(1) - (1)])); + (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[0])); } +#line 9347 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 741: -/* Line 1792 of yacc.c */ -#line 4029 "dtool/src/cppparser/cppBison.yxx" +#line 4021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[(1) - (1)])); + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); } +#line 9355 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 742: -/* Line 1792 of yacc.c */ -#line 4033 "dtool/src/cppparser/cppBison.yxx" +#line 4025 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[(1) - (1)])); + // This is not a keyword in Python, so it is useful to be able to use this + // in MAKE_PROPERTY definitions, etc. + (yyval.u.identifier) = new CPPIdentifier("signed", (yylsp[0])); } +#line 9365 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 743: -/* Line 1792 of yacc.c */ -#line 4037 "dtool/src/cppparser/cppBison.yxx" +#line 4031 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[(1) - (1)])); + (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[0])); } +#line 9373 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 744: -/* Line 1792 of yacc.c */ -#line 4041 "dtool/src/cppparser/cppBison.yxx" +#line 4035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[(1) - (1)])); + (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[0])); } +#line 9381 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 745: -/* Line 1792 of yacc.c */ -#line 4052 "dtool/src/cppparser/cppBison.yxx" +#line 4039 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); + (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[0])); } +#line 9389 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 746: -/* Line 1792 of yacc.c */ -#line 4056 "dtool/src/cppparser/cppBison.yxx" +#line 4043 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); + (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[0])); } +#line 9397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 747: -/* Line 1792 of yacc.c */ -#line 4060 "dtool/src/cppparser/cppBison.yxx" +#line 4054 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[(1) - (1)].u.identifier); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } +#line 9405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 748: -/* Line 1792 of yacc.c */ -#line 4064 "dtool/src/cppparser/cppBison.yxx" +#line 4058 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[(1) - (1)])); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } +#line 9413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 749: -/* Line 1792 of yacc.c */ -#line 4072 "dtool/src/cppparser/cppBison.yxx" +#line 4062 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[(1) - (1)].str)); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } +#line 9421 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 750: -/* Line 1792 of yacc.c */ -#line 4076 "dtool/src/cppparser/cppBison.yxx" +#line 4066 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[(1) - (1)].u.expr); + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); } +#line 9429 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 751: -/* Line 1792 of yacc.c */ -#line 4080 "dtool/src/cppparser/cppBison.yxx" +#line 4074 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - // The right string takes on the literal type of the left. - (yyval.u.expr) = (yyvsp[(1) - (2)].u.expr); - (yyval.u.expr)->_str += (yyvsp[(2) - (2)].str); + (yyval.u.expr) = new CPPExpression((yyvsp[0].str)); } +#line 9437 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 752: -/* Line 1792 of yacc.c */ -#line 4086 "dtool/src/cppparser/cppBison.yxx" +#line 4078 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 9445 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 753: +#line 4082 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + // The right string takes on the literal type of the left. + (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr)->_str += (yyvsp[0].str); +} +#line 9455 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 754: +#line 4088 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We have to check that the two literal types match up. - (yyval.u.expr) = (yyvsp[(1) - (2)].u.expr); - if ((yyvsp[(2) - (2)].u.expr)->_type != CPPExpression::T_string && (yyvsp[(2) - (2)].u.expr)->_type != (yyvsp[(1) - (2)].u.expr)->_type) { + (yyval.u.expr) = (yyvsp[-1].u.expr); + if ((yyvsp[0].u.expr)->_type != CPPExpression::T_string && (yyvsp[0].u.expr)->_type != (yyvsp[-1].u.expr)->_type) { yywarning("cannot concatenate two string literals of different types", (yyloc)); } - (yyval.u.expr)->_str += (yyvsp[(2) - (2)].u.expr)->_str; + (yyval.u.expr)->_str += (yyvsp[0].u.expr)->_str; } +#line 9468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; -/* Line 1792 of yacc.c */ -#line 9985 "built_x64/tmp/cppBison.yxx.c" +#line 9472 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -10004,7 +9491,7 @@ yyreduce: *++yyvsp = yyval; *++yylsp = yyloc; - /* Now `shift' the result of the reduction. Determine what state + /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ @@ -10019,9 +9506,9 @@ yyreduce: goto yynewstate; -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ @@ -10032,7 +9519,7 @@ yyerrlab: { ++yynerrs; #if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); + yyerror (&yylloc, YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) @@ -10059,7 +9546,7 @@ yyerrlab: yymsgp = yymsg; } } - yyerror (yymsgp); + yyerror (&yylloc, yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } @@ -10072,20 +9559,20 @@ yyerrlab: if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval, &yylloc); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval, &yylloc); + yychar = YYEMPTY; + } } /* Else will try to reuse lookahead token after shifting the error @@ -10105,7 +9592,7 @@ yyerrorlab: goto yyerrorlab; yyerror_range[1] = yylsp[1-yylen]; - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; @@ -10118,29 +9605,29 @@ yyerrorlab: | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; yyerror_range[1] = *yylsp; yydestruct ("Error: popping", - yystos[yystate], yyvsp, yylsp); + yystos[yystate], yyvsp, yylsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -10182,7 +9669,7 @@ yyabortlab: | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: - yyerror (YY_("memory exhausted")); + yyerror (&yylloc, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif @@ -10196,14 +9683,14 @@ yyreturn: yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc); } - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp, yylsp); + yystos[*yyssp], yyvsp, yylsp); YYPOPSTACK (1); } #ifndef yyoverflow @@ -10214,8 +9701,5 @@ yyreturn: if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif - /* Make sure YYID is used. */ - return YYID (yyresult); + return yyresult; } - - diff --git a/dtool/src/cppparser/cppBison.h.prebuilt b/dtool/src/cppparser/cppBison.h.prebuilt index 57b8c1be8a..cc8062241a 100644 --- a/dtool/src/cppparser/cppBison.h.prebuilt +++ b/dtool/src/cppparser/cppBison.h.prebuilt @@ -1,8 +1,8 @@ -/* 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 - 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 it under the terms of the GNU General Public License as published by @@ -30,9 +30,9 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -#ifndef YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED -# define YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED -/* Enabling traces. */ +#ifndef YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED +# define YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED +/* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif @@ -40,156 +40,155 @@ extern int cppyydebug; #endif -/* Tokens. */ +/* Token type. */ #ifndef 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, - TYPEPACK_IDENTIFIER = 267, - SCOPING = 268, - TYPEDEFNAME = 269, - ELLIPSIS = 270, - OROR = 271, - ANDAND = 272, - EQCOMPARE = 273, - NECOMPARE = 274, - LECOMPARE = 275, - GECOMPARE = 276, - LSHIFT = 277, - RSHIFT = 278, - POINTSAT_STAR = 279, - DOT_STAR = 280, - UNARY = 281, - UNARY_NOT = 282, - UNARY_NEGATE = 283, - UNARY_MINUS = 284, - UNARY_PLUS = 285, - UNARY_STAR = 286, - UNARY_REF = 287, - POINTSAT = 288, - SCOPE = 289, - PLUSPLUS = 290, - MINUSMINUS = 291, - TIMESEQUAL = 292, - DIVIDEEQUAL = 293, - MODEQUAL = 294, - PLUSEQUAL = 295, - MINUSEQUAL = 296, - OREQUAL = 297, - ANDEQUAL = 298, - XOREQUAL = 299, - LSHIFTEQUAL = 300, - RSHIFTEQUAL = 301, - ATTR_LEFT = 302, - ATTR_RIGHT = 303, - KW_ALIGNAS = 304, - KW_ALIGNOF = 305, - KW_AUTO = 306, - KW_BEGIN_PUBLISH = 307, - KW_BLOCKING = 308, - KW_BOOL = 309, - KW_CATCH = 310, - KW_CHAR = 311, - KW_CHAR16_T = 312, - KW_CHAR32_T = 313, - KW_CLASS = 314, - KW_CONST = 315, - KW_CONSTEXPR = 316, - KW_CONST_CAST = 317, - KW_DECLTYPE = 318, - KW_DEFAULT = 319, - KW_DELETE = 320, - KW_DOUBLE = 321, - KW_DYNAMIC_CAST = 322, - KW_ELSE = 323, - KW_END_PUBLISH = 324, - KW_ENUM = 325, - KW_EXTENSION = 326, - KW_EXTERN = 327, - KW_EXPLICIT = 328, - KW_PUBLISHED = 329, - KW_FALSE = 330, - KW_FINAL = 331, - KW_FLOAT = 332, - KW_FRIEND = 333, - KW_FOR = 334, - KW_GOTO = 335, - KW_HAS_VIRTUAL_DESTRUCTOR = 336, - KW_IF = 337, - KW_INLINE = 338, - KW_INT = 339, - KW_IS_ABSTRACT = 340, - KW_IS_BASE_OF = 341, - KW_IS_CLASS = 342, - KW_IS_CONSTRUCTIBLE = 343, - KW_IS_CONVERTIBLE_TO = 344, - KW_IS_DESTRUCTIBLE = 345, - KW_IS_EMPTY = 346, - KW_IS_ENUM = 347, - KW_IS_FINAL = 348, - KW_IS_FUNDAMENTAL = 349, - KW_IS_POD = 350, - KW_IS_POLYMORPHIC = 351, - KW_IS_STANDARD_LAYOUT = 352, - KW_IS_TRIVIAL = 353, - KW_IS_UNION = 354, - KW_LONG = 355, - KW_MAKE_MAP_PROPERTY = 356, - KW_MAKE_PROPERTY = 357, - KW_MAKE_PROPERTY2 = 358, - KW_MAKE_SEQ = 359, - KW_MAKE_SEQ_PROPERTY = 360, - KW_MUTABLE = 361, - KW_NAMESPACE = 362, - KW_NEW = 363, - KW_NOEXCEPT = 364, - KW_NULLPTR = 365, - KW_OPERATOR = 366, - KW_OVERRIDE = 367, - KW_PRIVATE = 368, - KW_PROTECTED = 369, - KW_PUBLIC = 370, - KW_REGISTER = 371, - KW_REINTERPRET_CAST = 372, - KW_RETURN = 373, - KW_SHORT = 374, - KW_SIGNED = 375, - KW_SIZEOF = 376, - KW_STATIC = 377, - KW_STATIC_ASSERT = 378, - KW_STATIC_CAST = 379, - KW_STRUCT = 380, - KW_TEMPLATE = 381, - KW_THREAD_LOCAL = 382, - KW_THROW = 383, - KW_TRUE = 384, - KW_TRY = 385, - KW_TYPEDEF = 386, - KW_TYPEID = 387, - KW_TYPENAME = 388, - KW_UNDERLYING_TYPE = 389, - KW_UNION = 390, - KW_UNSIGNED = 391, - KW_USING = 392, - KW_VIRTUAL = 393, - KW_VOID = 394, - KW_VOLATILE = 395, - KW_WCHAR_T = 396, - KW_WHILE = 397, - START_CPP = 398, - START_CONST_EXPR = 399, - START_TYPE = 400 - }; + 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, + TYPEPACK_IDENTIFIER = 267, + SCOPING = 268, + TYPEDEFNAME = 269, + ELLIPSIS = 270, + OROR = 271, + ANDAND = 272, + EQCOMPARE = 273, + NECOMPARE = 274, + LECOMPARE = 275, + GECOMPARE = 276, + LSHIFT = 277, + RSHIFT = 278, + POINTSAT_STAR = 279, + DOT_STAR = 280, + UNARY = 281, + UNARY_NOT = 282, + UNARY_NEGATE = 283, + UNARY_MINUS = 284, + UNARY_PLUS = 285, + UNARY_STAR = 286, + UNARY_REF = 287, + POINTSAT = 288, + SCOPE = 289, + PLUSPLUS = 290, + MINUSMINUS = 291, + TIMESEQUAL = 292, + DIVIDEEQUAL = 293, + MODEQUAL = 294, + PLUSEQUAL = 295, + MINUSEQUAL = 296, + OREQUAL = 297, + ANDEQUAL = 298, + XOREQUAL = 299, + LSHIFTEQUAL = 300, + RSHIFTEQUAL = 301, + ATTR_LEFT = 302, + ATTR_RIGHT = 303, + KW_ALIGNAS = 304, + KW_ALIGNOF = 305, + KW_AUTO = 306, + KW_BEGIN_PUBLISH = 307, + KW_BLOCKING = 308, + KW_BOOL = 309, + KW_CATCH = 310, + KW_CHAR = 311, + KW_CHAR16_T = 312, + KW_CHAR32_T = 313, + KW_CLASS = 314, + KW_CONST = 315, + KW_CONSTEXPR = 316, + KW_CONST_CAST = 317, + KW_DECLTYPE = 318, + KW_DEFAULT = 319, + KW_DELETE = 320, + KW_DOUBLE = 321, + KW_DYNAMIC_CAST = 322, + KW_ELSE = 323, + KW_END_PUBLISH = 324, + KW_ENUM = 325, + KW_EXTENSION = 326, + KW_EXTERN = 327, + KW_EXPLICIT = 328, + KW_PUBLISHED = 329, + KW_FALSE = 330, + KW_FINAL = 331, + KW_FLOAT = 332, + KW_FRIEND = 333, + KW_FOR = 334, + KW_GOTO = 335, + KW_HAS_VIRTUAL_DESTRUCTOR = 336, + KW_IF = 337, + KW_INLINE = 338, + KW_INT = 339, + KW_IS_ABSTRACT = 340, + KW_IS_BASE_OF = 341, + KW_IS_CLASS = 342, + KW_IS_CONSTRUCTIBLE = 343, + KW_IS_CONVERTIBLE_TO = 344, + KW_IS_DESTRUCTIBLE = 345, + KW_IS_EMPTY = 346, + KW_IS_ENUM = 347, + KW_IS_FINAL = 348, + KW_IS_FUNDAMENTAL = 349, + KW_IS_POD = 350, + KW_IS_POLYMORPHIC = 351, + KW_IS_STANDARD_LAYOUT = 352, + KW_IS_TRIVIAL = 353, + KW_IS_UNION = 354, + KW_LONG = 355, + KW_MAKE_MAP_PROPERTY = 356, + KW_MAKE_PROPERTY = 357, + KW_MAKE_PROPERTY2 = 358, + KW_MAKE_SEQ = 359, + KW_MAKE_SEQ_PROPERTY = 360, + KW_MUTABLE = 361, + KW_NAMESPACE = 362, + KW_NEW = 363, + KW_NOEXCEPT = 364, + KW_NULLPTR = 365, + KW_OPERATOR = 366, + KW_OVERRIDE = 367, + KW_PRIVATE = 368, + KW_PROTECTED = 369, + KW_PUBLIC = 370, + KW_REGISTER = 371, + KW_REINTERPRET_CAST = 372, + KW_RETURN = 373, + KW_SHORT = 374, + KW_SIGNED = 375, + KW_SIZEOF = 376, + KW_STATIC = 377, + KW_STATIC_ASSERT = 378, + KW_STATIC_CAST = 379, + KW_STRUCT = 380, + KW_TEMPLATE = 381, + KW_THREAD_LOCAL = 382, + KW_THROW = 383, + KW_TRUE = 384, + KW_TRY = 385, + KW_TYPEDEF = 386, + KW_TYPEID = 387, + KW_TYPENAME = 388, + KW_UNDERLYING_TYPE = 389, + KW_UNION = 390, + KW_UNSIGNED = 391, + KW_USING = 392, + KW_VIRTUAL = 393, + KW_VOID = 394, + KW_VOLATILE = 395, + KW_WCHAR_T = 396, + KW_WHILE = 397, + START_CPP = 398, + START_CONST_EXPR = 399, + START_TYPE = 400 + }; #endif /* Tokens. */ #define REAL 258 @@ -336,40 +335,24 @@ extern int cppyydebug; #define START_CONST_EXPR 399 #define START_TYPE 400 +/* 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 -typedef struct YYLTYPE +typedef struct YYLTYPE YYLTYPE; +struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; -} YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +}; # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #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); -#else -int cppyyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ -#endif /* !YY_CPPYY_BUILT_X64_TMP_CPPBISON_YXX_H_INCLUDED */ +int cppyyparse (void); + +#endif /* !YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED */ diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 8c0e9bf982..752bbbfecd 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -1451,6 +1451,7 @@ function_operator: more_template_declaration: type_like_declaration | template_declaration + | friend_declaration ; template_declaration: @@ -1464,6 +1465,7 @@ template_declaration: pop_scope(); } | KW_TEMPLATE type_like_declaration + | KW_TEMPLATE friend_declaration ; template_formal_parameters: From fdffcc280b33304001a430cabefadaabddbf94c4 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 10 Feb 2017 00:07:45 +0100 Subject: [PATCH 043/254] Fix compile error for ancient clangs --- panda/src/display/displayInformation.cxx | 4 ++-- panda/src/display/graphicsPipe.cxx | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/panda/src/display/displayInformation.cxx b/panda/src/display/displayInformation.cxx index ac357344a5..9bda75e0de 100644 --- a/panda/src/display/displayInformation.cxx +++ b/panda/src/display/displayInformation.cxx @@ -17,7 +17,7 @@ // For __rdtsc #ifdef _MSC_VER #include -#elif defined(__GNUC__) && !defined(__APPLE__) +#elif defined(__GNUC__) && !defined(__clang__) #include #endif @@ -529,7 +529,7 @@ get_cpu_frequency() { */ uint64_t DisplayInformation:: get_cpu_time() { -#if defined(_MSC_VER) || (defined(__GNUC__) && !defined(__APPLE__)) +#if defined(_MSC_VER) || (defined(__GNUC__) && !defined(__clang__)) return __rdtsc(); #else unsigned int lo, hi = 0; diff --git a/panda/src/display/graphicsPipe.cxx b/panda/src/display/graphicsPipe.cxx index 7bf9df67a6..5c00b204a3 100644 --- a/panda/src/display/graphicsPipe.cxx +++ b/panda/src/display/graphicsPipe.cxx @@ -141,14 +141,15 @@ GraphicsPipe() : } if (max_extended >= 0x80000004) { - string brand; + char brand[49]; get_cpuid(0x80000002, info); - brand += string(info.str, strnlen(info.str, 16)); + memcpy(brand, info.str, 16); get_cpuid(0x80000003, info); - brand += string(info.str, strnlen(info.str, 16)); + memcpy(brand + 16, info.str, 16); get_cpuid(0x80000004, info); - brand += string(info.str, strnlen(info.str, 16)); - _display_information->_cpu_brand_string = move(brand); + memcpy(brand + 32, info.str, 16); + brand[48] = 0; + _display_information->_cpu_brand_string = brand; } #if defined(IS_OSX) From 2acde88695a12b11af71d26f061e4db83a4b0565 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 10 Feb 2017 02:57:47 +0100 Subject: [PATCH 044/254] New alignment code to hopefully fix the alignment issues --- dtool/src/dtoolbase/deletedBufferChain.cxx | 8 +- dtool/src/dtoolbase/deletedChain.T | 145 +++++++++------------ dtool/src/dtoolbase/dtoolbase.h | 6 + dtool/src/dtoolbase/dtoolbase_cc.h | 6 +- dtool/src/dtoolbase/memoryHook.I | 103 +++++---------- dtool/src/dtoolbase/memoryHook.cxx | 46 ++++--- dtool/src/dtoolbase/memoryHook.h | 21 ++- dtool/src/dtoolbase/pallocator.T | 47 ++++--- panda/src/gobj/vertexDataBuffer.I | 28 ++-- 9 files changed, 198 insertions(+), 212 deletions(-) diff --git a/dtool/src/dtoolbase/deletedBufferChain.cxx b/dtool/src/dtoolbase/deletedBufferChain.cxx index 557b6ce9d8..0451ada7d3 100644 --- a/dtool/src/dtoolbase/deletedBufferChain.cxx +++ b/dtool/src/dtoolbase/deletedBufferChain.cxx @@ -39,7 +39,7 @@ allocate(size_t size, TypeHandle type_handle) { assert(size <= _buffer_size); // Determine how much space to allocate. - const size_t alloc_size = _buffer_size + flag_reserved_bytes + MemoryHook::get_memory_alignment() - 1; + const size_t alloc_size = _buffer_size + flag_reserved_bytes + MEMORY_HOOK_ALIGNMENT - 1; ObjectNode *obj; @@ -71,8 +71,8 @@ allocate(size_t size, TypeHandle type_handle) { // Allocate memory, and make sure the object starts at the proper alignment. void *mem = NeverFreeMemory::alloc(alloc_size); - intptr_t pad = (-(intptr_t)flag_reserved_bytes - (intptr_t)mem) % MemoryHook::get_memory_alignment(); - obj = (ObjectNode *)((uintptr_t)mem + pad); + uintptr_t aligned = ((uintptr_t)mem + flag_reserved_bytes + MEMORY_HOOK_ALIGNMENT - 1) & ~(MEMORY_HOOK_ALIGNMENT - 1); + obj = (ObjectNode *)(aligned - flag_reserved_bytes); #ifdef USE_DELETEDCHAINFLAG obj->_flag = DCF_alive; @@ -81,7 +81,7 @@ allocate(size_t size, TypeHandle type_handle) { void *ptr = node_to_buffer(obj); #ifndef NDEBUG - assert(((uintptr_t)ptr % MemoryHook::get_memory_alignment()) == 0); + assert(((uintptr_t)ptr % MEMORY_HOOK_ALIGNMENT) == 0); #endif #ifdef DO_MEMORY_USAGE diff --git a/dtool/src/dtoolbase/deletedChain.T b/dtool/src/dtoolbase/deletedChain.T index 5f50c9a36e..96e800ba3b 100644 --- a/dtool/src/dtoolbase/deletedChain.T +++ b/dtool/src/dtoolbase/deletedChain.T @@ -1,25 +1,22 @@ -// Filename: deletedChain.T -// Created by: drose (01Apr06) -// -//////////////////////////////////////////////////////////////////// -// -// 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." -// -//////////////////////////////////////////////////////////////////// +/** + * 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 deletedChain.T + * @author drose + * @date 2006-04-01 + */ template DeletedChain StaticDeletedChain::_chain; -//////////////////////////////////////////////////////////////////// -// Function: DeletedChain::allocate -// Access: Public -// Description: Allocates the memory for a new object of Type. -//////////////////////////////////////////////////////////////////// +/** + * Allocates the memory for a new object of Type. + */ template INLINE Type *DeletedChain:: allocate(size_t size, TypeHandle type_handle) { @@ -31,14 +28,12 @@ allocate(size_t size, TypeHandle type_handle) { memory_hook->mark_pointer(ptr, _chain->get_buffer_size(), make_ref_ptr(ptr)); #endif // DO_MEMORY_USAGE - return (Type *)ptr; + return (Type *)ASSUME_ALIGNED(ptr, MEMORY_HOOK_ALIGNMENT); } -//////////////////////////////////////////////////////////////////// -// Function: DeletedChain::deallocate -// Access: Public -// Description: Frees the memory for an object of Type. -//////////////////////////////////////////////////////////////////// +/** + * Frees the memory for an object of Type. + */ template INLINE void DeletedChain:: deallocate(Type *ptr, TypeHandle type_handle) { @@ -57,16 +52,13 @@ deallocate(Type *ptr, TypeHandle type_handle) { _chain->deallocate(ptr, type_handle); } -//////////////////////////////////////////////////////////////////// -// Function: DeletedChain::validate -// Access: Public -// Description: Returns true if the pointer is valid, false if it has -// been deleted or if it was never a valid pointer. -// -// This is only meaningful in debug mode, where -// USE_DELETEDCHAINFLAG is defined. If not, this -// trivially returns true. -//////////////////////////////////////////////////////////////////// +/** + * Returns true if the pointer is valid, false if it has been deleted or if it + * was never a valid pointer. + * + * This is only meaningful in debug mode, where USE_DELETEDCHAINFLAG is + * defined. If not, this trivially returns true. + */ template INLINE bool DeletedChain:: validate(const Type *ptr) { @@ -80,48 +72,37 @@ validate(const Type *ptr) { #endif // USE_DELETEDCHAINFLAG } -//////////////////////////////////////////////////////////////////// -// Function: DeletedChain::make_ref_ptr -// Access: Public, Static -// Description: This method has two overloads: one that accepts a -// void *, and one that accepts a ReferenceCount *. We -// rely on the C++ compiler to select the most -// appropriate one for a given type to return the -// ReferenceCount pointer that corresponds to a -// particular type, or NULL if the type does not inherit -// from ReferenceCount. -//////////////////////////////////////////////////////////////////// +/** + * This method has two overloads: one that accepts a void *, and one that + * accepts a ReferenceCount *. We rely on the C++ compiler to select the most + * appropriate one for a given type to return the ReferenceCount pointer that + * corresponds to a particular type, or NULL if the type does not inherit from + * ReferenceCount. + */ template INLINE ReferenceCount *DeletedChain:: make_ref_ptr(void *) { return NULL; } -//////////////////////////////////////////////////////////////////// -// Function: DeletedChain::make_ref_ptr -// Access: Public, Static -// Description: This method has two overloads: one that accepts a -// void *, and one that accepts a ReferenceCount *. We -// rely on the C++ compiler to select the most -// appropriate one for a given type to return the -// ReferenceCount pointer that corresponds to a -// particular type, or NULL if the type does not inherit -// from ReferenceCount. -//////////////////////////////////////////////////////////////////// +/** + * This method has two overloads: one that accepts a void *, and one that + * accepts a ReferenceCount *. We rely on the C++ compiler to select the most + * appropriate one for a given type to return the ReferenceCount pointer that + * corresponds to a particular type, or NULL if the type does not inherit from + * ReferenceCount. + */ template INLINE ReferenceCount *DeletedChain:: make_ref_ptr(ReferenceCount *ptr) { return ptr; } -//////////////////////////////////////////////////////////////////// -// Function: DeletedChain::init_deleted_chain -// Access: Private -// Description: Assigns the _chain pointer if it is not already -// assigned. This can't be done by a constructor, since -// often the DeletedChain instance is used before its -// static construct has had a chance to be called. -//////////////////////////////////////////////////////////////////// +/** + * Assigns the _chain pointer if it is not already assigned. This can't be + * done by a constructor, since often the DeletedChain instance is used before + * its static construct has had a chance to be called. + */ template void DeletedChain:: init_deleted_chain() { @@ -131,38 +112,32 @@ init_deleted_chain() { } } -//////////////////////////////////////////////////////////////////// -// Function: StaticDeletedChain::allocate -// Access: Public, Static -// Description: Allocates the memory for a new object of Type. -//////////////////////////////////////////////////////////////////// +/** + * Allocates the memory for a new object of Type. + */ template INLINE Type *StaticDeletedChain:: allocate(size_t size, TypeHandle type_handle) { - return _chain.allocate(size, type_handle); + Type *ptr = _chain.allocate(size, type_handle); + return (Type *)ASSUME_ALIGNED(ptr, MEMORY_HOOK_ALIGNMENT); } -//////////////////////////////////////////////////////////////////// -// Function: StaticDeletedChain::deallocate -// Access: Public -// Description: Frees the memory for an object of Type. -//////////////////////////////////////////////////////////////////// +/** + * Frees the memory for an object of Type. + */ template INLINE void StaticDeletedChain:: deallocate(Type *ptr, TypeHandle type_handle) { _chain.deallocate(ptr, type_handle); } -//////////////////////////////////////////////////////////////////// -// Function: StaticDeletedChain::validate -// Access: Public -// Description: Returns true if the pointer is valid, false if it has -// been deleted or if it was never a valid pointer. -// -// This is only meaningful in debug mode, where -// USE_DELETEDCHAINFLAG is defined. If not, this -// trivially returns true. -//////////////////////////////////////////////////////////////////// +/** + * Returns true if the pointer is valid, false if it has been deleted or if it + * was never a valid pointer. + * + * This is only meaningful in debug mode, where USE_DELETEDCHAINFLAG is + * defined. If not, this trivially returns true. + */ template INLINE bool StaticDeletedChain:: validate(const Type *ptr) { diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index c6cbbd7f46..8dd2ec3cf6 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -89,6 +89,12 @@ #define NODEFAULT #endif +// Use this to hint the compiler that a memory address is aligned. +#if __has_builtin(__builtin_assume_aligned) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) +#define ASSUME_ALIGNED(x, y) (__builtin_assume_aligned(x, y)) +#else +#define ASSUME_ALIGNED(x, y) (x) +#endif /* include win32 defns for everything up to WinServer2003, and assume diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index 3d374748b6..88d4244af6 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -290,10 +290,10 @@ EXPCL_DTOOL void init_memory_hook(); // Now redefine some handy macros to hook into the above MemoryHook object. #ifndef USE_MEMORY_NOWRAPPERS -#define PANDA_MALLOC_SINGLE(size) (memory_hook->heap_alloc_single(size)) +#define PANDA_MALLOC_SINGLE(size) (ASSUME_ALIGNED(memory_hook->heap_alloc_single(size), MEMORY_HOOK_ALIGNMENT)) #define PANDA_FREE_SINGLE(ptr) memory_hook->heap_free_single(ptr) -#define PANDA_MALLOC_ARRAY(size) (memory_hook->heap_alloc_array(size)) -#define PANDA_REALLOC_ARRAY(ptr, size) (memory_hook->heap_realloc_array(ptr, size)) +#define PANDA_MALLOC_ARRAY(size) (ASSUME_ALIGNED(memory_hook->heap_alloc_array(size), MEMORY_HOOK_ALIGNMENT)) +#define PANDA_REALLOC_ARRAY(ptr, size) (ASSUME_ALIGNED(memory_hook->heap_realloc_array(ptr, size), MEMORY_HOOK_ALIGNMENT)) #define PANDA_FREE_ARRAY(ptr) memory_hook->heap_free_array(ptr) #else #define PANDA_MALLOC_SINGLE(size) ::malloc(size) diff --git a/dtool/src/dtoolbase/memoryHook.I b/dtool/src/dtoolbase/memoryHook.I index 3d2be05097..c89fe1908b 100644 --- a/dtool/src/dtoolbase/memoryHook.I +++ b/dtool/src/dtoolbase/memoryHook.I @@ -38,57 +38,9 @@ dec_heap(size_t size) { * Returns the global memory alignment. This is the number of bytes at which * each allocated memory pointer will be aligned. */ -INLINE size_t MemoryHook:: +CONSTEXPR size_t MemoryHook:: get_memory_alignment() { -#ifdef LINMATH_ALIGN - // We require 16-byte alignment of certain structures, to support SSE2. We - // don't strictly have to align *everything*, but it's just easier to do so. -#ifdef __AVX__ - // Eigen requires 32-byte alignment when using AVX instructions. - const size_t alignment_size = 32; -#else - const size_t alignment_size = 16; -#endif -#else - // Otherwise, align to two words. This seems to be pretty standard to the - // point where some code may rely on this being the case. - const size_t alignment_size = sizeof(void *) * 2; -#endif - return alignment_size; -} - -/** - * Returns the number of additional bytes that are reserved at the beginning - * of every allocated block to store a size_t. - */ -INLINE size_t MemoryHook:: -get_header_reserved_bytes() { - // We need to figure out the minimum amount of additional space we need in - // order to place a single word at the start of each allocated block, to - // store the size of the block. - -#ifdef LINMATH_ALIGN - // If we're doing SSE2 alignment, we must reserve a full 16-byte block, - // since anything less than that will spoil the alignment. -#ifdef __AVX__ - // Eigen requires 32-byte alignment when using AVX instructions. - static const size_t header_reserved_bytes = 32; -#else - static const size_t header_reserved_bytes = 16; -#endif - -#elif defined(MEMORY_HOOK_DO_ALIGN) - // If we're just aligning to words, we reserve a block as big as two words, - // to allow us wiggle room to align the word precisely within that block. - static const size_t header_reserved_bytes = sizeof(size_t) + sizeof(size_t); - -#else - // Virtually all allocators align to two words, so we make sure we preserve - // that alignment for the benefit of anyone who relies upon that. - static const size_t header_reserved_bytes = sizeof(void *) * 2; -#endif - - return header_reserved_bytes; + return MEMORY_HOOK_ALIGNMENT; } /** @@ -109,6 +61,24 @@ round_up_to_page_size(size_t size) const { return ((size + _page_size - 1) / _page_size) * _page_size; } +/** + * Given a pointer that was returned by a MemoryHook allocation, returns the + * number of bytes that were allocated for it. Returns 0 if not compiling + * with DO_MEMORY_USAGE. + */ +INLINE size_t MemoryHook:: +get_ptr_size(void *ptr) { +#if defined(MEMORY_HOOK_DO_ALIGN) + uintptr_t *root = (uintptr_t *)ptr; + return (size_t)root[-2]; +#elif defined(DO_MEMORY_USAGE) + size_t *root = (size_t *)((char *)ptr - MEMORY_HOOK_ALIGNMENT); + return *root; +#else + return 0; +#endif // DO_MEMORY_USAGE +} + /** * Increments the amount of requested size as necessary to accommodate the * extra data we might piggyback on each allocated block. @@ -118,12 +88,13 @@ inflate_size(size_t size) { #if defined(MEMORY_HOOK_DO_ALIGN) // If we're aligning, we need to request the header size, plus extra bytes // to give us wiggle room to adjust the pointer. - return size + get_header_reserved_bytes() + get_memory_alignment() - 1; + return size + sizeof(uintptr_t) * 2 + MEMORY_HOOK_ALIGNMENT - 1; #elif defined(DO_MEMORY_USAGE) // If we're not aligning, but we're tracking memory allocations, we just // need the header size extra (this gives us a place to store the size of - // the allocated block). - return size + get_header_reserved_bytes(); + // the allocated block). However, we do need to make sure that any + // alignment guarantee is kept. + return size + MEMORY_HOOK_ALIGNMENT; #else // If we're not doing any of that, we can just allocate the precise // requested amount. @@ -138,17 +109,17 @@ inflate_size(size_t size) { INLINE void *MemoryHook:: alloc_to_ptr(void *alloc, size_t size) { #if defined(MEMORY_HOOK_DO_ALIGN) - size_t alignment = get_memory_alignment(); - // Move the allocated pointer up to the next even alignment. - size_t *root = (size_t *)((((size_t)alloc + alignment - 1) / alignment) * alignment); - assert(alloc <= root && (size_t)((char *)root - (char *)alloc) < alignment); - root[0] = size; - root[1] = (size_t)alloc; // Save the pointer we originally allocated. - return (void *)((char *)root + get_header_reserved_bytes()); + // Add room for two uintptr_t values. + uintptr_t *root = (uintptr_t *)((char *)alloc + sizeof(uintptr_t) * 2); + // Align this to the requested boundary. + root = (uintptr_t *)(((uintptr_t)root + MEMORY_HOOK_ALIGNMENT - 1) & ~(MEMORY_HOOK_ALIGNMENT - 1)); + root[-2] = size; + root[-1] = (uintptr_t)alloc; // Save the pointer we originally allocated. + return (void *)root; #elif defined(DO_MEMORY_USAGE) size_t *root = (size_t *)alloc; root[0] = size; - return (void *)((char *)root + get_header_reserved_bytes()); + return (void *)((char *)root + MEMORY_HOOK_ALIGNMENT); #else return alloc; #endif // DO_MEMORY_USAGE @@ -161,13 +132,11 @@ alloc_to_ptr(void *alloc, size_t size) { INLINE void *MemoryHook:: ptr_to_alloc(void *ptr, size_t &size) { #if defined(MEMORY_HOOK_DO_ALIGN) - size_t *root = (size_t *)((char *)ptr - get_header_reserved_bytes()); - size = root[0]; - void *alloc = (void *)root[1]; // Get the pointer we originally allocated. - assert(alloc <= root && (size_t)((char *)root - (char *)alloc) < get_memory_alignment()); - return alloc; + uintptr_t *root = (uintptr_t *)ptr; + size = root[-2]; + return (void *)root[-1]; // Get the pointer we originally allocated. #elif defined(DO_MEMORY_USAGE) - size_t *root = (size_t *)((char *)ptr - get_header_reserved_bytes()); + size_t *root = (size_t *)((char *)ptr - MEMORY_HOOK_ALIGNMENT); size = root[0]; return (void *)root; #else diff --git a/dtool/src/dtoolbase/memoryHook.cxx b/dtool/src/dtoolbase/memoryHook.cxx index e6131a5266..506ff51005 100644 --- a/dtool/src/dtoolbase/memoryHook.cxx +++ b/dtool/src/dtoolbase/memoryHook.cxx @@ -36,6 +36,15 @@ #endif // WIN32 +// Ensure we made the right decisions about the alignment size. +static_assert(MEMORY_HOOK_ALIGNMENT >= sizeof(size_t), + "MEMORY_HOOK_ALIGNMENT should at least be sizeof(size_t)"); +static_assert(MEMORY_HOOK_ALIGNMENT >= sizeof(void *), + "MEMORY_HOOK_ALIGNMENT should at least be sizeof(void *)"); +static_assert(MEMORY_HOOK_ALIGNMENT * 8 >= NATIVE_WORDSIZE, + "MEMORY_HOOK_ALIGNMENT * 8 should at least be NATIVE_WORDSIZE"); +static_assert((MEMORY_HOOK_ALIGNMENT & (MEMORY_HOOK_ALIGNMENT - 1)) == 0, + "MEMORY_HOOK_ALIGNMENT should be a power of two"); #if defined(USE_MEMORY_DLMALLOC) @@ -49,17 +58,8 @@ #ifdef _DEBUG #define DEBUG 1 #endif -#ifdef LINMATH_ALIGN -// drose: We require 16-byte alignment of certain structures, to -// support SSE2. We don't strictly have to align *everything*, but -// it's just easier to do so. -#ifdef __AVX__ -// Eigen requires 32-byte alignment when using AVX instructions. -#define MALLOC_ALIGNMENT ((size_t)32U) -#else -#define MALLOC_ALIGNMENT ((size_t)16U) -#endif -#endif +// dlmalloc can do the alignment we ask for. +#define MALLOC_ALIGNMENT MEMORY_HOOK_ALIGNMENT #include "dlmalloc_src.cxx" @@ -204,6 +204,7 @@ heap_alloc_single(size_t size) { #endif // DO_MEMORY_USAGE void *ptr = alloc_to_ptr(alloc, size); + assert(((uintptr_t)ptr % MEMORY_HOOK_ALIGNMENT) == 0); assert(ptr >= alloc && (char *)ptr + size <= (char *)alloc + inflated_size); return ptr; } @@ -273,6 +274,7 @@ heap_alloc_array(size_t size) { #endif // DO_MEMORY_USAGE void *ptr = alloc_to_ptr(alloc, size); + assert(((uintptr_t)ptr % MEMORY_HOOK_ALIGNMENT) == 0); assert(ptr >= alloc && (char *)ptr + size <= (char *)alloc + inflated_size); return ptr; } @@ -316,17 +318,27 @@ heap_realloc_array(void *ptr, size_t size) { #endif } - void *ptr1 = alloc_to_ptr(alloc1, size); - assert(ptr1 >= alloc1 && (char *)ptr1 + size <= (char *)alloc1 + inflated_size); -#if defined(MEMORY_HOOK_DO_ALIGN) - // We might have to shift the memory to account for the new offset due to - // the alignment. + // Align this to the requested boundary. +#ifdef MEMORY_HOOK_DO_ALIGN + // This copies the code from alloc_to_ptr, since we can't write the size and + // pointer until after we have done the memmove. + uintptr_t *root = (uintptr_t *)((char *)alloc1 + sizeof(uintptr_t) * 2); + root = (uintptr_t *)(((uintptr_t)root + MEMORY_HOOK_ALIGNMENT - 1) & ~(MEMORY_HOOK_ALIGNMENT - 1)); + void *ptr1 = (void *)root; + size_t orig_delta = (char *)ptr - (char *)alloc; size_t new_delta = (char *)ptr1 - (char *)alloc1; if (orig_delta != new_delta) { memmove((char *)alloc1 + new_delta, (char *)alloc1 + orig_delta, min(size, orig_size)); } -#endif // MEMORY_HOOK_DO_ALIGN + + root[-2] = size; + root[-1] = (uintptr_t)alloc1; // Save the pointer we originally allocated. +#else + void *ptr1 = alloc_to_ptr(alloc1, size); +#endif + assert(ptr1 >= alloc1 && (char *)ptr1 + size <= (char *)alloc1 + inflated_size); + assert(((uintptr_t)ptr1 % MEMORY_HOOK_ALIGNMENT) == 0); return ptr1; } diff --git a/dtool/src/dtoolbase/memoryHook.h b/dtool/src/dtoolbase/memoryHook.h index d53e03ba2e..b8eac26f54 100644 --- a/dtool/src/dtoolbase/memoryHook.h +++ b/dtool/src/dtoolbase/memoryHook.h @@ -20,6 +20,22 @@ #include "mutexImpl.h" #include +#ifdef LINMATH_ALIGN +// We require 16-byte alignment of certain structures, to support SSE2. We +// don't strictly have to align *everything*, but it's just easier to do so. +#ifdef __AVX__ +#define MEMORY_HOOK_ALIGNMENT 32 +#else +#define MEMORY_HOOK_ALIGNMENT 16 +#endif +// Otherwise, align to two words. This seems to be pretty standard to the +// point where some code may rely on this being the case. +#elif defined(IS_OSX) || NATIVE_WORDSIZE >= 64 +#define MEMORY_HOOK_ALIGNMENT 16 +#else +#define MEMORY_HOOK_ALIGNMENT 8 +#endif + class DeletedBufferChain; /** @@ -52,8 +68,7 @@ public: bool heap_trim(size_t pad); - INLINE static size_t get_memory_alignment(); - INLINE static size_t get_header_reserved_bytes(); + CONSTEXPR static size_t get_memory_alignment(); virtual void *mmap_alloc(size_t size, bool allow_exec); virtual void mmap_free(void *ptr, size_t size); @@ -66,6 +81,8 @@ public: virtual void alloc_fail(size_t attempted_size); + INLINE static size_t get_ptr_size(void *ptr); + private: INLINE static size_t inflate_size(size_t size); INLINE static void *alloc_to_ptr(void *alloc, size_t size); diff --git a/dtool/src/dtoolbase/pallocator.T b/dtool/src/dtoolbase/pallocator.T index ebfb8dbafd..38bc87135c 100644 --- a/dtool/src/dtoolbase/pallocator.T +++ b/dtool/src/dtoolbase/pallocator.T @@ -1,16 +1,15 @@ -// Filename: pallocator.T -// Created by: drose (05Jun01) -// -//////////////////////////////////////////////////////////////////// -// -// 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." -// -//////////////////////////////////////////////////////////////////// +/** + * 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 pallocator.T + * @author drose + * @date 2001-06-05 + */ template INLINE pallocator_single:: @@ -25,7 +24,8 @@ allocate(TYPENAME pallocator_single::size_type n, TYPENAME allocator TAU_PROFILE("pallocator_single:allocate()", " ", TAU_USER); // This doesn't support allocating arrays. assert(n == 1); - return StaticDeletedChain::allocate(sizeof(Type), _type_handle); + return (Type *)ASSUME_ALIGNED(StaticDeletedChain::allocate(sizeof(Type), _type_handle), + MEMORY_HOOK_ALIGNMENT); } template @@ -47,14 +47,13 @@ INLINE TYPENAME pallocator_array::pointer pallocator_array:: allocate(TYPENAME pallocator_array::size_type n, TYPENAME allocator::const_pointer) { TAU_PROFILE("pallocator_array:allocate()", " ", TAU_USER); #ifdef DO_MEMORY_USAGE - const size_t header_reserved_bytes = MemoryHook::get_header_reserved_bytes(); size_t alloc_size = n * sizeof(Type); - // We also need to store the total number of bytes we allocated. - alloc_size += header_reserved_bytes; - _type_handle.inc_memory_usage(TypeHandle::MC_array, alloc_size); void *ptr = (TYPENAME pallocator_array::pointer)PANDA_MALLOC_ARRAY(alloc_size); - *((size_t *)ptr) = alloc_size; - return (TYPENAME pallocator_array::pointer)(((char *)ptr) + header_reserved_bytes); +#ifdef _DEBUG + assert(alloc_size == MemoryHook::get_ptr_size(ptr)); +#endif + _type_handle.inc_memory_usage(TypeHandle::MC_array, alloc_size); + return (TYPENAME pallocator_array::pointer)ASSUME_ALIGNED(ptr, MEMORY_HOOK_ALIGNMENT); #else return (TYPENAME pallocator_array::pointer)PANDA_MALLOC_ARRAY(n * sizeof(Type)); #endif // DO_MEMORY_USAGE @@ -65,10 +64,10 @@ INLINE void pallocator_array:: deallocate(TYPENAME pallocator_array::pointer p, TYPENAME pallocator_array::size_type) { TAU_PROFILE("pallocator_array:deallocate()", " ", TAU_USER); #ifdef DO_MEMORY_USAGE - // Now we need to recover the total number of bytes. - const size_t header_reserved_bytes = MemoryHook::get_header_reserved_bytes(); - void *ptr = (void *)((char *)p - header_reserved_bytes); - size_t alloc_size = *((size_t *)ptr); + // Now we need to recover the total number of bytes. Fortunately, in the + // case of DO_MEMORY_USAGE, MemoryHook already keeps track of this. + void *ptr = (void *)p; + size_t alloc_size = MemoryHook::get_ptr_size(ptr); _type_handle.dec_memory_usage(TypeHandle::MC_array, alloc_size); PANDA_FREE_ARRAY(ptr); #else diff --git a/panda/src/gobj/vertexDataBuffer.I b/panda/src/gobj/vertexDataBuffer.I index 3652bae864..3bc1f85b80 100644 --- a/panda/src/gobj/vertexDataBuffer.I +++ b/panda/src/gobj/vertexDataBuffer.I @@ -67,17 +67,22 @@ INLINE const unsigned char *VertexDataBuffer:: get_read_pointer(bool force) const { LightMutexHolder holder(_lock); + const unsigned char *ptr; if (_resident_data != (unsigned char *)NULL || _size == 0) { - return _resident_data; + ptr = _resident_data; + } else { + nassertr(_block != (VertexDataBlock *)NULL, NULL); + nassertr(_reserved_size >= _size, NULL); + + // We don't necessarily need to page the buffer all the way into independent + // status; it's sufficient just to return the block's pointer, which will + // force its page to resident status. + ptr = _block->get_pointer(force); } - - nassertr(_block != (VertexDataBlock *)NULL, NULL); - nassertr(_reserved_size >= _size, NULL); - - // We don't necessarily need to page the buffer all the way into independent - // status; it's sufficient just to return the block's pointer, which will - // force its page to resident status. - return _block->get_pointer(force); +#ifdef _DEBUG + assert(((uintptr_t)ptr % MEMORY_HOOK_ALIGNMENT) == 0); +#endif + return (const unsigned char *)ASSUME_ALIGNED(ptr, MEMORY_HOOK_ALIGNMENT); } /** @@ -91,7 +96,10 @@ get_write_pointer() { do_page_in(); } nassertr(_reserved_size >= _size, NULL); - return _resident_data; +#ifdef _DEBUG + assert(((uintptr_t)_resident_data % MEMORY_HOOK_ALIGNMENT) == 0); +#endif + return (unsigned char *)ASSUME_ALIGNED(_resident_data, MEMORY_HOOK_ALIGNMENT); } /** From ec3c2c56813c04f369206c19d18f07bb884dba3d Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Wed, 15 Feb 2017 03:23:59 -0700 Subject: [PATCH 045/254] general: Fix missing include --- dtool/src/cppparser/cppClosureType.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/dtool/src/cppparser/cppClosureType.cxx b/dtool/src/cppparser/cppClosureType.cxx index cf8ec31143..30197057a6 100755 --- a/dtool/src/cppparser/cppClosureType.cxx +++ b/dtool/src/cppparser/cppClosureType.cxx @@ -12,6 +12,7 @@ */ #include "cppClosureType.h" +#include "cppParameterList.h" #include "cppExpression.h" /** From 29edf55069511e9158bc8c6a37fa7057b193d271 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 12 Feb 2017 17:21:53 +0100 Subject: [PATCH 046/254] GlobPattern: support trailing slash and globstar (eg. **/*.egg) --- dtool/src/dtoolutil/globPattern.cxx | 63 ++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/dtool/src/dtoolutil/globPattern.cxx b/dtool/src/dtoolutil/globPattern.cxx index 2a065e9a86..57a6afdb57 100644 --- a/dtool/src/dtoolutil/globPattern.cxx +++ b/dtool/src/dtoolutil/globPattern.cxx @@ -99,7 +99,7 @@ match_files(vector_string &results, const Filename &cwd) const { pattern = source; } else { pattern = source.substr(0, slash); - suffix = source.substr(slash + 1); + suffix = source.substr(slash); } GlobPattern glob(pattern); @@ -118,11 +118,21 @@ r_match_files(const Filename &prefix, const string &suffix, size_t slash = suffix.find('/'); if (slash == string::npos) { next_pattern = suffix; + } else if (slash + 1 == suffix.size()) { + // If the slash is at the end, we need to keep it, since it indicates that + // we only want to match directories. + next_pattern = suffix.substr(0, slash); + next_suffix = "/"; } else { next_pattern = suffix.substr(0, slash); next_suffix = suffix.substr(slash + 1); } + if (_pattern == "**" && next_pattern == "**") { + // Collapse consecutive globstar patterns. + return r_match_files(prefix, next_suffix, results, cwd); + } + Filename parent_dir; if (prefix.is_local() && !cwd.empty()) { parent_dir = Filename(cwd, prefix); @@ -136,19 +146,24 @@ r_match_files(const Filename &prefix, const string &suffix, if (!has_glob_characters()) { // If there are no special characters in the pattern, it's a literal // match. + Filename fn(parent_dir, _pattern); if (suffix.empty()) { // Time to stop. - Filename single_filename(parent_dir, _pattern); - if (single_filename.exists()) { + if (fn.exists()) { results.push_back(Filename(prefix, _pattern)); return 1; } return 0; + } else if (fn.is_directory()) { + // If the pattern ends with a slash, match a directory only. + if (suffix == "/") { + results.push_back(Filename(prefix, _pattern + "/")); + return 1; + } else { + return next_glob.r_match_files(Filename(prefix, _pattern), + next_suffix, results, cwd); + } } - - return next_glob.r_match_files(Filename(prefix, _pattern), - next_suffix, results, cwd); - } // If there *are* special glob characters, we must attempt to match the @@ -164,18 +179,44 @@ r_match_files(const Filename &prefix, const string &suffix, // the pattern. int num_matched = 0; + // A globstar pattern matches zero or more directories. + if (_pattern == "**") { + // Try to match this directory (as if the globstar wasn't there) + if (suffix.empty()) { + // This is a directory. Add it. + results.push_back(Filename(prefix)); + num_matched++; + } else if (suffix == "/") { + // Keep the trailing slash, but be sure not to duplicate it. + results.push_back(Filename(prefix, "")); + num_matched++; + } else { + num_matched += next_glob.r_match_files(prefix, next_suffix, results, cwd); + } + next_suffix = suffix; + next_glob = *this; + } + vector_string::const_iterator fi; for (fi = dir_files.begin(); fi != dir_files.end(); ++fi) { const string &local_file = (*fi); if (_pattern[0] == '.' || (local_file.empty() || local_file[0] != '.')) { if (matches(local_file)) { // We have a match; continue. - if (suffix.empty()) { + if (Filename(parent_dir, local_file).is_directory()) { + if (suffix.empty() && _pattern != "**") { + results.push_back(Filename(prefix, local_file)); + num_matched++; + } else if (suffix == "/" && _pattern != "**") { + results.push_back(Filename(prefix, local_file + "/")); + num_matched++; + } else { + num_matched += next_glob.r_match_files(Filename(prefix, local_file), + next_suffix, results, cwd); + } + } else if (suffix.empty()) { results.push_back(Filename(prefix, local_file)); num_matched++; - } else { - num_matched += next_glob.r_match_files(Filename(prefix, local_file), - next_suffix, results, cwd); } } } From 8c914a285569d2cf2f00d6fe595d632873bdad88 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 12 Feb 2017 17:24:03 +0100 Subject: [PATCH 047/254] Work towards ABI stability wrt allocation. Let MemoryHook take advantage of dlmalloc's internal bookkeeping. --- dtool/src/dtoolbase/deletedChain.h | 4 +- dtool/src/dtoolbase/dtoolbase.h | 39 +++++++ dtool/src/dtoolbase/memoryBase.h | 4 +- dtool/src/dtoolbase/memoryHook.I | 79 ++----------- dtool/src/dtoolbase/memoryHook.cxx | 110 +++++++++++++++++- dtool/src/dtoolbase/memoryHook.h | 21 ---- dtool/src/dtoolbase/pallocator.T | 30 +---- dtool/src/dtoolbase/pallocator.h | 6 +- dtool/src/dtoolbase/typeHandle.cxx | 86 +++++++++++++- dtool/src/dtoolbase/typeHandle.h | 72 ++++++++---- dtool/src/dtoolutil/pandaSystem.cxx | 13 +++ dtool/src/dtoolutil/pandaSystem.h | 2 + makepanda/makepanda.py | 2 - panda/src/gobj/geomVertexArrayData.h | 4 +- panda/src/gobj/vertexDataBuffer.cxx | 31 ++--- panda/src/gobj/vertexDataBuffer.h | 4 +- panda/src/linmath/lsimpleMatrix.h | 2 +- .../tinydisplay/tinyGraphicsStateGuardian.cxx | 6 +- panda/src/tinydisplay/tinyTextureContext.cxx | 6 +- 19 files changed, 331 insertions(+), 190 deletions(-) diff --git a/dtool/src/dtoolbase/deletedChain.h b/dtool/src/dtoolbase/deletedChain.h index 17a723a89b..a25be5d429 100644 --- a/dtool/src/dtoolbase/deletedChain.h +++ b/dtool/src/dtoolbase/deletedChain.h @@ -77,7 +77,7 @@ public: // Place this macro within a class definition to define appropriate operator // new and delete methods that take advantage of DeletedChain. #define ALLOC_DELETED_CHAIN(Type) \ - inline void *operator new(size_t size) { \ + inline void *operator new(size_t size) RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT) { \ return (void *)StaticDeletedChain< Type >::allocate(size, get_type_handle(Type)); \ } \ inline void *operator new(size_t size, void *ptr) { \ @@ -96,7 +96,7 @@ public: // Use this variant of the above macro in cases in which the compiler fails to // unify the static template pointers properly, to prevent leaks. #define ALLOC_DELETED_CHAIN_DECL(Type) \ - inline void *operator new(size_t size) { \ + inline void *operator new(size_t size) RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT) { \ return (void *)_deleted_chain.allocate(size, get_type_handle(Type)); \ } \ inline void *operator new(size_t size, void *ptr) { \ diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index 8dd2ec3cf6..965069614e 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -76,6 +76,10 @@ #define __has_builtin(x) 0 #endif +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif + // Use NODEFAULT to optimize a switch() stmt to tell MSVC to automatically go // to the final untested case after it has failed all the other cases (i.e. // 'assume at least one of the cases is always true') @@ -96,6 +100,12 @@ #define ASSUME_ALIGNED(x, y) (x) #endif +#if __has_attribute(assume_aligned) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9) +#define RETURNS_ALIGNED(x) __attribute__((assume_aligned(x))) +#else +#define RETURNS_ALIGNED(x) +#endif + /* include win32 defns for everything up to WinServer2003, and assume I'm smart enough to use GetProcAddress for backward compat on @@ -400,6 +410,35 @@ typedef struct _object PyObject; #endif +#ifdef LINMATH_ALIGN +/* We require 16-byte alignment of certain structures, to support SSE2. We + don't strictly have to align everything, but it's just easier to do so. */ +#if defined(HAVE_EIGEN) && defined(__AVX__) && defined(STDFLOAT_DOUBLE) +/* Eigen uses AVX instructions, but let's only enable this when compiling with + double precision, so that we can keep our ABI a bit more stable. */ +#define MEMORY_HOOK_ALIGNMENT 32 +#else +#define MEMORY_HOOK_ALIGNMENT 16 +#endif +/* Otherwise, align to two words. This seems to be pretty standard to the + point where some code may rely on this being the case. */ +#elif defined(IS_OSX) || NATIVE_WORDSIZE >= 64 +#define MEMORY_HOOK_ALIGNMENT 16 +#else +#define MEMORY_HOOK_ALIGNMENT 8 +#endif + +#ifdef HAVE_EIGEN +/* Make sure that Eigen doesn't assume alignment guarantees we don't offer. */ +#define EIGEN_MAX_ALIGN_BYTES MEMORY_HOOK_ALIGNMENT +#ifndef EIGEN_MPL2_ONLY +#define EIGEN_MPL2_ONLY 1 +#endif +#if !defined(_DEBUG) && !defined(EIGEN_NO_DEBUG) +#define EIGEN_NO_DEBUG 1 +#endif +#endif + /* Determine our memory-allocation requirements. */ #if defined(USE_MEMORY_PTMALLOC2) || defined(USE_MEMORY_DLMALLOC) || defined(DO_MEMORY_USAGE) || defined(MEMORY_HOOK_DO_ALIGN) /* In this case we have some custom memory management requirements. */ diff --git a/dtool/src/dtoolbase/memoryBase.h b/dtool/src/dtoolbase/memoryBase.h index 2f361f1bb1..6d755e695b 100644 --- a/dtool/src/dtoolbase/memoryBase.h +++ b/dtool/src/dtoolbase/memoryBase.h @@ -26,7 +26,7 @@ #ifndef USE_MEMORY_NOWRAPPERS #define ALLOC_MEMORY_BASE \ - inline void *operator new(size_t size) { \ + inline void *operator new(size_t size) RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT) { \ return PANDA_MALLOC_SINGLE(size); \ } \ inline void *operator new(size_t size, void *ptr) { \ @@ -38,7 +38,7 @@ } \ inline void operator delete(void *, void *) { \ } \ - inline void *operator new[](size_t size) { \ + inline void *operator new[](size_t size) RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT) { \ return PANDA_MALLOC_ARRAY(size); \ } \ inline void *operator new[](size_t size, void *ptr) { \ diff --git a/dtool/src/dtoolbase/memoryHook.I b/dtool/src/dtoolbase/memoryHook.I index c89fe1908b..bd5a55af79 100644 --- a/dtool/src/dtoolbase/memoryHook.I +++ b/dtool/src/dtoolbase/memoryHook.I @@ -63,14 +63,24 @@ round_up_to_page_size(size_t size) const { /** * Given a pointer that was returned by a MemoryHook allocation, returns the - * number of bytes that were allocated for it. Returns 0 if not compiling - * with DO_MEMORY_USAGE. + * number of bytes that were allocated for it. This may be slightly larger + * than the number of bytes requested. + * The behavior of this function is undefined if the given pointer was not + * returned by the MemoryHook allocator or was already freed. + * May return 0 if not compiling with DO_MEMORY_USAGE. + * + * This is only defined publicly so TypeHandle can get at it; it really + * shouldn't be used outside of dtoolbase. */ INLINE size_t MemoryHook:: get_ptr_size(void *ptr) { #if defined(MEMORY_HOOK_DO_ALIGN) uintptr_t *root = (uintptr_t *)ptr; return (size_t)root[-2]; +#elif defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2) + // If we are using dlmalloc, we know how it stores the size. + size_t *root = (size_t *)ptr; + return (root[-1] & ~0x7) - sizeof(size_t); #elif defined(DO_MEMORY_USAGE) size_t *root = (size_t *)((char *)ptr - MEMORY_HOOK_ALIGNMENT); return *root; @@ -78,68 +88,3 @@ get_ptr_size(void *ptr) { return 0; #endif // DO_MEMORY_USAGE } - -/** - * Increments the amount of requested size as necessary to accommodate the - * extra data we might piggyback on each allocated block. - */ -INLINE size_t MemoryHook:: -inflate_size(size_t size) { -#if defined(MEMORY_HOOK_DO_ALIGN) - // If we're aligning, we need to request the header size, plus extra bytes - // to give us wiggle room to adjust the pointer. - return size + sizeof(uintptr_t) * 2 + MEMORY_HOOK_ALIGNMENT - 1; -#elif defined(DO_MEMORY_USAGE) - // If we're not aligning, but we're tracking memory allocations, we just - // need the header size extra (this gives us a place to store the size of - // the allocated block). However, we do need to make sure that any - // alignment guarantee is kept. - return size + MEMORY_HOOK_ALIGNMENT; -#else - // If we're not doing any of that, we can just allocate the precise - // requested amount. - return size; -#endif // DO_MEMORY_USAGE -} - -/** - * Converts an allocated pointer to a pointer returnable to the application. - * Stuffs size in the first n bytes of the allocated space. - */ -INLINE void *MemoryHook:: -alloc_to_ptr(void *alloc, size_t size) { -#if defined(MEMORY_HOOK_DO_ALIGN) - // Add room for two uintptr_t values. - uintptr_t *root = (uintptr_t *)((char *)alloc + sizeof(uintptr_t) * 2); - // Align this to the requested boundary. - root = (uintptr_t *)(((uintptr_t)root + MEMORY_HOOK_ALIGNMENT - 1) & ~(MEMORY_HOOK_ALIGNMENT - 1)); - root[-2] = size; - root[-1] = (uintptr_t)alloc; // Save the pointer we originally allocated. - return (void *)root; -#elif defined(DO_MEMORY_USAGE) - size_t *root = (size_t *)alloc; - root[0] = size; - return (void *)((char *)root + MEMORY_HOOK_ALIGNMENT); -#else - return alloc; -#endif // DO_MEMORY_USAGE -} - -/** - * Converts an application pointer back to the original allocated pointer. - * Extracts size from the first n bytes of the allocated space. - */ -INLINE void *MemoryHook:: -ptr_to_alloc(void *ptr, size_t &size) { -#if defined(MEMORY_HOOK_DO_ALIGN) - uintptr_t *root = (uintptr_t *)ptr; - size = root[-2]; - return (void *)root[-1]; // Get the pointer we originally allocated. -#elif defined(DO_MEMORY_USAGE) - size_t *root = (size_t *)((char *)ptr - MEMORY_HOOK_ALIGNMENT); - size = root[0]; - return (void *)root; -#else - return ptr; -#endif // DO_MEMORY_USAGE -} diff --git a/dtool/src/dtoolbase/memoryHook.cxx b/dtool/src/dtoolbase/memoryHook.cxx index 506ff51005..224fd3107b 100644 --- a/dtool/src/dtoolbase/memoryHook.cxx +++ b/dtool/src/dtoolbase/memoryHook.cxx @@ -14,6 +14,7 @@ #include "memoryHook.h" #include "deletedBufferChain.h" #include +#include "typeRegistry.h" #ifdef WIN32 @@ -104,6 +105,83 @@ static_assert((MEMORY_HOOK_ALIGNMENT & (MEMORY_HOOK_ALIGNMENT - 1)) == 0, #endif // USE_MEMORY_* +/** + * Increments the amount of requested size as necessary to accommodate the + * extra data we might piggyback on each allocated block. + */ +INLINE static size_t +inflate_size(size_t size) { +#if defined(MEMORY_HOOK_DO_ALIGN) + // If we're aligning, we need to request the header size, plus extra bytes + // to give us wiggle room to adjust the pointer. + return size + sizeof(uintptr_t) * 2 + MEMORY_HOOK_ALIGNMENT - 1; +#elif defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2) + // If we are can access the allocator's bookkeeping to figure out how many + // bytes were allocated, we don't need to add our own information. + return size; +#elif defined(DO_MEMORY_USAGE) + // If we're not aligning, but we're tracking memory allocations, we just + // need the header size extra (this gives us a place to store the size of + // the allocated block). However, we do need to make sure that any + // alignment guarantee is kept. + return size + MEMORY_HOOK_ALIGNMENT; +#else + // If we're not doing any of that, we can just allocate the precise + // requested amount. + return size; +#endif // DO_MEMORY_USAGE +} + +/** + * Converts an allocated pointer to a pointer returnable to the application. + * Stuffs size in the first n bytes of the allocated space. + */ +INLINE static void * +alloc_to_ptr(void *alloc, size_t size) { +#if defined(MEMORY_HOOK_DO_ALIGN) + // Add room for two uintptr_t values. + uintptr_t *root = (uintptr_t *)((char *)alloc + sizeof(uintptr_t) * 2); + // Align this to the requested boundary. + root = (uintptr_t *)(((uintptr_t)root + MEMORY_HOOK_ALIGNMENT - 1) & ~(MEMORY_HOOK_ALIGNMENT - 1)); + root[-2] = size; + root[-1] = (uintptr_t)alloc; // Save the pointer we originally allocated. + return (void *)root; +#elif defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2) + return alloc; +#elif defined(DO_MEMORY_USAGE) + size_t *root = (size_t *)alloc; + root[0] = size; + return (void *)((char *)root + MEMORY_HOOK_ALIGNMENT); +#else + return alloc; +#endif // DO_MEMORY_USAGE +} + +/** + * Converts an application pointer back to the original allocated pointer. + * Extracts size from the first n bytes of the allocated space, but only if + * DO_MEMORY_USAGE is defined. + */ +INLINE static void * +ptr_to_alloc(void *ptr, size_t &size) { +#if defined(MEMORY_HOOK_DO_ALIGN) + uintptr_t *root = (uintptr_t *)ptr; + size = root[-2]; + return (void *)root[-1]; // Get the pointer we originally allocated. +#elif defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2) +#ifdef DO_MEMORY_USAGE + size = MemoryHook::get_ptr_size(ptr); +#endif + return ptr; +#elif defined(DO_MEMORY_USAGE) + size_t *root = (size_t *)((char *)ptr - MEMORY_HOOK_ALIGNMENT); + size = root[0]; + return (void *)root; +#else + return ptr; +#endif // DO_MEMORY_USAGE +} + /** * */ @@ -195,6 +273,11 @@ heap_alloc_single(size_t size) { #ifdef DO_MEMORY_USAGE // In the DO_MEMORY_USAGE case, we want to track the total size of allocated // bytes on the heap. +#if defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2) + // dlmalloc may slightly overallocate, however. + size = get_ptr_size(alloc); + inflated_size = size; +#endif AtomicAdjust::add(_total_heap_single_size, (AtomicAdjust::Integer)size); if ((size_t)AtomicAdjust::get(_total_heap_single_size) + (size_t)AtomicAdjust::get(_total_heap_array_size) > @@ -204,8 +287,10 @@ heap_alloc_single(size_t size) { #endif // DO_MEMORY_USAGE void *ptr = alloc_to_ptr(alloc, size); +#ifdef _DEBUG assert(((uintptr_t)ptr % MEMORY_HOOK_ALIGNMENT) == 0); assert(ptr >= alloc && (char *)ptr + size <= (char *)alloc + inflated_size); +#endif return ptr; } @@ -265,6 +350,11 @@ heap_alloc_array(size_t size) { #ifdef DO_MEMORY_USAGE // In the DO_MEMORY_USAGE case, we want to track the total size of allocated // bytes on the heap. +#if defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2) + // dlmalloc may slightly overallocate, however. + size = get_ptr_size(alloc); + inflated_size = size; +#endif AtomicAdjust::add(_total_heap_array_size, (AtomicAdjust::Integer)size); if ((size_t)AtomicAdjust::get(_total_heap_single_size) + (size_t)AtomicAdjust::get(_total_heap_array_size) > @@ -274,8 +364,10 @@ heap_alloc_array(size_t size) { #endif // DO_MEMORY_USAGE void *ptr = alloc_to_ptr(alloc, size); +#ifdef _DEBUG assert(((uintptr_t)ptr % MEMORY_HOOK_ALIGNMENT) == 0); assert(ptr >= alloc && (char *)ptr + size <= (char *)alloc + inflated_size); +#endif return ptr; } @@ -287,11 +379,6 @@ heap_realloc_array(void *ptr, size_t size) { size_t orig_size; void *alloc = ptr_to_alloc(ptr, orig_size); -#ifdef DO_MEMORY_USAGE - assert((AtomicAdjust::Integer)orig_size <= _total_heap_array_size); - AtomicAdjust::add(_total_heap_array_size, (AtomicAdjust::Integer)size-(AtomicAdjust::Integer)orig_size); -#endif // DO_MEMORY_USAGE - size_t inflated_size = inflate_size(size); void *alloc1 = alloc; @@ -318,6 +405,16 @@ heap_realloc_array(void *ptr, size_t size) { #endif } +#ifdef DO_MEMORY_USAGE +#if defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2) + // dlmalloc may slightly overallocate, however. + size = get_ptr_size(alloc1); + inflated_size = size; +#endif + assert((AtomicAdjust::Integer)orig_size <= _total_heap_array_size); + AtomicAdjust::add(_total_heap_array_size, (AtomicAdjust::Integer)size-(AtomicAdjust::Integer)orig_size); +#endif // DO_MEMORY_USAGE + // Align this to the requested boundary. #ifdef MEMORY_HOOK_DO_ALIGN // This copies the code from alloc_to_ptr, since we can't write the size and @@ -337,8 +434,11 @@ heap_realloc_array(void *ptr, size_t size) { #else void *ptr1 = alloc_to_ptr(alloc1, size); #endif + +#ifdef _DEBUG assert(ptr1 >= alloc1 && (char *)ptr1 + size <= (char *)alloc1 + inflated_size); assert(((uintptr_t)ptr1 % MEMORY_HOOK_ALIGNMENT) == 0); +#endif return ptr1; } diff --git a/dtool/src/dtoolbase/memoryHook.h b/dtool/src/dtoolbase/memoryHook.h index b8eac26f54..687e348aef 100644 --- a/dtool/src/dtoolbase/memoryHook.h +++ b/dtool/src/dtoolbase/memoryHook.h @@ -20,22 +20,6 @@ #include "mutexImpl.h" #include -#ifdef LINMATH_ALIGN -// We require 16-byte alignment of certain structures, to support SSE2. We -// don't strictly have to align *everything*, but it's just easier to do so. -#ifdef __AVX__ -#define MEMORY_HOOK_ALIGNMENT 32 -#else -#define MEMORY_HOOK_ALIGNMENT 16 -#endif -// Otherwise, align to two words. This seems to be pretty standard to the -// point where some code may rely on this being the case. -#elif defined(IS_OSX) || NATIVE_WORDSIZE >= 64 -#define MEMORY_HOOK_ALIGNMENT 16 -#else -#define MEMORY_HOOK_ALIGNMENT 8 -#endif - class DeletedBufferChain; /** @@ -83,11 +67,6 @@ public: INLINE static size_t get_ptr_size(void *ptr); -private: - INLINE static size_t inflate_size(size_t size); - INLINE static void *alloc_to_ptr(void *alloc, size_t size); - INLINE static void *ptr_to_alloc(void *ptr, size_t &size); - #ifdef DO_MEMORY_USAGE protected: TVOLATILE AtomicAdjust::Integer _total_heap_single_size; diff --git a/dtool/src/dtoolbase/pallocator.T b/dtool/src/dtoolbase/pallocator.T index 38bc87135c..e9bfd3f98e 100644 --- a/dtool/src/dtoolbase/pallocator.T +++ b/dtool/src/dtoolbase/pallocator.T @@ -19,7 +19,7 @@ pallocator_single(TypeHandle type_handle) NOEXCEPT : } template -INLINE TYPENAME pallocator_single::pointer pallocator_single:: +INLINE Type *pallocator_single:: allocate(TYPENAME pallocator_single::size_type n, TYPENAME allocator::const_pointer) { TAU_PROFILE("pallocator_single:allocate()", " ", TAU_USER); // This doesn't support allocating arrays. @@ -43,34 +43,14 @@ pallocator_array(TypeHandle type_handle) NOEXCEPT : } template -INLINE TYPENAME pallocator_array::pointer pallocator_array:: +INLINE Type *pallocator_array:: allocate(TYPENAME pallocator_array::size_type n, TYPENAME allocator::const_pointer) { - TAU_PROFILE("pallocator_array:allocate()", " ", TAU_USER); -#ifdef DO_MEMORY_USAGE - size_t alloc_size = n * sizeof(Type); - void *ptr = (TYPENAME pallocator_array::pointer)PANDA_MALLOC_ARRAY(alloc_size); -#ifdef _DEBUG - assert(alloc_size == MemoryHook::get_ptr_size(ptr)); -#endif - _type_handle.inc_memory_usage(TypeHandle::MC_array, alloc_size); - return (TYPENAME pallocator_array::pointer)ASSUME_ALIGNED(ptr, MEMORY_HOOK_ALIGNMENT); -#else - return (TYPENAME pallocator_array::pointer)PANDA_MALLOC_ARRAY(n * sizeof(Type)); -#endif // DO_MEMORY_USAGE + return (TYPENAME pallocator_array::pointer) + ASSUME_ALIGNED(_type_handle.allocate_array(n * sizeof(Type)), MEMORY_HOOK_ALIGNMENT); } template INLINE void pallocator_array:: deallocate(TYPENAME pallocator_array::pointer p, TYPENAME pallocator_array::size_type) { - TAU_PROFILE("pallocator_array:deallocate()", " ", TAU_USER); -#ifdef DO_MEMORY_USAGE - // Now we need to recover the total number of bytes. Fortunately, in the - // case of DO_MEMORY_USAGE, MemoryHook already keeps track of this. - void *ptr = (void *)p; - size_t alloc_size = MemoryHook::get_ptr_size(ptr); - _type_handle.dec_memory_usage(TypeHandle::MC_array, alloc_size); - PANDA_FREE_ARRAY(ptr); -#else - PANDA_FREE_ARRAY(p); -#endif // DO_MEMORY_USAGE + _type_handle.deallocate_array((void *)p); } diff --git a/dtool/src/dtoolbase/pallocator.h b/dtool/src/dtoolbase/pallocator.h index b735bb7b3e..3c91b6cc7e 100644 --- a/dtool/src/dtoolbase/pallocator.h +++ b/dtool/src/dtoolbase/pallocator.h @@ -59,7 +59,8 @@ public: INLINE pallocator_single(const pallocator_single ©) NOEXCEPT : _type_handle(copy._type_handle) { } - INLINE pointer allocate(size_type n, allocator::const_pointer hint = 0); + INLINE Type *allocate(size_type n, allocator::const_pointer hint = 0) + RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); INLINE void deallocate(pointer p, size_type n); template struct rebind { @@ -87,7 +88,8 @@ public: INLINE pallocator_array(const pallocator_array ©) NOEXCEPT : _type_handle(copy._type_handle) { } - INLINE pointer allocate(size_type n, allocator::const_pointer hint = 0); + INLINE Type *allocate(size_type n, allocator::const_pointer hint = 0) + RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); INLINE void deallocate(pointer p, size_type n); template struct rebind { diff --git a/dtool/src/dtoolbase/typeHandle.cxx b/dtool/src/dtoolbase/typeHandle.cxx index ea3a51d6a1..6f4d7bc1d1 100644 --- a/dtool/src/dtoolbase/typeHandle.cxx +++ b/dtool/src/dtoolbase/typeHandle.cxx @@ -18,7 +18,6 @@ // This is initialized to zero by static initialization. TypeHandle TypeHandle::_none; -#ifdef DO_MEMORY_USAGE /** * Returns the total allocated memory used by objects of this type, for the * indicated memory class. This is only updated if track-memory-usage is set @@ -26,6 +25,7 @@ TypeHandle TypeHandle::_none; */ size_t TypeHandle:: get_memory_usage(MemoryClass memory_class) const { +#ifdef DO_MEMORY_USAGE assert((int)memory_class >= 0 && (int)memory_class < (int)MC_limit); if ((*this) == TypeHandle::none()) { return 0; @@ -34,16 +34,17 @@ get_memory_usage(MemoryClass memory_class) const { assert(rnode != (TypeRegistryNode *)NULL); return (size_t)AtomicAdjust::get(rnode->_memory_usage[memory_class]); } -} #endif // DO_MEMORY_USAGE + return 0; +} -#ifdef DO_MEMORY_USAGE /** * Adds the indicated amount to the record for the total allocated memory for * objects of this type. */ void TypeHandle:: inc_memory_usage(MemoryClass memory_class, size_t size) { +#ifdef DO_MEMORY_USAGE assert((int)memory_class >= 0 && (int)memory_class < (int)MC_limit); if ((*this) != TypeHandle::none()) { TypeRegistryNode *rnode = TypeRegistry::ptr()->look_up(*this, NULL); @@ -56,16 +57,16 @@ inc_memory_usage(MemoryClass memory_class, size_t size) { abort(); } } -} #endif // DO_MEMORY_USAGE +} -#ifdef DO_MEMORY_USAGE /** * Subtracts the indicated amount from the record for the total allocated * memory for objects of this type. */ void TypeHandle:: dec_memory_usage(MemoryClass memory_class, size_t size) { +#ifdef DO_MEMORY_USAGE assert((int)memory_class >= 0 && (int)memory_class < (int)MC_limit); if ((*this) != TypeHandle::none()) { TypeRegistryNode *rnode = TypeRegistry::ptr()->look_up(*this, NULL); @@ -75,8 +76,81 @@ dec_memory_usage(MemoryClass memory_class, size_t size) { // rnode->_memory_usage[memory_class] << "\n"; assert(rnode->_memory_usage[memory_class] >= 0); } -} #endif // DO_MEMORY_USAGE +} + +/** + * Allocates memory, adding it to the total amount of memory allocated for + * this type. + */ +void *TypeHandle:: +allocate_array(size_t size) { + TAU_PROFILE("TypeHandle:allocate_array()", " ", TAU_USER); + + void *ptr = PANDA_MALLOC_ARRAY(size); +#ifdef DO_MEMORY_USAGE + if ((*this) != TypeHandle::none()) { + size_t alloc_size = MemoryHook::get_ptr_size(ptr); +#ifdef _DEBUG + assert(size <= alloc_size); +#endif + TypeRegistryNode *rnode = TypeRegistry::ptr()->look_up(*this, NULL); + assert(rnode != (TypeRegistryNode *)NULL); + AtomicAdjust::add(rnode->_memory_usage[MC_array], (AtomicAdjust::Integer)alloc_size); + if (rnode->_memory_usage[MC_array] < 0) { + cerr << "Memory usage overflow for type " << *this << ".\n"; + abort(); + } + } +#endif // DO_MEMORY_USAGE + return ptr; +} + +/** + * Reallocates memory, adjusting the total amount of memory allocated for this + * type. + */ +void *TypeHandle:: +reallocate_array(void *old_ptr, size_t size) { + TAU_PROFILE("TypeHandle:reallocate_array()", " ", TAU_USER); + +#ifdef DO_MEMORY_USAGE + size_t old_size = MemoryHook::get_ptr_size(old_ptr); + void *new_ptr = PANDA_REALLOC_ARRAY(old_ptr, size); + + if ((*this) != TypeHandle::none()) { + size_t new_size = MemoryHook::get_ptr_size(new_ptr); + + TypeRegistryNode *rnode = TypeRegistry::ptr()->look_up(*this, NULL); + assert(rnode != (TypeRegistryNode *)NULL); + AtomicAdjust::add(rnode->_memory_usage[MC_array], (AtomicAdjust::Integer)new_size - (AtomicAdjust::Integer)old_size); + assert(rnode->_memory_usage[MC_array] >= 0); + } +#else + void *new_ptr = PANDA_REALLOC_ARRAY(old_ptr, size); +#endif + return new_ptr; +} + +/** + * Deallocates memory, subtracting it from the total amount of memory + * allocated for this type. + */ +void TypeHandle:: +deallocate_array(void *ptr) { + TAU_PROFILE("TypeHandle:deallocate_array()", " ", TAU_USER); + +#ifdef DO_MEMORY_USAGE + size_t alloc_size = MemoryHook::get_ptr_size(ptr); + if ((*this) != TypeHandle::none()) { + TypeRegistryNode *rnode = TypeRegistry::ptr()->look_up(*this, NULL); + assert(rnode != (TypeRegistryNode *)NULL); + AtomicAdjust::add(rnode->_memory_usage[MC_array], -(AtomicAdjust::Integer)alloc_size); + assert(rnode->_memory_usage[MC_array] >= 0); + } +#endif // DO_MEMORY_USAGE + PANDA_FREE_ARRAY(ptr); +} /** * Return the Index of the BEst fit Classs from a set diff --git a/dtool/src/dtoolbase/typeHandle.h b/dtool/src/dtoolbase/typeHandle.h index fe611c2fd1..f770b1810b 100644 --- a/dtool/src/dtoolbase/typeHandle.h +++ b/dtool/src/dtoolbase/typeHandle.h @@ -18,25 +18,49 @@ #include -// The following illustrates the convention for declaring a type that uses -// TypeHandle. In this example, ThisThingie inherits from TypedObject, which -// automatically supplies some type-differentiation functions at the cost of -// one virtual function, get_type(); however, this inheritance is optional, -// and may be omitted to avoid the virtual function pointer overhead. (If you -// do use TypedObject, be sure to consider whether your destructor should also -// be virtual.) - -/* - * class ThatThingie : public SimpleTypedObject { public: static TypeHandle - * get_class_type() { return _type_handle; } static void init_type() { - * register_type(_type_handle, "ThatThingie"); } private: static TypeHandle - * _type_handle; }; class ThisThingie : public ThatThingie, publid TypedObject - * { public: static TypeHandle get_class_type() { return _type_handle; } - * static void init_type() { ThatThingie::init_type(); - * TypedObject::init_type(); register_type(_type_handle, "ThisThingie", - * ThatThingie::get_class_type(), TypedObject::get_class_type()); } virtual - * TypeHandle get_type() const { return get_class_type(); } private: static - * TypeHandle _type_handle; }; +/** + * The following illustrates the convention for declaring a type that uses + * TypeHandle. In this example, ThisThingie inherits from TypedObject, which + * automatically supplies some type-differentiation functions at the cost of + * one virtual function, get_type(); however, this inheritance is optional, + * and may be omitted to avoid the virtual function pointer overhead. (If you + * do use TypedObject, be sure to consider whether your destructor should also + * be virtual.) + * + * @code + * class ThatThingie : public SimpleTypedObject { + * public: + * static TypeHandle get_class_type() { + * return _type_handle; + * } + * static void init_type() { + * register_type(_type_handle, "ThatThingie"); + * } + * + * private: + * static TypeHandle _type_handle; + * }; + * + * class ThisThingie : public ThatThingie, publid TypedObject { + * public: + * static TypeHandle get_class_type() { + * return _type_handle; + * } + * static void init_type() { + * ThatThingie::init_type(); + * TypedObject::init_type(); + * register_type(_type_handle, "ThisThingie", + * ThatThingie::get_class_type(), + * TypedObject::get_class_type()); + * } + * virtual TypeHandle get_type() const { + * return get_class_type(); + * } + * + * private: + * static TypeHandle _type_handle; + * }; + * @endcode */ class TypedObject; @@ -97,15 +121,9 @@ PUBLISHED: int get_best_parent_from_Set(const std::set< int > &legal_vals) const; -#ifdef DO_MEMORY_USAGE size_t get_memory_usage(MemoryClass memory_class) const; void inc_memory_usage(MemoryClass memory_class, size_t size); void dec_memory_usage(MemoryClass memory_class, size_t size); -#else - static CONSTEXPR size_t get_memory_usage(MemoryClass) { return 0; } - INLINE void inc_memory_usage(MemoryClass, size_t) { } - INLINE void dec_memory_usage(MemoryClass, size_t) { } -#endif // DO_MEMORY_USAGE INLINE int get_index() const; INLINE void output(ostream &out) const; @@ -118,6 +136,10 @@ PUBLISHED: MAKE_SEQ_PROPERTY(child_classes, get_num_child_classes, get_child_class); public: + void *allocate_array(size_t size) RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); + void *reallocate_array(void *ptr, size_t size) RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); + void deallocate_array(void *ptr); + INLINE static TypeHandle from_index(int index); private: diff --git a/dtool/src/dtoolutil/pandaSystem.cxx b/dtool/src/dtoolutil/pandaSystem.cxx index cef04eb37b..79e5aa7762 100644 --- a/dtool/src/dtoolutil/pandaSystem.cxx +++ b/dtool/src/dtoolutil/pandaSystem.cxx @@ -45,6 +45,11 @@ PandaSystem() : #else set_system_tag("eigen", "vectorize", "0"); #endif +#ifdef __AVX__ + set_system_tag("eigen", "avx", "1"); +#else + set_system_tag("eigen", "avx", "0"); +#endif #endif // HAVE_EIGEN #ifdef USE_MEMORY_DLMALLOC @@ -189,6 +194,14 @@ is_official_version() { #endif } +/** + * Returns the memory alignment that Panda's allocators are using. + */ +int PandaSystem:: +get_memory_alignment() { + return MEMORY_HOOK_ALIGNMENT; +} + /** * Returns the string defined by the distributor of this version of Panda, or * "homebuilt" if this version was built directly from the sources by the end- diff --git a/dtool/src/dtoolutil/pandaSystem.h b/dtool/src/dtoolutil/pandaSystem.h index d88e3b92a3..bed5f2c073 100644 --- a/dtool/src/dtoolutil/pandaSystem.h +++ b/dtool/src/dtoolutil/pandaSystem.h @@ -39,6 +39,8 @@ PUBLISHED: static int get_sequence_version(); static bool is_official_version(); + static int get_memory_alignment(); + static string get_distributor(); static string get_compiler(); static string get_build_date(); diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 564ee8e4e9..e159e864d8 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -973,9 +973,7 @@ if GetTarget() == 'android': DefSymbol("ALWAYS", "ANDROID") if not PkgSkip("EIGEN"): - DefSymbol("ALWAYS", "EIGEN_MPL2_ONLY") if GetOptimize() >= 3: - DefSymbol("ALWAYS", "EIGEN_NO_DEBUG") if COMPILER == "MSVC": # Squeeze out a bit more performance on MSVC builds... # Only do this if EIGEN_NO_DEBUG is also set, otherwise it diff --git a/panda/src/gobj/geomVertexArrayData.h b/panda/src/gobj/geomVertexArrayData.h index e52876d376..9766a9cbd1 100644 --- a/panda/src/gobj/geomVertexArrayData.h +++ b/panda/src/gobj/geomVertexArrayData.h @@ -261,8 +261,8 @@ public: INLINE Thread *get_current_thread() const; - INLINE const unsigned char *get_read_pointer(bool force) const; - unsigned char *get_write_pointer(); + INLINE const unsigned char *get_read_pointer(bool force) const RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); + unsigned char *get_write_pointer() RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); PUBLISHED: INLINE const GeomVertexArrayData *get_object() const; diff --git a/panda/src/gobj/vertexDataBuffer.cxx b/panda/src/gobj/vertexDataBuffer.cxx index 1e3b884893..19f50b3013 100644 --- a/panda/src/gobj/vertexDataBuffer.cxx +++ b/panda/src/gobj/vertexDataBuffer.cxx @@ -27,15 +27,13 @@ operator = (const VertexDataBuffer ©) { if (_resident_data != (unsigned char *)NULL) { nassertv(_reserved_size != 0); - get_class_type().dec_memory_usage(TypeHandle::MC_array, (int)_reserved_size); - PANDA_FREE_ARRAY(_resident_data); + get_class_type().deallocate_array(_resident_data); _resident_data = NULL; } if (copy._resident_data != (unsigned char *)NULL && copy._size != 0) { // We only allocate _size bytes, not the full _reserved_size allocated by // the original copy. - get_class_type().inc_memory_usage(TypeHandle::MC_array, (int)copy._size); - _resident_data = (unsigned char *)PANDA_MALLOC_ARRAY(copy._size); + _resident_data = (unsigned char *)get_class_type().allocate_array(copy._size); memcpy(_resident_data, copy._resident_data, copy._size); } _size = copy._size; @@ -55,17 +53,16 @@ swap(VertexDataBuffer &other) { unsigned char *resident_data = _resident_data; size_t size = _size; size_t reserved_size = _reserved_size; - PT(VertexDataBlock) block = _block; + + _block.swap(other._block); _resident_data = other._resident_data; _size = other._size; _reserved_size = other._reserved_size; - _block = other._block; other._resident_data = resident_data; other._size = size; other._reserved_size = reserved_size; - other._block = block; nassertv(_reserved_size >= _size); } @@ -94,13 +91,12 @@ do_clean_realloc(size_t reserved_size) { do_page_in(); } - get_class_type().inc_memory_usage(TypeHandle::MC_array, (int)reserved_size - (int)_reserved_size); if (_reserved_size == 0) { nassertv(_resident_data == (unsigned char *)NULL); - _resident_data = (unsigned char *)PANDA_MALLOC_ARRAY(reserved_size); + _resident_data = (unsigned char *)get_class_type().allocate_array(reserved_size); } else { nassertv(_resident_data != (unsigned char *)NULL); - _resident_data = (unsigned char *)PANDA_REALLOC_ARRAY(_resident_data, reserved_size); + _resident_data = (unsigned char *)get_class_type().reallocate_array(_resident_data, reserved_size); } nassertv(_resident_data != (unsigned char *)NULL); _reserved_size = reserved_size; @@ -129,16 +125,14 @@ do_unclean_realloc(size_t reserved_size) { if (_resident_data != (unsigned char *)NULL) { nassertv(_reserved_size != 0); - get_class_type().dec_memory_usage(TypeHandle::MC_array, (int)_reserved_size); - PANDA_FREE_ARRAY(_resident_data); + get_class_type().deallocate_array(_resident_data); _resident_data = NULL; _reserved_size = 0; } if (reserved_size != 0) { - get_class_type().inc_memory_usage(TypeHandle::MC_array, (int)reserved_size); nassertv(_resident_data == (unsigned char *)NULL); - _resident_data = (unsigned char *)PANDA_MALLOC_ARRAY(reserved_size); + _resident_data = (unsigned char *)get_class_type().allocate_array(reserved_size); } _reserved_size = reserved_size; @@ -166,8 +160,7 @@ do_page_out(VertexDataBook &book) { if (_size == 0) { // It's an empty buffer. Just deallocate it; don't bother to create a // block. - get_class_type().dec_memory_usage(TypeHandle::MC_array, (int)_reserved_size); - PANDA_FREE_ARRAY(_resident_data); + get_class_type().deallocate_array(_resident_data); _resident_data = NULL; _reserved_size = 0; @@ -180,8 +173,7 @@ do_page_out(VertexDataBook &book) { nassertv(pointer != (unsigned char *)NULL); memcpy(pointer, _resident_data, _size); - get_class_type().dec_memory_usage(TypeHandle::MC_array, (int)_reserved_size); - PANDA_FREE_ARRAY(_resident_data); + get_class_type().deallocate_array(_resident_data); _resident_data = NULL; _reserved_size = _size; @@ -205,8 +197,7 @@ do_page_in() { nassertv(_block != (VertexDataBlock *)NULL); nassertv(_reserved_size == _size); - get_class_type().inc_memory_usage(TypeHandle::MC_array, (int)_size); - _resident_data = (unsigned char *)PANDA_MALLOC_ARRAY(_size); + _resident_data = (unsigned char *)get_class_type().allocate_array(_size); nassertv(_resident_data != (unsigned char *)NULL); memcpy(_resident_data, _block->get_pointer(true), _size); diff --git a/panda/src/gobj/vertexDataBuffer.h b/panda/src/gobj/vertexDataBuffer.h index 2a18aeda45..f698669f52 100644 --- a/panda/src/gobj/vertexDataBuffer.h +++ b/panda/src/gobj/vertexDataBuffer.h @@ -57,8 +57,8 @@ public: void operator = (const VertexDataBuffer ©); INLINE ~VertexDataBuffer(); - INLINE const unsigned char *get_read_pointer(bool force) const; - INLINE unsigned char *get_write_pointer(); + INLINE const unsigned char *get_read_pointer(bool force) const RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); + INLINE unsigned char *get_write_pointer() RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); INLINE size_t get_size() const; INLINE size_t get_reserved_size() const; diff --git a/panda/src/linmath/lsimpleMatrix.h b/panda/src/linmath/lsimpleMatrix.h index 5669e18be3..3228caf5bb 100644 --- a/panda/src/linmath/lsimpleMatrix.h +++ b/panda/src/linmath/lsimpleMatrix.h @@ -58,7 +58,7 @@ private: #endif // HAVE_EIGEN // This is as good a place as any to define this alignment macro. -#if defined(LINMATH_ALIGN) && defined(HAVE_EIGEN) && defined(__AVX__) +#if defined(LINMATH_ALIGN) && defined(HAVE_EIGEN) && defined(__AVX__) && defined(STDFLOAT_DOUBLE) #define ALIGN_LINMATH ALIGN_32BYTE #elif defined(LINMATH_ALIGN) #define ALIGN_LINMATH ALIGN_16BYTE diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx index 6818ea65a0..db600e14de 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx @@ -2612,12 +2612,10 @@ setup_gltex(GLTexture *gltex, int x_size, int y_size, int num_levels) { if (gltex->total_bytecount != total_bytecount) { if (gltex->allocated_buffer != NULL) { - PANDA_FREE_ARRAY(gltex->allocated_buffer); - TinyTextureContext::get_class_type().dec_memory_usage(TypeHandle::MC_array, gltex->total_bytecount); + TinyTextureContext::get_class_type().deallocate_array(gltex->allocated_buffer); } - gltex->allocated_buffer = PANDA_MALLOC_ARRAY(total_bytecount); + gltex->allocated_buffer = TinyTextureContext::get_class_type().allocate_array(total_bytecount); gltex->total_bytecount = total_bytecount; - TinyTextureContext::get_class_type().inc_memory_usage(TypeHandle::MC_array, total_bytecount); } char *next_buffer = (char *)gltex->allocated_buffer; diff --git a/panda/src/tinydisplay/tinyTextureContext.cxx b/panda/src/tinydisplay/tinyTextureContext.cxx index 87427ac365..5a3ae3414d 100644 --- a/panda/src/tinydisplay/tinyTextureContext.cxx +++ b/panda/src/tinydisplay/tinyTextureContext.cxx @@ -24,8 +24,7 @@ TinyTextureContext:: GLTexture *gltex = &_gltex; if (gltex->allocated_buffer != NULL) { nassertv(gltex->num_levels != 0); - TinyTextureContext::get_class_type().dec_memory_usage(TypeHandle::MC_array, gltex->total_bytecount); - PANDA_FREE_ARRAY(gltex->allocated_buffer); + get_class_type().deallocate_array(gltex->allocated_buffer); gltex->allocated_buffer = NULL; gltex->total_bytecount = 0; gltex->num_levels = 0; @@ -51,8 +50,7 @@ evict_lru() { GLTexture *gltex = &_gltex; if (gltex->allocated_buffer != NULL) { nassertv(gltex->num_levels != 0); - TinyTextureContext::get_class_type().dec_memory_usage(TypeHandle::MC_array, gltex->total_bytecount); - PANDA_FREE_ARRAY(gltex->allocated_buffer); + get_class_type().deallocate_array(gltex->allocated_buffer); gltex->allocated_buffer = NULL; gltex->total_bytecount = 0; gltex->num_levels = 0; From 78e4c712023ad32f82625b182d543d5c6fae60d0 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 17 Feb 2017 12:57:34 +0100 Subject: [PATCH 048/254] Fix issue with taking screenshots from an FBO --- panda/src/display/displayRegion.cxx | 6 ++++++ panda/src/glstuff/glGraphicsBuffer_src.cxx | 3 +++ 2 files changed, 9 insertions(+) diff --git a/panda/src/display/displayRegion.cxx b/panda/src/display/displayRegion.cxx index c8f7626468..4ffa29285c 100644 --- a/panda/src/display/displayRegion.cxx +++ b/panda/src/display/displayRegion.cxx @@ -491,6 +491,12 @@ get_screenshot() { return NULL; } + { + // Make sure that the correct viewport is active. + DisplayRegionPipelineReader dr_reader(this, current_thread); + gsg->prepare_display_region(&dr_reader); + } + PT(Texture) tex = new Texture; RenderBuffer buffer = gsg->get_render_buffer(get_screenshot_buffer_type(), diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index ad09596f9c..3a73d175c4 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -269,6 +269,9 @@ begin_frame(FrameMode mode, Thread *current_thread) { } } #endif + } else if (mode == FM_refresh) { + // Just bind the FBO. + rebuild_bitplanes(); } _gsg->set_current_properties(&get_fb_properties()); From 21a42f62dfeb62a590f957ae5d3aa0ca5b32f373 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 17 Feb 2017 12:59:50 +0100 Subject: [PATCH 049/254] Fix FreeBSD compile error --- panda/src/display/graphicsPipe.cxx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/panda/src/display/graphicsPipe.cxx b/panda/src/display/graphicsPipe.cxx index 5c00b204a3..bb6fdae3a4 100644 --- a/panda/src/display/graphicsPipe.cxx +++ b/panda/src/display/graphicsPipe.cxx @@ -23,11 +23,8 @@ #include #endif -#ifdef IS_OSX +#if defined(IS_OSX) || defined(IS_FREEBSD) #include -#endif - -#ifdef IS_FREEBSD #include #endif From f5f51c5d5b82e19993fe002282884a08bc694a10 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 17 Feb 2017 16:15:04 +0100 Subject: [PATCH 050/254] Remove OpenSSL includes from headers, so C++ users don't need to have OpenSSL --- dtool/src/parser-inc/openssl/evp.h | 3 +- dtool/src/parser-inc/openssl/ssl.h | 15 ++-- dtool/src/parser-inc/openssl/x509.h | 4 +- dtool/src/prc/encryptStreamBuf.cxx | 1 + dtool/src/prc/encryptStreamBuf.h | 2 +- dtool/src/prc/prcKeyRegistry.cxx | 4 + dtool/src/prc/prcKeyRegistry.h | 4 +- panda/src/downloader/bioPtr.I | 8 -- panda/src/downloader/bioPtr.cxx | 13 ++- panda/src/downloader/bioPtr.h | 10 +-- panda/src/downloader/bioStreamBuf.h | 6 -- panda/src/downloader/bioStreamPtr.h | 6 -- panda/src/downloader/httpChannel.cxx | 2 + panda/src/downloader/httpChannel.h | 8 +- panda/src/downloader/httpClient.cxx | 126 ++++++++++++++------------- panda/src/downloader/httpClient.h | 12 ++- panda/src/express/multifile.cxx | 39 +-------- panda/src/express/multifile.h | 7 +- 18 files changed, 112 insertions(+), 158 deletions(-) diff --git a/dtool/src/parser-inc/openssl/evp.h b/dtool/src/parser-inc/openssl/evp.h index a9ef1fd091..9cc780cb19 100644 --- a/dtool/src/parser-inc/openssl/evp.h +++ b/dtool/src/parser-inc/openssl/evp.h @@ -2,7 +2,6 @@ #ifndef EVP_H #define EVP_H -struct EVP_CIPHER_CTX; -struct EVP_PKEY; +#include #endif diff --git a/dtool/src/parser-inc/openssl/ssl.h b/dtool/src/parser-inc/openssl/ssl.h index d43aca6090..50fe63c4bc 100644 --- a/dtool/src/parser-inc/openssl/ssl.h +++ b/dtool/src/parser-inc/openssl/ssl.h @@ -2,13 +2,14 @@ #ifndef SSL_H #define SSL_H -struct BIO; -struct SSL_CTX; -struct EVP_CIPHER_CTX; -struct EVP_PKEY; -struct X509; -struct X509_STORE; -struct X509_NAME; +typedef struct bio_st BIO; +typedef struct ssl_ctx_st SSL_CTX; +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; +typedef struct evp_pkey_st EVP_PKEY; +typedef struct x509_st X509; +typedef struct x509_store_st X509_STORE; +typedef struct X509_name_st X509_NAME; +typedef struct ssl_cipher_st SSL_CIPHER; struct SSL; #define STACK_OF(type) struct stack_st_##type diff --git a/dtool/src/parser-inc/openssl/x509.h b/dtool/src/parser-inc/openssl/x509.h index bbd2598dfc..d2bfcbaa5c 100644 --- a/dtool/src/parser-inc/openssl/x509.h +++ b/dtool/src/parser-inc/openssl/x509.h @@ -2,9 +2,7 @@ #ifndef X509_H #define X509_H -struct X509; -struct X509_STORE; -struct X509_NAME; +#include #endif diff --git a/dtool/src/prc/encryptStreamBuf.cxx b/dtool/src/prc/encryptStreamBuf.cxx index 6cb0ee6b39..3d428852d2 100644 --- a/dtool/src/prc/encryptStreamBuf.cxx +++ b/dtool/src/prc/encryptStreamBuf.cxx @@ -21,6 +21,7 @@ #ifdef HAVE_OPENSSL #include "openssl/rand.h" +#include "openssl/evp.h" #ifndef HAVE_STREAMSIZE // Some compilers (notably SGI) don't define this for us diff --git a/dtool/src/prc/encryptStreamBuf.h b/dtool/src/prc/encryptStreamBuf.h index 4861a89240..b7d95424c2 100644 --- a/dtool/src/prc/encryptStreamBuf.h +++ b/dtool/src/prc/encryptStreamBuf.h @@ -19,7 +19,7 @@ // This module is not compiled if OpenSSL is not available. #ifdef HAVE_OPENSSL -#include "openssl/evp.h" +typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX; /** * The streambuf object that implements IDecompressStream and OCompressStream. diff --git a/dtool/src/prc/prcKeyRegistry.cxx b/dtool/src/prc/prcKeyRegistry.cxx index 9b760ac53d..6329a8abbd 100644 --- a/dtool/src/prc/prcKeyRegistry.cxx +++ b/dtool/src/prc/prcKeyRegistry.cxx @@ -19,8 +19,12 @@ #ifdef HAVE_OPENSSL +#include "openssl/evp.h" #include "openssl/pem.h" +// Some versions of OpenSSL appear to define this as a macro. Yucky. +#undef set_key + PrcKeyRegistry *PrcKeyRegistry::_global_ptr = NULL; /** diff --git a/dtool/src/prc/prcKeyRegistry.h b/dtool/src/prc/prcKeyRegistry.h index 1b53287215..69e25d949e 100644 --- a/dtool/src/prc/prcKeyRegistry.h +++ b/dtool/src/prc/prcKeyRegistry.h @@ -22,10 +22,8 @@ #ifdef HAVE_OPENSSL #include -#include "openssl/evp.h" -// Some versions of OpenSSL appear to define this as a macro. Yucky. -#undef set_key +typedef struct evp_pkey_st EVP_PKEY; /** * This class records the set of public keys used to verify the signature on a diff --git a/panda/src/downloader/bioPtr.I b/panda/src/downloader/bioPtr.I index f09ee7bbc8..a1e1f13e1d 100644 --- a/panda/src/downloader/bioPtr.I +++ b/panda/src/downloader/bioPtr.I @@ -18,14 +18,6 @@ INLINE BioPtr:: BioPtr(BIO *bio) : _bio(bio) { } -/** - * - */ -INLINE bool BioPtr:: -should_retry() const { - return (_bio != NULL) && BIO_should_retry(_bio); -} - /** * */ diff --git a/panda/src/downloader/bioPtr.cxx b/panda/src/downloader/bioPtr.cxx index 15fe997c02..b86f37f816 100644 --- a/panda/src/downloader/bioPtr.cxx +++ b/panda/src/downloader/bioPtr.cxx @@ -18,6 +18,9 @@ #include "urlSpec.h" #include "config_downloader.h" +#include "openSSLWrapper.h" // must be included before any other openssl. +#include "openssl/ssl.h" + #ifdef _WIN32 #include #else @@ -199,7 +202,7 @@ connect() { if (result != 0 && BIO_sock_should_retry(-1)) { // It's still in progress; we should retry later. This causes - // should_reply() to return true. + // should_retry() to return true. BIO_set_flags(_bio, BIO_FLAGS_SHOULD_RETRY); _connecting = true; return false; @@ -218,6 +221,14 @@ connect() { return true; } +/** + * + */ +bool BioPtr:: +should_retry() const { + return (_bio != NULL) && BIO_should_retry(_bio); +} + /** * */ diff --git a/panda/src/downloader/bioPtr.h b/panda/src/downloader/bioPtr.h index 332a1fc715..090ae20608 100644 --- a/panda/src/downloader/bioPtr.h +++ b/panda/src/downloader/bioPtr.h @@ -19,13 +19,7 @@ // This module is not compiled if OpenSSL is not available. #ifdef HAVE_OPENSSL -#ifndef OPENSSL_NO_KRB5 -#define OPENSSL_NO_KRB5 -#endif - #include "referenceCount.h" -#include "openSSLWrapper.h" // must be included before any other openssl. -#include "openssl/ssl.h" #ifdef _WIN32 #include @@ -35,6 +29,8 @@ #include #endif +typedef struct bio_st BIO; + class URLSpec; /** @@ -52,7 +48,7 @@ public: void set_nbio(bool nbio); bool connect(); - INLINE bool should_retry() const; + bool should_retry() const; INLINE BIO &operator *() const; INLINE BIO *operator -> () const; diff --git a/panda/src/downloader/bioStreamBuf.h b/panda/src/downloader/bioStreamBuf.h index c9174b30b1..0378d9db65 100644 --- a/panda/src/downloader/bioStreamBuf.h +++ b/panda/src/downloader/bioStreamBuf.h @@ -19,14 +19,8 @@ // This module is not compiled if OpenSSL is not available. #ifdef HAVE_OPENSSL -#ifndef OPENSSL_NO_KRB5 -#define OPENSSL_NO_KRB5 -#endif - #include "bioPtr.h" #include "pointerTo.h" -#include "openSSLWrapper.h" // must be included before any other openssl. -#include "openssl/ssl.h" /** * The streambuf object that implements IBioStream. diff --git a/panda/src/downloader/bioStreamPtr.h b/panda/src/downloader/bioStreamPtr.h index aa5c8a28bf..3f23040d20 100644 --- a/panda/src/downloader/bioStreamPtr.h +++ b/panda/src/downloader/bioStreamPtr.h @@ -19,14 +19,8 @@ // This module is not compiled if OpenSSL is not available. #ifdef HAVE_OPENSSL -#ifndef OPENSSL_NO_KRB5 -#define OPENSSL_NO_KRB5 -#endif - #include "bioStream.h" #include "referenceCount.h" -#include "openSSLWrapper.h" // must be included before any other openssl. -#include "openssl/ssl.h" /** * A wrapper around an BioStream object to make a reference-counting pointer diff --git a/panda/src/downloader/httpChannel.cxx b/panda/src/downloader/httpChannel.cxx index 3c90d63c3c..a7eb5f58d3 100644 --- a/panda/src/downloader/httpChannel.cxx +++ b/panda/src/downloader/httpChannel.cxx @@ -27,6 +27,8 @@ #ifdef HAVE_OPENSSL +#include "openSSLWrapper.h" + #if defined(WIN32_VC) || defined(WIN64_VC) #include #include // for select() diff --git a/panda/src/downloader/httpChannel.h b/panda/src/downloader/httpChannel.h index 4c4ddfa312..b9131eba9a 100644 --- a/panda/src/downloader/httpChannel.h +++ b/panda/src/downloader/httpChannel.h @@ -22,10 +22,6 @@ #ifdef HAVE_OPENSSL -#ifndef OPENSSL_NO_KRB5 -#define OPENSSL_NO_KRB5 -#endif - #include "httpClient.h" #include "httpEnum.h" #include "urlSpec.h" @@ -37,10 +33,10 @@ #include "pointerTo.h" #include "config_downloader.h" #include "filename.h" -#include "openSSLWrapper.h" // must be included before any other openssl. -#include "openssl/ssl.h" #include "typedReferenceCount.h" +typedef struct bio_st BIO; + class Ramfile; class HTTPClient; diff --git a/panda/src/downloader/httpClient.cxx b/panda/src/downloader/httpClient.cxx index 129d5fb6be..4770d6916d 100644 --- a/panda/src/downloader/httpClient.cxx +++ b/panda/src/downloader/httpClient.cxx @@ -24,6 +24,8 @@ #ifdef HAVE_OPENSSL +#include "openSSLWrapper.h" + PT(HTTPClient) HTTPClient::_global_ptr; /** @@ -68,6 +70,68 @@ tokenize(const string &str, vector_string &words, const string &delimiters) { words.push_back(string()); } +#ifndef NDEBUG +/** + * This method is attached as a callback for SSL messages only when debug + * output is enabled. + */ +static void +ssl_msg_callback(int write_p, int version, int content_type, + const void *, size_t len, SSL *, void *) { + ostringstream describe; + if (write_p) { + describe << "sent "; + } else { + describe << "received "; + } + switch (version) { + case SSL2_VERSION: + describe << "SSL 2.0 "; + break; + + case SSL3_VERSION: + describe << "SSL 3.0 "; + break; + + case TLS1_VERSION: + describe << "TLS 1.0 "; + break; + + default: + describe << "unknown protocol "; + } + + describe << "message: "; + + if (version != SSL2_VERSION) { + switch (content_type) { + case 20: + describe << "change cipher spec, "; + break; + + case 21: + describe << "alert, "; + break; + + case 22: + describe << "handshake, "; + break; + + case 23: + describe << "application data, "; + break; + + default: + describe << "unknown content type, "; + } + } + + describe << len << " bytes.\n"; + + downloader_cat.debug() << describe.str(); +} +#endif // !defined(NDEBUG) + /** * */ @@ -1564,68 +1628,6 @@ split_whitespace(string &a, string &b, const string &c) { b = c.substr(p); } -#ifndef NDEBUG -/** - * This method is attached as a callback for SSL messages only when debug - * output is enabled. - */ -void HTTPClient:: -ssl_msg_callback(int write_p, int version, int content_type, - const void *, size_t len, SSL *, void *) { - ostringstream describe; - if (write_p) { - describe << "sent "; - } else { - describe << "received "; - } - switch (version) { - case SSL2_VERSION: - describe << "SSL 2.0 "; - break; - - case SSL3_VERSION: - describe << "SSL 3.0 "; - break; - - case TLS1_VERSION: - describe << "TLS 1.0 "; - break; - - default: - describe << "unknown protocol "; - } - - describe << "message: "; - - if (version != SSL2_VERSION) { - switch (content_type) { - case 20: - describe << "change cipher spec, "; - break; - - case 21: - describe << "alert, "; - break; - - case 22: - describe << "handshake, "; - break; - - case 23: - describe << "application data, "; - break; - - default: - describe << "unknown content type, "; - } - } - - describe << len << " bytes.\n"; - - downloader_cat.debug() << describe.str(); -} -#endif // !defined(NDEBUG) - /** * */ diff --git a/panda/src/downloader/httpClient.h b/panda/src/downloader/httpClient.h index d901066357..1efab58460 100644 --- a/panda/src/downloader/httpClient.h +++ b/panda/src/downloader/httpClient.h @@ -32,7 +32,11 @@ #include "pmap.h" #include "pset.h" #include "referenceCount.h" -#include "openSSLWrapper.h" + +typedef struct ssl_ctx_st SSL_CTX; +typedef struct x509_st X509; +typedef struct X509_name_st X509_NAME; +typedef struct evp_pkey_st EVP_PKEY; class Filename; class HTTPChannel; @@ -155,12 +159,6 @@ private: static void split_whitespace(string &a, string &b, const string &c); -#ifndef NDEBUG - static void ssl_msg_callback(int write_p, int version, int content_type, - const void *buf, size_t len, SSL *ssl, - void *arg); -#endif - typedef pvector Proxies; typedef pmap ProxiesByScheme; ProxiesByScheme _proxies_by_scheme; diff --git a/panda/src/express/multifile.cxx b/panda/src/express/multifile.cxx index 2f7cda439b..0d98849efe 100644 --- a/panda/src/express/multifile.cxx +++ b/panda/src/express/multifile.cxx @@ -26,6 +26,8 @@ #include #include +#include "openSSLWrapper.h" + // This sequence of bytes begins each Multifile to identify it as a Multifile. const char Multifile::_header[] = "pmf\0\n\r"; const size_t Multifile::_header_size = 6; @@ -768,43 +770,6 @@ add_signature(const Filename &composite, const string &password) { } #endif // HAVE_OPENSSL -#ifdef HAVE_OPENSSL -/** - * Adds a new signature to the Multifile. This signature associates the - * indicated certificate with the current contents of the Multifile. When the - * Multifile is read later, the signature will still be present only if the - * Multifile is unchanged; any subsequent changes to the Multifile will - * automatically invalidate and remove the signature. - * - * If chain is non-NULL, it represents the certificate chain that validates - * the certificate. - * - * The specified private key must match the certificate, and the Multifile - * must be open in read-write mode. The private key is only used for - * generating the signature; it is not written to the Multifile and cannot be - * retrieved from the Multifile later. (However, the certificate *can* be - * retrieved from the Multifile later, to identify the entity that created the - * signature.) - * - * This implicitly causes a repack() operation if one is needed. Returns true - * on success, false on failure. - */ -bool Multifile:: -add_signature(X509 *certificate, STACK_OF(X509) *chain, EVP_PKEY *pkey) { - // Convert the certificate and chain into our own CertChain structure. - CertChain cert_chain; - cert_chain.push_back(CertRecord(certificate)); - if (chain != NULL) { - int num = sk_X509_num(chain); - for (int i = 0; i < num; ++i) { - cert_chain.push_back(CertRecord((X509 *)sk_X509_value(chain, i))); - } - } - - return add_signature(cert_chain, pkey); -} -#endif // HAVE_OPENSSL - #ifdef HAVE_OPENSSL /** * Adds a new signature to the Multifile. This signature associates the diff --git a/panda/src/express/multifile.h b/panda/src/express/multifile.h index 578ac70d6d..5c6ec16feb 100644 --- a/panda/src/express/multifile.h +++ b/panda/src/express/multifile.h @@ -24,7 +24,11 @@ #include "indirectLess.h" #include "referenceCount.h" #include "pvector.h" -#include "openSSLWrapper.h" + +#ifdef HAVE_OPENSSL +typedef struct x509_st X509; +typedef struct evp_pkey_st EVP_PKEY; +#endif /** * A file that contains a set of files. @@ -148,7 +152,6 @@ public: }; typedef pvector CertChain; - bool add_signature(X509 *certificate, STACK_OF(X509) *chain, EVP_PKEY *pkey); bool add_signature(const CertChain &chain, EVP_PKEY *pkey); const CertChain &get_signature(int n) const; From 4cc2009a940781837dc1b00447a6accfae6964d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=BE=A4?= <517067180@qq.com> Date: Sat, 18 Feb 2017 16:24:58 +0800 Subject: [PATCH 051/254] Correct several spelling mistakes in comments --- samples/chessboard/main.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/samples/chessboard/main.py b/samples/chessboard/main.py index 7da1d97a14..5c8b68302d 100755 --- a/samples/chessboard/main.py +++ b/samples/chessboard/main.py @@ -20,7 +20,7 @@ from direct.showbase.DirectObject import DirectObject from direct.task.Task import Task import sys -# First we define some contants for the colors +# First we define some constants for the colors BLACK = (0, 0, 0, 1) WHITE = (1, 1, 1, 1) HIGHLIGHT = (0, 1, 1, 1) @@ -33,7 +33,7 @@ PIECEBLACK = (.15, .15, .15, 1) # This is how we know where to position an object in 3D space based on a 2D mouse # position. It also assumes that we are dragging in the XY plane. # -# This is derived from the mathmatical of a plane, solved for a given point +# This is derived from the mathematical of a plane, solved for a given point def PointAtZ(z, point, vec): return point + vec * ((z - point.getZ()) / vec.getZ()) @@ -41,7 +41,7 @@ def PointAtZ(z, point, vec): def SquarePos(i): return LPoint3((i % 8) - 3.5, int(i // 8) - 3.5, 0) -# Helper function for determining wheter a square should be white or black +# Helper function for determining whether a square should be white or black # The modulo operations (%) generate the every-other pattern of a chess-board def SquareColor(i): if (i + ((i // 8) % 2)) % 2: @@ -84,7 +84,7 @@ class ChessboardDemo(ShowBase): # relative to it self.pickerNP = camera.attachNewNode(self.pickerNode) # Everything to be picked will use bit 1. This way if we were doing other - # collision we could seperate it + # collision we could separate it self.pickerNode.setFromCollideMask(BitMask32.bit(1)) self.pickerRay = CollisionRay() # Make our ray # Add it to the collision node @@ -96,7 +96,7 @@ class ChessboardDemo(ShowBase): # Now we create the chess board and its pieces # We will attach all of the squares to their own root. This way we can do the - # collision pass just on the sqaures and save the time of checking the rest + # collision pass just on the squares and save the time of checking the rest # of the scene self.squareRoot = render.attachNewNode("squareRoot") @@ -240,7 +240,7 @@ class ChessboardDemo(ShowBase): render.setLight(render.attachNewNode(ambientLight)) -# Class for a piece. This just handels loading the model and setting initial +# Class for a piece. This just handles loading the model and setting initial # position and color class Piece(object): def __init__(self, square, color): From aa00138b34c8ce350e7754a8bab9028119bb02c8 Mon Sep 17 00:00:00 2001 From: Jose Luis Cercos Pita Date: Sun, 19 Feb 2017 20:13:03 +0100 Subject: [PATCH 052/254] Support core-only OpenGL contexts in the default build. This is a squashed commit of the following, as well as my own (rdb's) revisions: commit 80662759a18607743316f75ee6aa4a63c3f8d8e6 Author: Jose Luis Cercos Pita Date: Thu Dec 1 15:07:29 2016 +0100 Removed some useless fixed pipeline checks commit 563b5dbe93b451006ddbf3797aabdda7482ef3de Author: Jose Luis Cercos Pita Date: Thu Dec 1 14:19:21 2016 +0100 Improved the LUMINANCE check system commit 596036a8bb59d627f703bccfdc399dc31e1723a9 Author: Jose Luis Cercos Pita Date: Thu Dec 1 13:30:45 2016 +0100 Removed some useless fixed pipeline checks commit 0f7fa7cd33860c3cde1b4594731271170301b42d Author: Jose Luis Cercos Pita Date: Thu Dec 1 13:26:07 2016 +0100 Don't try to check if fixed pipeline is available before the context has been generated commit 56ed18e29dcb0a7cb0feccd0d50038416637427f Author: Jose Luis Cercos Pita Date: Thu Dec 1 13:14:49 2016 +0100 Assuming the fixed pipeline is available in GL 3.1 contexts commit 73075ead73be21c8ce9a468ed92eb2c8c7d548c4 Author: Jose Luis Cercos Pita Date: Fri Nov 4 12:59:45 2016 +0100 Fixed errors while quering for GL_TEXTURE_LUMINANCE_SIZE and GL_TEXTURE_INTENSITY_SIZE in GL >= 4.0 core profile contexts commit 3f799ed20be22f6f82de13445c5f9515a424ef9f Author: Jose Luis Cercos Pita Date: Fri Dec 16 10:01:03 2016 +0100 Added fixed functions pipeline support check at runtime Closes: 128 --- panda/src/display/graphicsStateGuardian.I | 8 + panda/src/display/graphicsStateGuardian.cxx | 3 + panda/src/display/graphicsStateGuardian.h | 3 + panda/src/glstuff/glCgShaderContext_src.cxx | 19 +- panda/src/glstuff/glGraphicsBuffer_src.cxx | 6 +- .../src/glstuff/glGraphicsStateGuardian_src.I | 29 +- .../glstuff/glGraphicsStateGuardian_src.cxx | 543 ++++++++++-------- .../src/glstuff/glGraphicsStateGuardian_src.h | 6 + 8 files changed, 383 insertions(+), 234 deletions(-) diff --git a/panda/src/display/graphicsStateGuardian.I b/panda/src/display/graphicsStateGuardian.I index 15f95a19f4..94188b85be 100644 --- a/panda/src/display/graphicsStateGuardian.I +++ b/panda/src/display/graphicsStateGuardian.I @@ -538,6 +538,14 @@ get_supports_depth_stencil() const { return _supports_depth_stencil; } +/** + * Returns true if this particular GSG supports luminance textures. + */ +INLINE bool GraphicsStateGuardian:: +get_supports_luminance_texture() const { + return _supports_luminance_texture; +} + /** * Returns true if this particular GSG supports the filter mode FT_shadow for * depth textures. diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 7f87e87d8e..5b46251ba8 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -253,6 +253,9 @@ GraphicsStateGuardian(CoordinateSystem internal_coordinate_system, _supports_geometry_instancing = false; _supports_indirect_draw = false; + // We are safe assuming it has luminance support + _supports_luminance_texture = true; + // Assume a maximum of 1 render target in absence of MRT. _max_color_targets = 1; _supports_dual_source_blending = false; diff --git a/panda/src/display/graphicsStateGuardian.h b/panda/src/display/graphicsStateGuardian.h index 81643a1f11..a5dbce4a11 100644 --- a/panda/src/display/graphicsStateGuardian.h +++ b/panda/src/display/graphicsStateGuardian.h @@ -154,6 +154,7 @@ PUBLISHED: INLINE bool get_supports_generate_mipmap() const; INLINE bool get_supports_depth_texture() const; INLINE bool get_supports_depth_stencil() const; + INLINE bool get_supports_luminance_texture() const; INLINE bool get_supports_shadow_filter() const; INLINE bool get_supports_sampler_objects() const; INLINE bool get_supports_basic_shaders() const; @@ -203,6 +204,7 @@ PUBLISHED: MAKE_PROPERTY(supports_generate_mipmap, get_supports_generate_mipmap); MAKE_PROPERTY(supports_depth_texture, get_supports_depth_texture); MAKE_PROPERTY(supports_depth_stencil, get_supports_depth_stencil); + MAKE_PROPERTY(supports_luminance_texture, get_supports_luminance_texture); MAKE_PROPERTY(supports_shadow_filter, get_supports_shadow_filter); MAKE_PROPERTY(supports_sampler_objects, get_supports_sampler_objects); MAKE_PROPERTY(supports_basic_shaders, get_supports_basic_shaders); @@ -597,6 +599,7 @@ protected: bool _supports_generate_mipmap; bool _supports_depth_texture; bool _supports_depth_stencil; + bool _supports_luminance_texture; bool _supports_shadow_filter; bool _supports_sampler_objects; bool _supports_basic_shaders; diff --git a/panda/src/glstuff/glCgShaderContext_src.cxx b/panda/src/glstuff/glCgShaderContext_src.cxx index c857948b97..8497c7de71 100644 --- a/panda/src/glstuff/glCgShaderContext_src.cxx +++ b/panda/src/glstuff/glCgShaderContext_src.cxx @@ -145,7 +145,7 @@ CLP(CgShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderConte if (cgGetParameterBaseResource(p) == CG_ATTR0) { // The Cg toolkit claims that it is bound to a generic vertex attribute. - if (_glsl_program != 0) { + if (_glgsg->has_fixed_function_pipeline() && _glsl_program != 0) { // This is where the Cg glslv compiler lies, making the stupid // assumption that we're using an NVIDIA card where generic attributes // are aliased with conventional vertex attributes. Instead, it @@ -246,7 +246,7 @@ CLP(CgShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderConte // A conventional texture coordinate set. loc = CA_texcoord + cgGetParameterResourceIndex(p); - } else { + } else if (_glgsg->has_fixed_function_pipeline()) { // Some other conventional vertex attribute. switch (res) { case CG_POSITION0: @@ -276,6 +276,14 @@ CLP(CgShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderConte GLCAT.error(false) << ".\n"; loc = CA_unknown; } + } else { + GLCAT.error() + << "Cg varying " << cgGetParameterName(p); + if (cgGetParameterSemantic(p)) { + GLCAT.error(false) << " : " << cgGetParameterSemantic(p); + } + GLCAT.error(false) << " is bound to a conventional vertex attribute, " + "but the compatibility profile is not enabled.\n"; } #ifndef NDEBUG @@ -916,8 +924,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { } else { // There is no vertex column with this name; disable the attribute // array. -#ifdef SUPPORT_FIXED_FUNCTION - if (p == 0) { + if (_glgsg->has_fixed_function_pipeline() && p == 0) { // NOTE: if we disable attribute 0 in compatibility profile, the // object will disappear. In GLSL we fix this by forcing the vertex // column to be at 0, but we don't have control over that with Cg. @@ -930,9 +937,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { _glgsg->_glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); } - } else -#endif // SUPPORT_FIXED_FUNCTION - if (p >= 0) { + } else if (p >= 0) { _glgsg->disable_vertex_attrib_array(p); if (p == _color_attrib_index) { diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index 3a73d175c4..706bb03049 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -1165,8 +1165,10 @@ attach_tex(int layer, int view, Texture *attach, GLenum attachpoint) { glgsg->apply_texture(gtc); #if !defined(OPENGLES) && defined(SUPPORT_FIXED_FUNCTION) - GLclampf priority = 1.0f; - glPrioritizeTextures(1, >c->_index, &priority); + if (glgsg->has_fixed_function_pipeline()) { + GLclampf priority = 1.0f; + glPrioritizeTextures(1, >c->_index, &priority); + } #endif #ifndef OPENGLES diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.I b/panda/src/glstuff/glGraphicsStateGuardian_src.I index 221aff21b9..5ce7902917 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.I +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.I @@ -130,6 +130,33 @@ get_gl_version_minor() const { return _gl_version_minor; } +/** + * Returns whether a core profile or a compatibility mode is considered. + */ +/*INLINE bool CLP(GraphicsStateGuardian):: +has_core_profile() const { + return _core_profile; +}*/ + +/** + * Returns whether the fixed function pipeline is supported. + */ +INLINE bool CLP(GraphicsStateGuardian):: +has_fixed_function_pipeline() const { +#ifndef SUPPORT_FIXED_FUNCTION + return false; +#elif defined(OPENGLES_1) + return true; +#elif defined(OPENGLES) + return false; +#else + // Otherwise, we can just check whether we are using a core profile or a + // compatibility mode. The variable _core_profile is already taking into + // account if a GL < 3.2 is considered (becoming false) + return !_core_profile; +#endif +} + /** * Calls glFinish() if the config variable gl-finish is set True. */ @@ -363,7 +390,7 @@ enable_line_smooth(bool val) { INLINE void CLP(GraphicsStateGuardian):: enable_point_smooth(bool val) { #ifdef SUPPORT_FIXED_FUNCTION - if (_point_smooth_enabled != val) { + if (has_fixed_function_pipeline() && _point_smooth_enabled != val) { _state_mask.clear_bit(TransparencyAttrib::get_class_slot()); _point_smooth_enabled = val; if (val) { diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 98c21610c5..c83c9e52c0 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -369,6 +369,12 @@ CLP(GraphicsStateGuardian)(GraphicsEngine *engine, GraphicsPipe *pipe) : _gl_shadlang_ver_major = 0; _gl_shadlang_ver_minor = 0; + // Let's say we have a core profile, to be checked later (Otherwise, if we are + // wrong the user may ask for some non-available functions) +#ifndef OPENGLES + _core_profile = true; +#endif + // Hack. Turn on the flag that we turned off at a higher level, since we // know this works properly in OpenGL, and we want the performance benefit // it gives us. @@ -547,6 +553,7 @@ reset() { GLCAT.debug() << "Using compatibility profile\n"; } } + _core_profile = core_profile; #elif defined(OPENGLES_1) static const bool core_profile = false; #else @@ -723,7 +730,7 @@ reset() { #endif #if !defined(OPENGLES) && defined(SUPPORT_FIXED_FUNCTION) - if (is_at_least_gl_version(1, 4)) { + if (has_fixed_function_pipeline() && is_at_least_gl_version(1, 4)) { _glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC) get_extension_func("glSecondaryColorPointer"); @@ -1105,12 +1112,13 @@ reset() { _supports_rescale_normal = true; #else _supports_rescale_normal = - !core_profile && gl_support_rescale_normal && + has_fixed_function_pipeline() && gl_support_rescale_normal && (is_at_least_gl_version(1, 2) || has_extension("GL_EXT_rescale_normal")); #endif #ifndef OPENGLES - _use_separate_specular_color = gl_separate_specular_color && + _use_separate_specular_color = + has_fixed_function_pipeline() && gl_separate_specular_color && (is_at_least_gl_version(1, 2) || has_extension("GL_EXT_separate_specular_color")); #endif #endif // SUPPORT_FIXED_FUNCTION @@ -1162,8 +1170,10 @@ reset() { get_extension_func("glActiveTexture"); #ifdef SUPPORT_FIXED_FUNCTION - _glClientActiveTexture = (PFNGLACTIVETEXTUREPROC) - get_extension_func("glClientActiveTexture"); + if (has_fixed_function_pipeline()) { + _glClientActiveTexture = (PFNGLACTIVETEXTUREPROC) + get_extension_func("glClientActiveTexture"); + } #endif #ifdef SUPPORT_IMMEDIATE_MODE @@ -1192,8 +1202,10 @@ reset() { get_extension_func("glActiveTextureARB"); #ifdef SUPPORT_FIXED_FUNCTION - _glClientActiveTexture = (PFNGLACTIVETEXTUREPROC) - get_extension_func("glClientActiveTextureARB"); + if (has_fixed_function_pipeline()) { + _glClientActiveTexture = (PFNGLACTIVETEXTUREPROC) + get_extension_func("glClientActiveTextureARB"); + } #endif #ifdef SUPPORT_IMMEDIATE_MODE @@ -1221,7 +1233,7 @@ reset() { if (supports_multitexture) { if (_glActiveTexture == NULL #ifdef SUPPORT_FIXED_FUNCTION - || _glClientActiveTexture == NULL + || (has_fixed_function_pipeline() && _glClientActiveTexture == NULL) #endif #ifdef SUPPORT_IMMEDIATE_MODE || GLf(_glMultiTexCoord1) == NULL || GLf(_glMultiTexCoord2) == NULL @@ -1240,7 +1252,7 @@ reset() { } #ifdef SUPPORT_FIXED_FUNCTION - if (!supports_multitexture || core_profile) { + if (!supports_multitexture || !has_fixed_function_pipeline()) { _glClientActiveTexture = null_glActiveTexture; } #endif @@ -1251,6 +1263,7 @@ reset() { _supports_depth_stencil = has_extension("GL_OES_packed_depth_stencil"); _supports_depth24 = has_extension("GL_OES_depth24"); _supports_depth32 = has_extension("GL_OES_depth32"); + _supports_luminance_texture = true; #elif defined(OPENGLES) if (is_at_least_gles_version(3, 0)) { @@ -1271,12 +1284,16 @@ reset() { _supports_depth24 = has_extension("GL_OES_depth24"); _supports_depth32 = has_extension("GL_OES_depth32"); } + _supports_luminance_texture = true; #else _supports_depth_texture = (is_at_least_gl_version(1, 4) || has_extension("GL_ARB_depth_texture")); _supports_depth_stencil = (is_at_least_gl_version(3, 0) || has_extension("GL_ARB_framebuffer_object") || has_extension("GL_EXT_packed_depth_stencil")); + + // OpenGL 3 deprecates luminance, luminance-alpha and alpha textures. + _supports_luminance_texture = !core_profile; #endif #ifdef OPENGLES_2 @@ -1300,12 +1317,11 @@ reset() { _supports_shadow_filter = false; }*/ -#ifndef SUPPORT_FIXED_FUNCTION _supports_texture_combine = false; _supports_texture_saved_result = false; _supports_texture_dot3 = false; -#else - if (!core_profile) { +#ifdef SUPPORT_FIXED_FUNCTION + if (has_fixed_function_pipeline()) { _supports_texture_combine = is_at_least_gl_version(1, 3) || is_at_least_gles_version(1, 1) || @@ -1786,12 +1802,8 @@ reset() { // We need to have a default shader to apply in case something didn't happen // to have a shader applied, or if it failed to compile. This default // shader just outputs a red color, indicating that something went wrong. -#ifndef SUPPORT_FIXED_FUNCTION - if (_default_shader == NULL) { - _default_shader = Shader::make(Shader::SL_GLSL, default_vshader, default_fshader); - } -#elif !defined(OPENGLES) - if (_default_shader == NULL && core_profile) { +#ifndef OPENGLES_1 + if (_default_shader == NULL && !has_fixed_function_pipeline()) { _default_shader = Shader::make(Shader::SL_GLSL, default_vshader, default_fshader); } #endif @@ -2943,7 +2955,7 @@ reset() { glDisable(GL_LINE_SMOOTH); #endif #ifdef SUPPORT_FIXED_FUNCTION - if (!core_profile) { + if (has_fixed_function_pipeline()) { glDisable(GL_POINT_SMOOTH); } #endif @@ -2995,7 +3007,7 @@ reset() { // Count the max number of lights _max_lights = 0; #ifdef SUPPORT_FIXED_FUNCTION - if (!core_profile) { + if (has_fixed_function_pipeline()) { GLint max_lights = 0; glGetIntegerv(GL_MAX_LIGHTS, &max_lights); _max_lights = max_lights; @@ -3010,7 +3022,7 @@ reset() { // Count the max number of clipping planes _max_clip_planes = 0; #ifdef SUPPORT_FIXED_FUNCTION - if (!core_profile) { + if (has_fixed_function_pipeline()) { GLint max_clip_planes = 0; glGetIntegerv(GL_MAX_CLIP_PLANES, &max_clip_planes); _max_clip_planes = max_clip_planes; @@ -3024,7 +3036,7 @@ reset() { _max_texture_stages = 1; #ifdef SUPPORT_FIXED_FUNCTION - if (supports_multitexture && !core_profile) { + if (supports_multitexture && has_fixed_function_pipeline()) { GLint max_texture_stages = 0; glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_texture_stages); _max_texture_stages = max_texture_stages; @@ -3057,7 +3069,7 @@ reset() { report_my_gl_errors(); #ifdef SUPPORT_FIXED_FUNCTION - if (!core_profile) { + if (has_fixed_function_pipeline()) { if (gl_cheap_textures) { GLCAT.info() << "Setting glHint() for fastest textures.\n"; @@ -3070,7 +3082,7 @@ reset() { #endif #ifdef SUPPORT_FIXED_FUNCTION - if (!core_profile) { + if (has_fixed_function_pipeline()) { GLint num_red_bits = 0; glGetIntegerv(GL_RED_BITS, &num_red_bits); if (num_red_bits < 8) { @@ -3538,7 +3550,9 @@ prepare_display_region(DisplayRegionPipelineReader *dr) { void CLP(GraphicsStateGuardian):: clear_before_callback() { #ifdef SUPPORT_FIXED_FUNCTION - disable_standard_vertex_arrays(); + if (has_fixed_function_pipeline()) { + disable_standard_vertex_arrays(); + } #endif #ifndef OPENGLES_1 if (_vertex_array_shader_context != 0) { @@ -3620,16 +3634,18 @@ calc_projection_mat(const Lens *lens) { bool CLP(GraphicsStateGuardian):: prepare_lens() { #ifdef SUPPORT_FIXED_FUNCTION - if (GLCAT.is_spam()) { - GLCAT.spam() - << "glMatrixMode(GL_PROJECTION): " << _projection_mat->get_mat() << endl; + if (has_fixed_function_pipeline()) { + if (GLCAT.is_spam()) { + GLCAT.spam() + << "glMatrixMode(GL_PROJECTION): " << _projection_mat->get_mat() << endl; + } + + glMatrixMode(GL_PROJECTION); + call_glLoadMatrix(_projection_mat->get_mat()); + report_my_gl_errors(); + + do_point_size(); } - - glMatrixMode(GL_PROJECTION); - call_glLoadMatrix(_projection_mat->get_mat()); - report_my_gl_errors(); - - do_point_size(); #endif #ifndef OPENGLES_1 @@ -3762,7 +3778,7 @@ end_frame(Thread *current_thread) { // will just mean that we'll count everything as resident until the user // connects PStats, at which point it will then correct the assessment. No // harm done. - if (PStatClient::is_connected()) { + if (has_fixed_function_pipeline() && PStatClient::is_connected()) { check_nonresident_texture(_prepared_objects->_texture_residency.get_inactive_resident()); check_nonresident_texture(_prepared_objects->_texture_residency.get_active_resident()); @@ -3813,7 +3829,7 @@ end_frame(Thread *current_thread) { // Now is a good time to delete any pending display lists. #ifndef OPENGLES #ifdef SUPPORT_FIXED_FUNCTION - if (display_lists) { + if (has_fixed_function_pipeline() && display_lists) { LightMutexHolder holder(_lock); if (!_deleted_display_lists.empty()) { DeletedNames::iterator ddli; @@ -3922,11 +3938,13 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, } #endif // NDEBUG -#ifndef SUPPORT_FIXED_FUNCTION - // We can't draw without a shader bound in OpenGL ES 2. This shouldn't - // happen anyway unless the default shader failed to compile somehow. - if (_current_shader_context == NULL) { - return false; +#ifndef OPENGLES_1 + if (!has_fixed_function_pipeline()) { + // We can't draw without a shader bound in OpenGL ES 2. This shouldn't + // happen anyway unless the default shader failed to compile somehow. + if (_current_shader_context == NULL) { + return false; + } } #endif @@ -3967,7 +3985,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, } #ifdef SUPPORT_FIXED_FUNCTION - if (_data_reader->is_vertex_transformed()) { + if (has_fixed_function_pipeline() && _data_reader->is_vertex_transformed()) { // If the vertex data claims to be already transformed into clip // coordinates, wipe out the current projection and modelview matrix (so // we don't attempt to transform it again). @@ -3981,7 +3999,8 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, #endif #if !defined(OPENGLES) && defined(SUPPORT_FIXED_FUNCTION) // Display lists not supported by OpenGL ES. - if (/*geom_reader->get_usage_hint() == Geom::UH_static &&*/ + if (has_fixed_function_pipeline() && + /*geom_reader->get_usage_hint() == Geom::UH_static &&*/ _data_reader->get_usage_hint() == Geom::UH_static && display_lists) { // If the geom claims to be totally static, try to build it into a display @@ -4072,33 +4091,35 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, _vertex_array_shader_context->disable_shader_vertex_arrays(); } #ifdef SUPPORT_FIXED_FUNCTION - if (!update_standard_vertex_arrays(force)) { + if (has_fixed_function_pipeline() && !update_standard_vertex_arrays(force)) { return false; } #endif } else { #ifdef SUPPORT_FIXED_FUNCTION - // Shader. - if (_vertex_array_shader_context == 0 || - _vertex_array_shader_context->uses_standard_vertex_arrays()) { - // Previous shader used standard arrays. - if (_current_shader_context->uses_standard_vertex_arrays()) { - // So does the current, so update them. - if (!update_standard_vertex_arrays(force)) { - return false; + if (has_fixed_function_pipeline()) { + // Shader. + if (_vertex_array_shader_context == 0 || + _vertex_array_shader_context->uses_standard_vertex_arrays()) { + // Previous shader used standard arrays. + if (_current_shader_context->uses_standard_vertex_arrays()) { + // So does the current, so update them. + if (!update_standard_vertex_arrays(force)) { + return false; + } + } else { + // The current shader does not, so disable them entirely. + disable_standard_vertex_arrays(); } - } else { - // The current shader does not, so disable them entirely. - disable_standard_vertex_arrays(); } - } #ifdef HAVE_CG - else if (_vertex_array_shader_context->is_of_type(CLP(CgShaderContext)::get_class_type())) { - // The previous shader was a Cg shader, which can leave a messy - // situation. - _vertex_array_shader_context->disable_shader_vertex_arrays(); - } + else if (_vertex_array_shader_context->is_of_type(CLP(CgShaderContext)::get_class_type())) { + // The previous shader was a Cg shader, which can leave a messy + // situation. + _vertex_array_shader_context->disable_shader_vertex_arrays(); + } #endif + } #endif // SUPPORT_FIXED_FUNCTION // Now update the vertex arrays for the current shader. if (!_current_shader_context-> @@ -4334,7 +4355,9 @@ unbind_buffers() { #endif #ifdef SUPPORT_FIXED_FUNCTION - disable_standard_vertex_arrays(); + if (has_fixed_function_pipeline()) { + disable_standard_vertex_arrays(); + } #endif } @@ -5040,7 +5063,7 @@ draw_points(const GeomPrimitivePipelineReader *reader, bool force) { void CLP(GraphicsStateGuardian):: end_draw_primitives() { #if !defined(OPENGLES) && defined(SUPPORT_FIXED_FUNCTION) // Display lists not supported by OpenGL ES. - if (_geom_display_list != 0) { + if (has_fixed_function_pipeline() && _geom_display_list != 0) { // If we were building a display list, close it now. glEndList(); _load_display_list_pcollector.stop(); @@ -5054,12 +5077,12 @@ end_draw_primitives() { #endif #ifdef SUPPORT_FIXED_FUNCTION - if (_transform_stale) { + if (has_fixed_function_pipeline() && _transform_stale) { glMatrixMode(GL_MODELVIEW); call_glLoadMatrix(_internal_transform->get_mat()); } - if (_data_reader->is_vertex_transformed()) { + if (has_fixed_function_pipeline() && _data_reader->is_vertex_transformed()) { // Restore the matrices that we pushed above. glMatrixMode(GL_PROJECTION); glPopMatrix(); @@ -5436,7 +5459,9 @@ prepare_geom(Geom *geom) { void CLP(GraphicsStateGuardian):: release_geom(GeomContext *gc) { CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc); - ggc->release_display_lists(); + if (has_fixed_function_pipeline()) { + ggc->release_display_lists(); + } report_my_gl_errors(); delete ggc; @@ -6594,17 +6619,19 @@ apply_fog(Fog *fog) { void CLP(GraphicsStateGuardian):: do_issue_transform() { #ifdef SUPPORT_FIXED_FUNCTION - // OpenGL ES 2 does not support glLoadMatrix. + if (has_fixed_function_pipeline()) { + // OpenGL ES 2 does not support glLoadMatrix. - const TransformState *transform = _internal_transform; - if (GLCAT.is_spam()) { - GLCAT.spam() - << "glLoadMatrix(GL_MODELVIEW): " << transform->get_mat() << endl; + const TransformState *transform = _internal_transform; + if (GLCAT.is_spam()) { + GLCAT.spam() + << "glLoadMatrix(GL_MODELVIEW): " << transform->get_mat() << endl; + } + + DO_PSTATS_STUFF(_transform_state_pcollector.add_level(1)); + glMatrixMode(GL_MODELVIEW); + call_glLoadMatrix(transform->get_mat()); } - - DO_PSTATS_STUFF(_transform_state_pcollector.add_level(1)); - glMatrixMode(GL_MODELVIEW); - call_glLoadMatrix(transform->get_mat()); #endif _transform_stale = false; @@ -6643,13 +6670,11 @@ do_issue_shader() { ShaderContext *context = 0; Shader *shader = (Shader *)_target_shader->get_shader(); -#ifndef SUPPORT_FIXED_FUNCTION // If we don't have a shader, apply the default shader. - if (!shader) { + if (!has_fixed_function_pipeline() && !shader) { shader = _default_shader; nassertv(shader != NULL); } -#endif if (shader) { if (_current_shader != shader) { @@ -6659,9 +6684,9 @@ do_issue_shader() { } } -#ifndef SUPPORT_FIXED_FUNCTION // If it failed, try applying the default shader. - if (shader != _default_shader && (context == 0 || !context->valid())) { + if (_default_shader != nullptr && shader != _default_shader && + (context == 0 || !context->valid())) { shader = _default_shader; nassertv(shader != NULL); if (_current_shader != shader) { @@ -6670,7 +6695,6 @@ do_issue_shader() { context = _current_shader_context; } } -#endif if (context == 0 || !context->valid()) { if (_current_shader_context != 0) { @@ -6762,7 +6786,9 @@ do_issue_render_mode() { report_my_gl_errors(); #ifdef SUPPORT_FIXED_FUNCTION - do_point_size(); + if (has_fixed_function_pipeline()) { + do_point_size(); + } #endif } @@ -7372,6 +7398,8 @@ do_issue_blending() { */ void CLP(GraphicsStateGuardian):: bind_light(PointLight *light_obj, const NodePath &light, int light_id) { + nassertv(has_fixed_function_pipeline()); + // static PStatCollector // _draw_set_state_light_bind_point_pcollector("Draw:Set // State:Light:Bind:Point"); PStatGPUTimer timer(this, @@ -7416,6 +7444,8 @@ bind_light(PointLight *light_obj, const NodePath &light, int light_id) { */ void CLP(GraphicsStateGuardian):: bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id) { + nassertv(has_fixed_function_pipeline()); + // static PStatCollector // _draw_set_state_light_bind_directional_pcollector("Draw:Set // State:Light:Bind:Directional"); PStatGPUTimer timer(this, @@ -7467,6 +7497,8 @@ bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id) { */ void CLP(GraphicsStateGuardian):: bind_light(Spotlight *light_obj, const NodePath &light, int light_id) { + nassertv(has_fixed_function_pipeline()); + // static PStatCollector // _draw_set_state_light_bind_spotlight_pcollector("Draw:Set // State:Light:Bind:Spotlight"); PStatGPUTimer timer(this, @@ -8701,10 +8733,10 @@ get_external_image_format(Texture *tex) const { #endif case Texture::F_alpha: -#if defined(SUPPORT_FIXED_FUNCTION) || defined(OPENGLES) +#ifdef OPENGLES return GL_ALPHA; #else - return GL_RED; + return _supports_luminance_texture ? GL_ALPHA : GL_RED; #endif #ifndef OPENGLES_1 @@ -8744,18 +8776,18 @@ get_external_image_format(Texture *tex) const { case Texture::F_luminance: case Texture::F_sluminance: -#if defined(SUPPORT_FIXED_FUNCTION) || defined(OPENGLES) +#ifdef OPENGLES return GL_LUMINANCE; #else - return GL_RED; + return _supports_luminance_texture ? GL_LUMINANCE : GL_RED; #endif case Texture::F_luminance_alphamask: case Texture::F_luminance_alpha: case Texture::F_sluminance_alpha: -#if defined(SUPPORT_FIXED_FUNCTION) || defined(OPENGLES) +#ifdef OPENGLES return GL_LUMINANCE_ALPHA; #else - return GL_RG; + return _supports_luminance_texture ? GL_LUMINANCE_ALPHA : GL_RG; #endif #ifndef OPENGLES_1 @@ -9402,42 +9434,76 @@ get_internal_image_format(Texture *tex, bool force_sized) const { #endif case Texture::F_alpha: -#if defined(SUPPORT_FIXED_FUNCTION) || defined(OPENGLES) +#ifdef OPENGLES return force_sized ? GL_ALPHA8 : GL_ALPHA; #else - return force_sized ? GL_R8 : GL_RED; + if (_supports_luminance_texture) { + return force_sized ? GL_ALPHA8 : GL_ALPHA; + } else { + return force_sized ? GL_R8 : GL_RED; + } #endif case Texture::F_luminance: -#if defined(SUPPORT_FIXED_FUNCTION) || defined(OPENGLES) -#ifndef OPENGLES - if (tex->get_component_type() == Texture::T_float) { - return GL_LUMINANCE16F_ARB; - } else if (tex->get_component_type() == Texture::T_short) { - return GL_LUMINANCE16_SNORM; - } else if (tex->get_component_type() == Texture::T_unsigned_short) { - return GL_LUMINANCE16; - } else -#endif // OPENGLES - { - return force_sized ? GL_LUMINANCE8 : GL_LUMINANCE; - } +#ifdef OPENGLES + return force_sized ? GL_LUMINANCE8 : GL_LUMINANCE; #else - return force_sized ? GL_R8 : GL_RED; + if (_supports_luminance_texture) { + switch (tex->get_component_type()) { + case Texture::T_float: + case Texture::T_half_float: + return GL_LUMINANCE16F_ARB; + case Texture::T_short: + return GL_LUMINANCE16_SNORM; + case Texture::T_unsigned_short: + return GL_LUMINANCE16; + default: + return force_sized ? GL_LUMINANCE8 : GL_LUMINANCE; + } + } else { + switch (tex->get_component_type()) { + case Texture::T_float: + case Texture::T_half_float: + return GL_R16F; + case Texture::T_short: + return GL_R16_SNORM; + case Texture::T_unsigned_short: + return GL_R16; + default: + return force_sized ? GL_R8 : GL_RED; + } + } #endif case Texture::F_luminance_alpha: case Texture::F_luminance_alphamask: -#if defined(SUPPORT_FIXED_FUNCTION) || defined(OPENGLES) -#ifndef OPENGLES - if (tex->get_component_type() == Texture::T_float || tex->get_component_type() == Texture::T_unsigned_short) { - return GL_LUMINANCE_ALPHA16F_ARB; - } else -#endif // OPENGLES - { - return force_sized ? GL_LUMINANCE8_ALPHA8 : GL_LUMINANCE_ALPHA; - } +#ifdef OPENGLES + return force_sized ? GL_LUMINANCE8_ALPHA8 : GL_LUMINANCE_ALPHA; #else - return force_sized ? GL_RG8 : GL_RG; + if (_supports_luminance_texture) { + switch (tex->get_component_type()) { + case Texture::T_float: + case Texture::T_half_float: + return GL_LUMINANCE_ALPHA16F_ARB; + case Texture::T_short: + return GL_LUMINANCE16_SNORM; + case Texture::T_unsigned_short: + return GL_LUMINANCE16_ALPHA16; + default: + return force_sized ? GL_LUMINANCE8_ALPHA8 : GL_LUMINANCE_ALPHA; + } + } else { + switch (tex->get_component_type()) { + case Texture::T_float: + case Texture::T_half_float: + return GL_RG16F; + case Texture::T_short: + return GL_RG16_SNORM; + case Texture::T_unsigned_short: + return GL_RG16; + default: + return force_sized ? GL_RG8 : GL_RG; + } + } #endif #ifndef OPENGLES_1 @@ -10019,6 +10085,8 @@ reissue_transforms() { */ void CLP(GraphicsStateGuardian):: enable_lighting(bool enable) { + nassertv(has_fixed_function_pipeline()); + // static PStatCollector // _draw_set_state_light_enable_lighting_pcollector("Draw:Set // State:Light:Enable lighting"); PStatGPUTimer timer(this, @@ -10040,6 +10108,8 @@ enable_lighting(bool enable) { */ void CLP(GraphicsStateGuardian):: set_ambient_light(const LColor &color) { + nassertv(has_fixed_function_pipeline()); + // static PStatCollector _draw_set_state_light_ambient_pcollector("Draw:Set // State:Light:Ambient"); PStatGPUTimer timer(this, // _draw_set_state_light_ambient_pcollector); @@ -10061,6 +10131,8 @@ set_ambient_light(const LColor &color) { */ void CLP(GraphicsStateGuardian):: enable_light(int light_id, bool enable) { + nassertv(has_fixed_function_pipeline()); + // static PStatCollector // _draw_set_state_light_enable_light_pcollector("Draw:Set // State:Light:Enable light"); PStatGPUTimer timer(this, @@ -10085,6 +10157,8 @@ enable_light(int light_id, bool enable) { */ void CLP(GraphicsStateGuardian):: begin_bind_lights() { + nassertv(has_fixed_function_pipeline()); + // static PStatCollector // _draw_set_state_light_begin_bind_pcollector("Draw:Set State:Light:Begin // bind"); PStatGPUTimer timer(this, @@ -10115,6 +10189,8 @@ begin_bind_lights() { */ void CLP(GraphicsStateGuardian):: end_bind_lights() { + nassertv(has_fixed_function_pipeline()); + // static PStatCollector _draw_set_state_light_end_bind_pcollector("Draw:Set // State:Light:End bind"); PStatGPUTimer timer(this, // _draw_set_state_light_end_bind_pcollector); @@ -10132,6 +10208,8 @@ end_bind_lights() { */ void CLP(GraphicsStateGuardian):: enable_clip_plane(int plane_id, bool enable) { + nassertv(has_fixed_function_pipeline()); + if (enable) { glEnable(get_clip_plane_id(plane_id)); } else { @@ -10151,6 +10229,8 @@ enable_clip_plane(int plane_id, bool enable) { */ void CLP(GraphicsStateGuardian):: begin_bind_clip_planes() { + nassertv(has_fixed_function_pipeline()); + // We need to temporarily load a new matrix so we can define the clip_plane // in a known coordinate system. We pick the transform of the root. // (Alternatively, we could leave the current transform where it is and @@ -10175,6 +10255,8 @@ begin_bind_clip_planes() { */ void CLP(GraphicsStateGuardian):: bind_clip_plane(const NodePath &plane, int plane_id) { + nassertv(has_fixed_function_pipeline()); + GLenum id = get_clip_plane_id(plane_id); CPT(TransformState) transform = plane.get_transform(_scene_setup->get_scene_root().get_parent()); @@ -10205,6 +10287,8 @@ bind_clip_plane(const NodePath &plane, int plane_id) { */ void CLP(GraphicsStateGuardian):: end_bind_clip_planes() { + nassertv(has_fixed_function_pipeline()); + glMatrixMode(GL_MODELVIEW); glPopMatrix(); } @@ -10259,12 +10343,10 @@ set_state_and_transform(const RenderState *target, _state_shader = _target_shader; _state_mask.clear_bit(TextureAttrib::get_class_slot()); } -#ifndef SUPPORT_FIXED_FUNCTION - else if (_current_shader == NULL) { // In the case of OpenGL ES 2.x, we need to glUseShader before we draw anything. + else if (!has_fixed_function_pipeline() && _current_shader == NULL) { // In the case of OpenGL ES 2.x, we need to glUseShader before we draw anything. do_issue_shader(); _state_mask.clear_bit(TextureAttrib::get_class_slot()); } -#endif // Update all of the state that is bound to the shader program. if (_current_shader_context != NULL) { @@ -10273,17 +10355,19 @@ set_state_and_transform(const RenderState *target, #endif #ifdef SUPPORT_FIXED_FUNCTION - int alpha_test_slot = AlphaTestAttrib::get_class_slot(); - if (_target_rs->get_attrib(alpha_test_slot) != _state_rs->get_attrib(alpha_test_slot) || - !_state_mask.get_bit(alpha_test_slot) + if (has_fixed_function_pipeline()) { + int alpha_test_slot = AlphaTestAttrib::get_class_slot(); + if (_target_rs->get_attrib(alpha_test_slot) != _state_rs->get_attrib(alpha_test_slot) || + !_state_mask.get_bit(alpha_test_slot) #ifndef OPENGLES_1 - || (_target_shader->get_flag(ShaderAttrib::F_subsume_alpha_test) != - _state_shader->get_flag(ShaderAttrib::F_subsume_alpha_test)) + || (_target_shader->get_flag(ShaderAttrib::F_subsume_alpha_test) != + _state_shader->get_flag(ShaderAttrib::F_subsume_alpha_test)) #endif - ) { - // PStatGPUTimer timer(this, _draw_set_state_alpha_test_pcollector); - do_issue_alpha_test(); - _state_mask.set_bit(alpha_test_slot); + ) { + // PStatGPUTimer timer(this, _draw_set_state_alpha_test_pcollector); + do_issue_alpha_test(); + _state_mask.set_bit(alpha_test_slot); + } } #endif @@ -10357,22 +10441,22 @@ set_state_and_transform(const RenderState *target, } #ifdef SUPPORT_FIXED_FUNCTION - int rescale_normal_slot = RescaleNormalAttrib::get_class_slot(); - if (_target_rs->get_attrib(rescale_normal_slot) != _state_rs->get_attrib(rescale_normal_slot) || - !_state_mask.get_bit(rescale_normal_slot)) { - // PStatGPUTimer timer(this, _draw_set_state_rescale_normal_pcollector); - do_issue_rescale_normal(); - _state_mask.set_bit(rescale_normal_slot); - } -#endif + if (has_fixed_function_pipeline()) { + int rescale_normal_slot = RescaleNormalAttrib::get_class_slot(); + if (_target_rs->get_attrib(rescale_normal_slot) != _state_rs->get_attrib(rescale_normal_slot) || + !_state_mask.get_bit(rescale_normal_slot)) { + // PStatGPUTimer timer(this, _draw_set_state_rescale_normal_pcollector); + do_issue_rescale_normal(); + _state_mask.set_bit(rescale_normal_slot); + } -#ifdef SUPPORT_FIXED_FUNCTION - int shade_model_slot = ShadeModelAttrib::get_class_slot(); - if (_target_rs->get_attrib(shade_model_slot) != _state_rs->get_attrib(shade_model_slot) || - !_state_mask.get_bit(shade_model_slot)) { - // PStatGPUTimer timer(this, _draw_set_state_shade_model_pcollector); - do_issue_shade_model(); - _state_mask.set_bit(shade_model_slot); + int shade_model_slot = ShadeModelAttrib::get_class_slot(); + if (_target_rs->get_attrib(shade_model_slot) != _state_rs->get_attrib(shade_model_slot) || + !_state_mask.get_bit(shade_model_slot)) { + // PStatGPUTimer timer(this, _draw_set_state_shade_model_pcollector); + do_issue_shade_model(); + _state_mask.set_bit(shade_model_slot); + } } #endif @@ -10444,7 +10528,9 @@ set_state_and_transform(const RenderState *target, !_state_mask.get_bit(tex_matrix_slot)) { // PStatGPUTimer timer(this, _draw_set_state_tex_matrix_pcollector); #ifdef SUPPORT_FIXED_FUNCTION - do_issue_tex_matrix(); + if (has_fixed_function_pipeline()) { + do_issue_tex_matrix(); + } #endif _state_mask.set_bit(tex_matrix_slot); #ifndef OPENGLES_1 @@ -10455,35 +10541,41 @@ set_state_and_transform(const RenderState *target, } #ifdef SUPPORT_FIXED_FUNCTION - int tex_gen_slot = TexGenAttrib::get_class_slot(); - if (_target_tex_gen != _state_tex_gen || - !_state_mask.get_bit(tex_gen_slot)) { - // PStatGPUTimer timer(this, _draw_set_state_tex_gen_pcollector); - do_issue_tex_gen(); - _state_tex_gen = _target_tex_gen; - _state_mask.set_bit(tex_gen_slot); - } -#endif + if (has_fixed_function_pipeline()) { + int tex_gen_slot = TexGenAttrib::get_class_slot(); + if (_target_tex_gen != _state_tex_gen || + !_state_mask.get_bit(tex_gen_slot)) { + // PStatGPUTimer timer(this, _draw_set_state_tex_gen_pcollector); + do_issue_tex_gen(); + _state_tex_gen = _target_tex_gen; + _state_mask.set_bit(tex_gen_slot); + } - int material_slot = MaterialAttrib::get_class_slot(); - if (_target_rs->get_attrib(material_slot) != _state_rs->get_attrib(material_slot) || - !_state_mask.get_bit(material_slot)) { - // PStatGPUTimer timer(this, _draw_set_state_material_pcollector); -#ifdef SUPPORT_FIXED_FUNCTION - do_issue_material(); -#endif - _state_mask.set_bit(material_slot); - } + int material_slot = MaterialAttrib::get_class_slot(); + if (_target_rs->get_attrib(material_slot) != _state_rs->get_attrib(material_slot) || + !_state_mask.get_bit(material_slot)) { + // PStatGPUTimer timer(this, _draw_set_state_material_pcollector); + do_issue_material(); + _state_mask.set_bit(material_slot); + } - int light_slot = LightAttrib::get_class_slot(); - if (_target_rs->get_attrib(light_slot) != _state_rs->get_attrib(light_slot) || - !_state_mask.get_bit(light_slot)) { - // PStatGPUTimer timer(this, _draw_set_state_light_pcollector); -#ifdef SUPPORT_FIXED_FUNCTION - do_issue_light(); -#endif - _state_mask.set_bit(light_slot); + int light_slot = LightAttrib::get_class_slot(); + if (_target_rs->get_attrib(light_slot) != _state_rs->get_attrib(light_slot) || + !_state_mask.get_bit(light_slot)) { + // PStatGPUTimer timer(this, _draw_set_state_light_pcollector); + do_issue_light(); + _state_mask.set_bit(light_slot); + } + + int fog_slot = FogAttrib::get_class_slot(); + if (_target_rs->get_attrib(fog_slot) != _state_rs->get_attrib(fog_slot) || + !_state_mask.get_bit(fog_slot)) { + // PStatGPUTimer timer(this, _draw_set_state_fog_pcollector); + do_issue_fog(); + _state_mask.set_bit(fog_slot); + } } +#endif int stencil_slot = StencilAttrib::get_class_slot(); if (_target_rs->get_attrib(stencil_slot) != _state_rs->get_attrib(stencil_slot) || @@ -10493,16 +10585,6 @@ set_state_and_transform(const RenderState *target, _state_mask.set_bit(stencil_slot); } - int fog_slot = FogAttrib::get_class_slot(); - if (_target_rs->get_attrib(fog_slot) != _state_rs->get_attrib(fog_slot) || - !_state_mask.get_bit(fog_slot)) { - // PStatGPUTimer timer(this, _draw_set_state_fog_pcollector); -#ifdef SUPPORT_FIXED_FUNCTION - do_issue_fog(); -#endif - _state_mask.set_bit(fog_slot); - } - int scissor_slot = ScissorAttrib::get_class_slot(); if (_target_rs->get_attrib(scissor_slot) != _state_rs->get_attrib(scissor_slot) || !_state_mask.get_bit(scissor_slot)) { @@ -10546,12 +10628,16 @@ do_issue_texture() { _texture_binding_shader_context->disable_shader_texture_bindings(); } #ifdef SUPPORT_FIXED_FUNCTION - update_standard_texture_bindings(); + if (has_fixed_function_pipeline()) { + update_standard_texture_bindings(); + } #endif } else { if (_texture_binding_shader_context == 0) { #ifdef SUPPORT_FIXED_FUNCTION - disable_standard_texture_bindings(); + if (has_fixed_function_pipeline()) { + disable_standard_texture_bindings(); + } #endif _current_shader_context->update_shader_texture_bindings(NULL); } else { @@ -10881,20 +10967,22 @@ update_show_usage_texture_bindings(int show_stage_index) { } #ifdef SUPPORT_FIXED_FUNCTION - // Disable all texture stages. - for (i = 0; i < _num_active_texture_stages; i++) { - set_active_texture_stage(i); + if (has_fixed_function_pipeline()) { + // Disable all texture stages. + for (i = 0; i < _num_active_texture_stages; i++) { + set_active_texture_stage(i); #ifndef OPENGLES - glDisable(GL_TEXTURE_1D); + glDisable(GL_TEXTURE_1D); #endif // OPENGLES - glDisable(GL_TEXTURE_2D); - if (_supports_3d_texture) { + glDisable(GL_TEXTURE_2D); + if (_supports_3d_texture) { #ifndef OPENGLES_1 - glDisable(GL_TEXTURE_3D); + glDisable(GL_TEXTURE_3D); #endif // OPENGLES_1 - } - if (_supports_cube_map) { - glDisable(GL_TEXTURE_CUBE_MAP); + } + if (_supports_cube_map) { + glDisable(GL_TEXTURE_CUBE_MAP); + } } } #endif @@ -10917,7 +11005,9 @@ update_show_usage_texture_bindings(int show_stage_index) { // Choose the corresponding usage texture and apply it. set_active_texture_stage(i); #ifdef SUPPORT_FIXED_FUNCTION - glEnable(GL_TEXTURE_2D); + if (has_fixed_function_pipeline()) { + glEnable(GL_TEXTURE_2D); + } #endif UsageTextureKey key(texture->get_x_size(), texture->get_y_size()); @@ -11445,7 +11535,9 @@ specify_texture(CLP(TextureContext) *gtc, const SamplerState &sampler) { tex->get_format() == Texture::F_depth_component24 || tex->get_format() == Texture::F_depth_component32) { #ifdef SUPPORT_FIXED_FUNCTION - glTexParameteri(target, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY); + if (has_fixed_function_pipeline()) { + glTexParameteri(target, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY); + } #endif if (_supports_shadow_filter) { if ((sampler.get_magfilter() == SamplerState::FT_shadow) || @@ -11893,33 +11985,35 @@ upload_texture(CLP(TextureContext) *gtc, bool force, bool uses_mipmaps) { } #endif -#if !defined(SUPPORT_FIXED_FUNCTION) && !defined(OPENGLES) - // Do we need to apply a swizzle mask to emulate these deprecated texture - // formats? - switch (tex->get_format()) { - case Texture::F_alpha: - glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_ZERO); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_ZERO); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_ZERO); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_RED); - break; +#ifndef OPENGLES + if (!_supports_luminance_texture) { + // Do we need to apply a swizzle mask to emulate these deprecated texture + // formats? + switch (tex->get_format()) { + case Texture::F_alpha: + glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_ZERO); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_ZERO); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_ZERO); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_RED); + break; - case Texture::F_luminance: - glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_RED); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_RED); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_ONE); - break; + case Texture::F_luminance: + glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_RED); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_RED); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_ONE); + break; - case Texture::F_luminance_alpha: - glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_RED); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_RED); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED); - glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_GREEN); - break; + case Texture::F_luminance_alpha: + glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, GL_RED); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, GL_RED); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, GL_RED); + glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, GL_GREEN); + break; - default: - break; + default: + break; + } } #endif @@ -12676,9 +12770,8 @@ get_texture_memory_size(CLP(TextureContext) *gtc) { } // OK, get the noncompressed size. - GLint red_size, green_size, blue_size, alpha_size, - luminance_size, intensity_size; - GLint depth_size = 0; + GLint red_size, green_size, blue_size, alpha_size; + GLint depth_size = 0, luminance_size = 0, intensity_size = 0; glGetTexLevelParameteriv(page_target, 0, GL_TEXTURE_RED_SIZE, &red_size); glGetTexLevelParameteriv(page_target, 0, @@ -12687,11 +12780,13 @@ get_texture_memory_size(CLP(TextureContext) *gtc) { GL_TEXTURE_BLUE_SIZE, &blue_size); glGetTexLevelParameteriv(page_target, 0, GL_TEXTURE_ALPHA_SIZE, &alpha_size); - glGetTexLevelParameteriv(page_target, 0, - GL_TEXTURE_LUMINANCE_SIZE, &luminance_size); - glGetTexLevelParameteriv(page_target, 0, - GL_TEXTURE_INTENSITY_SIZE, &intensity_size); - if (_supports_depth_texture) { + if (get_supports_luminance_texture()) { + glGetTexLevelParameteriv(page_target, 0, + GL_TEXTURE_LUMINANCE_SIZE, &luminance_size); + glGetTexLevelParameteriv(page_target, 0, + GL_TEXTURE_INTENSITY_SIZE, &intensity_size); + } + if (get_supports_depth_texture()) { glGetTexLevelParameteriv(page_target, 0, GL_TEXTURE_DEPTH_SIZE, &depth_size); } diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.h b/panda/src/glstuff/glGraphicsStateGuardian_src.h index 85290cd6f2..bf95facb90 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.h +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.h @@ -399,6 +399,7 @@ public: INLINE const string &get_gl_version() const; INLINE int get_gl_version_major() const; INLINE int get_gl_version_minor() const; + INLINE bool has_fixed_function_pipeline() const; virtual void set_state_and_transform(const RenderState *state, const TransformState *transform); @@ -719,6 +720,11 @@ protected: pset _extensions; +#ifndef OPENGLES + // True for non-compatibility GL 3.2+ contexts. + bool _core_profile; +#endif + public: bool _supports_point_parameters; PFNGLPOINTPARAMETERFVPROC _glPointParameterfv; From 4a8819b0bd7517cf8ad0fe1eed0666b324cadc14 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 19 Feb 2017 22:16:49 +0100 Subject: [PATCH 053/254] MeshDrawer fixes and improvements: * Fix random number generator on Windows (LP 1663895) * Assert instead of crash when passing in non-Camera to begin() (LP 1663900) * Prevent repeated calls to generator()/set_budget() from leaking GeomNodes (LP 1663903) * Make the generator more efficient --- panda/src/grutil/meshDrawer.cxx | 59 ++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/panda/src/grutil/meshDrawer.cxx b/panda/src/grutil/meshDrawer.cxx index 02b63e938a..57ac0d9590 100644 --- a/panda/src/grutil/meshDrawer.cxx +++ b/panda/src/grutil/meshDrawer.cxx @@ -33,7 +33,7 @@ TypeHandle MeshDrawer::_type_handle; PN_stdfloat randFloat() { - return ((PN_stdfloat) rand() / (PN_stdfloat) 0x7fffffff); + return ((PN_stdfloat)rand() / (PN_stdfloat)RAND_MAX); } /** @@ -42,39 +42,43 @@ PN_stdfloat randFloat() { void MeshDrawer::generator(int budget) { // create enough triangles for budget: _vdata = new GeomVertexData(_root.get_name(), GeomVertexFormat::get_v3n3c4t2(), Geom::UH_static);//UH_dynamic); - GeomVertexWriter *tvertex = new GeomVertexWriter(_vdata, "vertex"); - GeomVertexWriter *tnormal = new GeomVertexWriter(_vdata, "normal"); - GeomVertexWriter *tuv = new GeomVertexWriter(_vdata, "texcoord"); - GeomVertexWriter *tcolor = new GeomVertexWriter(_vdata, "color"); - _prim = new GeomTriangles(Geom::UH_static); + _vdata->unclean_set_num_rows(budget * 3); - // iterate and fill _up a geom with random data so that it will not be - // optimized out by panda3d system - for(int i = 0; i < budget; i++) { - for( int vert = 0; vert < 3; vert++) { - LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001; - LVector4 vec4 = LVector4(1,1,1,randFloat()); - LVector2 vec2 = LVector2(0,randFloat()); - tvertex->add_data3(vec3); - tcolor->add_data4(vec4); - tuv->add_data2(vec2); - tnormal->add_data3(vec3); + { + GeomVertexWriter tvertex(_vdata, "vertex"); + GeomVertexWriter tnormal(_vdata, "normal"); + GeomVertexWriter tuv(_vdata, "texcoord"); + GeomVertexWriter tcolor(_vdata, "color"); + + // iterate and fill _up a geom with random data so that it will not be + // optimized out by panda3d system + for (int i = 0; i < budget; i++) { + for (int vert = 0; vert < 3; vert++) { + LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001; + LVector4 vec4 = LVector4(1,1,1,randFloat()); + LVector2 vec2 = LVector2(0,randFloat()); + tvertex.set_data3(vec3); + tcolor.set_data4(vec4); + tuv.set_data2(vec2); + tnormal.set_data3(vec3); + } } - _prim->add_vertices(i * 3, i * 3 + 1, i * 3 + 2); } + // create our node and attach it to this node path + _prim = new GeomTriangles(Geom::UH_static); + _prim->add_next_vertices(budget * 3); _prim->close_primitive(); _geom = new Geom(_vdata); _geom->add_primitive(_prim); - _geomnode = new GeomNode("__MeshDrawer_GeomNode"); + if (_geomnode == NULL) { + _geomnode = new GeomNode("__MeshDrawer_GeomNode"); + _root.attach_new_node(_geomnode); + } else { + _geomnode->remove_all_geoms(); + } _geomnode->add_geom(_geom); - _root.attach_new_node(_geomnode); _last_clear_index = budget; - - delete tvertex; - delete tnormal; - delete tuv; - delete tcolor; } /** @@ -451,8 +455,9 @@ link_segment(const LVector3 &pos, const LVector4 &frame, LVector3 cam_stop3d = _camera.get_relative_point(_render, stop); LPoint2 cam_stop2d = LVector2(); - PT(Camera) camera = DCAST(Camera, _camera.node()); - PT(Lens) lens = camera->get_lens(); + const Camera *camera; + DCAST_INTO_V(camera, _camera.node()); + const Lens *lens = camera->get_lens(); lens->project(cam_start3d, cam_start2d); lens->project(cam_stop3d, cam_stop2d); From 53258af8768325bbc54ddca825e7191169dab8ef Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 20 Feb 2017 00:23:21 +0100 Subject: [PATCH 054/254] display: reduce GraphicsEngine traversal overhead a bit --- panda/src/display/graphicsEngine.cxx | 168 +++++++++++---------------- panda/src/display/graphicsEngine.h | 9 +- 2 files changed, 75 insertions(+), 102 deletions(-) diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index ad3aa3caa6..045c534ebe 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -1328,21 +1328,24 @@ cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr, GraphicsStateGuardian *gsg = win->get_gsg(); nassertv(gsg != (GraphicsStateGuardian *)NULL); - DisplayRegionPipelineReader *dr_reader = - new DisplayRegionPipelineReader(dr, current_thread); + PT(SceneSetup) scene_setup; - win->change_scenes(dr_reader); - gsg->prepare_display_region(dr_reader); + { + DisplayRegionPipelineReader dr_reader(dr, current_thread); + win->change_scenes(&dr_reader); + gsg->prepare_display_region(&dr_reader); - if (dr_reader->is_any_clear_active()) { - gsg->clear(dr); + if (dr_reader.is_any_clear_active()) { + gsg->clear(dr); + } + + scene_setup = setup_scene(gsg, &dr_reader); } - PT(SceneSetup) scene_setup = setup_scene(gsg, dr_reader); if (scene_setup == (SceneSetup *)NULL) { // Never mind. - } else if (dr_reader->get_object()->is_stereo()) { + } else if (dr->is_stereo()) { // Don't draw stereo DisplayRegions directly. } else if (!gsg->set_scene(scene_setup)) { @@ -1353,9 +1356,6 @@ cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr, } else { DrawCullHandler cull_handler(gsg); if (gsg->begin_scene()) { - delete dr_reader; - dr_reader = NULL; - CallbackObject *cbobj = dr->get_cull_callback(); if (cbobj != (CallbackObject *)NULL) { // Issue the cull callback on this DisplayRegion. @@ -1372,10 +1372,6 @@ cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr, gsg->end_scene(); } } - - if (dr_reader != (DisplayRegionPipelineReader *)NULL) { - delete dr_reader; - } } /** @@ -1399,27 +1395,41 @@ cull_to_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) { for (size_t wi = 0; wi < wlist_size; ++wi) { GraphicsOutput *win = wlist[wi]; if (win->is_active() && win->get_gsg()->is_active()) { + GraphicsStateGuardian *gsg = win->get_gsg(); PStatTimer timer(win->get_cull_window_pcollector(), current_thread); int num_display_regions = win->get_num_active_display_regions(); for (int i = 0; i < num_display_regions; ++i) { DisplayRegion *dr = win->get_active_display_region(i); - if (dr != (DisplayRegion *)NULL) { - DisplayRegionPipelineReader *dr_reader = - new DisplayRegionPipelineReader(dr, current_thread); - + if (dr != nullptr) { + PT(SceneSetup) scene_setup; + PT(CullResult) cull_result; CullKey key; - key._gsg = win->get_gsg(); - key._camera = dr_reader->get_camera(); - key._lens_index = dr_reader->get_lens_index(); + { + PStatTimer timer(_cull_setup_pcollector, current_thread); + DisplayRegionPipelineReader dr_reader(dr, current_thread); + scene_setup = setup_scene(gsg, &dr_reader); + if (scene_setup == nullptr) { + continue; + } - AlreadyCulled::iterator aci = already_culled.insert(AlreadyCulled::value_type(key, (DisplayRegion *)NULL)).first; - if ((*aci).second == NULL) { + key._gsg = gsg; + key._camera = dr_reader.get_camera(); + key._lens_index = dr_reader.get_lens_index(); + } + + AlreadyCulled::iterator aci = already_culled.insert(AlreadyCulled::value_type(move(key), nullptr)).first; + if ((*aci).second == nullptr) { // We have not used this camera already in this thread. Perform // the cull operation. - delete dr_reader; - dr_reader = NULL; + cull_result = dr->get_cull_result(current_thread); + if (cull_result != nullptr) { + cull_result = cull_result->make_next(); + } else { + // This DisplayRegion has no cull results; draw it. + cull_result = new CullResult(gsg, dr->get_draw_region_pcollector()); + } (*aci).second = dr; - cull_to_bins(win, dr, current_thread); + cull_to_bins(win, gsg, dr, scene_setup, cull_result, current_thread); } else { // We have already culled a scene using this camera in this @@ -1429,14 +1439,11 @@ cull_to_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) { // image.) Of course, the cull result will be the same, so just // use the result from the other DisplayRegion. DisplayRegion *other_dr = (*aci).second; - dr->set_cull_result(other_dr->get_cull_result(current_thread), - setup_scene(win->get_gsg(), dr_reader), - current_thread); + cull_result = other_dr->get_cull_result(current_thread); } - if (dr_reader != (DisplayRegionPipelineReader *)NULL) { - delete dr_reader; - } + // Save the results for next frame. + dr->set_cull_result(MOVE(cull_result), MOVE(scene_setup), current_thread); } } } @@ -1447,50 +1454,26 @@ cull_to_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) { * Called only within the inner loop of cull_to_bins(), above. */ void GraphicsEngine:: -cull_to_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread) { - GraphicsStateGuardian *gsg = win->get_gsg(); - if (gsg == (GraphicsStateGuardian *)NULL) { - return; +cull_to_bins(GraphicsOutput *win, GraphicsStateGuardian *gsg, + DisplayRegion *dr, SceneSetup *scene_setup, + CullResult *cull_result, Thread *current_thread) { + + BinCullHandler cull_handler(cull_result); + CallbackObject *cbobj = dr->get_cull_callback(); + if (cbobj != (CallbackObject *)NULL) { + // Issue the cull callback on this DisplayRegion. + DisplayRegionCullCallbackData cbdata(&cull_handler, scene_setup); + cbobj->do_callback(&cbdata); + + // The callback has taken care of the culling. + + } else { + // Perform the cull normally. + dr->do_cull(&cull_handler, scene_setup, gsg, current_thread); } - PT(CullResult) cull_result; - PT(SceneSetup) scene_setup; - { - PStatTimer timer(_cull_setup_pcollector, current_thread); - DisplayRegionPipelineReader dr_reader(dr, current_thread); - scene_setup = setup_scene(gsg, &dr_reader); - cull_result = dr->get_cull_result(current_thread); - - if (cull_result != (CullResult *)NULL) { - cull_result = cull_result->make_next(); - - } else { - // This DisplayRegion has no cull results; draw it. - cull_result = new CullResult(gsg, dr->get_draw_region_pcollector()); - } - } - - if (scene_setup != (SceneSetup *)NULL) { - BinCullHandler cull_handler(cull_result); - CallbackObject *cbobj = dr->get_cull_callback(); - if (cbobj != (CallbackObject *)NULL) { - // Issue the cull callback on this DisplayRegion. - DisplayRegionCullCallbackData cbdata(&cull_handler, scene_setup); - cbobj->do_callback(&cbdata); - - // The callback has taken care of the culling. - - } else { - // Perform the cull normally. - dr->do_cull(&cull_handler, scene_setup, gsg, current_thread); - } - - PStatTimer timer(_cull_sort_pcollector, current_thread); - cull_result->finish_cull(scene_setup, current_thread); - } - - // Save the results for next frame. - dr->set_cull_result(MOVE(cull_result), MOVE(scene_setup), current_thread); + PStatTimer timer(_cull_sort_pcollector, current_thread); + cull_result->finish_cull(scene_setup, current_thread); } /** @@ -1538,7 +1521,7 @@ draw_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) { for (int i = 0; i < num_display_regions; ++i) { DisplayRegion *dr = win->get_active_display_region(i); if (dr != (DisplayRegion *)NULL) { - draw_bins(win, dr, current_thread); + do_draw(win, gsg, dr, current_thread); } } } @@ -1582,22 +1565,6 @@ draw_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) { } } -/** - * This variant on draw_bins() is only called from draw_bins(), above. It - * draws the cull result for a particular DisplayRegion. - */ -void GraphicsEngine:: -draw_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread) { - GraphicsStateGuardian *gsg = win->get_gsg(); - if (gsg == (GraphicsStateGuardian *)NULL) { - return; - } - - PT(CullResult) cull_result = dr->get_cull_result(current_thread); - PT(SceneSetup) scene_setup = dr->get_scene_setup(current_thread); - do_draw(cull_result, scene_setup, win, dr, current_thread); -} - /** * Called in the draw thread, this calls make_context() on each window on the * list to guarantee its gsg and graphics context both get created. @@ -1899,15 +1866,20 @@ setup_scene(GraphicsStateGuardian *gsg, DisplayRegionPipelineReader *dr) { * Draws the previously-culled scene. */ void GraphicsEngine:: -do_draw(CullResult *cull_result, SceneSetup *scene_setup, - GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread) { - - CallbackObject *cbobj; - GraphicsStateGuardian *gsg = win->get_gsg(); - +do_draw(GraphicsOutput *win, GraphicsStateGuardian *gsg, DisplayRegion *dr, Thread *current_thread) { // Statistics PStatGPUTimer timer(gsg, dr->get_draw_region_pcollector(), current_thread); + PT(CullResult) cull_result; + PT(SceneSetup) scene_setup; + { + DisplayRegion::CDCullReader cdata(dr->_cycler_cull, current_thread); + cull_result = cdata->_cull_result; + scene_setup = cdata->_scene_setup; + } + + CallbackObject *cbobj; + { DisplayRegionPipelineReader dr_reader(dr, current_thread); win->change_scenes(&dr_reader); diff --git a/panda/src/display/graphicsEngine.h b/panda/src/display/graphicsEngine.h index 89cfb7c616..04f0993dfa 100644 --- a/panda/src/display/graphicsEngine.h +++ b/panda/src/display/graphicsEngine.h @@ -147,9 +147,10 @@ private: Thread *current_thread); void cull_to_bins(const Windows &wlist, Thread *current_thread); - void cull_to_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread); + void cull_to_bins(GraphicsOutput *win, GraphicsStateGuardian *gsg, + DisplayRegion *dr, SceneSetup *scene_setup, + CullResult *cull_result, Thread *current_thread); void draw_bins(const Windows &wlist, Thread *current_thread); - void draw_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread); void make_contexts(const Windows &wlist, Thread *current_thread); void process_events(const Windows &wlist, Thread *current_thread); @@ -162,8 +163,8 @@ private: PT(SceneSetup) setup_scene(GraphicsStateGuardian *gsg, DisplayRegionPipelineReader *dr); - void do_draw(CullResult *cull_result, SceneSetup *scene_setup, - GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread); + void do_draw(GraphicsOutput *win, GraphicsStateGuardian *gsg, + DisplayRegion *dr, Thread *current_thread); void do_add_window(GraphicsOutput *window, const GraphicsThreadingModel &threading_model); From b113d9db550ab7e475081c394c28f6b85285e212 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 20 Feb 2017 00:32:05 +0100 Subject: [PATCH 055/254] Fix incorrect type hierarchy of HermiteCurve, PandaNode, ShaderGenerator --- panda/src/parametrics/hermiteCurve.h | 4 +++- panda/src/pgraph/pandaNode.h | 6 ++---- panda/src/pgraphnodes/shaderGenerator.h | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/panda/src/parametrics/hermiteCurve.h b/panda/src/parametrics/hermiteCurve.h index 806ab47ff1..5a3d350b82 100644 --- a/panda/src/parametrics/hermiteCurve.h +++ b/panda/src/parametrics/hermiteCurve.h @@ -163,7 +163,9 @@ public: return _type_handle; } static void init_type() { - register_type(_type_handle, "HermiteCurve"); + PiecewiseCurve::init_type(); + register_type(_type_handle, "HermiteCurve", + PiecewiseCurve::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); diff --git a/panda/src/pgraph/pandaNode.h b/panda/src/pgraph/pandaNode.h index 0bbc984117..e9f3204ccd 100644 --- a/panda/src/pgraph/pandaNode.h +++ b/panda/src/pgraph/pandaNode.h @@ -799,12 +799,10 @@ public: return _type_handle; } static void init_type() { - TypedWritable::init_type(); - ReferenceCount::init_type(); + TypedWritableReferenceCount::init_type(); Namable::init_type(); register_type(_type_handle, "PandaNode", - TypedWritable::get_class_type(), - ReferenceCount::get_class_type(), + TypedWritableReferenceCount::get_class_type(), Namable::get_class_type()); CData::init_type(); Down::init_type(); diff --git a/panda/src/pgraphnodes/shaderGenerator.h b/panda/src/pgraphnodes/shaderGenerator.h index 9564bd6120..a1d83f0919 100644 --- a/panda/src/pgraphnodes/shaderGenerator.h +++ b/panda/src/pgraphnodes/shaderGenerator.h @@ -151,9 +151,9 @@ public: return _type_handle; } static void init_type() { - TypedObject::init_type(); + TypedReferenceCount::init_type(); register_type(_type_handle, "ShaderGenerator", - TypedObject::get_class_type()); + TypedReferenceCount::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); @@ -173,9 +173,9 @@ public: return _type_handle; } static void init_type() { - TypedObject::init_type(); + TypedReferenceCount::init_type(); register_type(_type_handle, "ShaderGenerator", - TypedObject::get_class_type()); + TypedReferenceCount::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); From 6104e75eb0ef3602575f8c426f831718493bfecb Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 20 Feb 2017 15:09:11 +0100 Subject: [PATCH 056/254] bam2egg: generate a sphere from polygon with four vertices instead of two --- panda/src/egg2pg/eggSaver.cxx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/panda/src/egg2pg/eggSaver.cxx b/panda/src/egg2pg/eggSaver.cxx index 3976aa0714..133bddc874 100644 --- a/panda/src/egg2pg/eggSaver.cxx +++ b/panda/src/egg2pg/eggSaver.cxx @@ -482,7 +482,7 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path, } else if (child->is_of_type(CollisionSphere::get_class_type())) { CPT(CollisionSphere) sphere = DCAST(CollisionSphere, child); LPoint3 center = sphere->get_center(); - LVector3 offset(sphere->get_radius(), 0, 0); + PN_stdfloat radius = sphere->get_radius(); EggGroup *egg_sphere; if (num_solids == 1) { @@ -499,15 +499,19 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path, } egg_sphere->set_collide_flags(flags); - EggVertex ev1, ev2; - ev1.set_pos(LCAST(double, (center + offset) * net_mat)); - ev2.set_pos(LCAST(double, (center - offset) * net_mat)); + EggVertex ev1, ev2, ev3, ev4; + ev1.set_pos(LCAST(double, (center + LVector3(radius, 0, 0)) * net_mat)); + ev2.set_pos(LCAST(double, (center + LVector3(0, radius, 0)) * net_mat)); + ev3.set_pos(LCAST(double, (center + LVector3(-radius, 0, 0)) * net_mat)); + ev4.set_pos(LCAST(double, (center + LVector3(0, -radius, 0)) * net_mat)); EggPolygon *egg_poly = new EggPolygon; egg_sphere->add_child(egg_poly); egg_poly->add_vertex(cvpool->create_unique_vertex(ev1)); egg_poly->add_vertex(cvpool->create_unique_vertex(ev2)); + egg_poly->add_vertex(cvpool->create_unique_vertex(ev3)); + egg_poly->add_vertex(cvpool->create_unique_vertex(ev4)); } else if (child->is_of_type(CollisionPlane::get_class_type())) { LPlane plane = DCAST(CollisionPlane, child)->get_plane(); From f6e2e2ea05c6e683c6dfab2401bd6583d07fd916 Mon Sep 17 00:00:00 2001 From: deflected Date: Mon, 20 Feb 2017 15:10:15 +0100 Subject: [PATCH 057/254] Fix compile issue on FreeBSD 11 --- dtool/src/dtoolutil/executionEnvironment.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dtool/src/dtoolutil/executionEnvironment.cxx b/dtool/src/dtoolutil/executionEnvironment.cxx index bcf4584ab0..cf7ecac50e 100644 --- a/dtool/src/dtoolutil/executionEnvironment.cxx +++ b/dtool/src/dtoolutil/executionEnvironment.cxx @@ -591,8 +591,8 @@ read_args() { dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map); while (map != NULL) { - char *tail = strrchr(map->l_name, '/'); - char *head = strchr(map->l_name, '/'); + const char *tail = strrchr(map->l_name, '/'); + const char *head = strchr(map->l_name, '/'); if (tail && head && (strcmp(tail, "/libp3dtool.so." PANDA_ABI_VERSION_STR) == 0 || strcmp(tail, "/libp3dtool.so") == 0)) { _dtool_name = head; @@ -615,8 +615,8 @@ read_args() { char buffer[PATH_MAX]; buffer[0] = 0; maps.getline(buffer, PATH_MAX); - char *tail = strrchr(buffer, '/'); - char *head = strchr(buffer, '/'); + const char *tail = strrchr(buffer, '/'); + const char *head = strchr(buffer, '/'); if (tail && head && (strcmp(tail, "/libp3dtool.so." PANDA_ABI_VERSION_STR) == 0 || strcmp(tail, "/libp3dtool.so") == 0)) { _dtool_name = head; From edb83fe89ac874bfa94127b01903518f9fedaa0b Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 21 Feb 2017 02:20:06 +0100 Subject: [PATCH 058/254] Various optimizations to reduce performance overhead of rendering --- dtool/src/dtoolbase/typeHandle.cxx | 4 +- dtool/src/dtoolbase/typeRegistry.I | 13 +++ dtool/src/dtoolbase/typeRegistry.cxx | 15 +-- dtool/src/dtoolbase/typeRegistry.h | 2 +- makepanda/makepanda.py | 2 +- panda/src/cull/cullBinBackToFront.cxx | 19 +++- panda/src/cull/cullBinFixed.cxx | 19 +++- panda/src/cull/cullBinFrontToBack.cxx | 19 +++- panda/src/cull/cullBinStateSorted.cxx | 19 +++- panda/src/cull/cullBinUnsorted.cxx | 19 +++- panda/src/glstuff/glGraphicsBuffer_src.cxx | 36 +++---- panda/src/gobj/geom.I | 62 ++++++++---- panda/src/gobj/geom.cxx | 68 +++++++------- panda/src/gobj/geom.h | 8 +- panda/src/gobj/geomCacheEntry.cxx | 4 +- panda/src/gobj/geomPrimitive.I | 96 ++++++++++++------- panda/src/gobj/geomPrimitive.cxx | 31 +++--- panda/src/gobj/geomPrimitive.h | 17 ++-- panda/src/gobj/geomVertexArrayData.I | 80 ++++++++++++---- panda/src/gobj/geomVertexArrayData.h | 19 ++-- panda/src/gobj/geomVertexData.I | 104 ++++++++++++--------- panda/src/gobj/geomVertexData.cxx | 57 ++++------- panda/src/gobj/geomVertexData.h | 17 ++-- panda/src/gobj/geomVertexWriter.cxx | 2 +- panda/src/gobj/geomVertexWriter.h | 2 +- panda/src/grutil/shaderTerrainMesh.cxx | 2 +- panda/src/pgraph/cullTraverserData.cxx | 2 +- panda/src/pgraph/cullableObject.I | 25 ++++- panda/src/pgraph/cullableObject.h | 12 ++- panda/src/pgraph/geomNode.cxx | 4 +- panda/src/pgraph/geomTransformer.cxx | 12 +-- panda/src/pgraph/workingNodePath.I | 8 +- panda/src/pipeline/thread.I | 11 ++- panda/src/putil/copyOnWritePointer.I | 24 +++-- panda/src/putil/copyOnWritePointer.cxx | 4 +- panda/src/putil/copyOnWritePointer.h | 8 +- panda/src/text/textAssembler.cxx | 8 +- 37 files changed, 537 insertions(+), 317 deletions(-) diff --git a/dtool/src/dtoolbase/typeHandle.cxx b/dtool/src/dtoolbase/typeHandle.cxx index 6f4d7bc1d1..4bbdbcbbb1 100644 --- a/dtool/src/dtoolbase/typeHandle.cxx +++ b/dtool/src/dtoolbase/typeHandle.cxx @@ -53,7 +53,7 @@ inc_memory_usage(MemoryClass memory_class, size_t size) { // cerr << *this << ".inc(" << memory_class << ", " << size << ") -> " << // rnode->_memory_usage[memory_class] << "\n"; if (rnode->_memory_usage[memory_class] < 0) { - cerr << "Memory usage overflow for type " << *this << ".\n"; + cerr << "Memory usage overflow for type " << rnode->_name << ".\n"; abort(); } } @@ -98,7 +98,7 @@ allocate_array(size_t size) { assert(rnode != (TypeRegistryNode *)NULL); AtomicAdjust::add(rnode->_memory_usage[MC_array], (AtomicAdjust::Integer)alloc_size); if (rnode->_memory_usage[MC_array] < 0) { - cerr << "Memory usage overflow for type " << *this << ".\n"; + cerr << "Memory usage overflow for type " << rnode->_name << ".\n"; abort(); } } diff --git a/dtool/src/dtoolbase/typeRegistry.I b/dtool/src/dtoolbase/typeRegistry.I index f0105c1eda..e35f37c207 100644 --- a/dtool/src/dtoolbase/typeRegistry.I +++ b/dtool/src/dtoolbase/typeRegistry.I @@ -23,6 +23,19 @@ freshen_derivations() { } } +/** + * Returns the pointer to the global TypeRegistry object. + */ +INLINE TypeRegistry *TypeRegistry:: +ptr() { + // It's OK that we don't acquire the lock, because we guarantee that this is + // called at static init time. + if (_global_pointer == NULL) { + init_global_pointer(); + } + return _global_pointer; +} + /** * Ensures the lock pointer has been allocated. */ diff --git a/dtool/src/dtoolbase/typeRegistry.cxx b/dtool/src/dtoolbase/typeRegistry.cxx index 7349d20dd4..01b8ec498a 100644 --- a/dtool/src/dtoolbase/typeRegistry.cxx +++ b/dtool/src/dtoolbase/typeRegistry.cxx @@ -488,20 +488,6 @@ write(ostream &out) const { _lock->release(); } -/** - * Returns the pointer to the global TypeRegistry object. - */ -TypeRegistry *TypeRegistry:: -ptr() { - init_lock(); - _lock->acquire(); - if (_global_pointer == NULL) { - init_global_pointer(); - } - _lock->release(); - return _global_pointer; -} - /** * */ @@ -531,6 +517,7 @@ TypeRegistry() { */ void TypeRegistry:: init_global_pointer() { + init_lock(); init_memory_hook(); _global_pointer = new TypeRegistry; } diff --git a/dtool/src/dtoolbase/typeRegistry.h b/dtool/src/dtoolbase/typeRegistry.h index 828cee6c8c..651eb1904b 100644 --- a/dtool/src/dtoolbase/typeRegistry.h +++ b/dtool/src/dtoolbase/typeRegistry.h @@ -77,7 +77,7 @@ PUBLISHED: void write(ostream &out) const; // ptr() returns the pointer to the global TypeRegistry object. - static TypeRegistry *ptr(); + static INLINE TypeRegistry *ptr(); MAKE_SEQ_PROPERTY(typehandles, get_num_typehandles, get_typehandle); MAKE_SEQ_PROPERTY(root_classes, get_num_root_classes, get_root_class); diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index e159e864d8..adc2064f21 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -1290,7 +1290,7 @@ def CompileCxx(obj,src,opts): cmd += " -fno-strict-aliasing" if optlevel >= 3: - cmd += " -ffast-math" + cmd += " -ffast-math -fno-stack-protector -fno-stack-check" if optlevel == 3: # Fast math is nice, but we'd like to see NaN in dev builds. cmd += " -fno-finite-math-only" diff --git a/panda/src/cull/cullBinBackToFront.cxx b/panda/src/cull/cullBinBackToFront.cxx index e472d0811d..57168aa866 100644 --- a/panda/src/cull/cullBinBackToFront.cxx +++ b/panda/src/cull/cullBinBackToFront.cxx @@ -84,10 +84,27 @@ finish_cull(SceneSetup *, Thread *current_thread) { void CullBinBackToFront:: draw(bool force, Thread *current_thread) { PStatTimer timer(_draw_this_pcollector, current_thread); + + GeomPipelineReader geom_reader(current_thread); + GeomVertexDataPipelineReader data_reader(current_thread); + Objects::const_iterator oi; for (oi = _objects.begin(); oi != _objects.end(); ++oi) { CullableObject *object = (*oi)._object; - CullHandler::draw(object, _gsg, force, current_thread); + + if (object->_draw_callback == nullptr) { + nassertd(object->_geom != nullptr) continue; + + _gsg->set_state_and_transform(object->_state, object->_internal_transform); + data_reader.set_object(object->_munged_data); + data_reader.check_array_readers(); + geom_reader.set_object(object->_geom); + geom_reader.draw(_gsg, object->_munger, &data_reader, force); + } else { + // It has a callback associated. + object->draw_callback(_gsg, force, current_thread); + // Now the callback has taken care of drawing. + } } } diff --git a/panda/src/cull/cullBinFixed.cxx b/panda/src/cull/cullBinFixed.cxx index 3db9b9f7fb..6bbce5ed78 100644 --- a/panda/src/cull/cullBinFixed.cxx +++ b/panda/src/cull/cullBinFixed.cxx @@ -70,10 +70,27 @@ finish_cull(SceneSetup *, Thread *current_thread) { void CullBinFixed:: draw(bool force, Thread *current_thread) { PStatTimer timer(_draw_this_pcollector, current_thread); + + GeomPipelineReader geom_reader(current_thread); + GeomVertexDataPipelineReader data_reader(current_thread); + Objects::const_iterator oi; for (oi = _objects.begin(); oi != _objects.end(); ++oi) { CullableObject *object = (*oi)._object; - CullHandler::draw(object, _gsg, force, current_thread); + + if (object->_draw_callback == nullptr) { + nassertd(object->_geom != nullptr) continue; + + _gsg->set_state_and_transform(object->_state, object->_internal_transform); + data_reader.set_object(object->_munged_data); + data_reader.check_array_readers(); + geom_reader.set_object(object->_geom); + geom_reader.draw(_gsg, object->_munger, &data_reader, force); + } else { + // It has a callback associated. + object->draw_callback(_gsg, force, current_thread); + // Now the callback has taken care of drawing. + } } } diff --git a/panda/src/cull/cullBinFrontToBack.cxx b/panda/src/cull/cullBinFrontToBack.cxx index 1800b5636a..a532fef811 100644 --- a/panda/src/cull/cullBinFrontToBack.cxx +++ b/panda/src/cull/cullBinFrontToBack.cxx @@ -84,10 +84,27 @@ finish_cull(SceneSetup *, Thread *current_thread) { void CullBinFrontToBack:: draw(bool force, Thread *current_thread) { PStatTimer timer(_draw_this_pcollector, current_thread); + + GeomPipelineReader geom_reader(current_thread); + GeomVertexDataPipelineReader data_reader(current_thread); + Objects::const_iterator oi; for (oi = _objects.begin(); oi != _objects.end(); ++oi) { CullableObject *object = (*oi)._object; - CullHandler::draw(object, _gsg, force, current_thread); + + if (object->_draw_callback == nullptr) { + nassertd(object->_geom != nullptr) continue; + + _gsg->set_state_and_transform(object->_state, object->_internal_transform); + data_reader.set_object(object->_munged_data); + data_reader.check_array_readers(); + geom_reader.set_object(object->_geom); + geom_reader.draw(_gsg, object->_munger, &data_reader, force); + } else { + // It has a callback associated. + object->draw_callback(_gsg, force, current_thread); + // Now the callback has taken care of drawing. + } } } diff --git a/panda/src/cull/cullBinStateSorted.cxx b/panda/src/cull/cullBinStateSorted.cxx index c7ba58c295..07f3f9c9a3 100644 --- a/panda/src/cull/cullBinStateSorted.cxx +++ b/panda/src/cull/cullBinStateSorted.cxx @@ -69,10 +69,27 @@ finish_cull(SceneSetup *, Thread *current_thread) { void CullBinStateSorted:: draw(bool force, Thread *current_thread) { PStatTimer timer(_draw_this_pcollector, current_thread); + + GeomPipelineReader geom_reader(current_thread); + GeomVertexDataPipelineReader data_reader(current_thread); + Objects::const_iterator oi; for (oi = _objects.begin(); oi != _objects.end(); ++oi) { CullableObject *object = (*oi)._object; - CullHandler::draw(object, _gsg, force, current_thread); + + if (object->_draw_callback == nullptr) { + nassertd(object->_geom != nullptr) continue; + + _gsg->set_state_and_transform(object->_state, object->_internal_transform); + data_reader.set_object(object->_munged_data); + data_reader.check_array_readers(); + geom_reader.set_object(object->_geom); + geom_reader.draw(_gsg, object->_munger, &data_reader, force); + } else { + // It has a callback associated. + object->draw_callback(_gsg, force, current_thread); + // Now the callback has taken care of drawing. + } } } diff --git a/panda/src/cull/cullBinUnsorted.cxx b/panda/src/cull/cullBinUnsorted.cxx index e9de061fb1..c9a68401b6 100644 --- a/panda/src/cull/cullBinUnsorted.cxx +++ b/panda/src/cull/cullBinUnsorted.cxx @@ -54,10 +54,27 @@ add_object(CullableObject *object, Thread *current_thread) { void CullBinUnsorted:: draw(bool force, Thread *current_thread) { PStatTimer timer(_draw_this_pcollector, current_thread); + + GeomPipelineReader geom_reader(current_thread); + GeomVertexDataPipelineReader data_reader(current_thread); + Objects::iterator oi; for (oi = _objects.begin(); oi != _objects.end(); ++oi) { CullableObject *object = (*oi); - CullHandler::draw(object, _gsg, force, current_thread); + + if (object->_draw_callback == nullptr) { + nassertd(object->_geom != nullptr) continue; + + _gsg->set_state_and_transform(object->_state, object->_internal_transform); + data_reader.set_object(object->_munged_data); + data_reader.check_array_readers(); + geom_reader.set_object(object->_geom); + geom_reader.draw(_gsg, object->_munger, &data_reader, force); + } else { + // It has a callback associated. + object->draw_callback(_gsg, force, current_thread); + // Now the callback has taken care of drawing. + } } } diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index 706bb03049..a4daaf3931 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -95,8 +95,7 @@ clear(Thread *current_thread) { return; } - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); if (glgsg->_glClearBufferfv == NULL) { // We can't efficiently clear the buffer. Fall back to the inefficient @@ -254,8 +253,7 @@ begin_frame(FrameMode mode, Thread *current_thread) { // until we call glBlitFramebuffer. #ifndef OPENGLES_1 if (gl_enable_memory_barriers && _fbo_multisample == 0) { - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_R(glgsg, _gsg, false); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); TextureContexts::iterator it; for (it = _texture_contexts.begin(); it != _texture_contexts.end(); ++it) { @@ -285,8 +283,7 @@ begin_frame(FrameMode mode, Thread *current_thread) { */ bool CLP(GraphicsBuffer):: check_fbo() { - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_R(glgsg, _gsg, false); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); GLenum status = glgsg->_glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT); if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { @@ -341,8 +338,7 @@ rebuild_bitplanes() { return; } - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); if (!_needs_rebuild) { if (_fbo_multisample != 0) { @@ -685,8 +681,7 @@ rebuild_bitplanes() { */ void CLP(GraphicsBuffer):: bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, GLenum attachpoint) { - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); Texture *tex = attach[slot]; @@ -1020,8 +1015,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, */ void CLP(GraphicsBuffer):: bind_slot_multisample(bool rb_resize, Texture **attach, RenderTexturePlane slot, GLenum attachpoint) { - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); if ((_rbm[slot] != 0)&&(!rb_resize)) { return; @@ -1144,8 +1138,7 @@ bind_slot_multisample(bool rb_resize, Texture **attach, RenderTexturePlane slot, */ void CLP(GraphicsBuffer):: attach_tex(int layer, int view, Texture *attach, GLenum attachpoint) { - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); if (view >= attach->get_num_views()) { attach->set_num_views(view + 1); @@ -1215,8 +1208,7 @@ generate_mipmaps() { return; } - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); // PStatGPUTimer timer(glgsg, _generate_mipmap_pcollector); @@ -1253,8 +1245,7 @@ end_frame(FrameMode mode, Thread *current_thread) { // Unbind the FBO. TODO: calling bind_fbo is slow, so we should probably // move this to begin_frame to prevent unnecessary calls. - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); glgsg->bind_fbo(0); _bound_tex_page = -1; @@ -1293,8 +1284,7 @@ void CLP(GraphicsBuffer):: select_target_tex_page(int page) { nassertv(page >= 0 && page < _fbo.size()); - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); bool switched_page = (_bound_tex_page != page); @@ -1689,8 +1679,7 @@ report_my_errors(int line, const char *file) { GLCAT.error() << file << ", line " << line << ": GL error " << (int)error_code << "\n"; } } else { - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); glgsg->report_my_errors(line, file); } } @@ -1723,8 +1712,7 @@ void CLP(GraphicsBuffer):: resolve_multisamples() { nassertv(_fbo.size() > 0); - CLP(GraphicsStateGuardian) *glgsg; - DCAST_INTO_V(glgsg, _gsg); + CLP(GraphicsStateGuardian) *glgsg = (CLP(GraphicsStateGuardian) *)_gsg.p(); PStatGPUTimer timer(glgsg, _resolve_multisample_pcollector); diff --git a/panda/src/gobj/geom.I b/panda/src/gobj/geom.I index 33132b3be5..3457a8b265 100644 --- a/panda/src/gobj/geom.I +++ b/panda/src/gobj/geom.I @@ -51,7 +51,7 @@ get_geom_rendering() const { INLINE CPT(GeomVertexData) Geom:: get_vertex_data(Thread *current_thread) const { CDReader cdata(_cycler, current_thread); - return cdata->_data.get_read_pointer(); + return cdata->_data.get_read_pointer(current_thread); } /** @@ -514,6 +514,18 @@ CData(const Geom::CData ©) : { } + +/** + * + */ +INLINE GeomPipelineReader:: +GeomPipelineReader(Thread *current_thread) : + _object(nullptr), + _current_thread(current_thread), + _cdata(nullptr) +{ +} + /** * */ @@ -531,34 +543,22 @@ GeomPipelineReader(const Geom *object, Thread *current_thread) : #endif // DO_PIPELINING } -/** - * Don't attempt to copy these objects. - */ -INLINE GeomPipelineReader:: -GeomPipelineReader(const GeomPipelineReader &) { - nassertv(false); -} - -/** - * Don't attempt to copy these objects. - */ -INLINE void GeomPipelineReader:: -operator = (const GeomPipelineReader &) { - nassertv(false); -} - /** * */ INLINE GeomPipelineReader:: ~GeomPipelineReader() { #ifdef _DEBUG - nassertv(_object->test_ref_count_nonzero()); + if (_object != nullptr) { + nassertv(_object->test_ref_count_nonzero()); + } #endif // _DEBUG // _object->_cycler.release_read(_cdata); #ifdef DO_PIPELINING - unref_delete((CycleData *)_cdata); + if (_cdata != nullptr) { + unref_delete((CycleData *)_cdata); + } #endif // DO_PIPELINING #ifdef _DEBUG @@ -567,6 +567,30 @@ INLINE GeomPipelineReader:: #endif // _DEBUG } +/** + * + */ +INLINE void GeomPipelineReader:: +set_object(const Geom *object) { + if (object != _object) { + // _object->_cycler.release_read(_cdata); + +#ifdef DO_PIPELINING + if (_cdata != NULL) { + unref_delete((CycleData *)_cdata); + } +#endif // DO_PIPELINING + + _cdata = object->_cycler.read_unlocked(_current_thread); + +#ifdef DO_PIPELINING + _cdata->ref(); +#endif // DO_PIPELINING + + _object = object; + } +} + /** * */ diff --git a/panda/src/gobj/geom.cxx b/panda/src/gobj/geom.cxx index 1d3e0a2a45..eb44a46abb 100644 --- a/panda/src/gobj/geom.cxx +++ b/panda/src/gobj/geom.cxx @@ -236,7 +236,7 @@ make_nonindexed(bool composite_only) { int num_changed = 0; CDWriter cdata(_cycler, true, current_thread); - CPT(GeomVertexData) orig_data = cdata->_data.get_read_pointer(); + CPT(GeomVertexData) orig_data = cdata->_data.get_read_pointer(current_thread); PT(GeomVertexData) new_data = new GeomVertexData(*orig_data); new_data->clear_rows(); @@ -247,7 +247,7 @@ make_nonindexed(bool composite_only) { Primitives new_prims; new_prims.reserve(cdata->_primitives.size()); for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - PT(GeomPrimitive) primitive = (*pi).get_read_pointer()->make_copy(); + PT(GeomPrimitive) primitive = (*pi).get_read_pointer(current_thread)->make_copy(); new_prims.push_back(primitive.p()); // GeomPoints are considered "composite" for the purposes of making @@ -298,7 +298,7 @@ set_primitive(int i, const GeomPrimitive *primitive) { Thread *current_thread = Thread::get_current_thread(); CDWriter cdata(_cycler, true, current_thread); nassertv(i >= 0 && i < (int)cdata->_primitives.size()); - nassertv(primitive->check_valid(cdata->_data.get_read_pointer())); + nassertv(primitive->check_valid(cdata->_data.get_read_pointer(current_thread))); // All primitives within a particular Geom must have the same fundamental // primitive type (triangles, points, or lines). @@ -339,7 +339,7 @@ add_primitive(const GeomPrimitive *primitive) { Thread *current_thread = Thread::get_current_thread(); CDWriter cdata(_cycler, true, current_thread); - nassertv(primitive->check_valid(cdata->_data.get_read_pointer())); + nassertv(primitive->check_valid(cdata->_data.get_read_pointer(current_thread))); // All primitives within a particular Geom must have the same fundamental // primitive type (triangles, points, or lines). @@ -426,11 +426,11 @@ decompose_in_place() { #endif Primitives::iterator pi; for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer()->decompose(); + CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer(current_thread)->decompose(); (*pi) = (GeomPrimitive *)new_prim.p(); #ifndef NDEBUG - if (!new_prim->check_valid(cdata->_data.get_read_pointer())) { + if (!new_prim->check_valid(cdata->_data.get_read_pointer(current_thread))) { all_is_valid = false; } #endif @@ -460,11 +460,11 @@ doubleside_in_place() { #endif Primitives::iterator pi; for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer()->doubleside(); + CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer(current_thread)->doubleside(); (*pi) = (GeomPrimitive *)new_prim.p(); #ifndef NDEBUG - if (!new_prim->check_valid(cdata->_data.get_read_pointer())) { + if (!new_prim->check_valid(cdata->_data.get_read_pointer(current_thread))) { all_is_valid = false; } #endif @@ -494,11 +494,11 @@ reverse_in_place() { #endif Primitives::iterator pi; for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer()->reverse(); + CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer(current_thread)->reverse(); (*pi) = (GeomPrimitive *)new_prim.p(); #ifndef NDEBUG - if (!new_prim->check_valid(cdata->_data.get_read_pointer())) { + if (!new_prim->check_valid(cdata->_data.get_read_pointer(current_thread))) { all_is_valid = false; } #endif @@ -528,11 +528,11 @@ rotate_in_place() { #endif Primitives::iterator pi; for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer()->rotate(); + CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer(current_thread)->rotate(); (*pi) = (GeomPrimitive *)new_prim.p(); #ifndef NDEBUG - if (!new_prim->check_valid(cdata->_data.get_read_pointer())) { + if (!new_prim->check_valid(cdata->_data.get_read_pointer(current_thread))) { all_is_valid = false; } #endif @@ -596,7 +596,7 @@ unify_in_place(int max_indices, bool preserve_order) { Primitives::const_iterator pi; for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) primitive = (*pi).get_read_pointer(); + CPT(GeomPrimitive) primitive = (*pi).get_read_pointer(current_thread); NewPrims::iterator npi = new_prims.find(primitive->get_type()); if (npi == new_prims.end()) { // This is the first primitive of this type. @@ -648,7 +648,7 @@ unify_in_place(int max_indices, bool preserve_order) { for (npi = new_prims.begin(); npi != new_prims.end(); ++npi) { GeomPrimitive *prim = (*npi).second; - nassertv(prim->check_valid(cdata->_data.get_read_pointer())); + nassertv(prim->check_valid(cdata->_data.get_read_pointer(current_thread))); // Each new primitive, naturally, inherits the Geom's overall shade model. prim->set_shade_model(cdata->_shade_model); @@ -706,11 +706,11 @@ make_lines_in_place() { #endif Primitives::iterator pi; for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer()->make_lines(); + CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer(current_thread)->make_lines(); (*pi) = (GeomPrimitive *)new_prim.p(); #ifndef NDEBUG - if (!new_prim->check_valid(cdata->_data.get_read_pointer())) { + if (!new_prim->check_valid(cdata->_data.get_read_pointer(current_thread))) { all_is_valid = false; } #endif @@ -740,11 +740,11 @@ make_points_in_place() { #endif Primitives::iterator pi; for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer()->make_points(); + CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer(current_thread)->make_points(); (*pi) = (GeomPrimitive *)new_prim.p(); #ifndef NDEBUG - if (!new_prim->check_valid(cdata->_data.get_read_pointer())) { + if (!new_prim->check_valid(cdata->_data.get_read_pointer(current_thread))) { all_is_valid = false; } #endif @@ -774,11 +774,11 @@ make_patches_in_place() { #endif Primitives::iterator pi; for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer()->make_patches(); + CPT(GeomPrimitive) new_prim = (*pi).get_read_pointer(current_thread)->make_patches(); (*pi) = (GeomPrimitive *)new_prim.p(); #ifndef NDEBUG - if (!new_prim->check_valid(cdata->_data.get_read_pointer())) { + if (!new_prim->check_valid(cdata->_data.get_read_pointer(current_thread))) { all_is_valid = false; } #endif @@ -865,7 +865,9 @@ get_num_bytes() const { */ bool Geom:: request_resident() const { - CDReader cdata(_cycler); + Thread *current_thread = Thread::get_current_thread(); + + CDReader cdata(_cycler, current_thread); bool resident = true; @@ -873,7 +875,7 @@ request_resident() const { for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - if (!(*pi).get_read_pointer()->request_resident()) { + if (!(*pi).get_read_pointer(current_thread)->request_resident()) { resident = false; } } @@ -1197,7 +1199,7 @@ compute_internal_bounds(Geom::CData *cdata, Thread *current_thread) const { int num_vertices = 0; // Get the vertex data, after animation. - CPT(GeomVertexData) vertex_data = cdata->_data.get_read_pointer(); + CPT(GeomVertexData) vertex_data = cdata->_data.get_read_pointer(current_thread); vertex_data = vertex_data->animate_vertices(true, current_thread); // Now actually compute the bounding volume. We do this by using @@ -1296,7 +1298,7 @@ compute_internal_bounds(Geom::CData *cdata, Thread *current_thread) const { for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) prim = (*pi).get_read_pointer(); + CPT(GeomPrimitive) prim = (*pi).get_read_pointer(current_thread); num_vertices += prim->get_num_vertices(); } @@ -1327,7 +1329,7 @@ do_calc_tight_bounds(LPoint3 &min_point, LPoint3 &max_point, for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) prim = (*pi).get_read_pointer(); + CPT(GeomPrimitive) prim = (*pi).get_read_pointer(current_thread); prim->calc_tight_bounds(min_point, max_point, sq_center_dist, found_any, vertex_data, got_mat, mat, column_name, current_thread); @@ -1345,7 +1347,7 @@ do_calc_sphere_radius(const LPoint3 ¢er, PN_stdfloat &sq_radius, for (pi = cdata->_primitives.begin(); pi != cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) prim = (*pi).get_read_pointer(); + CPT(GeomPrimitive) prim = (*pi).get_read_pointer(current_thread); prim->calc_sphere_radius(center, sq_radius, found_any, vertex_data, current_thread); } @@ -1469,8 +1471,10 @@ combine_primitives(GeomPrimitive *a_prim, const GeomPrimitive *b_prim, a_prim->append_unused_vertices(a_vertices, b_vertex); } - PT(GeomVertexArrayDataHandle) a_handle = a_vertices->modify_handle(current_thread); - CPT(GeomVertexArrayDataHandle) b_handle = b_vertices->get_handle(current_thread); + PT(GeomVertexArrayDataHandle) a_handle = + new GeomVertexArrayDataHandle(move(a_vertices), current_thread); + CPT(GeomVertexArrayDataHandle) b_handle = + new GeomVertexArrayDataHandle(move(b_vertices), current_thread); size_t orig_a_vertices = a_handle->get_num_rows(); @@ -1683,8 +1687,7 @@ check_valid(const GeomVertexDataPipelineReader *data_reader) const { for (pi = _cdata->_primitives.begin(); pi != _cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) primitive = (*pi).get_read_pointer(); - GeomPrimitivePipelineReader reader(primitive, _current_thread); + GeomPrimitivePipelineReader reader((*pi).get_read_pointer(_current_thread), _current_thread); reader.check_minmax(); if (!reader.check_valid(data_reader)) { return false; @@ -1707,12 +1710,11 @@ draw(GraphicsStateGuardianBase *gsg, const GeomMunger *munger, for (pi = _cdata->_primitives.begin(); pi != _cdata->_primitives.end(); ++pi) { - CPT(GeomPrimitive) primitive = (*pi).get_read_pointer(); - GeomPrimitivePipelineReader reader(primitive, _current_thread); + GeomPrimitivePipelineReader reader((*pi).get_read_pointer(_current_thread), _current_thread); if (reader.get_num_vertices() != 0) { reader.check_minmax(); nassertr(reader.check_valid(data_reader), false); - if (!primitive->draw(gsg, &reader, force)) { + if (!reader.draw(gsg, force)) { all_ok = false; } } diff --git a/panda/src/gobj/geom.h b/panda/src/gobj/geom.h index cd02493d79..0ed8cc5193 100644 --- a/panda/src/gobj/geom.h +++ b/panda/src/gobj/geom.h @@ -401,15 +401,17 @@ private: */ class EXPCL_PANDA_GOBJ GeomPipelineReader : public GeomEnums { public: + INLINE GeomPipelineReader(Thread *current_thread); INLINE GeomPipelineReader(const Geom *object, Thread *current_thread); private: - INLINE GeomPipelineReader(const GeomPipelineReader ©); - INLINE void operator = (const GeomPipelineReader ©); + GeomPipelineReader(const GeomPipelineReader ©) DELETED; + GeomPipelineReader &operator = (const GeomPipelineReader ©) DELETED_ASSIGN; public: INLINE ~GeomPipelineReader(); ALLOC_DELETED_CHAIN(GeomPipelineReader); + INLINE void set_object(const Geom *object); INLINE const Geom *get_object() const; INLINE Thread *get_current_thread() const; @@ -433,7 +435,7 @@ public: private: const Geom *_object; - Thread *_current_thread; + Thread *const _current_thread; const Geom::CData *_cdata; public: diff --git a/panda/src/gobj/geomCacheEntry.cxx b/panda/src/gobj/geomCacheEntry.cxx index 27ab5a9e20..d16a7f6a08 100644 --- a/panda/src/gobj/geomCacheEntry.cxx +++ b/panda/src/gobj/geomCacheEntry.cxx @@ -95,8 +95,8 @@ PT(GeomCacheEntry) GeomCacheEntry:: erase() { nassertr(_next != (GeomCacheEntry *)NULL && _prev != (GeomCacheEntry *)NULL, NULL); - PT(GeomCacheEntry) keepme = this; - unref(); + PT(GeomCacheEntry) keepme; + keepme.cheat() = this; if (gobj_cat.is_debug()) { gobj_cat.debug() diff --git a/panda/src/gobj/geomPrimitive.I b/panda/src/gobj/geomPrimitive.I index 029063f864..1dceada335 100644 --- a/panda/src/gobj/geomPrimitive.I +++ b/panda/src/gobj/geomPrimitive.I @@ -235,6 +235,24 @@ get_vertices() const { return cdata->_vertices.get_read_pointer(); } +/** + * Equivalent to get_vertices().get_handle(). + */ +INLINE CPT(GeomVertexArrayDataHandle) GeomPrimitive:: +get_vertices_handle(Thread *current_thread) const { + CDReader cdata(_cycler, current_thread); + return new GeomVertexArrayDataHandle(cdata->_vertices.get_read_pointer(current_thread), current_thread); +} + +/** + * Equivalent to modify_vertices().get_handle(). + */ +INLINE PT(GeomVertexArrayDataHandle) GeomPrimitive:: +modify_vertices_handle(Thread *current_thread) { + CDWriter cdata(_cycler, true, current_thread); + return new GeomVertexArrayDataHandle(do_modify_vertices(cdata), current_thread); +} + /** * A convenience function to return the gap between successive index numbers, * in bytes, of the index data. @@ -414,38 +432,32 @@ CData(const GeomPrimitive::CData ©) : * */ INLINE GeomPrimitivePipelineReader:: -GeomPrimitivePipelineReader(const GeomPrimitive *object, +GeomPrimitivePipelineReader(CPT(GeomPrimitive) object, Thread *current_thread) : - _object(object), + _object(move(object)), _current_thread(current_thread), - _cdata(object->_cycler.read_unlocked(current_thread)), - _vertices_reader(NULL) +#ifndef CPPPARSER + _cdata(_object->_cycler.read_unlocked(current_thread)), +#endif + _vertices_cdata(NULL) { nassertv(_object->test_ref_count_nonzero()); #ifdef DO_PIPELINING _cdata->ref(); #endif // DO_PIPELINING + if (!_cdata->_vertices.is_null()) { - _vertices_reader = _cdata->_vertices.get_read_pointer()->get_handle(); + _vertices = _cdata->_vertices.get_read_pointer(current_thread); + _vertices_cdata = _vertices->_cycler.read_unlocked(current_thread); +#ifdef DO_PIPELINING + _vertices_cdata->ref(); +#endif // DO_PIPELINING + // We must grab the lock *after* we have incremented the reference count, + // above. + _vertices_cdata->_rw_lock.acquire(); } } -/** - * Don't attempt to copy these objects. - */ -INLINE GeomPrimitivePipelineReader:: -GeomPrimitivePipelineReader(const GeomPrimitivePipelineReader &) { - nassertv(false); -} - -/** - * Don't attempt to copy these objects. - */ -INLINE void GeomPrimitivePipelineReader:: -operator = (const GeomPrimitivePipelineReader &) { - nassertv(false); -} - /** * */ @@ -460,8 +472,17 @@ INLINE GeomPrimitivePipelineReader:: unref_delete((CycleData *)_cdata); #endif // DO_PIPELINING + if (_vertices_cdata != nullptr) { + // We must release the lock *before* we decrement the reference count, + // below. + _vertices_cdata->_rw_lock.release(); + +#ifdef DO_PIPELINING + unref_delete((CycleData *)_vertices_cdata); +#endif // DO_PIPELINING + } + #ifdef _DEBUG - _vertices_reader = NULL; _object = NULL; _cdata = NULL; #endif // _DEBUG @@ -512,7 +533,7 @@ get_index_type() const { */ INLINE bool GeomPrimitivePipelineReader:: is_indexed() const { - return (!_cdata->_vertices.is_null()); + return (!_vertices.is_null()); } /** @@ -523,8 +544,10 @@ get_num_vertices() const { if (_cdata->_num_vertices != -1) { return _cdata->_num_vertices; } else { - nassertr(!_cdata->_vertices.is_null(), 0); - return _vertices_reader->get_num_rows(); + nassertr(!_vertices.is_null(), 0); + size_t stride = _vertices->_array_format->get_stride(); + nassertr(stride != 0, 0); + return get_data_size_bytes() / stride; } } @@ -551,7 +574,7 @@ get_max_vertex() const { */ INLINE int GeomPrimitivePipelineReader:: get_data_size_bytes() const { - return _vertices_reader->get_data_size_bytes(); + return _vertices_cdata->_buffer.get_size(); } /** @@ -568,15 +591,7 @@ get_modified() const { INLINE int GeomPrimitivePipelineReader:: get_index_stride() const { nassertr(is_indexed(), 0); - return _cdata->_vertices.get_read_pointer()->get_array_format()->get_stride(); -} - -/** - * - */ -INLINE const GeomVertexArrayDataHandle *GeomPrimitivePipelineReader:: -get_vertices_reader() const { - return _vertices_reader; + return _vertices->_array_format->get_stride(); } /** @@ -584,7 +599,8 @@ get_vertices_reader() const { */ INLINE const unsigned char *GeomPrimitivePipelineReader:: get_read_pointer(bool force) const { - return _vertices_reader->get_read_pointer(force); + ((GeomVertexArrayData *)_vertices.p())->mark_used(); + return _vertices_cdata->_buffer.get_read_pointer(force); } /** @@ -632,6 +648,14 @@ prepare_now(PreparedGraphicsObjects *prepared_objects, return ((GeomPrimitive *)_object.p())->prepare_now(prepared_objects, gsg); } +/** + * Calls the appropriate method on the GSG to draw the primitive. + */ +INLINE bool GeomPrimitivePipelineReader:: +draw(GraphicsStateGuardianBase *gsg, bool force) const { + return _object->draw(gsg, this, force); +} + INLINE ostream & operator << (ostream &out, const GeomPrimitive &obj) { obj.output(out); diff --git a/panda/src/gobj/geomPrimitive.cxx b/panda/src/gobj/geomPrimitive.cxx index 6f918eefdb..b96249cc83 100644 --- a/panda/src/gobj/geomPrimitive.cxx +++ b/panda/src/gobj/geomPrimitive.cxx @@ -1036,23 +1036,23 @@ get_num_bytes() const { * shortly; try again later. */ bool GeomPrimitive:: -request_resident() const { - CDReader cdata(_cycler); +request_resident(Thread *current_thread) const { + CDReader cdata(_cycler, current_thread); bool resident = true; if (!cdata->_vertices.is_null() && - !cdata->_vertices.get_read_pointer()->request_resident()) { + !cdata->_vertices.get_read_pointer(current_thread)->request_resident(current_thread)) { resident = false; } if (is_composite() && cdata->_got_minmax) { if (!cdata->_mins.is_null() && - !cdata->_mins.get_read_pointer()->request_resident()) { + !cdata->_mins.get_read_pointer(current_thread)->request_resident(current_thread)) { resident = false; } if (!cdata->_maxs.is_null() && - !cdata->_maxs.get_read_pointer()->request_resident()) { + !cdata->_maxs.get_read_pointer(current_thread)->request_resident(current_thread)) { resident = false; } } @@ -2178,14 +2178,17 @@ check_minmax() const { */ int GeomPrimitivePipelineReader:: get_first_vertex() const { - if (_cdata->_vertices.is_null()) { + if (_vertices.is_null()) { return _cdata->_first_vertex; - } else if (_vertices_reader->get_num_rows() == 0) { - return 0; - } else { - GeomVertexReader index(_cdata->_vertices.get_read_pointer(), 0); - return index.get_data1i(); } + + size_t size = _vertices_cdata->_buffer.get_size(); + if (size == 0) { + return 0; + } + + GeomVertexReader index(_vertices, 0); + return index.get_data1i(); } /** @@ -2193,11 +2196,11 @@ get_first_vertex() const { */ int GeomPrimitivePipelineReader:: get_vertex(int i) const { - if (!_cdata->_vertices.is_null()) { + if (!_vertices.is_null()) { // The indexed case. - nassertr(i >= 0 && i < _vertices_reader->get_num_rows(), -1); + nassertr(i >= 0 && i < get_num_vertices(), -1); - GeomVertexReader index(_cdata->_vertices.get_read_pointer(), 0); + GeomVertexReader index(_vertices, 0); index.set_row_unsafe(i); return index.get_data1i(); diff --git a/panda/src/gobj/geomPrimitive.h b/panda/src/gobj/geomPrimitive.h index 9c24af0c45..41c575acd4 100644 --- a/panda/src/gobj/geomPrimitive.h +++ b/panda/src/gobj/geomPrimitive.h @@ -142,7 +142,7 @@ PUBLISHED: MAKE_PROPERTY(data_size_bytes, get_data_size_bytes); MAKE_PROPERTY(modified, get_modified); - bool request_resident() const; + bool request_resident(Thread *current_thread = Thread::get_current_thread()) const; INLINE bool check_valid(const GeomVertexData *vertex_data) const; @@ -162,7 +162,9 @@ PUBLISHED: */ INLINE CPT(GeomVertexArrayData) get_vertices() const; + INLINE CPT(GeomVertexArrayDataHandle) get_vertices_handle(Thread *current_thread) const; PT(GeomVertexArrayData) modify_vertices(int num_vertices = -1); + INLINE PT(GeomVertexArrayDataHandle) modify_vertices_handle(Thread *current_thread); void set_vertices(const GeomVertexArrayData *vertices, int num_vertices = -1); void set_nonindexed_vertices(int first_vertex, int num_vertices); @@ -347,10 +349,10 @@ private: */ class EXPCL_PANDA_GOBJ GeomPrimitivePipelineReader : public GeomEnums { public: - INLINE GeomPrimitivePipelineReader(const GeomPrimitive *object, Thread *current_thread); + INLINE GeomPrimitivePipelineReader(CPT(GeomPrimitive) object, Thread *current_thread); private: - INLINE GeomPrimitivePipelineReader(const GeomPrimitivePipelineReader ©); - INLINE void operator = (const GeomPrimitivePipelineReader ©); + GeomPrimitivePipelineReader(const GeomPrimitivePipelineReader ©) DELETED; + GeomPrimitivePipelineReader &operator = (const GeomPrimitivePipelineReader ©) DELETED_ASSIGN; public: INLINE ~GeomPrimitivePipelineReader(); @@ -375,7 +377,6 @@ public: INLINE UpdateSeq get_modified() const; bool check_valid(const GeomVertexDataPipelineReader *data_reader) const; INLINE int get_index_stride() const; - INLINE const GeomVertexArrayDataHandle *get_vertices_reader() const; INLINE const unsigned char *get_read_pointer(bool force) const; INLINE int get_strip_cut_index() const; INLINE CPTA_int get_ends() const; @@ -384,13 +385,15 @@ public: INLINE IndexBufferContext *prepare_now(PreparedGraphicsObjects *prepared_objects, GraphicsStateGuardianBase *gsg) const; + INLINE bool draw(GraphicsStateGuardianBase *gsg, bool force) const; private: CPT(GeomPrimitive) _object; - Thread *_current_thread; + Thread *const _current_thread; const GeomPrimitive::CData *_cdata; - CPT(GeomVertexArrayDataHandle) _vertices_reader; + CPT(GeomVertexArrayData) _vertices; + const GeomVertexArrayData::CData *_vertices_cdata; public: static TypeHandle get_class_type() { diff --git a/panda/src/gobj/geomVertexArrayData.I b/panda/src/gobj/geomVertexArrayData.I index 3ee8d9311f..0c2b9904ea 100644 --- a/panda/src/gobj/geomVertexArrayData.I +++ b/panda/src/gobj/geomVertexArrayData.I @@ -130,9 +130,20 @@ get_modified() const { * back into memory shortly; try again later. */ INLINE bool GeomVertexArrayData:: -request_resident() const { - CPT(GeomVertexArrayDataHandle) handle = get_handle(); - return handle->request_resident(); +request_resident(Thread *current_thread) const { +#ifdef DO_PIPELINING + CPT(GeomVertexArrayData::CData) cdata = _cycler.read_unlocked(current_thread); +#else + const GeomVertexArrayData::CData *cdata = _cycler.read_unlocked(current_thread); +#endif + + cdata->_rw_lock.acquire(); + + ((GeomVertexArrayData *)this)->mark_used(); + bool is_resident = (cdata->_buffer.get_read_pointer(false) != nullptr); + + cdata->_rw_lock.release(); + return is_resident; } /** @@ -143,9 +154,7 @@ request_resident() const { */ INLINE CPT(GeomVertexArrayDataHandle) GeomVertexArrayData:: get_handle(Thread *current_thread) const { - const CData *cdata = _cycler.read_unlocked(current_thread); - return new GeomVertexArrayDataHandle(this, current_thread, - cdata, false); + return new GeomVertexArrayDataHandle(this, current_thread); } /** @@ -156,9 +165,7 @@ get_handle(Thread *current_thread) const { */ INLINE PT(GeomVertexArrayDataHandle) GeomVertexArrayData:: modify_handle(Thread *current_thread) { - CData *cdata = _cycler.write_upstream(true, current_thread); - return new GeomVertexArrayDataHandle(this, current_thread, - cdata, true); + return new GeomVertexArrayDataHandle(PT(GeomVertexArrayData)(this), current_thread); } /** @@ -202,6 +209,17 @@ set_lru_size(size_t lru_size) { } } +/** + */ +INLINE void GeomVertexArrayData:: +mark_used() { + if ((int)get_lru_size() <= vertex_data_small_size) { + SimpleLruPage::mark_used_lru(&_small_lru); + } else { + SimpleLruPage::mark_used_lru(&_independent_lru); + } +} + /** * */ @@ -238,15 +256,40 @@ operator = (const GeomVertexArrayData::CData ©) { * */ INLINE GeomVertexArrayDataHandle:: -GeomVertexArrayDataHandle(const GeomVertexArrayData *object, - Thread *current_thread, - const GeomVertexArrayData::CData *cdata, - bool writable) : - _object((GeomVertexArrayData *)object), +GeomVertexArrayDataHandle(CPT(GeomVertexArrayData) object, + Thread *current_thread) : _current_thread(current_thread), - _cdata((GeomVertexArrayData::CData *)cdata), - _writable(writable) + _cdata((GeomVertexArrayData::CData *)object->_cycler.read_unlocked(current_thread)), + _writable(false) { + _object.swap(object); + +#ifdef _DEBUG + nassertv(_object->test_ref_count_nonzero()); +#endif // _DEBUG +#ifdef DO_PIPELINING + _cdata->ref(); +#endif // DO_PIPELINING + // We must grab the lock *after* we have incremented the reference count, + // above. + _cdata->_rw_lock.acquire(); +#ifdef DO_MEMORY_USAGE + MemoryUsage::update_type(this, get_class_type()); +#endif +} + +/** + * + */ +INLINE GeomVertexArrayDataHandle:: +GeomVertexArrayDataHandle(PT(GeomVertexArrayData) object, + Thread *current_thread) : + _current_thread(current_thread), + _cdata(object->_cycler.write_upstream(true, current_thread)), + _writable(true) +{ + _object.swap(object); + #ifdef _DEBUG nassertv(_object->test_ref_count_nonzero()); #endif // _DEBUG @@ -265,7 +308,8 @@ GeomVertexArrayDataHandle(const GeomVertexArrayData *object, * Don't attempt to copy these objects. */ INLINE GeomVertexArrayDataHandle:: -GeomVertexArrayDataHandle(const GeomVertexArrayDataHandle ©) { +GeomVertexArrayDataHandle(const GeomVertexArrayDataHandle ©) + : _current_thread(copy._current_thread) { nassertv(false); } @@ -448,7 +492,7 @@ get_subdata(size_t start, size_t size) const { */ void GeomVertexArrayDataHandle:: mark_used() const { - _object->set_lru_size(_object->get_lru_size()); + _object->mark_used(); } INLINE ostream & diff --git a/panda/src/gobj/geomVertexArrayData.h b/panda/src/gobj/geomVertexArrayData.h index 9766a9cbd1..2104e74b52 100644 --- a/panda/src/gobj/geomVertexArrayData.h +++ b/panda/src/gobj/geomVertexArrayData.h @@ -95,7 +95,7 @@ PUBLISHED: void output(ostream &out) const; void write(ostream &out, int indent_level = 0) const; - INLINE bool request_resident() const; + INLINE bool request_resident(Thread *current_thread = Thread::get_current_thread()) const; INLINE CPT(GeomVertexArrayDataHandle) get_handle(Thread *current_thread = Thread::get_current_thread()) const; INLINE PT(GeomVertexArrayDataHandle) modify_handle(Thread *current_thread = Thread::get_current_thread()); @@ -124,6 +124,7 @@ public: private: INLINE void set_lru_size(size_t lru_size); + INLINE void mark_used(); void clear_prepared(PreparedGraphicsObjects *prepared_objects); void reverse_data_endianness(unsigned char *dest, @@ -230,6 +231,7 @@ private: friend class GeomVertexData; friend class PreparedGraphicsObjects; friend class GeomVertexArrayDataHandle; + friend class GeomPrimitivePipelineReader; }; /** @@ -246,10 +248,10 @@ private: */ class EXPCL_PANDA_GOBJ GeomVertexArrayDataHandle : public ReferenceCount, public GeomEnums { private: - INLINE GeomVertexArrayDataHandle(const GeomVertexArrayData *object, - Thread *current_thread, - const GeomVertexArrayData::CData *_cdata, - bool writable); + INLINE GeomVertexArrayDataHandle(CPT(GeomVertexArrayData) object, + Thread *current_thread); + INLINE GeomVertexArrayDataHandle(PT(GeomVertexArrayData) object, + Thread *current_thread); INLINE GeomVertexArrayDataHandle(const GeomVertexArrayDataHandle &); INLINE void operator = (const GeomVertexArrayDataHandle &); @@ -316,7 +318,7 @@ PUBLISHED: private: PT(GeomVertexArrayData) _object; - Thread *_current_thread; + Thread *const _current_thread; GeomVertexArrayData::CData *_cdata; bool _writable; @@ -333,6 +335,11 @@ public: private: static TypeHandle _type_handle; + friend class Geom; + friend class GeomPrimitive; + friend class GeomVertexData; + friend class GeomVertexDataPipelineReader; + friend class GeomVertexDataPipelineWriter; friend class GeomVertexArrayData; }; diff --git a/panda/src/gobj/geomVertexData.I b/panda/src/gobj/geomVertexData.I index dfb2138c1a..888db97c88 100644 --- a/panda/src/gobj/geomVertexData.I +++ b/panda/src/gobj/geomVertexData.I @@ -147,6 +147,17 @@ get_array(int i) const { return cdata->_arrays[i].get_read_pointer(); } +/** + * Equivalent to get_array(i).get_handle(). + */ +INLINE CPT(GeomVertexArrayDataHandle) GeomVertexData:: +get_array_handle(int i) const { + Thread *current_thread = Thread::get_current_thread(); + CDReader cdata(_cycler, current_thread); + nassertr(i >= 0 && i < (int)cdata->_arrays.size(), NULL); + return new GeomVertexArrayDataHandle(cdata->_arrays[i].get_read_pointer(), current_thread); +} + /** * Returns a modifiable pointer to the indicated vertex array, so that * application code may directly manipulate the data. You should avoid @@ -162,6 +173,16 @@ modify_array(int i) { return writer.modify_array(i); } +/** + * Equivalent to modify_array(i).modify_handle(). + */ +INLINE PT(GeomVertexArrayDataHandle) GeomVertexData:: +modify_array_handle(int i) { + Thread *current_thread = Thread::get_current_thread(); + GeomVertexDataPipelineWriter writer(this, true, current_thread); + return new GeomVertexArrayDataHandle(writer.modify_array(i), current_thread); +} + /** * Replaces the indicated vertex data array with a completely new array. You * should be careful that the new array has the same length and format as the @@ -575,6 +596,17 @@ CData(const GeomVertexData::CData ©) : { } +/** + * + */ +INLINE GeomVertexDataPipelineBase:: +GeomVertexDataPipelineBase(Thread *current_thread) : + _object(nullptr), + _current_thread(current_thread), + _cdata(nullptr) +{ +} + /** * */ @@ -600,11 +632,15 @@ GeomVertexDataPipelineBase(GeomVertexData *object, INLINE GeomVertexDataPipelineBase:: ~GeomVertexDataPipelineBase() { #ifdef _DEBUG - nassertv(_object->test_ref_count_nonzero()); + if (_object != nullptr) { + nassertv(_object->test_ref_count_nonzero()); + } #endif // _DEBUG #ifdef DO_PIPELINING - unref_delete((CycleData *)_cdata); + if (_cdata != nullptr) { + unref_delete((CycleData *)_cdata); + } #endif // DO_PIPELINING #ifdef _DEBUG @@ -694,6 +730,16 @@ get_modified() const { return _cdata->_modified; } +/** + * + */ +INLINE GeomVertexDataPipelineReader:: +GeomVertexDataPipelineReader(Thread *current_thread) : + GeomVertexDataPipelineBase(current_thread), + _got_array_readers(false) +{ +} + /** * */ @@ -706,33 +752,23 @@ GeomVertexDataPipelineReader(const GeomVertexData *object, { } -/** - * Don't attempt to copy these objects. - */ -INLINE GeomVertexDataPipelineReader:: -GeomVertexDataPipelineReader(const GeomVertexDataPipelineReader ©) : - GeomVertexDataPipelineBase(copy) -{ - nassertv(false); -} - -/** - * Don't attempt to copy these objects. - */ -INLINE void GeomVertexDataPipelineReader:: -operator = (const GeomVertexDataPipelineReader &) { - nassertv(false); -} - /** * */ -INLINE GeomVertexDataPipelineReader:: -~GeomVertexDataPipelineReader() { - if (_got_array_readers) { - delete_array_readers(); +INLINE void GeomVertexDataPipelineReader:: +set_object(CPT(GeomVertexData) object) { +#ifdef DO_PIPELINING + if (_cdata != NULL) { + unref_delete((CycleData *)_cdata); } - // _object->_cycler.release_read(_cdata); +#endif // DO_PIPELINING + _array_readers.clear(); + + _object.swap(object); + _cdata = (GeomVertexData::CData *)_object->_cycler.read_unlocked(_current_thread); + _got_array_readers = false; + + _cdata->ref(); } /** @@ -819,24 +855,6 @@ GeomVertexDataPipelineWriter(GeomVertexData *object, bool force_to_0, #endif // _DEBUG } -/** - * Don't attempt to copy these objects. - */ -INLINE GeomVertexDataPipelineWriter:: -GeomVertexDataPipelineWriter(const GeomVertexDataPipelineWriter ©) : - GeomVertexDataPipelineBase(copy) -{ - nassertv(false); -} - -/** - * Don't attempt to copy these objects. - */ -INLINE void GeomVertexDataPipelineWriter:: -operator = (const GeomVertexDataPipelineWriter &) { - nassertv(false); -} - /** * */ diff --git a/panda/src/gobj/geomVertexData.cxx b/panda/src/gobj/geomVertexData.cxx index 6b73e4fe0f..cfa47d9949 100644 --- a/panda/src/gobj/geomVertexData.cxx +++ b/panda/src/gobj/geomVertexData.cxx @@ -516,9 +516,7 @@ copy_from(const GeomVertexData *source, bool keep_data_objects, if (keep_data_objects) { // Copy the data, but keep the same GeomVertexArrayData object. - PT(GeomVertexArrayData) dest_data = modify_array(dest_i); - CPT(GeomVertexArrayData) source_data = source->get_array(source_i); - dest_data->modify_handle()->copy_data_from(source_data->get_handle()); + modify_array_handle(dest_i)->copy_data_from(source->get_array_handle(source_i)); } else { // Copy the GeomVertexArrayData object. if (get_array(dest_i) != source->get_array(source_i)) { @@ -533,13 +531,16 @@ copy_from(const GeomVertexData *source, bool keep_data_objects, } // Now make sure the arrays we didn't share are all filled in. - reserve_num_rows(num_rows); - set_num_rows(num_rows); + { + GeomVertexDataPipelineWriter writer(this, true, Thread::get_current_thread()); + writer.check_array_writers(); + writer.reserve_num_rows(num_rows); + writer.set_num_rows(num_rows); + } // Now go back through and copy any data that's left over. for (source_i = 0; source_i < num_arrays; ++source_i) { - CPT(GeomVertexArrayData) array_obj = source->get_array(source_i); - CPT(GeomVertexArrayDataHandle) array_handle = array_obj->get_handle(); + CPT(GeomVertexArrayDataHandle) array_handle = source->get_array_handle(source_i); const unsigned char *array_data = array_handle->get_read_pointer(true); const GeomVertexArrayFormat *source_array_format = source_format->get_array(source_i); int num_columns = source_array_format->get_num_columns(); @@ -557,8 +558,7 @@ copy_from(const GeomVertexData *source, bool keep_data_objects, if (dest_column->is_bytewise_equivalent(*source_column)) { // We can do a quick bytewise copy. - PT(GeomVertexArrayData) dest_array_obj = modify_array(dest_i); - PT(GeomVertexArrayDataHandle) dest_handle = dest_array_obj->modify_handle(); + PT(GeomVertexArrayDataHandle) dest_handle = modify_array_handle(dest_i); unsigned char *dest_array_data = dest_handle->get_write_pointer(); bytewise_copy(dest_array_data + dest_column->get_start(), @@ -569,8 +569,7 @@ copy_from(const GeomVertexData *source, bool keep_data_objects, } else if (dest_column->is_packed_argb() && source_column->is_uint8_rgba()) { // A common special case: OpenGL color to DirectX color. - PT(GeomVertexArrayData) dest_array_obj = modify_array(dest_i); - PT(GeomVertexArrayDataHandle) dest_handle = dest_array_obj->modify_handle(); + PT(GeomVertexArrayDataHandle) dest_handle = modify_array_handle(dest_i); unsigned char *dest_array_data = dest_handle->get_write_pointer(); uint8_rgba_to_packed_argb @@ -582,8 +581,7 @@ copy_from(const GeomVertexData *source, bool keep_data_objects, } else if (dest_column->is_uint8_rgba() && source_column->is_packed_argb()) { // Another common special case: DirectX color to OpenGL color. - PT(GeomVertexArrayData) dest_array_obj = modify_array(dest_i); - PT(GeomVertexArrayDataHandle) dest_handle = dest_array_obj->modify_handle(); + PT(GeomVertexArrayDataHandle) dest_handle = modify_array_handle(dest_i); unsigned char *dest_array_data = dest_handle->get_write_pointer(); packed_argb_to_uint8_rgba @@ -700,12 +698,10 @@ copy_row_from(int dest_row, const GeomVertexData *source, int num_arrays = source_format->get_num_arrays(); for (int i = 0; i < num_arrays; ++i) { - PT(GeomVertexArrayData) dest_array_obj = modify_array(i); - PT(GeomVertexArrayDataHandle) dest_handle = dest_array_obj->modify_handle(); + PT(GeomVertexArrayDataHandle) dest_handle = modify_array_handle(i); unsigned char *dest_array_data = dest_handle->get_write_pointer(); - CPT(GeomVertexArrayData) source_array_obj = source->get_array(i); - CPT(GeomVertexArrayDataHandle) source_array_handle = source_array_obj->get_handle(); + CPT(GeomVertexArrayDataHandle) source_array_handle = source->get_array_handle(i); const unsigned char *source_array_data = source_array_handle->get_read_pointer(true); const GeomVertexArrayFormat *array_format = source_format->get_array(i); @@ -1144,8 +1140,7 @@ do_set_color(GeomVertexData *vdata, const LColor &color) { packer->set_data4f(buffer, color); #endif - PT(GeomVertexArrayDataHandle) handle = - vdata->modify_array(array_index)->modify_handle(); + PT(GeomVertexArrayDataHandle) handle = vdata->modify_array_handle(array_index); unsigned char *write_ptr = handle->get_write_pointer(); unsigned char *end_ptr = write_ptr + handle->get_data_size_bytes(); write_ptr += column->get_start(); @@ -1586,7 +1581,7 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) { } // Then apply the transforms. - CPT(TransformBlendTable) tb_table = cdata->_transform_blend_table.get_read_pointer(); + CPT(TransformBlendTable) tb_table = cdata->_transform_blend_table.get_read_pointer(current_thread); if (tb_table != (TransformBlendTable *)NULL) { // Recompute all the blends up front, so we don't have to test each one // for staleness at each vertex. @@ -1617,7 +1612,8 @@ update_animated_vertices(GeomVertexData::CData *cdata, Thread *current_thread) { if (blend_array_format->get_stride() == 2 && blend_array_format->get_column(0)->get_component_bytes() == 2) { // The blend indices are a table of ushorts. Optimize this common case. - CPT(GeomVertexArrayDataHandle) blend_array_handle = cdata->_arrays[blend_array_index].get_read_pointer()->get_handle(current_thread); + CPT(GeomVertexArrayDataHandle) blend_array_handle = + new GeomVertexArrayDataHandle(cdata->_arrays[blend_array_index].get_read_pointer(current_thread), current_thread); const unsigned short *blendt = (const unsigned short *)blend_array_handle->get_read_pointer(true); size_t ci; @@ -2399,24 +2395,12 @@ make_array_readers() { _array_readers.reserve(_cdata->_arrays.size()); GeomVertexData::Arrays::const_iterator ai; for (ai = _cdata->_arrays.begin(); ai != _cdata->_arrays.end(); ++ai) { - CPT(GeomVertexArrayData) array_obj = (*ai).get_read_pointer(); - _array_readers.push_back(array_obj->get_handle(_current_thread)); + _array_readers.push_back(new GeomVertexArrayDataHandle((*ai).get_read_pointer(_current_thread), _current_thread)); } _got_array_readers = true; } -/** - * - */ -void GeomVertexDataPipelineReader:: -delete_array_readers() { - nassertv(_got_array_readers); - - _array_readers.clear(); - _got_array_readers = false; -} - /** * */ @@ -2610,7 +2594,7 @@ set_array(int i, const GeomVertexArrayData *array) { _cdata->_animated_vertices_modified = UpdateSeq(); if (_got_array_writers) { - _array_writers[i] = _cdata->_arrays[i].get_write_pointer()->modify_handle(_current_thread); + _array_writers[i] = new GeomVertexArrayDataHandle(_cdata->_arrays[i].get_write_pointer(), _current_thread); } } @@ -2624,8 +2608,7 @@ make_array_writers() { _array_writers.reserve(_cdata->_arrays.size()); GeomVertexData::Arrays::iterator ai; for (ai = _cdata->_arrays.begin(); ai != _cdata->_arrays.end(); ++ai) { - PT(GeomVertexArrayData) array_obj = (*ai).get_write_pointer(); - _array_writers.push_back(array_obj->modify_handle(_current_thread)); + _array_writers.push_back(new GeomVertexArrayDataHandle((*ai).get_write_pointer(), _current_thread)); } _object->clear_cache_stage(); diff --git a/panda/src/gobj/geomVertexData.h b/panda/src/gobj/geomVertexData.h index cfb592529d..0261c05a93 100644 --- a/panda/src/gobj/geomVertexData.h +++ b/panda/src/gobj/geomVertexData.h @@ -107,8 +107,10 @@ PUBLISHED: INLINE int get_num_arrays() const; INLINE CPT(GeomVertexArrayData) get_array(int i) const; + INLINE CPT(GeomVertexArrayDataHandle) get_array_handle(int i) const; MAKE_SEQ(get_arrays, get_num_arrays, get_array); INLINE PT(GeomVertexArrayData) modify_array(int i); + INLINE PT(GeomVertexArrayDataHandle) modify_array_handle(int i); INLINE void set_array(int i, const GeomVertexArrayData *array); MAKE_SEQ_PROPERTY(arrays, get_num_arrays, get_array, set_array); @@ -402,6 +404,7 @@ private: */ class EXPCL_PANDA_GOBJ GeomVertexDataPipelineBase : public GeomEnums { protected: + INLINE GeomVertexDataPipelineBase(Thread *current_thread); INLINE GeomVertexDataPipelineBase(GeomVertexData *object, Thread *current_thread, GeomVertexData::CData *cdata); @@ -426,7 +429,7 @@ public: protected: PT(GeomVertexData) _object; - Thread *_current_thread; + Thread *const _current_thread; GeomVertexData::CData *_cdata; }; @@ -436,15 +439,16 @@ protected: */ class EXPCL_PANDA_GOBJ GeomVertexDataPipelineReader : public GeomVertexDataPipelineBase { public: + INLINE GeomVertexDataPipelineReader(Thread *current_thread); INLINE GeomVertexDataPipelineReader(const GeomVertexData *object, Thread *current_thread); private: - INLINE GeomVertexDataPipelineReader(const GeomVertexDataPipelineReader ©); - INLINE void operator = (const GeomVertexDataPipelineReader ©); + GeomVertexDataPipelineReader(const GeomVertexDataPipelineReader ©) DELETED; + GeomVertexDataPipelineReader &operator = (const GeomVertexDataPipelineReader ©) DELETED_ASSIGN; public: - INLINE ~GeomVertexDataPipelineReader(); ALLOC_DELETED_CHAIN(GeomVertexDataPipelineReader); + INLINE void set_object(CPT(GeomVertexData) object); INLINE const GeomVertexData *get_object() const; INLINE void check_array_readers() const; @@ -480,7 +484,6 @@ public: private: void make_array_readers(); - void delete_array_readers(); bool _got_array_readers; typedef pvector ArrayReaders; @@ -507,8 +510,8 @@ public: INLINE GeomVertexDataPipelineWriter(GeomVertexData *object, bool force_to_0, Thread *current_thread); private: - INLINE GeomVertexDataPipelineWriter(const GeomVertexDataPipelineWriter ©); - INLINE void operator = (const GeomVertexDataPipelineWriter ©); + GeomVertexDataPipelineWriter(const GeomVertexDataPipelineWriter ©) DELETED; + GeomVertexDataPipelineWriter &operator = (const GeomVertexDataPipelineWriter ©) DELETED_ASSIGN; public: INLINE ~GeomVertexDataPipelineWriter(); diff --git a/panda/src/gobj/geomVertexWriter.cxx b/panda/src/gobj/geomVertexWriter.cxx index b80a30fe67..ef05c3bc44 100644 --- a/panda/src/gobj/geomVertexWriter.cxx +++ b/panda/src/gobj/geomVertexWriter.cxx @@ -14,7 +14,7 @@ #include "geomVertexWriter.h" -#ifndef NDEBUG +#ifdef _DEBUG // This is defined just for the benefit of having something non-NULL to // return from a nassertr() call. unsigned char GeomVertexWriter::empty_buffer[100] = { 0 }; diff --git a/panda/src/gobj/geomVertexWriter.h b/panda/src/gobj/geomVertexWriter.h index 815ca6435f..aaedaf565b 100644 --- a/panda/src/gobj/geomVertexWriter.h +++ b/panda/src/gobj/geomVertexWriter.h @@ -212,7 +212,7 @@ private: int _start_row; -#ifndef NDEBUG +#ifdef _DEBUG // This is defined just for the benefit of having something non-NULL to // return from a nassertr() call. static unsigned char empty_buffer[100]; diff --git a/panda/src/grutil/shaderTerrainMesh.cxx b/panda/src/grutil/shaderTerrainMesh.cxx index 8c2d03cdd4..c01c851345 100644 --- a/panda/src/grutil/shaderTerrainMesh.cxx +++ b/panda/src/grutil/shaderTerrainMesh.cxx @@ -528,7 +528,7 @@ void ShaderTerrainMesh::add_for_draw(CullTraverser *trav, CullTraverserData &dat state = state->set_attrib(current_shader_attrib, 10000); // Emit chunk - CullableObject *object = new CullableObject(_chunk_geom, state, modelview_transform); + CullableObject *object = new CullableObject(_chunk_geom, move(state), move(modelview_transform)); trav->get_cull_handler()->record_object(object, trav); // After rendering, increment the view index diff --git a/panda/src/pgraph/cullTraverserData.cxx b/panda/src/pgraph/cullTraverserData.cxx index d5ad3cba4f..b6bb5911f4 100644 --- a/panda/src/pgraph/cullTraverserData.cxx +++ b/panda/src/pgraph/cullTraverserData.cxx @@ -101,7 +101,7 @@ apply_transform_and_state(CullTraverser *trav, if (clip_plane_cull) { _cull_planes = _cull_planes->apply_state(trav, this, (const ClipPlaneAttrib *)node_state->get_attrib(ClipPlaneAttrib::get_class_slot()), - DCAST(ClipPlaneAttrib, off_clip_planes), + (const ClipPlaneAttrib *)off_clip_planes, (const OccluderEffect *)node_effects->get_effect(OccluderEffect::get_class_type())); } } diff --git a/panda/src/pgraph/cullableObject.I b/panda/src/pgraph/cullableObject.I index 242496587f..2aae972296 100644 --- a/panda/src/pgraph/cullableObject.I +++ b/panda/src/pgraph/cullableObject.I @@ -26,11 +26,11 @@ CullableObject() { * render state and transform. */ INLINE CullableObject:: -CullableObject(const Geom *geom, const RenderState *state, - const TransformState *internal_transform) : - _geom(geom), - _state(state), - _internal_transform(internal_transform) +CullableObject(CPT(Geom) geom, CPT(RenderState) state, + CPT(TransformState) internal_transform) : + _geom(move(geom)), + _state(move(state)), + _internal_transform(move(internal_transform)) { #ifdef DO_MEMORY_USAGE MemoryUsage::update_type(this, get_class_type()); @@ -135,6 +135,21 @@ draw_inline(GraphicsStateGuardianBase *gsg, bool force, Thread *current_thread) _geom->draw(gsg, _munger, _munged_data, force, current_thread); } +/** + * Invokes the draw callback, assuming one is set. Crashes if not. + */ +INLINE void CullableObject:: +draw_callback(GraphicsStateGuardianBase *gsg, bool force, Thread *current_thread) { + gsg->clear_before_callback(); + gsg->set_state_and_transform(_state, _internal_transform); + GeomDrawCallbackData cbdata(this, gsg, force); + _draw_callback->do_callback(&cbdata); + if (cbdata.get_lost_state()) { + // Tell the GSG to forget its state. + gsg->clear_state_and_transform(); + } +} + /** * */ diff --git a/panda/src/pgraph/cullableObject.h b/panda/src/pgraph/cullableObject.h index 82fd0df3a5..aa4a3af3c2 100644 --- a/panda/src/pgraph/cullableObject.h +++ b/panda/src/pgraph/cullableObject.h @@ -46,8 +46,8 @@ class EXPCL_PANDA_PGRAPH CullableObject { public: INLINE CullableObject(); - INLINE CullableObject(const Geom *geom, const RenderState *state, - const TransformState *internal_transform); + INLINE CullableObject(CPT(Geom) geom, CPT(RenderState) state, + CPT(TransformState) internal_transform); INLINE CullableObject(const CullableObject ©); INLINE void operator = (const CullableObject ©); @@ -63,6 +63,11 @@ public: INLINE void set_draw_callback(CallbackObject *draw_callback); + INLINE void draw_inline(GraphicsStateGuardianBase *gsg, + bool force, Thread *current_thread); + INLINE void draw_callback(GraphicsStateGuardianBase *gsg, + bool force, Thread *current_thread); + public: ALLOC_DELETED_CHAIN(CullableObject); @@ -82,9 +87,6 @@ private: static CPT(RenderState) get_flash_cpu_state(); static CPT(RenderState) get_flash_hardware_state(); - INLINE void draw_inline(GraphicsStateGuardianBase *gsg, - bool force, Thread *current_thread); - private: // This class is used internally by munge_points_to_quads(). class PointData { diff --git a/panda/src/pgraph/geomNode.cxx b/panda/src/pgraph/geomNode.cxx index f0000d4ebb..7b850fafc6 100644 --- a/panda/src/pgraph/geomNode.cxx +++ b/panda/src/pgraph/geomNode.cxx @@ -515,7 +515,7 @@ add_for_draw(CullTraverser *trav, CullTraverserData &data) { CPT(TransformState) internal_transform = data.get_internal_transform(trav); for (int i = 0; i < num_geoms; i++) { - const Geom *geom = geoms.get_geom(i); + CPT(Geom) geom = geoms.get_geom(i); if (geom->is_empty()) { continue; } @@ -558,7 +558,7 @@ add_for_draw(CullTraverser *trav, CullTraverserData &data) { } CullableObject *object = - new CullableObject(geom, state, internal_transform); + new CullableObject(move(geom), move(state), internal_transform); trav->get_cull_handler()->record_object(object, trav); } } diff --git a/panda/src/pgraph/geomTransformer.cxx b/panda/src/pgraph/geomTransformer.cxx index 10648b7686..04207356bd 100644 --- a/panda/src/pgraph/geomTransformer.cxx +++ b/panda/src/pgraph/geomTransformer.cxx @@ -1243,16 +1243,14 @@ apply_collect_changes() { void GeomTransformer::NewCollectedData:: append_vdata(const GeomVertexData *vdata, int vertex_offset) { for (int i = 0; i < vdata->get_num_arrays(); ++i) { - PT(GeomVertexArrayData) new_array = _new_data->modify_array(i); - CPT(GeomVertexArrayData) old_array = vdata->get_array(i); + PT(GeomVertexArrayDataHandle) new_handle = _new_data->modify_array_handle(i); + CPT(GeomVertexArrayDataHandle) old_handle = vdata->get_array_handle(i); size_t stride = (size_t)_new_format->get_array(i)->get_stride(); size_t start_byte = (size_t)vertex_offset * stride; - size_t copy_bytes = old_array->get_data_size_bytes(); - nassertv(start_byte + copy_bytes <= new_array->get_data_size_bytes()); + size_t copy_bytes = old_handle->get_data_size_bytes(); + nassertv(start_byte + copy_bytes <= new_handle->get_data_size_bytes()); - new_array->modify_handle()->copy_subdata_from - (start_byte, copy_bytes, - old_array->get_handle(), 0, copy_bytes); + new_handle->copy_subdata_from(start_byte, copy_bytes, old_handle, 0, copy_bytes); } // Also, copy the animation data (if any). This means combining transform diff --git a/panda/src/pgraph/workingNodePath.I b/panda/src/pgraph/workingNodePath.I index 83010f2009..b74921827b 100644 --- a/panda/src/pgraph/workingNodePath.I +++ b/panda/src/pgraph/workingNodePath.I @@ -43,10 +43,10 @@ WorkingNodePath(const WorkingNodePath ©) : * traversal to the next node. */ INLINE WorkingNodePath:: -WorkingNodePath(const WorkingNodePath &parent, PandaNode *child) { - _next = &parent; - _start = (NodePathComponent *)NULL; - _node = child; +WorkingNodePath(const WorkingNodePath &parent, PandaNode *child) : + _next(&parent), + _start(nullptr), + _node(child) { nassertv(_node != _next->_node); } diff --git a/panda/src/pipeline/thread.I b/panda/src/pipeline/thread.I index b721486c72..ba460bc3bf 100644 --- a/panda/src/pipeline/thread.I +++ b/panda/src/pipeline/thread.I @@ -73,7 +73,16 @@ get_unique_id() const { */ INLINE int Thread:: get_pipeline_stage() const { - return _pipeline_stage; +#if !defined(_DEBUG) && defined(__has_builtin) && __has_builtin(__builtin_assume) + // Because this is a signed int, this results in a sign extend on x86-64. + // However, since we guarantee that this is never less than zero, clang + // offers a nice way to avoid that. + int pipeline_stage = _pipeline_stage; + __builtin_assume(_pipeline_stage >= 0); + return pipeline_stage; +#else + return pipeline_stage; +#endif } /** diff --git a/panda/src/putil/copyOnWritePointer.I b/panda/src/putil/copyOnWritePointer.I index a44731bcbc..9e996355fa 100644 --- a/panda/src/putil/copyOnWritePointer.I +++ b/panda/src/putil/copyOnWritePointer.I @@ -166,7 +166,7 @@ operator < (const CopyOnWritePointer &other) const { * This flavor of the method is written for the non-threaded case. */ INLINE const CopyOnWriteObject *CopyOnWritePointer:: -get_read_pointer() const { +get_read_pointer(Thread *current_thread) const { return _cow_object; } #endif // COW_THREADED @@ -362,8 +362,14 @@ operator = (PointerTo &&from) NOEXCEPT { */ template INLINE CPT(TYPENAME CopyOnWritePointerTo::To) CopyOnWritePointerTo:: -get_read_pointer() const { - return (const To *)(CopyOnWritePointer::get_read_pointer().p()); +get_read_pointer(Thread *current_thread) const { + // This is necessary because we don't currently have a way to cast between + // two compatible PointerTo types without losing the reference count. + CPT(TYPENAME CopyOnWritePointerTo::To) to; + CPT(CopyOnWriteObject) from = CopyOnWritePointer::get_read_pointer(current_thread); + to.cheat() = (const To *)from.p(); + from.cheat() = nullptr; + return to; } #else // COW_THREADED /** @@ -371,8 +377,8 @@ get_read_pointer() const { */ template INLINE const TYPENAME CopyOnWritePointerTo::To *CopyOnWritePointerTo:: -get_read_pointer() const { - return (const To *)CopyOnWritePointer::get_read_pointer(); +get_read_pointer(Thread *current_thread) const { + return (const To *)CopyOnWritePointer::get_read_pointer(current_thread); } #endif // COW_THREADED #endif // CPPPARSER @@ -385,7 +391,13 @@ get_read_pointer() const { template INLINE PT(TYPENAME CopyOnWritePointerTo::To) CopyOnWritePointerTo:: get_write_pointer() { - return (To *)(CopyOnWritePointer::get_write_pointer().p()); + // This is necessary because we don't currently have a way to cast between + // two compatible PointerTo types without losing the reference count. + PT(TYPENAME CopyOnWritePointerTo::To) to; + PT(CopyOnWriteObject) from = CopyOnWritePointer::get_write_pointer(); + to.cheat() = (To *)from.p(); + from.cheat() = nullptr; + return to; } #else // COW_THREADED /** diff --git a/panda/src/putil/copyOnWritePointer.cxx b/panda/src/putil/copyOnWritePointer.cxx index e2396e84a9..03ed76e24b 100644 --- a/panda/src/putil/copyOnWritePointer.cxx +++ b/panda/src/putil/copyOnWritePointer.cxx @@ -23,13 +23,11 @@ * This flavor of the method is written for the threaded case. */ CPT(CopyOnWriteObject) CopyOnWritePointer:: -get_read_pointer() const { +get_read_pointer(Thread *current_thread) const { if (_cow_object == (CopyOnWriteObject *)NULL) { return NULL; } - Thread *current_thread = Thread::get_current_thread(); - MutexHolder holder(_cow_object->_lock_mutex); while (_cow_object->_lock_status == CopyOnWriteObject::LS_locked_write) { if (_cow_object->_locking_thread == current_thread) { diff --git a/panda/src/putil/copyOnWritePointer.h b/panda/src/putil/copyOnWritePointer.h index 1a7f0e099d..2178b6b433 100644 --- a/panda/src/putil/copyOnWritePointer.h +++ b/panda/src/putil/copyOnWritePointer.h @@ -48,10 +48,10 @@ public: INLINE bool operator < (const CopyOnWritePointer &other) const; #ifdef COW_THREADED - CPT(CopyOnWriteObject) get_read_pointer() const; + CPT(CopyOnWriteObject) get_read_pointer(Thread *current_thread) const; PT(CopyOnWriteObject) get_write_pointer(); #else - INLINE const CopyOnWriteObject *get_read_pointer() const; + INLINE const CopyOnWriteObject *get_read_pointer(Thread *current_thread) const; INLINE CopyOnWriteObject *get_write_pointer(); #endif // COW_THREADED @@ -93,10 +93,10 @@ public: #endif #ifdef COW_THREADED - INLINE CPT(To) get_read_pointer() const; + INLINE CPT(To) get_read_pointer(Thread *current_thread = Thread::get_current_thread()) const; INLINE PT(To) get_write_pointer(); #else - INLINE const To *get_read_pointer() const; + INLINE const To *get_read_pointer(Thread *current_thread = Thread::get_current_thread()) const; INLINE To *get_write_pointer(); #endif // COW_THREADED diff --git a/panda/src/text/textAssembler.cxx b/panda/src/text/textAssembler.cxx index 4829576407..3c8550a6a5 100644 --- a/panda/src/text/textAssembler.cxx +++ b/panda/src/text/textAssembler.cxx @@ -1142,7 +1142,6 @@ generate_quads(GeomNode *geom_node, const QuadMap &quad_map) { } else { tris->set_index_type(GeomEnums::NT_uint16); } - PT(GeomVertexArrayData) indices = tris->modify_vertices(); int i = 0; @@ -1150,9 +1149,10 @@ generate_quads(GeomNode *geom_node, const QuadMap &quad_map) { // bottleneck. So, I've written this out the hard way instead. Two // versions of the loop: one for 32-bit indices, one for 16-bit. { - PT(GeomVertexArrayDataHandle) vtx_handle = vdata->modify_array(0)->modify_handle(); + PT(GeomVertexArrayDataHandle) vtx_handle = vdata->modify_array_handle(0); vtx_handle->unclean_set_num_rows(quads.size() * 4); + Thread *current_thread = Thread::get_current_thread(); unsigned char *write_ptr = vtx_handle->get_write_pointer(); size_t stride = format->get_array(0)->get_stride() / sizeof(PN_float32); @@ -1163,7 +1163,7 @@ generate_quads(GeomNode *geom_node, const QuadMap &quad_map) { if (tris->get_index_type() == GeomEnums::NT_uint32) { // 32-bit index case. - PT(GeomVertexArrayDataHandle) idx_handle = indices->modify_handle(); + PT(GeomVertexArrayDataHandle) idx_handle = tris->modify_vertices_handle(current_thread); idx_handle->unclean_set_num_rows(quads.size() * 6); uint32_t *idx_ptr = (uint32_t *)idx_handle->get_write_pointer(); @@ -1219,7 +1219,7 @@ generate_quads(GeomNode *geom_node, const QuadMap &quad_map) { } } else { // 16-bit index case. - PT(GeomVertexArrayDataHandle) idx_handle = indices->modify_handle(); + PT(GeomVertexArrayDataHandle) idx_handle = tris->modify_vertices_handle(current_thread); idx_handle->unclean_set_num_rows(quads.size() * 6); uint16_t *idx_ptr = (uint16_t *)idx_handle->get_write_pointer(); From 351627a0e30e05817581bfcc6decbde2d052c937 Mon Sep 17 00:00:00 2001 From: deflected Date: Tue, 21 Feb 2017 02:21:50 +0100 Subject: [PATCH 059/254] glgsg: fix false positive for buffer texture detection on OpenGL 3.0 --- panda/src/glstuff/glGraphicsStateGuardian_src.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index c83c9e52c0..5c73772b50 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -929,7 +929,7 @@ reset() { #endif #ifndef OPENGLES - if (is_at_least_gl_version(3, 0)) { + if (is_at_least_gl_version(3, 1)) { _glTexBuffer = (PFNGLTEXBUFFERPROC)get_extension_func("glTexBuffer"); _supports_buffer_texture = true; From 1eaa1bcf706eb280654c42c3f99dc5df2cee93d7 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 21 Feb 2017 02:27:28 +0100 Subject: [PATCH 060/254] Fix error when not compiling with clang --- panda/src/pipeline/thread.I | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda/src/pipeline/thread.I b/panda/src/pipeline/thread.I index ba460bc3bf..b6ae48469a 100644 --- a/panda/src/pipeline/thread.I +++ b/panda/src/pipeline/thread.I @@ -81,7 +81,7 @@ get_pipeline_stage() const { __builtin_assume(_pipeline_stage >= 0); return pipeline_stage; #else - return pipeline_stage; + return _pipeline_stage; #endif } From 8ec4da2824c166c9242bc218876970836c584781 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 21 Feb 2017 02:43:56 +0100 Subject: [PATCH 061/254] Compile fixes for compilers that don't support all C++11 features --- makepanda/makepanda.py | 2 +- panda/src/gobj/geom.h | 2 +- panda/src/gobj/geomPrimitive.h | 2 +- panda/src/gobj/geomVertexData.h | 14 +++++--------- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index adc2064f21..f782898df5 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -1290,7 +1290,7 @@ def CompileCxx(obj,src,opts): cmd += " -fno-strict-aliasing" if optlevel >= 3: - cmd += " -ffast-math -fno-stack-protector -fno-stack-check" + cmd += " -ffast-math -fno-stack-protector" if optlevel == 3: # Fast math is nice, but we'd like to see NaN in dev builds. cmd += " -fno-finite-math-only" diff --git a/panda/src/gobj/geom.h b/panda/src/gobj/geom.h index 0ed8cc5193..a1408878d8 100644 --- a/panda/src/gobj/geom.h +++ b/panda/src/gobj/geom.h @@ -435,7 +435,7 @@ public: private: const Geom *_object; - Thread *const _current_thread; + Thread *_current_thread; const Geom::CData *_cdata; public: diff --git a/panda/src/gobj/geomPrimitive.h b/panda/src/gobj/geomPrimitive.h index 41c575acd4..0880e77c7a 100644 --- a/panda/src/gobj/geomPrimitive.h +++ b/panda/src/gobj/geomPrimitive.h @@ -389,7 +389,7 @@ public: private: CPT(GeomPrimitive) _object; - Thread *const _current_thread; + Thread *_current_thread; const GeomPrimitive::CData *_cdata; CPT(GeomVertexArrayData) _vertices; diff --git a/panda/src/gobj/geomVertexData.h b/panda/src/gobj/geomVertexData.h index 0261c05a93..8e236029ae 100644 --- a/panda/src/gobj/geomVertexData.h +++ b/panda/src/gobj/geomVertexData.h @@ -409,6 +409,10 @@ protected: Thread *current_thread, GeomVertexData::CData *cdata); +private: + GeomVertexDataPipelineBase(const GeomVertexDataPipelineBase ©) DELETED; + GeomVertexDataPipelineBase &operator = (const GeomVertexDataPipelineBase ©) DELETED_ASSIGN; + public: INLINE ~GeomVertexDataPipelineBase(); @@ -429,7 +433,7 @@ public: protected: PT(GeomVertexData) _object; - Thread *const _current_thread; + Thread *_current_thread; GeomVertexData::CData *_cdata; }; @@ -441,11 +445,7 @@ class EXPCL_PANDA_GOBJ GeomVertexDataPipelineReader : public GeomVertexDataPipel public: INLINE GeomVertexDataPipelineReader(Thread *current_thread); INLINE GeomVertexDataPipelineReader(const GeomVertexData *object, Thread *current_thread); -private: - GeomVertexDataPipelineReader(const GeomVertexDataPipelineReader ©) DELETED; - GeomVertexDataPipelineReader &operator = (const GeomVertexDataPipelineReader ©) DELETED_ASSIGN; -public: ALLOC_DELETED_CHAIN(GeomVertexDataPipelineReader); INLINE void set_object(CPT(GeomVertexData) object); @@ -509,11 +509,7 @@ class EXPCL_PANDA_GOBJ GeomVertexDataPipelineWriter : public GeomVertexDataPipel public: INLINE GeomVertexDataPipelineWriter(GeomVertexData *object, bool force_to_0, Thread *current_thread); -private: - GeomVertexDataPipelineWriter(const GeomVertexDataPipelineWriter ©) DELETED; - GeomVertexDataPipelineWriter &operator = (const GeomVertexDataPipelineWriter ©) DELETED_ASSIGN; -public: INLINE ~GeomVertexDataPipelineWriter(); ALLOC_DELETED_CHAIN(GeomVertexDataPipelineWriter); From 72262ea15aeadfe6b2ce8d1fa7cd4930e2901e75 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 21 Feb 2017 21:38:46 +0100 Subject: [PATCH 062/254] Fix compiler issues on Windows --- panda/src/dxgsg9/dxIndexBufferContext9.cxx | 3 +-- panda/src/gobj/geomVertexArrayData.I | 11 ++++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/panda/src/dxgsg9/dxIndexBufferContext9.cxx b/panda/src/dxgsg9/dxIndexBufferContext9.cxx index 6cf6a78c84..fada562e55 100644 --- a/panda/src/dxgsg9/dxIndexBufferContext9.cxx +++ b/panda/src/dxgsg9/dxIndexBufferContext9.cxx @@ -132,8 +132,7 @@ allocate_ibuffer(DXScreenData &scrn, dxgsg9_cat.debug() << "creating index buffer " << _ibuffer << ": " << reader->get_num_vertices() << " indices (" - << reader->get_vertices_reader()->get_array_format()->get_column(0)->get_numeric_type() - << ")\n"; + << reader->get_index_type() << ")\n"; } } } diff --git a/panda/src/gobj/geomVertexArrayData.I b/panda/src/gobj/geomVertexArrayData.I index 0c2b9904ea..6b29288f3b 100644 --- a/panda/src/gobj/geomVertexArrayData.I +++ b/panda/src/gobj/geomVertexArrayData.I @@ -131,10 +131,10 @@ get_modified() const { */ INLINE bool GeomVertexArrayData:: request_resident(Thread *current_thread) const { -#ifdef DO_PIPELINING - CPT(GeomVertexArrayData::CData) cdata = _cycler.read_unlocked(current_thread); -#else const GeomVertexArrayData::CData *cdata = _cycler.read_unlocked(current_thread); + +#ifdef DO_PIPELINING + cdata->ref(); #endif cdata->_rw_lock.acquire(); @@ -143,6 +143,11 @@ request_resident(Thread *current_thread) const { bool is_resident = (cdata->_buffer.get_read_pointer(false) != nullptr); cdata->_rw_lock.release(); + +#ifdef DO_PIPELINING + unref_delete((CycleData *)cdata); +#endif + return is_resident; } From ea1ba281b516dc3d93cbeb36d4e1ce432ecde8b5 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Wed, 8 Mar 2017 01:54:21 -0700 Subject: [PATCH 063/254] interrogate: Add missing cast in generated calls to PyObject_INIT_VAR --- dtool/src/interrogate/interfaceMakerPythonNative.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index 2b51f87689..e4dbfd4084 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -6219,7 +6219,7 @@ write_make_seq(ostream &out, Object *obj, const std::string &ClassName, // the assumption that the called method doesn't do anything with this // tuple other than unpack it (which is a fairly safe assumption to make). out << " PyTupleObject args;\n"; - out << " (void)PyObject_INIT_VAR(&args, &PyTuple_Type, 1);\n"; + out << " (void)PyObject_INIT_VAR((PyVarObject *)&args, &PyTuple_Type, 1);\n"; } out << From 4d59ad401488a2a8cfb013b3d0aeb46e4ee455df Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Wed, 8 Mar 2017 01:59:02 -0700 Subject: [PATCH 064/254] interrogatedb: Build even when _PyErr_OCCURRED is undefined --- dtool/src/interrogatedb/py_panda.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index f5e77e0dbb..d66ee88c21 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -303,8 +303,14 @@ template INLINE bool DTOOL_Call_ExtractThisPointer(PyObject *self, T *& // Functions related to error reporting. EXPCL_INTERROGATEDB bool _Dtool_CheckErrorOccurred(); +// _PyErr_OCCURRED is an undocumented macro version of PyErr_Occurred. +// Some implementations of the CPython API (e.g. PyPy's cpyext) do not define +// it, so in these cases we just silently fall back to PyErr_Occurred. +#ifndef _PyErr_OCCURRED +#define _PyErr_OCCURRED() PyErr_Occurred() +#endif + #ifdef NDEBUG -// _PyErr_OCCURRED is an undocumented inline version of PyErr_Occurred. #define Dtool_CheckErrorOccurred() (_PyErr_OCCURRED() != NULL) #else #define Dtool_CheckErrorOccurred() _Dtool_CheckErrorOccurred() From 3db8ce2562a92b755e0df193d5484a30d004520c Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 8 Mar 2017 12:28:06 +0100 Subject: [PATCH 065/254] Fixes for ARM build --- panda/src/display/displayInformation.cxx | 6 ++++++ panda/src/display/graphicsPipe.cxx | 20 +++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/panda/src/display/displayInformation.cxx b/panda/src/display/displayInformation.cxx index 9bda75e0de..d690544889 100644 --- a/panda/src/display/displayInformation.cxx +++ b/panda/src/display/displayInformation.cxx @@ -15,11 +15,13 @@ #include "displayInformation.h" // For __rdtsc +#if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) #ifdef _MSC_VER #include #elif defined(__GNUC__) && !defined(__clang__) #include #endif +#endif /** * Returns true if these two DisplayModes are identical. @@ -529,6 +531,7 @@ get_cpu_frequency() { */ uint64_t DisplayInformation:: get_cpu_time() { +#if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) #if defined(_MSC_VER) || (defined(__GNUC__) && !defined(__clang__)) return __rdtsc(); #else @@ -536,6 +539,9 @@ get_cpu_time() { __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); return ((uint64_t)hi << 32) | lo; #endif +#else + return 0; +#endif } /** diff --git a/panda/src/display/graphicsPipe.cxx b/panda/src/display/graphicsPipe.cxx index bb6fdae3a4..ad5d1aea62 100644 --- a/panda/src/display/graphicsPipe.cxx +++ b/panda/src/display/graphicsPipe.cxx @@ -28,6 +28,16 @@ #include #endif +#ifdef _WIN32 +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#endif + +// CPUID is only available on i386 and x86-64 architectures. +#if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) + #if defined(__GNUC__) && !defined(__APPLE__) // GCC and Clang offer a useful cpuid.h header. #include @@ -38,13 +48,6 @@ #include #endif -#ifdef _WIN32 -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN 1 -#endif -#include -#endif - union cpuid_info { char str[16]; struct { @@ -85,6 +88,7 @@ static inline void get_cpuid(uint32_t leaf, cpuid_info &info) { : "0" (leaf)); #endif } +#endif #ifdef IS_LINUX /** @@ -123,6 +127,7 @@ GraphicsPipe() : _display_information = new DisplayInformation(); +#if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) cpuid_info info; const uint32_t max_cpuid = get_cpuid_max(0); const uint32_t max_extended = get_cpuid_max(0x80000000); @@ -148,6 +153,7 @@ GraphicsPipe() : brand[48] = 0; _display_information->_cpu_brand_string = brand; } +#endif #if defined(IS_OSX) // macOS exposes a lot of useful information through sysctl. From 4f299fa71fa96e25a8f0d7dee9bfb2a2de7b2b24 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 9 Mar 2017 14:31:07 +0100 Subject: [PATCH 066/254] Fix compilation when building without threads enabled --- panda/src/gobj/geomVertexArrayData.I | 50 ++++++++++++++++++++++++++++ panda/src/gobj/geomVertexArrayData.h | 4 +++ 2 files changed, 54 insertions(+) diff --git a/panda/src/gobj/geomVertexArrayData.I b/panda/src/gobj/geomVertexArrayData.I index 6b29288f3b..351f56cd53 100644 --- a/panda/src/gobj/geomVertexArrayData.I +++ b/panda/src/gobj/geomVertexArrayData.I @@ -283,6 +283,31 @@ GeomVertexArrayDataHandle(CPT(GeomVertexArrayData) object, #endif } +/** + * + */ +INLINE GeomVertexArrayDataHandle:: +GeomVertexArrayDataHandle(const GeomVertexArrayData *object, + Thread *current_thread) : + _object((GeomVertexArrayData *)object), + _current_thread(current_thread), + _cdata((GeomVertexArrayData::CData *)object->_cycler.read_unlocked(current_thread)), + _writable(false) +{ +#ifdef _DEBUG + nassertv(_object->test_ref_count_nonzero()); +#endif // _DEBUG +#ifdef DO_PIPELINING + _cdata->ref(); +#endif // DO_PIPELINING + // We must grab the lock *after* we have incremented the reference count, + // above. + _cdata->_rw_lock.acquire(); +#ifdef DO_MEMORY_USAGE + MemoryUsage::update_type(this, get_class_type()); +#endif +} + /** * */ @@ -309,6 +334,31 @@ GeomVertexArrayDataHandle(PT(GeomVertexArrayData) object, #endif } +/** + * + */ +INLINE GeomVertexArrayDataHandle:: +GeomVertexArrayDataHandle(GeomVertexArrayData *object, + Thread *current_thread) : + _object(object), + _current_thread(current_thread), + _cdata(object->_cycler.write_upstream(true, current_thread)), + _writable(true) +{ +#ifdef _DEBUG + nassertv(_object->test_ref_count_nonzero()); +#endif // _DEBUG +#ifdef DO_PIPELINING + _cdata->ref(); +#endif // DO_PIPELINING + // We must grab the lock *after* we have incremented the reference count, + // above. + _cdata->_rw_lock.acquire(); +#ifdef DO_MEMORY_USAGE + MemoryUsage::update_type(this, get_class_type()); +#endif +} + /** * Don't attempt to copy these objects. */ diff --git a/panda/src/gobj/geomVertexArrayData.h b/panda/src/gobj/geomVertexArrayData.h index 2104e74b52..c16c5831d9 100644 --- a/panda/src/gobj/geomVertexArrayData.h +++ b/panda/src/gobj/geomVertexArrayData.h @@ -250,8 +250,12 @@ class EXPCL_PANDA_GOBJ GeomVertexArrayDataHandle : public ReferenceCount, public private: INLINE GeomVertexArrayDataHandle(CPT(GeomVertexArrayData) object, Thread *current_thread); + INLINE GeomVertexArrayDataHandle(const GeomVertexArrayData *object, + Thread *current_thread); INLINE GeomVertexArrayDataHandle(PT(GeomVertexArrayData) object, Thread *current_thread); + INLINE GeomVertexArrayDataHandle(GeomVertexArrayData *object, + Thread *current_thread); INLINE GeomVertexArrayDataHandle(const GeomVertexArrayDataHandle &); INLINE void operator = (const GeomVertexArrayDataHandle &); From ce736ad0936fa64e5ede54eec336903fbf789e42 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 10 Mar 2017 12:25:21 +0100 Subject: [PATCH 067/254] glsl: fix issue with vertex colors not showing up --- panda/src/glstuff/glShaderContext_src.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 6947a39235..41b004775f 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -2194,7 +2194,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { // Figure out which attributes to enable or disable. BitMask32 enabled_attribs = _enabled_attribs; if (_color_attrib_index != -1 && - color_attrib->get_type() != ColorAttrib::T_vertex) { + color_attrib->get_color_type() != ColorAttrib::T_vertex) { // Vertex colours are disabled. enabled_attribs.clear_bit(_color_attrib_index); @@ -2247,7 +2247,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { // Don't apply vertex colors if they are disabled with a ColorAttrib. int num_elements, element_stride, divisor; bool normalized; - if ((p != _color_attrib_index || color_attrib->get_type() == ColorAttrib::T_vertex) && + if ((p != _color_attrib_index || color_attrib->get_color_type() == ColorAttrib::T_vertex) && _glgsg->_data_reader->get_array_info(name, array_reader, num_values, numeric_type, normalized, start, stride, divisor, From 20085d182aaf1a6eedb61b8bf186b90b03b185f8 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 10 Mar 2017 15:44:47 +0100 Subject: [PATCH 068/254] Backport 4a8819b0bd7517cf8ad0fe1eed0666b324cadc14 (MeshDrawer fixes and improvements) * Fix random number generator on Windows (LP 1663895) * Assert instead of crash when passing in non-Camera to begin() (LP 1663900) * Prevent repeated calls to generator()/set_budget() from leaking GeomNodes (LP 1663903) * Make the generator more efficient --- panda/src/grutil/meshDrawer.cxx | 59 ++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/panda/src/grutil/meshDrawer.cxx b/panda/src/grutil/meshDrawer.cxx index 631a6a8e79..8baad7ac4b 100644 --- a/panda/src/grutil/meshDrawer.cxx +++ b/panda/src/grutil/meshDrawer.cxx @@ -34,7 +34,7 @@ TypeHandle MeshDrawer::_type_handle; PN_stdfloat randFloat() { - return ((PN_stdfloat) rand() / (PN_stdfloat) 0x7fffffff); + return ((PN_stdfloat)rand() / (PN_stdfloat)RAND_MAX); } //////////////////////////////////////////////////////////////////// @@ -45,39 +45,43 @@ PN_stdfloat randFloat() { void MeshDrawer::generator(int budget) { // create enough triangles for budget: _vdata = new GeomVertexData(_root.get_name(), GeomVertexFormat::get_v3n3c4t2(), Geom::UH_static);//UH_dynamic); - GeomVertexWriter *tvertex = new GeomVertexWriter(_vdata, "vertex"); - GeomVertexWriter *tnormal = new GeomVertexWriter(_vdata, "normal"); - GeomVertexWriter *tuv = new GeomVertexWriter(_vdata, "texcoord"); - GeomVertexWriter *tcolor = new GeomVertexWriter(_vdata, "color"); - _prim = new GeomTriangles(Geom::UH_static); + _vdata->unclean_set_num_rows(budget * 3); - // iterate and fill _up a geom with random data so that it will - // not be optimized out by panda3d system - for(int i = 0; i < budget; i++) { - for( int vert = 0; vert < 3; vert++) { - LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001; - LVector4 vec4 = LVector4(1,1,1,randFloat()); - LVector2 vec2 = LVector2(0,randFloat()); - tvertex->add_data3(vec3); - tcolor->add_data4(vec4); - tuv->add_data2(vec2); - tnormal->add_data3(vec3); + { + GeomVertexWriter tvertex(_vdata, "vertex"); + GeomVertexWriter tnormal(_vdata, "normal"); + GeomVertexWriter tuv(_vdata, "texcoord"); + GeomVertexWriter tcolor(_vdata, "color"); + + // iterate and fill _up a geom with random data so that it will not be + // optimized out by panda3d system + for (int i = 0; i < budget; i++) { + for (int vert = 0; vert < 3; vert++) { + LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001; + LVector4 vec4 = LVector4(1,1,1,randFloat()); + LVector2 vec2 = LVector2(0,randFloat()); + tvertex.set_data3(vec3); + tcolor.set_data4(vec4); + tuv.set_data2(vec2); + tnormal.set_data3(vec3); + } } - _prim->add_vertices(i * 3, i * 3 + 1, i * 3 + 2); } + // create our node and attach it to this node path + _prim = new GeomTriangles(Geom::UH_static); + _prim->add_next_vertices(budget * 3); _prim->close_primitive(); _geom = new Geom(_vdata); _geom->add_primitive(_prim); - _geomnode = new GeomNode("__MeshDrawer_GeomNode"); + if (_geomnode == NULL) { + _geomnode = new GeomNode("__MeshDrawer_GeomNode"); + _root.attach_new_node(_geomnode); + } else { + _geomnode->remove_all_geoms(); + } _geomnode->add_geom(_geom); - _root.attach_new_node(_geomnode); _last_clear_index = budget; - - delete tvertex; - delete tnormal; - delete tuv; - delete tcolor; } //////////////////////////////////////////////////////////////////// @@ -492,8 +496,9 @@ link_segment(const LVector3 &pos, const LVector4 &frame, LVector3 cam_stop3d = _camera.get_relative_point(_render, stop); LPoint2 cam_stop2d = LVector2(); - PT(Camera) camera = DCAST(Camera, _camera.node()); - PT(Lens) lens = camera->get_lens(); + const Camera *camera; + DCAST_INTO_V(camera, _camera.node()); + const Lens *lens = camera->get_lens(); lens->project(cam_start3d, cam_start2d); lens->project(cam_stop3d, cam_stop2d); From 63be56cd0e6516d8fead2a3053c1ce12fa383413 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 10 Mar 2017 15:46:03 +0100 Subject: [PATCH 069/254] Backport part of b21e8fdf3216b9a18d7f2edef9fc5ce5590f9969 that fixes an issue with geometry generation when multithreaded pipeline is enabled Fixes bullet soft body issue as well as LP 1671639 --- panda/src/putil/copyOnWritePointer.cxx | 28 +++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/panda/src/putil/copyOnWritePointer.cxx b/panda/src/putil/copyOnWritePointer.cxx index c323cb76c0..ad487e1701 100644 --- a/panda/src/putil/copyOnWritePointer.cxx +++ b/panda/src/putil/copyOnWritePointer.cxx @@ -99,19 +99,17 @@ get_write_pointer() { } PT(CopyOnWriteObject) new_object = _cow_object->make_cow_copy(); + _cow_object->CachedTypedWritableReferenceCount::cache_unref(); + _cow_object->_lock_mutex.release(); - // We can't call cache_unref_delete, because we hold the lock. - if (!_cow_object->CachedTypedWritableReferenceCount::cache_unref()) { - _cow_object->_lock_mutex.release(); - delete _cow_object; - } else { - _cow_object->_lock_mutex.release(); - } + MutexHolder holder(new_object->_lock_mutex); _cow_object = new_object; - _cow_object->cache_ref(); + _cow_object->CachedTypedWritableReferenceCount::cache_ref(); _cow_object->_lock_status = CopyOnWriteObject::LS_locked_write; _cow_object->_locking_thread = current_thread; + return new_object; + } else if (_cow_object->get_cache_ref_count() > 1) { // No one else has it specifically read-locked, but there are // other CopyOnWritePointers holding the same object, so we should @@ -124,19 +122,17 @@ get_write_pointer() { } PT(CopyOnWriteObject) new_object = _cow_object->make_cow_copy(); + _cow_object->CachedTypedWritableReferenceCount::cache_unref(); + _cow_object->_lock_mutex.release(); - // We can't call cache_unref_delete, because we hold the lock. - if (!_cow_object->CachedTypedWritableReferenceCount::cache_unref()) { - _cow_object->_lock_mutex.release(); - delete _cow_object; - } else { - _cow_object->_lock_mutex.release(); - } + MutexHolder holder(new_object->_lock_mutex); _cow_object = new_object; - _cow_object->cache_ref(); + _cow_object->CachedTypedWritableReferenceCount::cache_ref(); _cow_object->_lock_status = CopyOnWriteObject::LS_locked_write; _cow_object->_locking_thread = current_thread; + return new_object; + } else { // No other thread has the pointer locked, and we're the only // CopyOnWritePointer with this object. We can safely write to it From 0406a49edce4413392497adfa2203ba18e3385af Mon Sep 17 00:00:00 2001 From: Younguk Kim Date: Thu, 26 Jan 2017 00:16:26 +0900 Subject: [PATCH 070/254] Fix include guard typo. --- panda/src/parametrics/parametricCurveCollection.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/panda/src/parametrics/parametricCurveCollection.h b/panda/src/parametrics/parametricCurveCollection.h index 01d505234b..4e8612650e 100644 --- a/panda/src/parametrics/parametricCurveCollection.h +++ b/panda/src/parametrics/parametricCurveCollection.h @@ -12,8 +12,8 @@ // //////////////////////////////////////////////////////////////////// -#ifndef NODEPATHCOLLECTION_H -#define NODEPATHCOLLECTION_H +#ifndef PARAMETRICCURVECOLLECTION_H +#define PARAMETRICCURVECOLLECTION_H #include "pandabase.h" From bf919e4811229b8a8ee7bef14b34b5140fcd0aad Mon Sep 17 00:00:00 2001 From: deflected Date: Mon, 20 Feb 2017 15:10:15 +0100 Subject: [PATCH 071/254] Fix compile issue on FreeBSD 11 --- dtool/src/dtoolutil/executionEnvironment.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dtool/src/dtoolutil/executionEnvironment.cxx b/dtool/src/dtoolutil/executionEnvironment.cxx index b6ae2c7f71..d5f6445263 100644 --- a/dtool/src/dtoolutil/executionEnvironment.cxx +++ b/dtool/src/dtoolutil/executionEnvironment.cxx @@ -687,8 +687,8 @@ read_args() { dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map); while (map != NULL) { - char *tail = strrchr(map->l_name, '/'); - char *head = strchr(map->l_name, '/'); + const char *tail = strrchr(map->l_name, '/'); + const char *head = strchr(map->l_name, '/'); if (tail && head && (strcmp(tail, "/libp3dtool.so." PANDA_ABI_VERSION_STR) == 0 || strcmp(tail, "/libp3dtool.so") == 0)) { _dtool_name = head; @@ -711,8 +711,8 @@ read_args() { char buffer[PATH_MAX]; buffer[0] = 0; maps.getline(buffer, PATH_MAX); - char *tail = strrchr(buffer, '/'); - char *head = strchr(buffer, '/'); + const char *tail = strrchr(buffer, '/'); + const char *head = strchr(buffer, '/'); if (tail && head && (strcmp(tail, "/libp3dtool.so." PANDA_ABI_VERSION_STR) == 0 || strcmp(tail, "/libp3dtool.so") == 0)) { _dtool_name = head; From 64a7fbab873dedf8aaa6fb1993bc16ed12f0f0bd Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 10 Mar 2017 23:00:00 +0100 Subject: [PATCH 072/254] glgsg: fix assertion encountered when trying to use pointer textures Fixes LP 990089 --- panda/src/gobj/texture.I | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/panda/src/gobj/texture.I b/panda/src/gobj/texture.I index 47ce9e233f..29b1702280 100644 --- a/panda/src/gobj/texture.I +++ b/panda/src/gobj/texture.I @@ -1544,7 +1544,14 @@ INLINE size_t Texture:: get_ram_mipmap_image_size(int n) const { CDReader cdata(_cycler); if (n >= 0 && n < (int)cdata->_ram_images.size()) { - return cdata->_ram_images[n]._image.size(); + if (cdata->_ram_images[n]._pointer_image == nullptr) { + return cdata->_ram_images[n]._image.size(); + } else { + // Calculate it based on the given page size. + return do_get_ram_mipmap_page_size(cdata, n) * + do_get_expected_mipmap_z_size(cdata, n) * + cdata->_num_views; + } } return 0; } From d8066e19b1844786b2369638516813fef29a7026 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 22 Mar 2017 22:42:21 +0100 Subject: [PATCH 073/254] Fix assertion when using Texture.load_sub_image to load entire image --- panda/src/gobj/texture.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index 115d9529bf..d3dd47dbb9 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -3441,8 +3441,8 @@ do_load_sub_image(CData *cdata, const PNMImage &image, int x, int y, int z, int nassertr(y >= 0 && y < tex_y_size, false); nassertr(z >= 0 && z < tex_z_size, false); - nassertr(image.get_x_size() + x < tex_x_size, false); - nassertr(image.get_y_size() + y < tex_y_size, false); + nassertr(image.get_x_size() + x <= tex_x_size, false); + nassertr(image.get_y_size() + y <= tex_y_size, false); // Flip y y = cdata->_y_size - (image.get_y_size() + y); From 9d05044a9f925ac8e4440023acd8bd34af75d96e Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 23 Mar 2017 12:22:34 +0100 Subject: [PATCH 074/254] shadows: force interocular distance to 0 for shadow cameras --- panda/src/pgraphnodes/directionalLight.cxx | 1 + panda/src/pgraphnodes/pointLight.cxx | 6 ++++++ panda/src/pgraphnodes/spotlight.cxx | 1 + 3 files changed, 8 insertions(+) diff --git a/panda/src/pgraphnodes/directionalLight.cxx b/panda/src/pgraphnodes/directionalLight.cxx index 127f994fbb..f0d84ffb9a 100644 --- a/panda/src/pgraphnodes/directionalLight.cxx +++ b/panda/src/pgraphnodes/directionalLight.cxx @@ -59,6 +59,7 @@ DirectionalLight(const string &name) : LightLensNode(name, new OrthographicLens()), _has_specular_color(false) { + _lenses[0]._lens->set_interocular_distance(0); } /** diff --git a/panda/src/pgraphnodes/pointLight.cxx b/panda/src/pgraphnodes/pointLight.cxx index 564116ecac..d3f7192248 100644 --- a/panda/src/pgraphnodes/pointLight.cxx +++ b/panda/src/pgraphnodes/pointLight.cxx @@ -66,21 +66,27 @@ PointLight(const string &name) : { PT(Lens) lens; lens = new PerspectiveLens(90, 90); + lens->set_interocular_distance(0); lens->set_view_vector(1, 0, 0, 0, -1, 0); set_lens(0, lens); lens = new PerspectiveLens(90, 90); + lens->set_interocular_distance(0); lens->set_view_vector(-1, 0, 0, 0, -1, 0); set_lens(1, lens); lens = new PerspectiveLens(90, 90); + lens->set_interocular_distance(0); lens->set_view_vector(0, 1, 0, 0, 0, 1); set_lens(2, lens); lens = new PerspectiveLens(90, 90); + lens->set_interocular_distance(0); lens->set_view_vector(0, -1, 0, 0, 0, -1); set_lens(3, lens); lens = new PerspectiveLens(90, 90); + lens->set_interocular_distance(0); lens->set_view_vector(0, 0, 1, 0, -1, 0); set_lens(4, lens); lens = new PerspectiveLens(90, 90); + lens->set_interocular_distance(0); lens->set_view_vector(0, 0, -1, 0, -1, 0); set_lens(5, lens); } diff --git a/panda/src/pgraphnodes/spotlight.cxx b/panda/src/pgraphnodes/spotlight.cxx index 638f89f93c..badf4544d9 100644 --- a/panda/src/pgraphnodes/spotlight.cxx +++ b/panda/src/pgraphnodes/spotlight.cxx @@ -68,6 +68,7 @@ Spotlight(const string &name) : LightLensNode(name), _has_specular_color(false) { + _lenses[0]._lens->set_interocular_distance(0); } /** From f062c64e9a827e8486776e76eb77febb2935c906 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Mon, 27 Mar 2017 00:56:05 -0600 Subject: [PATCH 075/254] distributed: Fix broken reference to StackTrace when __debug__==False --- direct/src/distributed/DistributedObject.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/direct/src/distributed/DistributedObject.py b/direct/src/distributed/DistributedObject.py index 0ed3e90a54..64fd3ecc20 100644 --- a/direct/src/distributed/DistributedObject.py +++ b/direct/src/distributed/DistributedObject.py @@ -4,7 +4,6 @@ from panda3d.core import * from panda3d.direct import * from direct.directnotify.DirectNotifyGlobal import directNotify from direct.distributed.DistributedObjectBase import DistributedObjectBase -from direct.showbase.PythonUtil import StackTrace #from PyDatagram import PyDatagram #from PyDatagramIterator import PyDatagramIterator @@ -259,7 +258,10 @@ class DistributedObject(DistributedObjectBase): def _destroyDO(self): # after this is called, the object is no longer a DistributedObject # but may still be used as a DelayDeleted object - self.destroyDoStackTrace = StackTrace() + if __debug__: + # StackTrace is omitted in packed versions + from direct.showbase.PythonUtil import StackTrace + self.destroyDoStackTrace = StackTrace() # check for leftover cached data that was not retrieved or flushed by this object # this will catch typos in the data name in calls to get/setCachedData if hasattr(self, '_cachedData'): From 4080e03d05c8b33b4ac1d343126a279d28122036 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Mon, 27 Mar 2017 01:00:00 -0600 Subject: [PATCH 076/254] distributed: Remove use of exceptionLogged() decorator This isn't available when __debug__==False either. --- direct/src/distributed/DoCollectionManager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/direct/src/distributed/DoCollectionManager.py b/direct/src/distributed/DoCollectionManager.py index 16bf345f4e..fcff96e218 100755 --- a/direct/src/distributed/DoCollectionManager.py +++ b/direct/src/distributed/DoCollectionManager.py @@ -312,7 +312,6 @@ class DoCollectionManager: else: self.notify.warning('handleSetLocation: object %s not present' % self.getMsgChannel()) - @exceptionLogged() def storeObjectLocation(self, object, parentId, zoneId): oldParentId = object.parentId oldZoneId = object.zoneId From e1c0e7d1d465e206436ed0cc9e70c13e78086ab7 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 27 Mar 2017 19:15:09 +0200 Subject: [PATCH 077/254] text: add experimental kerning support, enabled by 'text-kerning' --- panda/src/text/config_text.cxx | 6 ++++++ panda/src/text/config_text.h | 1 + panda/src/text/dynamicTextFont.cxx | 26 ++++++++++++++++++++++++++ panda/src/text/dynamicTextFont.h | 1 + panda/src/text/textAssembler.cxx | 16 ++++++++++++++++ panda/src/text/textFont.cxx | 10 ++++++++++ panda/src/text/textFont.h | 2 ++ 7 files changed, 62 insertions(+) diff --git a/panda/src/text/config_text.cxx b/panda/src/text/config_text.cxx index 4790c5ecf7..36ef375afe 100644 --- a/panda/src/text/config_text.cxx +++ b/panda/src/text/config_text.cxx @@ -48,6 +48,12 @@ ConfigVariableBool text_dynamic_merge "operation. Usually it's a performance " "advantage to keep this true. See TextNode::set_flatten_flags().")); +ConfigVariableBool text_kerning +("text-kerning", false, + PRC_DESC("Set this true to enable kerning when the font provides kerning " + "tables. This can result in more aesthetically pleasing spacing " + "between individual glyphs.")); + ConfigVariableInt text_anisotropic_degree ("text-anisotropic-degree", 1, PRC_DESC("This is the default anisotropic-degree that is set on dynamic " diff --git a/panda/src/text/config_text.h b/panda/src/text/config_text.h index 5c50af6a52..4e5ca1a6ed 100644 --- a/panda/src/text/config_text.h +++ b/panda/src/text/config_text.h @@ -30,6 +30,7 @@ NotifyCategoryDecl(text, EXPCL_PANDA_TEXT, EXPTP_PANDA_TEXT); extern ConfigVariableBool text_flatten; extern ConfigVariableBool text_dynamic_merge; +extern ConfigVariableBool text_kerning; extern ConfigVariableInt text_anisotropic_degree; extern ConfigVariableInt text_texture_margin; extern ConfigVariableDouble text_poly_margin; diff --git a/panda/src/text/dynamicTextFont.cxx b/panda/src/text/dynamicTextFont.cxx index 09369a12b9..f066e07c35 100644 --- a/panda/src/text/dynamicTextFont.cxx +++ b/panda/src/text/dynamicTextFont.cxx @@ -278,6 +278,32 @@ get_glyph(int character, CPT(TextGlyph) &glyph) { return (glyph_index != 0); } +/** + * Returns the amount by which to offset the second glyph when it directly + * follows the first glyph. This is an additional offset that is added on top + * of the advance. + */ +PN_stdfloat DynamicTextFont:: +get_kerning(int first, int second) const { + if (!_is_valid) { + return 0; + } + + FT_Face face = acquire_face(); + if (!FT_HAS_KERNING(face)) { + release_face(face); + return 0; + } + + int first_index = FT_Get_Char_Index(face, first); + int second_index = FT_Get_Char_Index(face, second); + + FT_Vector delta; + FT_Get_Kerning(face, first_index, second_index, FT_KERNING_DEFAULT, &delta); + release_face(face); + + return delta.x / (_font_pixels_per_unit * 64); +} /** * Called from both constructors to set up some initial values. diff --git a/panda/src/text/dynamicTextFont.h b/panda/src/text/dynamicTextFont.h index c418ea34c3..26433deef6 100644 --- a/panda/src/text/dynamicTextFont.h +++ b/panda/src/text/dynamicTextFont.h @@ -123,6 +123,7 @@ PUBLISHED: public: virtual bool get_glyph(int character, CPT(TextGlyph) &glyph); + virtual PN_stdfloat get_kerning(int first, int second) const; private: void initialize(); diff --git a/panda/src/text/textAssembler.cxx b/panda/src/text/textAssembler.cxx index 3c8550a6a5..1f2cfc67d7 100644 --- a/panda/src/text/textAssembler.cxx +++ b/panda/src/text/textAssembler.cxx @@ -609,6 +609,8 @@ assemble_text() { * Returns the width of a single character, according to its associated font. * This also correctly calculates the width of cheesy ligatures and accented * characters, which may not exist in the font as such. + * + * This does not take kerning into account, however. */ PN_stdfloat TextAssembler:: calc_width(wchar_t character, const TextProperties &properties) { @@ -1399,6 +1401,9 @@ assemble_row(TextAssembler::TextRow &row, PN_stdfloat xpos = 0.0f; align = TextProperties::A_left; + // Remember previous character, for kerning. + int prev_char = -1; + bool underscore = false; PN_stdfloat underscore_start = 0.0f; const TextProperties *underscore_properties = NULL; @@ -1450,11 +1455,13 @@ assemble_row(TextAssembler::TextRow &row, if (character == ' ') { // A space is a special case. xpos += properties->get_glyph_scale() * properties->get_text_scale() * font->get_space_advance(); + prev_char = -1; } else if (character == '\t') { // So is a tab character. PN_stdfloat tab_width = properties->get_tab_width(); xpos = (floor(xpos / tab_width) + 1.0f) * tab_width; + prev_char = -1; } else if (character == text_soft_hyphen_key) { // And so is the 'soft-hyphen' key character. @@ -1493,6 +1500,7 @@ assemble_row(TextAssembler::TextRow &row, placed_glyphs.push_back(placement); xpos += advance * glyph_scale; + prev_char = -1; } else { // A printable character. @@ -1521,6 +1529,14 @@ assemble_row(TextAssembler::TextRow &row, << "\n"; } + // Add the kerning delta. + if (text_kerning) { + if (prev_char != -1) { + xpos += font->get_kerning(prev_char, character); + } + prev_char = character; + } + // Build up a GlyphPlacement, indicating all of the Geoms that go into // this character. Normally, there is only one Geom per character, but // it may involve multiple Geoms if we need to add cheesy accents or diff --git a/panda/src/text/textFont.cxx b/panda/src/text/textFont.cxx index 70ca9a74d5..add86483bd 100644 --- a/panda/src/text/textFont.cxx +++ b/panda/src/text/textFont.cxx @@ -54,6 +54,16 @@ TextFont:: ~TextFont() { } +/** + * Returns the amount by which to offset the second glyph when it directly + * follows the first glyph. This is an additional offset that is added on top + * of the advance. + */ +PN_stdfloat TextFont:: +get_kerning(int first, int second) const { + return 0; +} + /** * */ diff --git a/panda/src/text/textFont.h b/panda/src/text/textFont.h index 1249e7b817..7cea63e391 100644 --- a/panda/src/text/textFont.h +++ b/panda/src/text/textFont.h @@ -74,6 +74,8 @@ PUBLISHED: INLINE CPT(TextGlyph) get_glyph(int character); + virtual PN_stdfloat get_kerning(int first, int second) const; + virtual void write(ostream &out, int indent_level) const; public: From 605ac1189fde77142bb5a8e78bf691c0e251ecd7 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 28 Mar 2017 21:13:03 +0200 Subject: [PATCH 078/254] text: kerning should respect text scale --- panda/src/text/textAssembler.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/panda/src/text/textAssembler.cxx b/panda/src/text/textAssembler.cxx index 1f2cfc67d7..7b8470116b 100644 --- a/panda/src/text/textAssembler.cxx +++ b/panda/src/text/textAssembler.cxx @@ -1529,10 +1529,12 @@ assemble_row(TextAssembler::TextRow &row, << "\n"; } + glyph_scale *= properties->get_glyph_scale() * properties->get_text_scale(); + // Add the kerning delta. if (text_kerning) { if (prev_char != -1) { - xpos += font->get_kerning(prev_char, character); + xpos += font->get_kerning(prev_char, character) * glyph_scale; } prev_char = character; } @@ -1543,7 +1545,6 @@ assemble_row(TextAssembler::TextRow &row, // ligatures. GlyphPlacement placement; - glyph_scale *= properties->get_glyph_scale() * properties->get_text_scale(); placement._glyph = NULL; placement._scale = glyph_scale; placement._xpos = xpos; From f773bf6328cca4d88456a2aa1646203ea31dcf32 Mon Sep 17 00:00:00 2001 From: wolfgangp Date: Wed, 29 Mar 2017 11:38:39 +0200 Subject: [PATCH 079/254] Add properties to Bullet classes (#140) --- panda/src/bullet/bulletAllHitsRayResult.h | 12 +++++++ panda/src/bullet/bulletBodyNode.cxx | 9 +++++ panda/src/bullet/bulletBodyNode.h | 27 ++++++++++++-- panda/src/bullet/bulletBoxShape.h | 3 ++ panda/src/bullet/bulletCapsuleShape.h | 3 ++ .../bullet/bulletCharacterControllerNode.cxx | 3 +- .../bullet/bulletCharacterControllerNode.h | 11 ++++-- panda/src/bullet/bulletClosestHitRayResult.h | 9 +++++ .../src/bullet/bulletClosestHitSweepResult.h | 7 ++++ panda/src/bullet/bulletConeShape.h | 3 ++ panda/src/bullet/bulletConeTwistConstraint.h | 4 +++ panda/src/bullet/bulletConstraint.I | 2 +- panda/src/bullet/bulletConstraint.h | 13 +++++-- panda/src/bullet/bulletContactCallbackData.h | 8 +++++ panda/src/bullet/bulletContactCallbacks.h | 6 ++-- panda/src/bullet/bulletContactResult.h | 9 +++++ .../src/bullet/bulletConvexPointCloudShape.h | 2 ++ panda/src/bullet/bulletCylinderShape.h | 4 +++ panda/src/bullet/bulletDebugNode.I | 36 +++++++++++++++++++ panda/src/bullet/bulletDebugNode.h | 9 +++++ panda/src/bullet/bulletFilterCallbackData.h | 4 +++ panda/src/bullet/bulletGenericConstraint.h | 4 +++ panda/src/bullet/bulletGhostNode.h | 2 ++ panda/src/bullet/bulletHelper.h | 3 ++ panda/src/bullet/bulletHingeConstraint.h | 7 ++++ panda/src/bullet/bulletManifoldPoint.h | 24 +++++++++++++ panda/src/bullet/bulletMinkowskiSumShape.h | 6 ++++ panda/src/bullet/bulletMultiSphereShape.h | 4 +++ panda/src/bullet/bulletPersistentManifold.h | 6 ++++ panda/src/bullet/bulletPlaneShape.h | 3 ++ panda/src/bullet/bulletRigidBodyNode.h | 17 +++++++++ panda/src/bullet/bulletRotationalLimitMotor.h | 7 ++++ panda/src/bullet/bulletShape.h | 12 ++++++- panda/src/bullet/bulletSliderConstraint.h | 15 ++++++++ panda/src/bullet/bulletSoftBodyConfig.I | 4 +-- panda/src/bullet/bulletSoftBodyConfig.h | 30 ++++++++++++++-- panda/src/bullet/bulletSoftBodyMaterial.h | 11 +++--- panda/src/bullet/bulletSoftBodyNode.h | 15 ++++++++ panda/src/bullet/bulletSoftBodyShape.h | 2 ++ panda/src/bullet/bulletSoftBodyWorldInfo.h | 6 ++++ panda/src/bullet/bulletSphereShape.h | 2 ++ panda/src/bullet/bulletSphericalConstraint.h | 3 ++ panda/src/bullet/bulletTickCallbackData.h | 2 ++ .../bullet/bulletTranslationalLimitMotor.h | 8 +++-- panda/src/bullet/bulletTriangleMesh.h | 3 ++ panda/src/bullet/bulletTriangleMeshShape.h | 3 ++ panda/src/bullet/bulletVehicle.h | 13 +++++++ panda/src/bullet/bulletWheel.h | 35 ++++++++++++++++++ panda/src/bullet/bulletWorld.I | 9 +++++ panda/src/bullet/bulletWorld.h | 12 +++++++ 50 files changed, 427 insertions(+), 25 deletions(-) diff --git a/panda/src/bullet/bulletAllHitsRayResult.h b/panda/src/bullet/bulletAllHitsRayResult.h index c5ff637ac9..b0b31e04d3 100644 --- a/panda/src/bullet/bulletAllHitsRayResult.h +++ b/panda/src/bullet/bulletAllHitsRayResult.h @@ -39,6 +39,13 @@ PUBLISHED: int get_shape_part() const; int get_triangle_index() const; + MAKE_PROPERTY(node, get_node); + MAKE_PROPERTY(hit_pos, get_hit_pos); + MAKE_PROPERTY(hit_normal, get_hit_normal); + MAKE_PROPERTY(hit_fraction, get_hit_fraction); + MAKE_PROPERTY(shape_part, get_shape_part); + MAKE_PROPERTY(triangle_index, get_triangle_index); + private: const btCollisionObject *_object; btVector3 _normal; @@ -69,6 +76,11 @@ PUBLISHED: const BulletRayHit get_hit(int idx) const; MAKE_SEQ(get_hits, get_num_hits, get_hit); + MAKE_PROPERTY(from_pos, get_from_pos); + MAKE_PROPERTY(to_pos, get_to_pos); + MAKE_PROPERTY(closest_hit_fraction, get_closest_hit_fraction); + MAKE_SEQ_PROPERTY(hits, get_num_hits, get_hit); + public: virtual bool needsCollision(btBroadphaseProxy* proxy0) const; virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace); diff --git a/panda/src/bullet/bulletBodyNode.cxx b/panda/src/bullet/bulletBodyNode.cxx index cb4d39c444..b078864ccc 100644 --- a/panda/src/bullet/bulletBodyNode.cxx +++ b/panda/src/bullet/bulletBodyNode.cxx @@ -442,6 +442,15 @@ set_active(bool active, bool force) { } } +/** + * + */ +void BulletBodyNode:: +force_active(bool active) { + + set_active(active, true); +} + /** * If true, this object will be deactivated after a certain amount of time has * passed without movement. If false, the object will always remain active. diff --git a/panda/src/bullet/bulletBodyNode.h b/panda/src/bullet/bulletBodyNode.h index 53fe6c7136..562e88c7fb 100644 --- a/panda/src/bullet/bulletBodyNode.h +++ b/panda/src/bullet/bulletBodyNode.h @@ -56,7 +56,7 @@ PUBLISHED: // Static and kinematic INLINE bool is_static() const; INLINE bool is_kinematic() const; - + INLINE void set_static(bool value); INLINE void set_kinematic(bool value); @@ -79,6 +79,7 @@ PUBLISHED: // Deactivation bool is_active() const; void set_active(bool active, bool force=false); + void force_active(bool active); void set_deactivation_time(PN_stdfloat dt); PN_stdfloat get_deactivation_time() const; @@ -86,7 +87,7 @@ PUBLISHED: void set_deactivation_enabled(bool enabled); bool is_deactivation_enabled() const; - // Debug Visualistion + // Debug Visualisation INLINE void set_debug_enabled(const bool enabled); INLINE bool is_debug_enabled() const; @@ -100,6 +101,7 @@ PUBLISHED: #if BT_BULLET_VERSION >= 281 INLINE PN_stdfloat get_rolling_friction() const; INLINE void set_rolling_friction(PN_stdfloat friction); + MAKE_PROPERTY(rolling_friction, get_rolling_friction, set_rolling_friction); #endif INLINE bool has_anisotropic_friction() const; @@ -115,6 +117,27 @@ PUBLISHED: // Special void set_transform_dirty(); + MAKE_SEQ_PROPERTY(shapes, get_num_shapes, get_shape); + MAKE_SEQ_PROPERTY(shape_pos, get_num_shapes, get_shape_pos); + MAKE_SEQ_PROPERTY(shape_mat, get_num_shapes, get_shape_mat); + MAKE_SEQ_PROPERTY(shape_transform, get_num_shapes, get_shape_transform); + MAKE_PROPERTY(shape_bounds, get_shape_bounds); + MAKE_PROPERTY(static, is_static, set_static); + MAKE_PROPERTY(kinematic, is_kinematic, set_kinematic); + MAKE_PROPERTY(collision_notification, notifies_collisions, notify_collisions); + MAKE_PROPERTY(collision_response, get_collision_response, set_collision_response); + MAKE_PROPERTY(contact_response, has_contact_response); + MAKE_PROPERTY(contact_processing_threshold, get_contact_processing_threshold, set_contact_processing_threshold); + MAKE_PROPERTY(active, is_active, force_active); + MAKE_PROPERTY(deactivation_time, get_deactivation_time, set_deactivation_time); + MAKE_PROPERTY(deactivation_enabled, is_deactivation_enabled, set_deactivation_enabled); + MAKE_PROPERTY(debug_enabled, is_debug_enabled, set_debug_enabled); + MAKE_PROPERTY(restitution, get_restitution, set_restitution); + MAKE_PROPERTY(friction, get_friction, set_friction); + MAKE_PROPERTY(anisotropic_friction, get_anisotropic_friction, set_anisotropic_friction); + MAKE_PROPERTY(ccd_swept_sphere_radius, get_ccd_swept_sphere_radius, set_ccd_swept_sphere_radius); + MAKE_PROPERTY(ccd_motion_threshold, get_ccd_motion_threshold, set_ccd_motion_threshold); + public: virtual btCollisionObject *get_object() const = 0; diff --git a/panda/src/bullet/bulletBoxShape.h b/panda/src/bullet/bulletBoxShape.h index 82b1f10412..72a897d799 100644 --- a/panda/src/bullet/bulletBoxShape.h +++ b/panda/src/bullet/bulletBoxShape.h @@ -42,6 +42,9 @@ PUBLISHED: static BulletBoxShape *make_from_solid(const CollisionBox *solid); + MAKE_PROPERTY(half_extents_with_margin, get_half_extents_with_margin); + MAKE_PROPERTY(half_extents_without_margin, get_half_extents_without_margin); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletCapsuleShape.h b/panda/src/bullet/bulletCapsuleShape.h index 5e2150c27c..b89001064f 100644 --- a/panda/src/bullet/bulletCapsuleShape.h +++ b/panda/src/bullet/bulletCapsuleShape.h @@ -34,6 +34,9 @@ PUBLISHED: INLINE PN_stdfloat get_radius() const; INLINE PN_stdfloat get_half_height() const; + MAKE_PROPERTY(radius, get_radius); + MAKE_PROPERTY(half_height, get_half_height); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletCharacterControllerNode.cxx b/panda/src/bullet/bulletCharacterControllerNode.cxx index 8d9dfdf434..c6af3842e9 100644 --- a/panda/src/bullet/bulletCharacterControllerNode.cxx +++ b/panda/src/bullet/bulletCharacterControllerNode.cxx @@ -296,7 +296,6 @@ set_gravity(PN_stdfloat gravity) { #endif } - /** * */ @@ -304,4 +303,4 @@ void BulletCharacterControllerNode:: set_use_ghost_sweep_test(bool value) { return _character->setUseGhostSweepTest(value); -} +} \ No newline at end of file diff --git a/panda/src/bullet/bulletCharacterControllerNode.h b/panda/src/bullet/bulletCharacterControllerNode.h index 80f6aab834..1ced97ab9d 100644 --- a/panda/src/bullet/bulletCharacterControllerNode.h +++ b/panda/src/bullet/bulletCharacterControllerNode.h @@ -39,20 +39,27 @@ PUBLISHED: BulletShape *get_shape() const; + void set_gravity(PN_stdfloat gravity); PN_stdfloat get_gravity() const; - PN_stdfloat get_max_slope() const; void set_fall_speed(PN_stdfloat fall_speed); void set_jump_speed(PN_stdfloat jump_speed); void set_max_jump_height(PN_stdfloat max_jump_height); + void set_max_slope(PN_stdfloat max_slope); - void set_gravity(PN_stdfloat gravity); + PN_stdfloat get_max_slope() const; + void set_use_ghost_sweep_test(bool value); bool is_on_ground() const; bool can_jump() const; void do_jump(); + MAKE_PROPERTY(shape, get_shape); + MAKE_PROPERTY(gravity, get_gravity, set_gravity); + MAKE_PROPERTY(max_slope, get_max_slope, set_max_slope); + MAKE_PROPERTY(on_ground, is_on_ground); + public: INLINE virtual btPairCachingGhostObject *get_ghost() const; INLINE virtual btCharacterControllerInterface *get_character() const; diff --git a/panda/src/bullet/bulletClosestHitRayResult.h b/panda/src/bullet/bulletClosestHitRayResult.h index 0f2bd67128..c6c31f19d0 100644 --- a/panda/src/bullet/bulletClosestHitRayResult.h +++ b/panda/src/bullet/bulletClosestHitRayResult.h @@ -44,6 +44,15 @@ PUBLISHED: int get_shape_part() const; int get_triangle_index() const; + MAKE_PROPERTY(from_pos, get_from_pos); + MAKE_PROPERTY(to_pos, get_to_pos); + MAKE_PROPERTY(node, get_node); + MAKE_PROPERTY(hit_pos, get_hit_pos); + MAKE_PROPERTY(hit_normal, get_hit_normal); + MAKE_PROPERTY(hit_fraction, get_hit_fraction); + MAKE_PROPERTY(shape_part, get_shape_part); + MAKE_PROPERTY(triangle_index, get_triangle_index); + public: virtual bool needsCollision(btBroadphaseProxy* proxy0) const; virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace); diff --git a/panda/src/bullet/bulletClosestHitSweepResult.h b/panda/src/bullet/bulletClosestHitSweepResult.h index 44a82e5fb8..aba5ff57d8 100644 --- a/panda/src/bullet/bulletClosestHitSweepResult.h +++ b/panda/src/bullet/bulletClosestHitSweepResult.h @@ -41,6 +41,13 @@ PUBLISHED: LVector3 get_hit_normal() const; PN_stdfloat get_hit_fraction() const; + MAKE_PROPERTY(from_pos, get_from_pos); + MAKE_PROPERTY(to_pos, get_to_pos); + MAKE_PROPERTY(node, get_node); + MAKE_PROPERTY(hit_pos, get_hit_pos); + MAKE_PROPERTY(hit_normal, get_hit_normal); + MAKE_PROPERTY(hit_fraction, get_hit_fraction); + public: virtual bool needsCollision(btBroadphaseProxy* proxy0) const; diff --git a/panda/src/bullet/bulletConeShape.h b/panda/src/bullet/bulletConeShape.h index 21349bac14..97b99b01fe 100644 --- a/panda/src/bullet/bulletConeShape.h +++ b/panda/src/bullet/bulletConeShape.h @@ -34,6 +34,9 @@ PUBLISHED: INLINE PN_stdfloat get_radius() const; INLINE PN_stdfloat get_height() const; + MAKE_PROPERTY(radius, get_radius); + MAKE_PROPERTY(height, get_height); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletConeTwistConstraint.h b/panda/src/bullet/bulletConeTwistConstraint.h index 1cc4cc61e6..7e5c782915 100644 --- a/panda/src/bullet/bulletConeTwistConstraint.h +++ b/panda/src/bullet/bulletConeTwistConstraint.h @@ -56,6 +56,10 @@ PUBLISHED: INLINE CPT(TransformState) get_frame_a() const; INLINE CPT(TransformState) get_frame_b() const; + MAKE_PROPERTY(fix_threshold, get_fix_threshold, set_fix_threshold); + MAKE_PROPERTY(frame_a, get_frame_a); + MAKE_PROPERTY(frame_b, get_frame_b); + public: virtual btTypedConstraint *ptr() const; diff --git a/panda/src/bullet/bulletConstraint.I b/panda/src/bullet/bulletConstraint.I index b2f4666608..d66f5b6099 100644 --- a/panda/src/bullet/bulletConstraint.I +++ b/panda/src/bullet/bulletConstraint.I @@ -34,7 +34,7 @@ set_breaking_threshold(PN_stdfloat threshold) { * Returns the applied impluse limit for breaking the constraint. */ INLINE PN_stdfloat BulletConstraint:: -set_breaking_threshold() const { +get_breaking_threshold() const { return (PN_stdfloat)ptr()->getBreakingImpulseThreshold(); } diff --git a/panda/src/bullet/bulletConstraint.h b/panda/src/bullet/bulletConstraint.h index 9f97be7af8..85b0f0d63d 100644 --- a/panda/src/bullet/bulletConstraint.h +++ b/panda/src/bullet/bulletConstraint.h @@ -34,13 +34,13 @@ PUBLISHED: BulletRigidBodyNode *get_rigid_body_b(); void enable_feedback(bool value); - void set_debug_draw_size(PN_stdfloat size); - PN_stdfloat get_applied_impulse() const; + void set_debug_draw_size(PN_stdfloat size); PN_stdfloat get_debug_draw_size(); + PN_stdfloat get_applied_impulse() const; INLINE void set_breaking_threshold(PN_stdfloat threshold); - INLINE PN_stdfloat set_breaking_threshold() const; + INLINE PN_stdfloat get_breaking_threshold() const; INLINE void set_enabled(bool enabled); INLINE bool is_enabled() const; @@ -54,6 +54,13 @@ PUBLISHED: void set_param(ConstraintParam num, PN_stdfloat value, int axis=-1); PN_stdfloat get_param(ConstraintParam num, int axis=-1); + MAKE_PROPERTY(rigid_body_a, get_rigid_body_a); + MAKE_PROPERTY(rigid_body_b, get_rigid_body_b); + MAKE_PROPERTY(debug_draw_size, get_debug_draw_size, set_debug_draw_size); + MAKE_PROPERTY(applied_impulse, get_applied_impulse); + MAKE_PROPERTY(breaking_threshold, get_breaking_threshold, set_breaking_threshold); + MAKE_PROPERTY(enabled, is_enabled, set_enabled); + public: virtual btTypedConstraint *ptr() const = 0; diff --git a/panda/src/bullet/bulletContactCallbackData.h b/panda/src/bullet/bulletContactCallbackData.h index a83f66ff9c..c6c45c1e07 100644 --- a/panda/src/bullet/bulletContactCallbackData.h +++ b/panda/src/bullet/bulletContactCallbackData.h @@ -41,6 +41,14 @@ PUBLISHED: INLINE int get_index0() const; INLINE int get_index1() const; + MAKE_PROPERTY(manifold, get_manifold); + MAKE_PROPERTY(node0, get_node0); + MAKE_PROPERTY(node1, get_node1); + MAKE_PROPERTY(part_id0, get_part_id0); + MAKE_PROPERTY(part_id1, get_part_id1); + MAKE_PROPERTY(index0, get_index0); + MAKE_PROPERTY(index1, get_index1); + private: BulletManifoldPoint &_mp; PandaNode *_node0; diff --git a/panda/src/bullet/bulletContactCallbacks.h b/panda/src/bullet/bulletContactCallbacks.h index fa338154f8..27e8093e55 100644 --- a/panda/src/bullet/bulletContactCallbacks.h +++ b/panda/src/bullet/bulletContactCallbacks.h @@ -26,7 +26,7 @@ #include "eventParameter.h" #include "pandaNode.h" -struct UserPersitentData { +struct UserPersistentData { PT(PandaNode) node0; PT(PandaNode) node1; }; @@ -64,7 +64,7 @@ contact_added_callback(btManifoldPoint &cp, bullet_cat.debug() << "contact added: " << cp.m_userPersistentData << endl; // Gather persistent data - UserPersitentData *data = new UserPersitentData(); + UserPersistentData *data = new UserPersistentData(); data->node0 = node0; data->node1 = node1; @@ -126,7 +126,7 @@ contact_destroyed_callback(void *userPersistentData) { bullet_cat.debug() << "contact removed: " << userPersistentData << endl; - UserPersitentData *data = (UserPersitentData *)userPersistentData; + UserPersistentData *data = (UserPersistentData *)userPersistentData; // Send event if (bullet_enable_contact_events) { diff --git a/panda/src/bullet/bulletContactResult.h b/panda/src/bullet/bulletContactResult.h index 3e0e216135..afcf1ea51a 100644 --- a/panda/src/bullet/bulletContactResult.h +++ b/panda/src/bullet/bulletContactResult.h @@ -39,6 +39,14 @@ PUBLISHED: INLINE int get_part_id0() const; INLINE int get_part_id1() const; + MAKE_PROPERTY(manifold_point, get_manifold_point); + MAKE_PROPERTY(node0, get_node0); + MAKE_PROPERTY(node1, get_node1); + MAKE_PROPERTY(idx0, get_idx0); + MAKE_PROPERTY(idx1, get_idx1); + MAKE_PROPERTY(part_id0, get_part_id0); + MAKE_PROPERTY(part_id1, get_part_id1); + private: static btManifoldPoint _empty; @@ -64,6 +72,7 @@ PUBLISHED: INLINE int get_num_contacts() const; INLINE BulletContact get_contact(int idx); MAKE_SEQ(get_contacts, get_num_contacts, get_contact); + MAKE_SEQ_PROPERTY(contacts, get_num_contacts, get_contact); public: #if BT_BULLET_VERSION >= 281 diff --git a/panda/src/bullet/bulletConvexPointCloudShape.h b/panda/src/bullet/bulletConvexPointCloudShape.h index e1199d7a5b..bb5b5d2029 100644 --- a/panda/src/bullet/bulletConvexPointCloudShape.h +++ b/panda/src/bullet/bulletConvexPointCloudShape.h @@ -36,6 +36,8 @@ PUBLISHED: INLINE int get_num_points() const; + MAKE_PROPERTY(num_points, get_num_points); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletCylinderShape.h b/panda/src/bullet/bulletCylinderShape.h index d4e9beb31f..23c8781756 100644 --- a/panda/src/bullet/bulletCylinderShape.h +++ b/panda/src/bullet/bulletCylinderShape.h @@ -36,6 +36,10 @@ PUBLISHED: INLINE LVecBase3 get_half_extents_without_margin() const; INLINE LVecBase3 get_half_extents_with_margin() const; + MAKE_PROPERTY(radius, get_radius); + MAKE_PROPERTY(half_extents_without_margin, get_half_extents_without_margin); + MAKE_PROPERTY(half_extents_with_margin, get_half_extents_with_margin); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletDebugNode.I b/panda/src/bullet/bulletDebugNode.I index 4d4d8aa069..eae681aba5 100644 --- a/panda/src/bullet/bulletDebugNode.I +++ b/panda/src/bullet/bulletDebugNode.I @@ -29,6 +29,15 @@ show_wireframe(bool show) { draw_mask_changed(); } +/** + * + */ +INLINE bool BulletDebugNode:: +get_show_wireframe() const { + + return _wireframe; +} + /** * */ @@ -39,6 +48,15 @@ show_constraints(bool show) { draw_mask_changed(); } +/** + * + */ +INLINE bool BulletDebugNode:: +get_show_constraints() const { + + return _constraints; +} + /** * */ @@ -49,6 +67,15 @@ show_bounding_boxes(bool show) { draw_mask_changed(); } +/** + * + */ +INLINE bool BulletDebugNode:: +get_show_bounding_boxes() const { + + return _bounds; +} + /** * */ @@ -57,3 +84,12 @@ show_normals(bool show) { _drawer._normals = show; } + +/** + * + */ +INLINE bool BulletDebugNode:: +get_show_normals() const { + + return _drawer._normals; +} \ No newline at end of file diff --git a/panda/src/bullet/bulletDebugNode.h b/panda/src/bullet/bulletDebugNode.h index 5104438381..987e1a7450 100644 --- a/panda/src/bullet/bulletDebugNode.h +++ b/panda/src/bullet/bulletDebugNode.h @@ -35,6 +35,15 @@ PUBLISHED: INLINE void show_constraints(bool show); INLINE void show_bounding_boxes(bool show); INLINE void show_normals(bool show); + INLINE bool get_show_wireframe() const; + INLINE bool get_show_constraints() const; + INLINE bool get_show_bounding_boxes() const; + INLINE bool get_show_normals() const; + + MAKE_PROPERTY(wireframe, get_show_wireframe, show_wireframe); + MAKE_PROPERTY(constraints, get_show_constraints, show_constraints); + MAKE_PROPERTY(bounding_boxes, get_show_bounding_boxes, show_bounding_boxes); + MAKE_PROPERTY(normals, get_show_normals, show_normals); public: virtual bool safe_to_flatten() const; diff --git a/panda/src/bullet/bulletFilterCallbackData.h b/panda/src/bullet/bulletFilterCallbackData.h index 00a244cff8..36e3117716 100644 --- a/panda/src/bullet/bulletFilterCallbackData.h +++ b/panda/src/bullet/bulletFilterCallbackData.h @@ -36,6 +36,10 @@ PUBLISHED: INLINE void set_collide(bool collide); INLINE bool get_collide() const; + MAKE_PROPERTY(node_0, get_node_0); + MAKE_PROPERTY(node_1, get_node_1); + MAKE_PROPERTY(collide, get_collide, set_collide); + private: PandaNode *_node0; PandaNode *_node1; diff --git a/panda/src/bullet/bulletGenericConstraint.h b/panda/src/bullet/bulletGenericConstraint.h index c43c2217be..523330ca0f 100644 --- a/panda/src/bullet/bulletGenericConstraint.h +++ b/panda/src/bullet/bulletGenericConstraint.h @@ -61,6 +61,10 @@ PUBLISHED: INLINE CPT(TransformState) get_frame_a() const; INLINE CPT(TransformState) get_frame_b() const; + MAKE_PROPERTY(translational_limit_motor, get_translational_limit_motor); + MAKE_PROPERTY(frame_a, get_frame_a); + MAKE_PROPERTY(frame_b, get_frame_b); + public: virtual btTypedConstraint *ptr() const; diff --git a/panda/src/bullet/bulletGhostNode.h b/panda/src/bullet/bulletGhostNode.h index 3e8f2b6465..2cf5f73f21 100644 --- a/panda/src/bullet/bulletGhostNode.h +++ b/panda/src/bullet/bulletGhostNode.h @@ -38,6 +38,8 @@ PUBLISHED: INLINE int get_num_overlapping_nodes() const; INLINE PandaNode *get_overlapping_node(int idx) const; MAKE_SEQ(get_overlapping_nodes, get_num_overlapping_nodes, get_overlapping_node); + + MAKE_SEQ_PROPERTY(overlapping_nodes, get_num_overlapping_nodes, get_overlapping_node); public: virtual btCollisionObject *get_object() const; diff --git a/panda/src/bullet/bulletHelper.h b/panda/src/bullet/bulletHelper.h index 5b3aaf6152..c63f70f111 100644 --- a/panda/src/bullet/bulletHelper.h +++ b/panda/src/bullet/bulletHelper.h @@ -51,6 +51,9 @@ PUBLISHED: static void make_texcoords_for_patch(Geom *geom, int resx, int resy); + MAKE_PROPERTY(sb_index, get_sb_index); + MAKE_PROPERTY(sb_flip, get_sb_flip); + private: static PT(InternalName) _sb_index; static PT(InternalName) _sb_flip; diff --git a/panda/src/bullet/bulletHingeConstraint.h b/panda/src/bullet/bulletHingeConstraint.h index e5d5228454..81cf0b2674 100644 --- a/panda/src/bullet/bulletHingeConstraint.h +++ b/panda/src/bullet/bulletHingeConstraint.h @@ -73,6 +73,13 @@ PUBLISHED: INLINE CPT(TransformState) get_frame_a() const; INLINE CPT(TransformState) get_frame_b() const; + MAKE_PROPERTY(hinge_angle, get_hinge_angle); + MAKE_PROPERTY(lower_limit, get_lower_limit); + MAKE_PROPERTY(upper_limit, get_upper_limit); + MAKE_PROPERTY(angular_only, get_angular_only, set_angular_only); + MAKE_PROPERTY(frame_a, get_frame_a); + MAKE_PROPERTY(frame_b, get_frame_b); + public: virtual btTypedConstraint *ptr() const; diff --git a/panda/src/bullet/bulletManifoldPoint.h b/panda/src/bullet/bulletManifoldPoint.h index 4184ed9d97..a7bc271599 100644 --- a/panda/src/bullet/bulletManifoldPoint.h +++ b/panda/src/bullet/bulletManifoldPoint.h @@ -68,6 +68,30 @@ PUBLISHED: INLINE PN_stdfloat get_contact_cfm1() const; INLINE PN_stdfloat get_contact_cfm2() const; + MAKE_PROPERTY(life_time, get_life_time); + MAKE_PROPERTY(distance, get_distance); + MAKE_PROPERTY(applied_impulse, get_applied_impulse, set_applied_impulse); + MAKE_PROPERTY(position_world_on_a, get_position_world_on_a); + MAKE_PROPERTY(position_world_on_b, get_position_world_on_b); + MAKE_PROPERTY(normal_world_on_b, get_normal_world_on_b); + MAKE_PROPERTY(local_point_a, get_local_point_a); + MAKE_PROPERTY(local_point_b, get_local_point_b); + MAKE_PROPERTY(part_id0, get_part_id0); + MAKE_PROPERTY(part_id1, get_part_id1); + MAKE_PROPERTY(index0, get_index0); + MAKE_PROPERTY(index1, get_index1); + MAKE_PROPERTY(lateral_friction_initialized, get_lateral_friction_initialized, set_lateral_friction_initialized); + MAKE_PROPERTY(lateral_friction_dir1, get_lateral_friction_dir1, set_lateral_friction_dir1); + MAKE_PROPERTY(lateral_friction_dir2, get_lateral_friction_dir2, set_lateral_friction_dir2); + MAKE_PROPERTY(contact_motion1, get_contact_motion1, set_contact_motion1); + MAKE_PROPERTY(contact_motion2, get_contact_motion2, set_contact_motion2); + MAKE_PROPERTY(combined_friction, get_combined_friction, set_combined_friction); + MAKE_PROPERTY(combined_restitution, get_combined_restitution, set_combined_restitution); + MAKE_PROPERTY(applied_impulse_lateral1, get_applied_impulse_lateral1, set_applied_impulse_lateral1); + MAKE_PROPERTY(applied_impulse_lateral2, get_applied_impulse_lateral2, set_applied_impulse_lateral2); + MAKE_PROPERTY(contact_cfm1, get_contact_cfm1, set_contact_cfm1); + MAKE_PROPERTY(contact_cfm2, get_contact_cfm2, set_contact_cfm2); + public: BulletManifoldPoint(btManifoldPoint &pt); diff --git a/panda/src/bullet/bulletMinkowskiSumShape.h b/panda/src/bullet/bulletMinkowskiSumShape.h index 3b6aa6bc1f..dd148ce335 100644 --- a/panda/src/bullet/bulletMinkowskiSumShape.h +++ b/panda/src/bullet/bulletMinkowskiSumShape.h @@ -43,6 +43,12 @@ PUBLISHED: INLINE PN_stdfloat get_margin() const; + MAKE_PROPERTY(transform_a, get_transform_a, set_transform_a); + MAKE_PROPERTY(transform_b, get_transform_b, set_transform_b); + MAKE_PROPERTY(shape_a, get_shape_a); + MAKE_PROPERTY(shape_b, get_shape_b); + MAKE_PROPERTY(margin, get_margin); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletMultiSphereShape.h b/panda/src/bullet/bulletMultiSphereShape.h index b3a55bd5e3..2fb9c6c3a0 100644 --- a/panda/src/bullet/bulletMultiSphereShape.h +++ b/panda/src/bullet/bulletMultiSphereShape.h @@ -37,6 +37,10 @@ PUBLISHED: INLINE LPoint3 get_sphere_pos(int index) const; INLINE PN_stdfloat get_sphere_radius(int index) const; + MAKE_PROPERTY(sphere_count, get_sphere_count); + MAKE_SEQ_PROPERTY(sphere_pos, get_sphere_count, get_sphere_pos); + MAKE_SEQ_PROPERTY(sphere_radius, get_sphere_count, get_sphere_radius); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletPersistentManifold.h b/panda/src/bullet/bulletPersistentManifold.h index 2878d0b7ed..25feb57493 100644 --- a/panda/src/bullet/bulletPersistentManifold.h +++ b/panda/src/bullet/bulletPersistentManifold.h @@ -42,6 +42,12 @@ PUBLISHED: void clear_manifold(); + MAKE_PROPERTY(node0, get_node0); + MAKE_PROPERTY(node1, get_node1); + MAKE_SEQ_PROPERTY(manifold_points, get_num_manifold_points, get_manifold_point); + MAKE_PROPERTY(contact_breaking_threshold, get_contact_breaking_threshold); + MAKE_PROPERTY(contact_processing_threshold, get_contact_processing_threshold); + public: BulletPersistentManifold(btPersistentManifold *manifold); diff --git a/panda/src/bullet/bulletPlaneShape.h b/panda/src/bullet/bulletPlaneShape.h index 44a8e9ede6..4e75bfc2e6 100644 --- a/panda/src/bullet/bulletPlaneShape.h +++ b/panda/src/bullet/bulletPlaneShape.h @@ -42,6 +42,9 @@ PUBLISHED: static BulletPlaneShape *make_from_solid(const CollisionPlane *solid); + MAKE_PROPERTY(plane_normal, get_plane_normal); + MAKE_PROPERTY(plane_constant, get_plane_constant); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletRigidBodyNode.h b/panda/src/bullet/bulletRigidBodyNode.h index ea59c9202c..c8afaeb8bb 100644 --- a/panda/src/bullet/bulletRigidBodyNode.h +++ b/panda/src/bullet/bulletRigidBodyNode.h @@ -86,6 +86,23 @@ PUBLISHED: // Special bool pick_dirty_flag(); + MAKE_PROPERTY(mass, get_mass, set_mass); + MAKE_PROPERTY(inv_mass, get_inv_mass); + MAKE_PROPERTY(inertia, get_inertia, set_inertia); + MAKE_PROPERTY(inv_inertia_diag_local, get_inv_inertia_diag_local); + MAKE_PROPERTY(inv_inertia_tensor_world, get_inv_inertia_tensor_world); + MAKE_PROPERTY(linear_velocity, get_linear_velocity, set_linear_velocity); + MAKE_PROPERTY(angular_velocity, get_angular_velocity, set_angular_velocity); + MAKE_PROPERTY(linear_damping, get_linear_damping, set_linear_damping); + MAKE_PROPERTY(angular_damping, get_angular_damping, set_angular_damping); + MAKE_PROPERTY(total_force, get_total_force); + MAKE_PROPERTY(total_torque, get_total_torque); + MAKE_PROPERTY(linear_sleep_threshold, get_linear_sleep_threshold, set_linear_sleep_threshold); + MAKE_PROPERTY(angular_sleep_threshold, get_angular_sleep_threshold, set_angular_sleep_threshold); + MAKE_PROPERTY(gravity, get_gravity, set_gravity); + MAKE_PROPERTY(linear_factor, get_linear_factor, set_linear_factor); + MAKE_PROPERTY(angular_factor, get_angular_factor, set_angular_factor); + public: virtual btCollisionObject *get_object() const; diff --git a/panda/src/bullet/bulletRotationalLimitMotor.h b/panda/src/bullet/bulletRotationalLimitMotor.h index b82db7ad57..a1cce18ff4 100644 --- a/panda/src/bullet/bulletRotationalLimitMotor.h +++ b/panda/src/bullet/bulletRotationalLimitMotor.h @@ -50,6 +50,13 @@ PUBLISHED: INLINE PN_stdfloat get_current_position() const; INLINE PN_stdfloat get_accumulated_impulse() const; + MAKE_PROPERTY(limited, is_limited); + MAKE_PROPERTY(motor_enabled, get_motor_enabled, set_motor_enabled); + MAKE_PROPERTY(current_limit, get_current_limit); + MAKE_PROPERTY(current_error, get_current_error); + MAKE_PROPERTY(current_position, get_current_position); + MAKE_PROPERTY(accumulated_impulse, get_accumulated_impulse); + public: BulletRotationalLimitMotor(btRotationalLimitMotor &motor); diff --git a/panda/src/bullet/bulletShape.h b/panda/src/bullet/bulletShape.h index 8094cd1efb..8ebeaf9290 100644 --- a/panda/src/bullet/bulletShape.h +++ b/panda/src/bullet/bulletShape.h @@ -45,10 +45,20 @@ PUBLISHED: PN_stdfloat get_margin() const; BoundingSphere get_shape_bounds() const; + + MAKE_PROPERTY(polyhedral, is_polyhedral); + MAKE_PROPERTY(convex, is_convex); + MAKE_PROPERTY(convex_2d, is_convex_2d); + MAKE_PROPERTY(concave, is_concave); + MAKE_PROPERTY(infinite, is_infinite); + MAKE_PROPERTY(non_moving, is_non_moving); + MAKE_PROPERTY(soft_body, is_soft_body); + MAKE_PROPERTY(margin, get_margin, set_margin); + MAKE_PROPERTY(name, get_name); + MAKE_PROPERTY(shape_bounds, get_shape_bounds); public: virtual btCollisionShape *ptr() const = 0; - LVecBase3 get_local_scale() const; void set_local_scale(const LVecBase3 &scale); diff --git a/panda/src/bullet/bulletSliderConstraint.h b/panda/src/bullet/bulletSliderConstraint.h index b2ea28046e..181cb3a94a 100644 --- a/panda/src/bullet/bulletSliderConstraint.h +++ b/panda/src/bullet/bulletSliderConstraint.h @@ -74,6 +74,21 @@ PUBLISHED: INLINE CPT(TransformState) get_frame_a() const; INLINE CPT(TransformState) get_frame_b() const; + MAKE_PROPERTY(linear_pos, get_linear_pos); + MAKE_PROPERTY(angular_pos, get_angular_pos); + MAKE_PROPERTY(lower_linear_limit, get_lower_linear_limit, set_lower_linear_limit); + MAKE_PROPERTY(upper_linear_limit, get_upper_linear_limit, set_upper_linear_limit); + MAKE_PROPERTY(lower_angular_limit, get_lower_angular_limit, set_lower_angular_limit); + MAKE_PROPERTY(upper_angular_limit, get_upper_angular_limit, set_upper_angular_limit); + MAKE_PROPERTY(powered_linear_motor, get_powered_linear_motor, set_powered_linear_motor); + MAKE_PROPERTY(target_linear_motor_velocity, get_target_linear_motor_velocity, set_target_linear_motor_velocity); + MAKE_PROPERTY(max_linear_motor_force, get_max_linear_motor_force, set_max_linear_motor_force); + MAKE_PROPERTY(powered_angular_motor, get_powered_angular_motor, set_powered_angular_motor); + MAKE_PROPERTY(target_angular_motor_velocity, get_target_angular_motor_velocity, set_target_angular_motor_velocity); + MAKE_PROPERTY(max_angular_motor_force, get_max_angular_motor_force, set_max_angular_motor_force); + MAKE_PROPERTY(frame_a, get_frame_a); + MAKE_PROPERTY(frame_b, get_frame_b); + public: virtual btTypedConstraint *ptr() const; diff --git a/panda/src/bullet/bulletSoftBodyConfig.I b/panda/src/bullet/bulletSoftBodyConfig.I index 811463d492..eed9499bbb 100644 --- a/panda/src/bullet/bulletSoftBodyConfig.I +++ b/panda/src/bullet/bulletSoftBodyConfig.I @@ -113,7 +113,7 @@ set_pressure_coefficient(PN_stdfloat value) { * Getter for property kVC. */ INLINE PN_stdfloat BulletSoftBodyConfig:: -get_volume_conversation_coefficient() const { +get_volume_conservation_coefficient() const { return (PN_stdfloat)_cfg.kVC; } @@ -122,7 +122,7 @@ get_volume_conversation_coefficient() const { * Setter for property kVC. */ INLINE void BulletSoftBodyConfig:: -set_volume_conversation_coefficient(PN_stdfloat value) { +set_volume_conservation_coefficient(PN_stdfloat value) { _cfg.kVC = (btScalar)value; } diff --git a/panda/src/bullet/bulletSoftBodyConfig.h b/panda/src/bullet/bulletSoftBodyConfig.h index e3bf316881..2411797146 100644 --- a/panda/src/bullet/bulletSoftBodyConfig.h +++ b/panda/src/bullet/bulletSoftBodyConfig.h @@ -56,7 +56,7 @@ PUBLISHED: INLINE void set_drag_coefficient(PN_stdfloat value); INLINE void set_lift_coefficient(PN_stdfloat value); INLINE void set_pressure_coefficient(PN_stdfloat value); - INLINE void set_volume_conversation_coefficient(PN_stdfloat value); + INLINE void set_volume_conservation_coefficient(PN_stdfloat value); INLINE void set_dynamic_friction_coefficient(PN_stdfloat value); INLINE void set_pose_matching_coefficient(PN_stdfloat value); INLINE void set_rigid_contacts_hardness(PN_stdfloat value); @@ -81,7 +81,7 @@ PUBLISHED: INLINE PN_stdfloat get_drag_coefficient() const; INLINE PN_stdfloat get_lift_coefficient() const; INLINE PN_stdfloat get_pressure_coefficient() const; - INLINE PN_stdfloat get_volume_conversation_coefficient() const; + INLINE PN_stdfloat get_volume_conservation_coefficient() const; INLINE PN_stdfloat get_dynamic_friction_coefficient() const; INLINE PN_stdfloat get_pose_matching_coefficient() const; INLINE PN_stdfloat get_rigid_contacts_hardness() const; @@ -101,6 +101,32 @@ PUBLISHED: INLINE int get_drift_solver_iterations() const; INLINE int get_cluster_solver_iterations() const; + MAKE_PROPERTY(aero_model, get_aero_model, set_aero_model); + MAKE_PROPERTY(velocities_correction_factor, get_velocities_correction_factor, set_velocities_correction_factor); + MAKE_PROPERTY(damping_coefficient, get_damping_coefficient, set_damping_coefficient); + MAKE_PROPERTY(drag_coefficient, get_drag_coefficient, set_drag_coefficient); + MAKE_PROPERTY(lift_coefficient, get_lift_coefficient, set_lift_coefficient); + MAKE_PROPERTY(pressure_coefficient, get_pressure_coefficient, set_pressure_coefficient); + MAKE_PROPERTY(volume_conservation_coefficient, get_volume_conservation_coefficient, set_volume_conservation_coefficient); + MAKE_PROPERTY(dynamic_friction_coefficient, get_dynamic_friction_coefficient, set_dynamic_friction_coefficient); + MAKE_PROPERTY(pose_matching_coefficient, get_pose_matching_coefficient, set_pose_matching_coefficient); + MAKE_PROPERTY(rigid_contacts_hardness, get_rigid_contacts_hardness, set_rigid_contacts_hardness); + MAKE_PROPERTY(kinetic_contacts_hardness, get_kinetic_contacts_hardness, set_kinetic_contacts_hardness); + MAKE_PROPERTY(soft_contacts_hardness, get_soft_contacts_hardness, set_soft_contacts_hardness); + MAKE_PROPERTY(anchors_hardness, get_anchors_hardness, set_anchors_hardness); + MAKE_PROPERTY(soft_vs_rigid_hardness, get_soft_vs_rigid_hardness, set_soft_vs_rigid_hardness); + MAKE_PROPERTY(soft_vs_kinetic_hardness, get_soft_vs_kinetic_hardness, set_soft_vs_kinetic_hardness); + MAKE_PROPERTY(soft_vs_soft_hardness, get_soft_vs_soft_hardness, set_soft_vs_soft_hardness); + MAKE_PROPERTY(soft_vs_rigid_impulse_split, get_soft_vs_rigid_impulse_split, set_soft_vs_rigid_impulse_split); + MAKE_PROPERTY(soft_vs_kinetic_impulse_split, get_soft_vs_kinetic_impulse_split, set_soft_vs_kinetic_impulse_split); + MAKE_PROPERTY(soft_vs_soft_impulse_split, get_soft_vs_soft_impulse_split, set_soft_vs_soft_impulse_split); + MAKE_PROPERTY(maxvolume, get_maxvolume, set_maxvolume); + MAKE_PROPERTY(timescale, get_timescale, set_timescale); + MAKE_PROPERTY(positions_solver_iterations, get_positions_solver_iterations, set_positions_solver_iterations); + MAKE_PROPERTY(velocities_solver_iterations, get_velocities_solver_iterations, set_velocities_solver_iterations); + MAKE_PROPERTY(drift_solver_iterations, get_drift_solver_iterations, set_drift_solver_iterations); + MAKE_PROPERTY(cluster_solver_iterations, get_cluster_solver_iterations, set_cluster_solver_iterations); + public: BulletSoftBodyConfig(btSoftBody::Config &cfg); diff --git a/panda/src/bullet/bulletSoftBodyMaterial.h b/panda/src/bullet/bulletSoftBodyMaterial.h index b2a70c1d9d..3f1c07a7aa 100644 --- a/panda/src/bullet/bulletSoftBodyMaterial.h +++ b/panda/src/bullet/bulletSoftBodyMaterial.h @@ -27,16 +27,17 @@ PUBLISHED: INLINE ~BulletSoftBodyMaterial(); INLINE static BulletSoftBodyMaterial empty(); - 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_linear_stiffness(PN_stdfloat value); - 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_angular_stiffness(PN_stdfloat value); - INLINE void set_volume_preservation(PN_stdfloat value); INLINE PN_stdfloat get_volume_preservation() const; + INLINE void set_volume_preservation(PN_stdfloat value); + + MAKE_PROPERTY(linear_stiffness, get_linear_stiffness, set_linear_stiffness); + MAKE_PROPERTY(angular_stiffness, get_angular_stiffness, set_angular_stiffness); MAKE_PROPERTY(volume_preservation, get_volume_preservation, set_volume_preservation); public: diff --git a/panda/src/bullet/bulletSoftBodyNode.h b/panda/src/bullet/bulletSoftBodyNode.h index 38d95c1fd9..0f37217dfe 100644 --- a/panda/src/bullet/bulletSoftBodyNode.h +++ b/panda/src/bullet/bulletSoftBodyNode.h @@ -50,6 +50,13 @@ PUBLISHED: INLINE PN_stdfloat get_area() const; INLINE int is_attached() const; + MAKE_PROPERTY(pos, get_pos); + MAKE_PROPERTY(velocity, get_velocity); + MAKE_PROPERTY(normal, get_normal); + MAKE_PROPERTY(inv_mass, get_inv_mass); + MAKE_PROPERTY(area, get_area); + MAKE_PROPERTY(attached, is_attached); + public: BulletSoftBodyNodeElement(btSoftBody::Node &node); @@ -203,6 +210,14 @@ PUBLISHED: const char *face, const char *node); + MAKE_PROPERTY(cfg, get_cfg); + MAKE_PROPERTY(world_info, get_world_info); + MAKE_PROPERTY(wind_velocity, get_wind_velocity, set_wind_velocity); + MAKE_PROPERTY(aabb, get_aabb); + MAKE_PROPERTY(num_clusters, get_num_clusters); + MAKE_SEQ_PROPERTY(materials, get_num_materials, get_material); + MAKE_SEQ_PROPERTY(nodes, get_num_nodes, get_node); + public: virtual btCollisionObject *get_object() const; diff --git a/panda/src/bullet/bulletSoftBodyShape.h b/panda/src/bullet/bulletSoftBodyShape.h index 28a5aab9a6..85f62df88f 100644 --- a/panda/src/bullet/bulletSoftBodyShape.h +++ b/panda/src/bullet/bulletSoftBodyShape.h @@ -31,6 +31,8 @@ PUBLISHED: BulletSoftBodyNode *get_body() const; + MAKE_PROPERTY(body, get_body); + public: BulletSoftBodyShape(btSoftBodyCollisionShape *shapePtr); diff --git a/panda/src/bullet/bulletSoftBodyWorldInfo.h b/panda/src/bullet/bulletSoftBodyWorldInfo.h index c0aa23454b..5cae2fa0d5 100644 --- a/panda/src/bullet/bulletSoftBodyWorldInfo.h +++ b/panda/src/bullet/bulletSoftBodyWorldInfo.h @@ -43,6 +43,12 @@ PUBLISHED: void garbage_collect(int lifetime=256); + MAKE_PROPERTY(air_density, get_air_density, set_air_density); + MAKE_PROPERTY(water_density, get_water_density, set_water_density); + MAKE_PROPERTY(water_offset, get_water_offset, set_water_offset); + MAKE_PROPERTY(water_normal, get_water_normal, set_water_normal); + MAKE_PROPERTY(gravity, get_gravity, set_gravity); + public: BulletSoftBodyWorldInfo(btSoftBodyWorldInfo &_info); diff --git a/panda/src/bullet/bulletSphereShape.h b/panda/src/bullet/bulletSphereShape.h index 877f24f5df..815728c908 100644 --- a/panda/src/bullet/bulletSphereShape.h +++ b/panda/src/bullet/bulletSphereShape.h @@ -40,6 +40,8 @@ PUBLISHED: static BulletSphereShape *make_from_solid(const CollisionSphere *solid); + MAKE_PROPERTY(radius, get_radius); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletSphericalConstraint.h b/panda/src/bullet/bulletSphericalConstraint.h index 26f04825ea..4aad8b4ee9 100644 --- a/panda/src/bullet/bulletSphericalConstraint.h +++ b/panda/src/bullet/bulletSphericalConstraint.h @@ -48,6 +48,9 @@ PUBLISHED: LPoint3 get_pivot_in_a() const; LPoint3 get_pivot_in_b() const; + MAKE_PROPERTY(pivot_a, get_pivot_in_a, set_pivot_a); + MAKE_PROPERTY(pivot_b, get_pivot_in_b, set_pivot_b); + public: virtual btTypedConstraint *ptr() const; diff --git a/panda/src/bullet/bulletTickCallbackData.h b/panda/src/bullet/bulletTickCallbackData.h index 80c8570fe1..6218ac237c 100644 --- a/panda/src/bullet/bulletTickCallbackData.h +++ b/panda/src/bullet/bulletTickCallbackData.h @@ -30,6 +30,8 @@ PUBLISHED: INLINE PN_stdfloat get_timestep() const; + MAKE_PROPERTY(timestep, get_timestep); + private: btScalar _timestep; diff --git a/panda/src/bullet/bulletTranslationalLimitMotor.h b/panda/src/bullet/bulletTranslationalLimitMotor.h index bfbdd5e870..f339daefef 100644 --- a/panda/src/bullet/bulletTranslationalLimitMotor.h +++ b/panda/src/bullet/bulletTranslationalLimitMotor.h @@ -32,8 +32,8 @@ PUBLISHED: INLINE void set_motor_enabled(int axis, bool enable); INLINE void set_low_limit(const LVecBase3 &limit); - INLINE void set_high_limit(const LVecBase3 & limit); - INLINE void set_target_velocity(const LVecBase3&velocity); + INLINE void set_high_limit(const LVecBase3 &limit); + INLINE void set_target_velocity(const LVecBase3 &velocity); INLINE void set_max_motor_force(const LVecBase3 &force); INLINE void set_damping(PN_stdfloat damping); INLINE void set_softness(PN_stdfloat softness); @@ -49,6 +49,10 @@ PUBLISHED: INLINE LPoint3 get_current_diff() const; INLINE LVector3 get_accumulated_impulse() const; + MAKE_PROPERTY(current_error, get_current_error); + MAKE_PROPERTY(current_diff, get_current_diff); + MAKE_PROPERTY(accumulated_impulse, get_accumulated_impulse); + public: BulletTranslationalLimitMotor(btTranslationalLimitMotor &motor); diff --git a/panda/src/bullet/bulletTriangleMesh.h b/panda/src/bullet/bulletTriangleMesh.h index ade3ccfd7f..71dfe39a50 100644 --- a/panda/src/bullet/bulletTriangleMesh.h +++ b/panda/src/bullet/bulletTriangleMesh.h @@ -55,6 +55,9 @@ PUBLISHED: virtual void output(ostream &out) const; virtual void write(ostream &out, int indent_level) const; + MAKE_PROPERTY(num_triangles, get_num_triangles); + MAKE_PROPERTY(welding_distance, get_welding_distance, set_welding_distance); + public: INLINE btTriangleMesh *ptr() const; diff --git a/panda/src/bullet/bulletTriangleMeshShape.h b/panda/src/bullet/bulletTriangleMeshShape.h index 7a40dd5782..022df31655 100644 --- a/panda/src/bullet/bulletTriangleMeshShape.h +++ b/panda/src/bullet/bulletTriangleMeshShape.h @@ -41,6 +41,9 @@ PUBLISHED: INLINE bool is_static() const; INLINE bool is_dynamic() const; + MAKE_PROPERTY(static, is_static); + MAKE_PROPERTY(dynamic, is_dynamic); + public: virtual btCollisionShape *ptr() const; diff --git a/panda/src/bullet/bulletVehicle.h b/panda/src/bullet/bulletVehicle.h index 7ced2acb46..8b7f7862c6 100644 --- a/panda/src/bullet/bulletVehicle.h +++ b/panda/src/bullet/bulletVehicle.h @@ -46,6 +46,13 @@ PUBLISHED: INLINE PN_stdfloat get_friction_slip() const; INLINE PN_stdfloat get_max_suspension_force() const; + MAKE_PROPERTY(suspension_stiffness, get_suspension_stiffness, set_suspension_stiffness); + MAKE_PROPERTY(suspension_compression, get_suspension_compression, set_suspension_compression); + MAKE_PROPERTY(suspension_damping, get_suspension_damping, set_suspension_damping); + MAKE_PROPERTY(max_suspension_travel_cm, get_max_suspension_travel_cm, set_max_suspension_travel_cm); + MAKE_PROPERTY(friction_slip, get_friction_slip, set_friction_slip); + MAKE_PROPERTY(max_suspension_force, get_max_suspension_force, set_max_suspension_force); + private: btRaycastVehicle::btVehicleTuning _; @@ -87,6 +94,12 @@ PUBLISHED: // Tuning INLINE BulletVehicleTuning &get_tuning(); + MAKE_PROPERTY(chassis, get_chassis); + MAKE_PROPERTY(current_speed_km_hour, get_current_speed_km_hour); + MAKE_PROPERTY(forward_vector, get_forward_vector); + MAKE_SEQ_PROPERTY(wheels, get_num_wheels, get_wheel); + MAKE_PROPERTY(tuning, get_tuning); + public: INLINE btRaycastVehicle *get_vehicle() const; diff --git a/panda/src/bullet/bulletWheel.h b/panda/src/bullet/bulletWheel.h index 2f3fcc2e71..2b6ecd8a80 100644 --- a/panda/src/bullet/bulletWheel.h +++ b/panda/src/bullet/bulletWheel.h @@ -39,6 +39,15 @@ PUBLISHED: INLINE LPoint3 get_hard_point_ws() const; INLINE PandaNode *get_ground_object() const; + MAKE_PROPERTY(in_contact, is_in_contact); + MAKE_PROPERTY(suspension_length, get_suspension_length); + MAKE_PROPERTY(contact_normal_ws, get_contact_normal_ws); + MAKE_PROPERTY(wheel_direction_ws, get_wheel_direction_ws); + MAKE_PROPERTY(wheel_axle_ws, get_wheel_axle_ws); + MAKE_PROPERTY(contact_point_ws, get_contact_point_ws); + MAKE_PROPERTY(hard_point_ws, get_hard_point_ws); + MAKE_PROPERTY(ground_object, get_ground_object); + public: BulletWheelRaycastInfo(btWheelInfo::RaycastInfo &info); @@ -105,6 +114,32 @@ PUBLISHED: PandaNode *get_node() const; BulletWheelRaycastInfo get_raycast_info() const; + MAKE_PROPERTY(raycast_info, get_raycast_info); + MAKE_PROPERTY(suspension_rest_length, get_suspension_rest_length); + MAKE_PROPERTY(suspension_stiffness, get_suspension_stiffness, set_suspension_stiffness); + MAKE_PROPERTY(max_suspension_travel_cm, get_max_suspension_travel_cm, set_max_suspension_travel_cm); + MAKE_PROPERTY(friction_slip, get_friction_slip, set_friction_slip); + MAKE_PROPERTY(max_suspension_force, get_max_suspension_force, set_max_suspension_force); + MAKE_PROPERTY(wheels_damping_compression, get_wheels_damping_compression, set_wheels_damping_compression); + MAKE_PROPERTY(wheels_damping_relaxation, get_wheels_damping_relaxation, set_wheels_damping_relaxation); + MAKE_PROPERTY(roll_influence, get_roll_influence, set_roll_influence); + MAKE_PROPERTY(wheel_radius, get_wheel_radius, set_wheel_radius); + MAKE_PROPERTY(steering, get_steering, set_steering); + MAKE_PROPERTY(rotation, get_rotation, set_rotation); + MAKE_PROPERTY(delta_rotation, get_delta_rotation, set_delta_rotation); + MAKE_PROPERTY(engine_force, get_engine_force, set_engine_force); + MAKE_PROPERTY(brake, get_brake, set_brake); + MAKE_PROPERTY(skid_info, get_skid_info, set_skid_info); + MAKE_PROPERTY(wheels_suspension_force, get_wheels_suspension_force, set_wheels_suspension_force); + MAKE_PROPERTY(suspension_relative_velocity, get_suspension_relative_velocity, set_suspension_relative_velocity); + MAKE_PROPERTY(clipped_inv_connection_point_cs, get_clipped_inv_connection_point_cs, set_clipped_inv_connection_point_cs); + MAKE_PROPERTY(chassis_connection_point_cs, get_chassis_connection_point_cs, set_chassis_connection_point_cs); + MAKE_PROPERTY(wheel_direction_cs, get_wheel_direction_cs, set_wheel_direction_cs); + MAKE_PROPERTY(wheel_axle_cs, get_wheel_axle_cs, set_wheel_axle_cs); + MAKE_PROPERTY(world_transform, get_world_transform, set_world_transform); + MAKE_PROPERTY(front_wheel, is_front_wheel, set_front_wheel); + MAKE_PROPERTY(node, get_node, set_node); + public: BulletWheel(btWheelInfo &info); diff --git a/panda/src/bullet/bulletWorld.I b/panda/src/bullet/bulletWorld.I index e93dc0d176..958376ec60 100644 --- a/panda/src/bullet/bulletWorld.I +++ b/panda/src/bullet/bulletWorld.I @@ -81,6 +81,15 @@ get_debug_node() const { return _debug; } +/** + * + */ +INLINE bool BulletWorld:: +has_debug_node() const { + + return _debug != NULL; +} + /** * */ diff --git a/panda/src/bullet/bulletWorld.h b/panda/src/bullet/bulletWorld.h index 8d39186bb0..b077e05f7a 100644 --- a/panda/src/bullet/bulletWorld.h +++ b/panda/src/bullet/bulletWorld.h @@ -65,6 +65,7 @@ PUBLISHED: INLINE void set_debug_node(BulletDebugNode *node); INLINE void clear_debug_node(); INLINE BulletDebugNode *get_debug_node() const; + INLINE bool has_debug_node() const; // AttachRemove void attach(TypedObject *object); @@ -159,6 +160,17 @@ PUBLISHED: FA_callback, }; + MAKE_PROPERTY(gravity, get_gravity, set_gravity); + MAKE_PROPERTY(world_info, get_world_info); + MAKE_PROPERTY2(debug_node, has_debug_node, get_debug_node, set_debug_node, clear_debug_node); + MAKE_SEQ_PROPERTY(ghosts, get_num_ghosts, get_ghost); + MAKE_SEQ_PROPERTY(rigid_bodies, get_num_rigid_bodies, get_rigid_body); + MAKE_SEQ_PROPERTY(soft_bodies, get_num_soft_bodies, get_soft_body); + MAKE_SEQ_PROPERTY(characters, get_num_characters, get_character); + MAKE_SEQ_PROPERTY(vehicles, get_num_vehicles, get_vehicle); + MAKE_SEQ_PROPERTY(constraints, get_num_constraints, get_constraint); + MAKE_SEQ_PROPERTY(manifolds, get_num_manifolds, get_manifold); + PUBLISHED: // Deprecated methods, will become private soon void attach_ghost(BulletGhostNode *node); void remove_ghost(BulletGhostNode *node); From 6d250f2f1f797b106a86c8019814f100aca486cc Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Wed, 29 Mar 2017 17:38:17 -0600 Subject: [PATCH 080/254] fsm: FourState needs to initialize stateIndex BEFORE first debugPrint I honestly have no idea how this even worked before. --- direct/src/fsm/FourState.py | 2 +- direct/src/fsm/FourStateAI.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/direct/src/fsm/FourState.py b/direct/src/fsm/FourState.py index df653825f9..fc24e23ca9 100755 --- a/direct/src/fsm/FourState.py +++ b/direct/src/fsm/FourState.py @@ -90,6 +90,7 @@ class FourState: off (and so is state 2 which is oposite of 4 and therefore oposite of 'on'). """ + self.stateIndex = 0 assert self.debugPrint("FourState(names=%s)"%(names)) self.track = None self.stateTime = 0.0 @@ -120,7 +121,6 @@ class FourState: self.exitState4, [names[1]]), } - self.stateIndex = 0 self.fsm = ClassicFSM.ClassicFSM('FourState', list(self.states.values()), # Initial State diff --git a/direct/src/fsm/FourStateAI.py b/direct/src/fsm/FourStateAI.py index 6f5ff8d966..7b0ebda64d 100755 --- a/direct/src/fsm/FourStateAI.py +++ b/direct/src/fsm/FourStateAI.py @@ -93,11 +93,11 @@ class FourStateAI: off (and so is state 2 which is oposite of state 4 and therefore oposite of 'on'). """ + self.stateIndex = 0 assert self.debugPrint( "FourStateAI(names=%s, durations=%s)" %(names, durations)) self.doLaterTask = None - self.stateIndex = 0 assert len(names) == 5 assert len(names) == len(durations) self.names = names From 76070d84cdea19c20a7d208ab0ae830d52c25bfc Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Wed, 29 Mar 2017 17:39:27 -0600 Subject: [PATCH 081/254] fsm: Change FourState's debugPrint to a __method This should stop it from getting overridden by subclasses. --- direct/src/fsm/FourState.py | 32 ++++++++++++------------- direct/src/fsm/FourStateAI.py | 44 +++++++++++++++++------------------ 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/direct/src/fsm/FourState.py b/direct/src/fsm/FourState.py index fc24e23ca9..af7b7d650c 100755 --- a/direct/src/fsm/FourState.py +++ b/direct/src/fsm/FourState.py @@ -91,7 +91,7 @@ class FourState: oposite of 'on'). """ self.stateIndex = 0 - assert self.debugPrint("FourState(names=%s)"%(names)) + assert self.__debugPrint("FourState(names=%s)"%(names)) self.track = None self.stateTime = 0.0 self.names = names @@ -131,7 +131,7 @@ class FourState: self.fsm.enterInitialState() def setTrack(self, track): - assert self.debugPrint("setTrack(track=%s)"%(track,)) + assert self.__debugPrint("setTrack(track=%s)"%(track,)) if self.track is not None: self.track.pause() self.track = None @@ -147,27 +147,27 @@ class FourState: # If the client wants the state changed it needs to # send a request to the AI. #def setIsOn(self, isOn): - # assert self.debugPrint("setIsOn(isOn=%s)"%(isOn,)) + # assert self.__debugPrint("setIsOn(isOn=%s)"%(isOn,)) # pass def isOn(self): - assert self.debugPrint("isOn() returning %s (stateIndex=%s)"%(self.stateIndex==4, self.stateIndex)) + assert self.__debugPrint("isOn() returning %s (stateIndex=%s)"%(self.stateIndex==4, self.stateIndex)) return self.stateIndex==4 def changedOnState(self, isOn): """ Allow derived classes to overide this. """ - assert self.debugPrint("changedOnState(isOn=%s)"%(isOn,)) + assert self.__debugPrint("changedOnState(isOn=%s)"%(isOn,)) ##### state 0 ##### def enterState0(self): - assert self.debugPrint("enter0()") + assert self.__debugPrint("enter0()") self.enterStateN(0) def exitState0(self): - assert self.debugPrint("exit0()") + assert self.__debugPrint("exit0()") # It's important for FourStates to broadcast their state # when they are generated on the client. Before I put this in, # if a door was generated and went directly to an 'open' state, @@ -177,43 +177,43 @@ class FourState: ##### state 1 ##### def enterState1(self): - assert self.debugPrint("enterState1()") + assert self.__debugPrint("enterState1()") self.enterStateN(1) def exitState1(self): - assert self.debugPrint("exitState1()") + assert self.__debugPrint("exitState1()") ##### state 2 ##### def enterState2(self): - assert self.debugPrint("enterState2()") + assert self.__debugPrint("enterState2()") self.enterStateN(2) def exitState2(self): - assert self.debugPrint("exitState2()") + assert self.__debugPrint("exitState2()") ##### state 3 ##### def enterState3(self): - assert self.debugPrint("enterState3()") + assert self.__debugPrint("enterState3()") self.enterStateN(3) def exitState3(self): - assert self.debugPrint("exitState3()") + assert self.__debugPrint("exitState3()") ##### state 4 ##### def enterState4(self): - assert self.debugPrint("enterState4()") + assert self.__debugPrint("enterState4()") self.enterStateN(4) self.changedOnState(1) def exitState4(self): - assert self.debugPrint("exitState4()") + assert self.__debugPrint("exitState4()") self.changedOnState(0) if __debug__: - def debugPrint(self, message): + def __debugPrint(self, message): """for debugging""" return self.notify.debug("%d (%d) %s"%( id(self), self.stateIndex==4, message)) diff --git a/direct/src/fsm/FourStateAI.py b/direct/src/fsm/FourStateAI.py index 7b0ebda64d..eee4b43a76 100755 --- a/direct/src/fsm/FourStateAI.py +++ b/direct/src/fsm/FourStateAI.py @@ -94,7 +94,7 @@ class FourStateAI: oposite of 'on'). """ self.stateIndex = 0 - assert self.debugPrint( + assert self.__debugPrint( "FourStateAI(names=%s, durations=%s)" %(names, durations)) self.doLaterTask = None @@ -137,7 +137,7 @@ class FourStateAI: self.fsm.enterInitialState() def delete(self): - assert self.debugPrint("delete()") + assert self.__debugPrint("delete()") if self.doLaterTask is not None: self.doLaterTask.remove() del self.doLaterTask @@ -145,15 +145,15 @@ class FourStateAI: del self.fsm def getState(self): - assert self.debugPrint("getState() returning %s"%(self.stateIndex,)) + assert self.__debugPrint("getState() returning %s"%(self.stateIndex,)) return [self.stateIndex] def sendState(self): - assert self.debugPrint("sendState()") + assert self.__debugPrint("sendState()") self.sendUpdate('setState', self.getState()) def setIsOn(self, isOn): - assert self.debugPrint("setIsOn(isOn=%s)"%(isOn,)) + assert self.__debugPrint("setIsOn(isOn=%s)"%(isOn,)) if isOn: if self.stateIndex != 4: # ...if it's not On; request turning on: @@ -170,7 +170,7 @@ class FourStateAI: # self.fsm.request(self.states[nextState]) def isOn(self): - assert self.debugPrint("isOn() returning %s (stateIndex=%s)"%(self.stateIndex==4, self.stateIndex)) + assert self.__debugPrint("isOn() returning %s (stateIndex=%s)"%(self.stateIndex==4, self.stateIndex)) return self.stateIndex==4 def changedOnState(self, isOn): @@ -179,12 +179,12 @@ class FourStateAI: The self.isOn value has toggled. Call getIsOn() to get the current state. """ - assert self.debugPrint("changedOnState(isOn=%s)"%(isOn,)) + assert self.__debugPrint("changedOnState(isOn=%s)"%(isOn,)) ##### states ##### def switchToNextStateTask(self, task): - assert self.debugPrint("switchToNextStateTask()") + assert self.__debugPrint("switchToNextStateTask()") self.fsm.request(self.states[self.nextStateIndex]) return Task.done @@ -193,11 +193,11 @@ class FourStateAI: This function is intentionaly simple so that derived classes may easily alter the network message. """ - assert self.debugPrint("distributeStateChange()") + assert self.__debugPrint("distributeStateChange()") self.sendState() def enterStateN(self, stateIndex, nextStateIndex): - assert self.debugPrint( + assert self.__debugPrint( "enterStateN(stateIndex=%s, nextStateIndex=%s)"% (stateIndex, nextStateIndex)) self.stateIndex = stateIndex @@ -211,7 +211,7 @@ class FourStateAI: "enterStateN-timer-%s"%id(self)) def exitStateN(self): - assert self.debugPrint("exitStateN()") + assert self.__debugPrint("exitStateN()") if self.doLaterTask: taskMgr.remove(self.doLaterTask) self.doLaterTask=None @@ -219,56 +219,56 @@ class FourStateAI: ##### state 0 ##### def enterState0(self): - assert self.debugPrint("enter0()") + assert self.__debugPrint("enter0()") self.enterStateN(0, 0) def exitState0(self): - assert self.debugPrint("exit0()") + assert self.__debugPrint("exit0()") ##### state 1 ##### def enterState1(self): - #assert self.debugPrint("enterState1()") + #assert self.__debugPrint("enterState1()") self.enterStateN(1, 2) def exitState1(self): - assert self.debugPrint("exitState1()") + assert self.__debugPrint("exitState1()") self.exitStateN() ##### state 2 ##### def enterState2(self): - #assert self.debugPrint("enterState2()") + #assert self.__debugPrint("enterState2()") self.enterStateN(2, 3) def exitState2(self): - assert self.debugPrint("exitState2()") + assert self.__debugPrint("exitState2()") self.exitStateN() ##### state 3 ##### def enterState3(self): - #assert self.debugPrint("enterState3()") + #assert self.__debugPrint("enterState3()") self.enterStateN(3, 4) def exitState3(self): - assert self.debugPrint("exitState3()") + assert self.__debugPrint("exitState3()") self.exitStateN() ##### state 4 ##### def enterState4(self): - assert self.debugPrint("enterState4()") + assert self.__debugPrint("enterState4()") self.enterStateN(4, 1) self.changedOnState(1) def exitState4(self): - assert self.debugPrint("exitState4()") + assert self.__debugPrint("exitState4()") self.exitStateN() self.changedOnState(0) if __debug__: - def debugPrint(self, message): + def __debugPrint(self, message): """for debugging""" return self.notify.debug("%d (%d) %s"%( id(self), self.stateIndex==4, message)) From 47f41078559589120fe6afbf5a385e4ea61ef969 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 30 Mar 2017 19:48:58 +0200 Subject: [PATCH 082/254] models: remove odd polygons inside tail of panda-model --- models/panda-model.egg | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/models/panda-model.egg b/models/panda-model.egg index df9ca085a0..5a3b6ec7d1 100755 --- a/models/panda-model.egg +++ b/models/panda-model.egg @@ -12378,11 +12378,6 @@ { Tex1 } { 670 158 673 { panda_mesh.verts } } } - { - { 1 1 1 1 } - { Tex1 } - { 602 674 627 { panda_mesh.verts } } - } { { 1 1 1 1 } { Tex1 } @@ -12398,16 +12393,6 @@ { Tex1 } { 628 630 676 { panda_mesh.verts } } } - { - { 1 1 1 1 } - { Tex1 } - { 674 676 630 { panda_mesh.verts } } - } - { - { 1 1 1 1 } - { Tex1 } - { 630 627 674 { panda_mesh.verts } } - } { { 1 1 1 1 } { Tex1 } @@ -16888,11 +16873,6 @@ { Tex1 } { 826 1321 1320 { panda_mesh.verts } } } - { - { 1 1 1 1 } - { Tex1 } - { 674 602 627 { panda_mesh.verts } } - } { { 1 1 1 1 } { Tex1 } @@ -16908,16 +16888,6 @@ { Tex1 } { 630 1283 676 { panda_mesh.verts } } } - { - { 1 1 1 1 } - { Tex1 } - { 676 674 630 { panda_mesh.verts } } - } - { - { 1 1 1 1 } - { Tex1 } - { 627 630 674 { panda_mesh.verts } } - } { { 1 1 1 1 } { Tex1 } @@ -24400,7 +24370,7 @@ } { 294 295 593 595 597 600 602 624 625 626 627 628 629 630 631 632 - 633 634 635 636 637 638 649 650 651 653 656 657 658 659 674 675 + 633 634 635 636 637 638 649 650 651 653 656 657 658 659 675 676 956 957 1251 1254 1256 1258 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1301 1302 1303 1305 1308 1309 1310 1311 1325 From 5050aae5c8bb05e4b05e86ec688a73ff18af8913 Mon Sep 17 00:00:00 2001 From: AnythingTechPro Date: Thu, 30 Mar 2017 13:32:41 -0400 Subject: [PATCH 083/254] Code formatting cleanups in StagedObject Closes #142 --- direct/src/distributed/StagedObject.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/direct/src/distributed/StagedObject.py b/direct/src/distributed/StagedObject.py index 7692dc3684..3127bd6e06 100755 --- a/direct/src/distributed/StagedObject.py +++ b/direct/src/distributed/StagedObject.py @@ -17,7 +17,6 @@ class StagedObject: call any "handle" functions. """ self.__state = initState - pass def goOnStage(self, *args, **kw): """ @@ -29,8 +28,6 @@ class StagedObject: if not self.isOnStage(): self.handleOnStage(*args, **kw) - pass - pass def handleOnStage(self): """ @@ -39,7 +36,6 @@ class StagedObject: Don't forget to call down to this one, though. """ self.__state = StagedObject.ON - pass def goOffStage(self, *args, **kw): """ @@ -51,8 +47,6 @@ class StagedObject: if not self.isOffStage(): self.handleOffStage(*args, **kw) - pass - pass def handleOffStage(self): """ @@ -61,7 +55,6 @@ class StagedObject: Don't forget to call down to this one, though. """ self.__state = StagedObject.OFF - pass def isOnStage(self): return self.__state == StagedObject.ON From 163c923c82346f4741e7e5e8395dd889a485b295 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 31 Mar 2017 17:45:15 +0200 Subject: [PATCH 084/254] Backport various fixes for 1.9.4 --- README.md | 4 ++-- direct/src/directtools/DirectCameraControl.py | 2 +- direct/src/fsm/FourState.py | 2 +- direct/src/fsm/FourStateAI.py | 2 +- direct/src/plugin/p3dInstance.cxx | 8 ++++---- direct/src/plugin/p3dOsxSplashWindow.cxx | 16 ++++++++-------- direct/src/tkwidgets/MemoryExplorer.py | 3 +++ doc/ReleaseNotes | 15 +++++++++++++++ dtool/PandaVersion.pp | 2 +- dtool/src/cppparser/cppBison.yxx | 1 + dtool/src/interrogatedb/py_panda.h | 8 +++++++- dtool/src/pystub/pystub.cxx | 18 ++++++++++++++++++ panda/src/audiotraits/fmodAudioManager.cxx | 4 ++-- panda/src/audiotraits/openalAudioManager.cxx | 1 - panda/src/collide/collisionBox.cxx | 6 +++--- panda/src/collide/collisionFloorMesh.cxx | 4 ++-- .../collide/collisionHandlerFluidPusher.cxx | 2 +- panda/src/collide/collisionInvSphere.cxx | 8 ++++---- panda/src/collide/collisionPlane.cxx | 10 +++++----- panda/src/collide/collisionPolygon.cxx | 10 +++++----- panda/src/collide/collisionSphere.cxx | 12 ++++++------ panda/src/collide/collisionTube.cxx | 10 +++++----- panda/src/display/displayRegion.cxx | 6 ++++++ panda/src/downloader/httpClient.cxx | 2 +- panda/src/egg2pg/eggSaver.cxx | 12 ++++++++---- panda/src/glstuff/glGraphicsBuffer_src.cxx | 3 +++ panda/src/gobj/texture.cxx | 4 ++-- panda/src/ode/odeTriMeshData.cxx | 2 +- panda/src/ode/odeTriMeshGeom.I | 2 +- panda/src/pgraph/clipPlaneAttrib.cxx | 4 ++-- panda/src/pgraph/portalClipper.cxx | 2 +- panda/src/pnmimage/pnm-image-filter.cxx | 4 ++-- pandatool/src/xfile/xParser.cxx.prebuilt | 2 +- pandatool/src/xfile/xParser.yxx | 2 +- samples/chessboard/main.py | 12 ++++++------ 35 files changed, 130 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index ceb23f7793..e058a9f18a 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ are included as part of the Windows 7.1 SDK. You will also need to have the third-party dependency libraries available for the build scripts to use. These are available from one of these two URLs, depending on whether you are on a 32-bit or 64-bit system: -https://www.panda3d.org/download/panda3d-1.9.2/panda3d-1.9.2-tools-win32.zip -https://www.panda3d.org/download/panda3d-1.9.2/panda3d-1.9.2-tools-win64.zip +https://www.panda3d.org/download/panda3d-1.9.4/panda3d-1.9.4-tools-win32.zip +https://www.panda3d.org/download/panda3d-1.9.4/panda3d-1.9.4-tools-win64.zip After acquiring these dependencies, you may simply build Panda3D from the command prompt using the following command: diff --git a/direct/src/directtools/DirectCameraControl.py b/direct/src/directtools/DirectCameraControl.py index b2333c2ff2..8c2c770897 100644 --- a/direct/src/directtools/DirectCameraControl.py +++ b/direct/src/directtools/DirectCameraControl.py @@ -413,7 +413,7 @@ class DirectCameraControl(DirectObject): np = NodePath('temp') np.setPos(base.direct.camera, hitPt) self.coaMarkerPos = np.getPos() - np.remove() + np.removeNode() self.coaMarker.setPos(self.coaMarkerPos) iRay.collisionNodePath.removeNode() diff --git a/direct/src/fsm/FourState.py b/direct/src/fsm/FourState.py index 6f42046cef..e29e494ff9 100755 --- a/direct/src/fsm/FourState.py +++ b/direct/src/fsm/FourState.py @@ -91,6 +91,7 @@ class FourState: off (and so is state 2 which is oposite of 4 and therefore oposite of 'on'). """ + self.stateIndex = 0 assert self.debugPrint("FourState(names=%s)"%(names)) self.track = None self.stateTime = 0.0 @@ -121,7 +122,6 @@ class FourState: self.exitState4, [names[1]]), } - self.stateIndex = 0 self.fsm = ClassicFSM.ClassicFSM('FourState', self.states.values(), # Initial State diff --git a/direct/src/fsm/FourStateAI.py b/direct/src/fsm/FourStateAI.py index d81d2bcf47..1c491aaecf 100755 --- a/direct/src/fsm/FourStateAI.py +++ b/direct/src/fsm/FourStateAI.py @@ -93,11 +93,11 @@ class FourStateAI: off (and so is state 2 which is oposite of state 4 and therefore oposite of 'on'). """ + self.stateIndex = 0 assert self.debugPrint( "FourStateAI(names=%s, durations=%s)" %(names, durations)) self.doLaterTask = None - self.stateIndex = 0 assert len(names) == 5 assert len(names) == len(durations) self.names = names diff --git a/direct/src/plugin/p3dInstance.cxx b/direct/src/plugin/p3dInstance.cxx index 87fbf64dee..083aa33b07 100644 --- a/direct/src/plugin/p3dInstance.cxx +++ b/direct/src/plugin/p3dInstance.cxx @@ -3699,8 +3699,8 @@ paint_window_osx_port() { int y_size = min(_wparams.get_win_height(), _swbuffer->get_y_size()); size_t rowsize = _swbuffer->get_row_size(); - Rect src_rect = {0, 0, y_size, x_size}; - Rect ddrc_rect = {0, 0, y_size, x_size}; + Rect src_rect = {0, 0, (short)y_size, (short)x_size}; + Rect ddrc_rect = {0, 0, (short)y_size, (short)x_size}; QDErr err; @@ -3754,7 +3754,7 @@ paint_window_osx_cgcontext(CGContextRef context) { int y_size = min(_wparams.get_win_height(), _swbuffer->get_y_size()); if (_buffer_image != NULL) { - CGRect region = { { 0, 0 }, { x_size, y_size } }; + CGRect region = { { 0, 0 }, { (CGFloat)x_size, (CGFloat)y_size } }; CGContextDrawImage(context, region, _buffer_image); } } @@ -3794,7 +3794,7 @@ handle_event_osx_event_record(const P3D_event_data &event) { // First, convert the coordinates from screen coordinates to // browser window coordinates. WindowRef window = handle._handle._osx_cgcontext._window; - CGPoint cgpt = { pt.h, pt.v }; + CGPoint cgpt = { (CGFloat)pt.h, (CGFloat)pt.v }; HIPointConvert(&cgpt, kHICoordSpaceScreenPixel, NULL, kHICoordSpaceWindow, window); diff --git a/direct/src/plugin/p3dOsxSplashWindow.cxx b/direct/src/plugin/p3dOsxSplashWindow.cxx index 53f9976d4c..d3ea6fd730 100644 --- a/direct/src/plugin/p3dOsxSplashWindow.cxx +++ b/direct/src/plugin/p3dOsxSplashWindow.cxx @@ -290,7 +290,7 @@ refresh() { return; } if (_toplevel_window != NULL) { - Rect r = { 0, 0, _win_height, _win_width }; + Rect r = { 0, 0, (short)_win_height, (short)_win_width }; InvalWindowRect(_toplevel_window, &r); } else { @@ -374,7 +374,7 @@ paint_window_osx_cgcontext(CGContextRef context) { CGColorSpaceRef rgb_space = CGColorSpaceCreateDeviceRGB(); CGColorRef bg = CGColorCreate(rgb_space, bg_components); - CGRect region = { { 0, 0 }, { _win_width, _win_height } }; + CGRect region = { { 0, 0 }, { (CGFloat)_win_width, (CGFloat)_win_height } }; CGContextSetFillColorWithColor(context, bg); CGContextFillRect(context, region); @@ -440,7 +440,7 @@ handle_event_osx_event_record(const P3D_event_data &event) { // First, convert the coordinates from screen coordinates to // browser window coordinates. WindowRef window = handle._handle._osx_cgcontext._window; - CGPoint cgpt = { pt.h, pt.v }; + CGPoint cgpt = { (CGFloat)pt.h, (CGFloat)pt.v }; HIPointConvert(&cgpt, kHICoordSpaceScreenPixel, NULL, kHICoordSpaceWindow, window); @@ -662,7 +662,7 @@ paint_progress_bar(CGContextRef context) { int bar_x, bar_y, bar_width, bar_height; get_bar_placement(bar_x, bar_y, bar_width, bar_height); - CGRect bar_rect = { { bar_x, bar_y }, { bar_width, bar_height } }; + CGRect bar_rect = { { (CGFloat)bar_x, (CGFloat)bar_y }, { (CGFloat)bar_width, (CGFloat)bar_height } }; // Clear the entire progress bar to white (or the background color). CGContextSetFillColorWithColor(context, bar_bg); @@ -672,7 +672,7 @@ paint_progress_bar(CGContextRef context) { if (_progress_known) { int progress_width = (int)(bar_width * _install_progress + 0.5); if (progress_width != 0) { - CGRect prog = { { bar_x, bar_y }, { progress_width, bar_height } }; + CGRect prog = { { (CGFloat)bar_x, (CGFloat)bar_y }, { (CGFloat)progress_width, (CGFloat)bar_height } }; CGContextSetFillColorWithColor(context, bar); CGContextFillRect(context, prog); } @@ -687,7 +687,7 @@ paint_progress_bar(CGContextRef context) { progress = block_travel * 2 - progress; } - CGRect prog = { { bar_x + progress, bar_y }, { block_width, bar_height } }; + CGRect prog = { { (CGFloat)(bar_x + progress), (CGFloat)bar_y }, { (CGFloat)block_width, (CGFloat)bar_height } }; CGContextSetFillColorWithColor(context, bar); CGContextFillRect(context, prog); } @@ -697,8 +697,8 @@ paint_progress_bar(CGContextRef context) { // We offset the border by half a pixel, so we'll be drawing the // one-pixel line through the middle of a pixel, and it won't try to // antialias itself into a half-black two-pixel line. - CGRect border_rect = { { bar_x - 0.5, bar_y - 0.5 }, - { bar_width + 1, bar_height + 1 } }; + CGRect border_rect = { { (CGFloat)(bar_x - 0.5), (CGFloat)(bar_y - 0.5) }, + { (CGFloat)(bar_width + 1), (CGFloat)(bar_height + 1) } }; CGContextBeginPath(context); CGContextSetLineWidth(context, 1); diff --git a/direct/src/tkwidgets/MemoryExplorer.py b/direct/src/tkwidgets/MemoryExplorer.py index 3257bbeea8..331fa5e656 100755 --- a/direct/src/tkwidgets/MemoryExplorer.py +++ b/direct/src/tkwidgets/MemoryExplorer.py @@ -282,6 +282,9 @@ class MemoryExplorerItem: def getNumChildren(self): return len(self.children) + def getChildren(self): + return self.children + def getChildrenAsList(self): return self.children diff --git a/doc/ReleaseNotes b/doc/ReleaseNotes index d3e22a1fc3..4a8a13ee64 100644 --- a/doc/ReleaseNotes +++ b/doc/ReleaseNotes @@ -1,3 +1,18 @@ +------------------------ RELEASE 1.9.4 ------------------------ + +One of the bugfixes in the last 1.9.3 release introduced a regression, +therefore it was decided to make another 1.9.x release. + +* Fix 1.9.3 regression with generating geometry in threaded pipeline +* Various compile warning fixes +* Fix occasional crash in PNMImage::quick_filter_from() +* Fix issue taking screenshots from an OpenGL FBO buffer +* Fix various issues with MeshDrawer +* Fix issue with collision sphere generation in bam2egg +* Fix compile errors with more obscure Python configurations +* Fix assert when using Texture.load_sub_image to load whole image +* Fix fsm FourState + ------------------------ RELEASE 1.9.3 ------------------------ This issue fixes several bugs that were still found in 1.9.2. diff --git a/dtool/PandaVersion.pp b/dtool/PandaVersion.pp index 0e01d82c67..12ed42e338 100644 --- a/dtool/PandaVersion.pp +++ b/dtool/PandaVersion.pp @@ -3,7 +3,7 @@ // ppremake scripts for Panda. // Use spaces to separate the major, minor, and sequence numbers here. -#define PANDA_VERSION 1 9 3 +#define PANDA_VERSION 1 9 4 // This variable will be defined to false in the CVS repository, but // scripts that generate source tarballs and/or binary releases for diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 518f2a6cbb..2c3003ad2c 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -1075,6 +1075,7 @@ function_operator: more_template_declaration: type_like_declaration | template_declaration + | friend_declaration ; template_declaration: diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index 3545561a03..bea5b395d2 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -346,8 +346,14 @@ template INLINE bool DTOOL_Call_ExtractThisPointer(PyObject *self, T *& // Functions related to error reporting. +// _PyErr_OCCURRED is an undocumented macro version of PyErr_Occurred. +// Some implementations of the CPython API (e.g. PyPy's cpyext) do not define +// it, so in these cases we just silently fall back to PyErr_Occurred. +#ifndef _PyErr_OCCURRED +#define _PyErr_OCCURRED() PyErr_Occurred() +#endif + #ifdef NDEBUG -// _PyErr_OCCURRED is an undocumented inline version of PyErr_Occurred. #define Dtool_CheckErrorOccurred() (_PyErr_OCCURRED() != NULL) #else EXPCL_DTOOLCONFIG bool Dtool_CheckErrorOccurred(); diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index 4fa1a4ed6a..988ccc5f92 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -91,6 +91,7 @@ extern "C" { EXPCL_PYSTUB int PyModule_AddObject(...); EXPCL_PYSTUB int PyModule_AddStringConstant(...); EXPCL_PYSTUB int PyModule_Create2(...); + EXPCL_PYSTUB int PyModule_Create2TraceRefs(...); EXPCL_PYSTUB int PyNumber_Check(...); EXPCL_PYSTUB int PyNumber_Float(...); EXPCL_PYSTUB int PyNumber_Int(...); @@ -150,12 +151,14 @@ extern "C" { EXPCL_PYSTUB int PyUnicodeUCS2_FromStringAndSize(...); EXPCL_PYSTUB int PyUnicodeUCS2_FromWideChar(...); EXPCL_PYSTUB int PyUnicodeUCS2_AsWideChar(...); + EXPCL_PYSTUB int PyUnicodeUCS2_AsWideCharString(...); EXPCL_PYSTUB int PyUnicodeUCS2_GetSize(...); EXPCL_PYSTUB int PyUnicodeUCS4_FromFormat(...); EXPCL_PYSTUB int PyUnicodeUCS4_FromString(...); EXPCL_PYSTUB int PyUnicodeUCS4_FromStringAndSize(...); EXPCL_PYSTUB int PyUnicodeUCS4_FromWideChar(...); EXPCL_PYSTUB int PyUnicodeUCS4_AsWideChar(...); + EXPCL_PYSTUB int PyUnicodeUCS4_AsWideCharString(...); EXPCL_PYSTUB int PyUnicodeUCS4_GetSize(...); EXPCL_PYSTUB int PyUnicode_AsUTF8(...); EXPCL_PYSTUB int PyUnicode_AsUTF8AndSize(...); @@ -174,6 +177,7 @@ extern "C" { EXPCL_PYSTUB int Py_InitModule4(...); EXPCL_PYSTUB int Py_InitModule4_64(...); EXPCL_PYSTUB int Py_InitModule4TraceRefs(...); + EXPCL_PYSTUB int Py_InitModule4TraceRefs_64(...); EXPCL_PYSTUB int _PyArg_ParseTuple_SizeT(...); EXPCL_PYSTUB int _PyArg_ParseTupleAndKeywords_SizeT(...); EXPCL_PYSTUB int _PyArg_Parse_SizeT(...); @@ -183,9 +187,14 @@ extern "C" { EXPCL_PYSTUB int _PyObject_Del(...); EXPCL_PYSTUB int _PyUnicode_AsString(...); EXPCL_PYSTUB int _PyUnicode_AsStringAndSize(...); + EXPCL_PYSTUB int _Py_AddToAllObjects(...); EXPCL_PYSTUB int _Py_BuildValue_SizeT(...); EXPCL_PYSTUB int _Py_Dealloc(...); + EXPCL_PYSTUB int _Py_ForgetReference(...); EXPCL_PYSTUB int _Py_NegativeRefcount(...); + EXPCL_PYSTUB int _Py_NewReference(...); + EXPCL_PYSTUB int _Py_PrintReferenceAddresses(...); + EXPCL_PYSTUB int _Py_PrintReferences(...); EXPCL_PYSTUB int _Py_RefTotal(...); EXPCL_PYSTUB void Py_Initialize(); @@ -291,6 +300,7 @@ int PyModule_AddIntConstant(...) { return 0; }; int PyModule_AddObject(...) { return 0; }; int PyModule_AddStringConstant(...) { return 0; }; int PyModule_Create2(...) { return 0; }; +int PyModule_Create2TraceRefs(...) { return 0; }; int PyNumber_Check(...) { return 0; } int PyNumber_Float(...) { return 0; } int PyNumber_Int(...) { return 0; } @@ -350,12 +360,14 @@ int PyUnicodeUCS2_FromString(...) { return 0; } int PyUnicodeUCS2_FromStringAndSize(...) { return 0; } int PyUnicodeUCS2_FromWideChar(...) { return 0; } int PyUnicodeUCS2_AsWideChar(...) { return 0; } +int PyUnicodeUCS2_AsWideCharString(...) { return 0; } int PyUnicodeUCS2_GetSize(...) { return 0; } int PyUnicodeUCS4_FromFormat(...) { return 0; } int PyUnicodeUCS4_FromString(...) { return 0; } int PyUnicodeUCS4_FromStringAndSize(...) { return 0; } int PyUnicodeUCS4_FromWideChar(...) { return 0; } int PyUnicodeUCS4_AsWideChar(...) { return 0; } +int PyUnicodeUCS4_AsWideCharString(...) { return 0; } int PyUnicodeUCS4_GetSize(...) { return 0; } int PyUnicode_AsUTF8(...) { return 0; } int PyUnicode_AsUTF8AndSize(...) { return 0; } @@ -374,6 +386,7 @@ int Py_BuildValue(...) { return 0; } int Py_InitModule4(...) { return 0; } int Py_InitModule4_64(...) { return 0; } int Py_InitModule4TraceRefs(...) { return 0; }; +int Py_InitModule4TraceRefs_64(...) { return 0; }; int _PyArg_ParseTuple_SizeT(...) { return 0; }; int _PyArg_ParseTupleAndKeywords_SizeT(...) { return 0; }; int _PyArg_Parse_SizeT(...) { return 0; }; @@ -383,9 +396,14 @@ int _PyObject_DebugFree(...) { return 0; }; int _PyObject_Del(...) { return 0; }; int _PyUnicode_AsString(...) { return 0; }; int _PyUnicode_AsStringAndSize(...) { return 0; }; +int _Py_AddToAllObjects(...) { return 0; }; int _Py_BuildValue_SizeT(...) { return 0; }; int _Py_Dealloc(...) { return 0; }; +int _Py_ForgetReference(...) { return 0; }; int _Py_NegativeRefcount(...) { return 0; }; +int _Py_NewReference(...) { return 0; }; +int _Py_PrintReferenceAddresses(...) { return 0; }; +int _Py_PrintReferences(...) { return 0; }; int _Py_RefTotal(...) { return 0; }; // We actually might call this one. diff --git a/panda/src/audiotraits/fmodAudioManager.cxx b/panda/src/audiotraits/fmodAudioManager.cxx index 3a6a4a82e4..b53a872205 100644 --- a/panda/src/audiotraits/fmodAudioManager.cxx +++ b/panda/src/audiotraits/fmodAudioManager.cxx @@ -450,8 +450,8 @@ get_sound(const string &file_name, bool positional, int) { vfs->resolve_filename(path, get_model_path()); // Build a new AudioSound from the audio data. - PT(AudioSound) audioSound = 0; - PT(FmodAudioSound) fmodAudioSound = new FmodAudioSound(this, path, positional ); + PT(AudioSound) audioSound; + PT(FmodAudioSound) fmodAudioSound = new FmodAudioSound(this, path, positional); _all_sounds.insert(fmodAudioSound); diff --git a/panda/src/audiotraits/openalAudioManager.cxx b/panda/src/audiotraits/openalAudioManager.cxx index b5138a345b..a6decdf2a5 100644 --- a/panda/src/audiotraits/openalAudioManager.cxx +++ b/panda/src/audiotraits/openalAudioManager.cxx @@ -1120,7 +1120,6 @@ cleanup() { OpenALAudioManager::SoundData:: SoundData() : _manager(0), - _movie(0), _sample(0), _stream(NULL), _length(0.0), diff --git a/panda/src/collide/collisionBox.cxx b/panda/src/collide/collisionBox.cxx index 2004d9175e..2504d7e438 100644 --- a/panda/src/collide/collisionBox.cxx +++ b/panda/src/collide/collisionBox.cxx @@ -258,7 +258,7 @@ PT(CollisionEntry) CollisionBox:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); CPT(TransformState) wrt_space = entry.get_wrt_space(); CPT(TransformState) wrt_prev_space = entry.get_wrt_prev_space(); @@ -466,7 +466,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionBox:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); LPoint3 from_origin = ray->get_origin() * wrt_mat; @@ -549,7 +549,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionBox:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *seg; - DCAST_INTO_R(seg, entry.get_from(), 0); + DCAST_INTO_R(seg, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); LPoint3 from_origin = seg->get_point_a() * wrt_mat; diff --git a/panda/src/collide/collisionFloorMesh.cxx b/panda/src/collide/collisionFloorMesh.cxx index 63dbfd8eca..f8a5e04a87 100644 --- a/panda/src/collide/collisionFloorMesh.cxx +++ b/panda/src/collide/collisionFloorMesh.cxx @@ -141,7 +141,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionFloorMesh:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); LPoint3 from_origin = ray->get_origin() * entry.get_wrt_mat(); double fx = from_origin[0]; @@ -208,7 +208,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionFloorMesh:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); LPoint3 from_origin = sphere->get_center() * entry.get_wrt_mat(); double fx = from_origin[0]; diff --git a/panda/src/collide/collisionHandlerFluidPusher.cxx b/panda/src/collide/collisionHandlerFluidPusher.cxx index 8deab17d6c..3709c6d9e5 100644 --- a/panda/src/collide/collisionHandlerFluidPusher.cxx +++ b/panda/src/collide/collisionHandlerFluidPusher.cxx @@ -143,7 +143,7 @@ handle_entries() { // currently we only support spheres as the collider const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entries.front()->get_from(), 0); + DCAST_INTO_R(sphere, entries.front()->get_from(), false); from_node_path.set_pos(wrt_node, 0,0,0); LPoint3 sphere_offset = (sphere->get_center() * diff --git a/panda/src/collide/collisionInvSphere.cxx b/panda/src/collide/collisionInvSphere.cxx index 893d950d48..2b658370f8 100644 --- a/panda/src/collide/collisionInvSphere.cxx +++ b/panda/src/collide/collisionInvSphere.cxx @@ -109,7 +109,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionInvSphere:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -163,7 +163,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionInvSphere:: test_intersection_from_line(const CollisionEntry &entry) const { const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -206,7 +206,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionInvSphere:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -252,7 +252,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionInvSphere:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/collide/collisionPlane.cxx b/panda/src/collide/collisionPlane.cxx index 5d02de8670..e04758d289 100644 --- a/panda/src/collide/collisionPlane.cxx +++ b/panda/src/collide/collisionPlane.cxx @@ -128,7 +128,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -169,7 +169,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_line(const CollisionEntry &entry) const { const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -216,7 +216,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -270,7 +270,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -331,7 +331,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionPlane:: test_intersection_from_parabola(const CollisionEntry &entry) const { const CollisionParabola *parabola; - DCAST_INTO_R(parabola, entry.get_from(), 0); + DCAST_INTO_R(parabola, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/collide/collisionPolygon.cxx b/panda/src/collide/collisionPolygon.cxx index 30e35e1169..50c22225b2 100644 --- a/panda/src/collide/collisionPolygon.cxx +++ b/panda/src/collide/collisionPolygon.cxx @@ -402,7 +402,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { } const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); CPT(TransformState) wrt_space = entry.get_wrt_space(); CPT(TransformState) wrt_prev_space = entry.get_wrt_prev_space(); @@ -590,7 +590,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { } const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -661,7 +661,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { } const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -737,7 +737,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { } const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -815,7 +815,7 @@ test_intersection_from_parabola(const CollisionEntry &entry) const { } const CollisionParabola *parabola; - DCAST_INTO_R(parabola, entry.get_from(), 0); + DCAST_INTO_R(parabola, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/collide/collisionSphere.cxx b/panda/src/collide/collisionSphere.cxx index e69cfbdef0..ed492fb4a2 100644 --- a/panda/src/collide/collisionSphere.cxx +++ b/panda/src/collide/collisionSphere.cxx @@ -141,7 +141,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); CPT(TransformState) wrt_space = entry.get_wrt_space(); @@ -254,7 +254,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_line(const CollisionEntry &entry) const { const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -296,7 +296,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_box(const CollisionEntry &entry) const { const CollisionBox *box; - DCAST_INTO_R(box, entry.get_from(), 0); + DCAST_INTO_R(box, entry.get_from(), NULL); // Instead of transforming the box into the sphere's coordinate space, // we do it the other way around. It's easier that way. @@ -374,7 +374,7 @@ test_intersection_from_box(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -423,7 +423,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -474,7 +474,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionSphere:: test_intersection_from_parabola(const CollisionEntry &entry) const { const CollisionParabola *parabola; - DCAST_INTO_R(parabola, entry.get_from(), 0); + DCAST_INTO_R(parabola, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/collide/collisionTube.cxx b/panda/src/collide/collisionTube.cxx index f99c513e93..51068d3836 100644 --- a/panda/src/collide/collisionTube.cxx +++ b/panda/src/collide/collisionTube.cxx @@ -158,7 +158,7 @@ compute_internal_bounds() const { PT(CollisionEntry) CollisionTube:: test_intersection_from_sphere(const CollisionEntry &entry) const { const CollisionSphere *sphere; - DCAST_INTO_R(sphere, entry.get_from(), 0); + DCAST_INTO_R(sphere, entry.get_from(), NULL); CPT(TransformState) wrt_space = entry.get_wrt_space(); CPT(TransformState) wrt_prev_space = entry.get_wrt_prev_space(); @@ -239,7 +239,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionTube:: test_intersection_from_line(const CollisionEntry &entry) const { const CollisionLine *line; - DCAST_INTO_R(line, entry.get_from(), 0); + DCAST_INTO_R(line, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -289,7 +289,7 @@ test_intersection_from_line(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionTube:: test_intersection_from_ray(const CollisionEntry &entry) const { const CollisionRay *ray; - DCAST_INTO_R(ray, entry.get_from(), 0); + DCAST_INTO_R(ray, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -353,7 +353,7 @@ test_intersection_from_ray(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionTube:: test_intersection_from_segment(const CollisionEntry &entry) const { const CollisionSegment *segment; - DCAST_INTO_R(segment, entry.get_from(), 0); + DCAST_INTO_R(segment, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); @@ -419,7 +419,7 @@ test_intersection_from_segment(const CollisionEntry &entry) const { PT(CollisionEntry) CollisionTube:: test_intersection_from_parabola(const CollisionEntry &entry) const { const CollisionParabola *parabola; - DCAST_INTO_R(parabola, entry.get_from(), 0); + DCAST_INTO_R(parabola, entry.get_from(), NULL); const LMatrix4 &wrt_mat = entry.get_wrt_mat(); diff --git a/panda/src/display/displayRegion.cxx b/panda/src/display/displayRegion.cxx index 8e2fc71e4e..625650750f 100644 --- a/panda/src/display/displayRegion.cxx +++ b/panda/src/display/displayRegion.cxx @@ -582,6 +582,12 @@ get_screenshot() { return NULL; } + { + // Make sure that the correct viewport is active. + DisplayRegionPipelineReader dr_reader(this, current_thread); + gsg->prepare_display_region(&dr_reader); + } + PT(Texture) tex = new Texture; RenderBuffer buffer = gsg->get_render_buffer(get_screenshot_buffer_type(), diff --git a/panda/src/downloader/httpClient.cxx b/panda/src/downloader/httpClient.cxx index fcab207736..ef8dfa6688 100644 --- a/panda/src/downloader/httpClient.cxx +++ b/panda/src/downloader/httpClient.cxx @@ -891,7 +891,7 @@ load_client_certificate() { // Rewind the "file" to the beginning in order to read the public // key (which might appear first in the file). - BIO_reset(mbio); + (void)BIO_reset(mbio); ERR_clear_error(); _client_certificate_pub = diff --git a/panda/src/egg2pg/eggSaver.cxx b/panda/src/egg2pg/eggSaver.cxx index 647337e6bf..0a66df2b55 100644 --- a/panda/src/egg2pg/eggSaver.cxx +++ b/panda/src/egg2pg/eggSaver.cxx @@ -481,7 +481,7 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path, } else if (child->is_of_type(CollisionSphere::get_class_type())) { CPT(CollisionSphere) sphere = DCAST(CollisionSphere, child); LPoint3 center = sphere->get_center(); - LVector3 offset(sphere->get_radius(), 0, 0); + PN_stdfloat radius = sphere->get_radius(); EggGroup *egg_sphere; if (num_solids == 1) { @@ -498,15 +498,19 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path, } egg_sphere->set_collide_flags(flags); - EggVertex ev1, ev2; - ev1.set_pos(LCAST(double, (center + offset) * net_mat)); - ev2.set_pos(LCAST(double, (center - offset) * net_mat)); + EggVertex ev1, ev2, ev3, ev4; + ev1.set_pos(LCAST(double, (center + LVector3(radius, 0, 0)) * net_mat)); + ev2.set_pos(LCAST(double, (center + LVector3(0, radius, 0)) * net_mat)); + ev3.set_pos(LCAST(double, (center + LVector3(-radius, 0, 0)) * net_mat)); + ev4.set_pos(LCAST(double, (center + LVector3(0, -radius, 0)) * net_mat)); EggPolygon *egg_poly = new EggPolygon; egg_sphere->add_child(egg_poly); egg_poly->add_vertex(cvpool->create_unique_vertex(ev1)); egg_poly->add_vertex(cvpool->create_unique_vertex(ev2)); + egg_poly->add_vertex(cvpool->create_unique_vertex(ev3)); + egg_poly->add_vertex(cvpool->create_unique_vertex(ev4)); } else if (child->is_of_type(CollisionPlane::get_class_type())) { LPlane plane = DCAST(CollisionPlane, child)->get_plane(); diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index 93a5c24180..df10110849 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -163,6 +163,9 @@ begin_frame(FrameMode mode, Thread *current_thread) { } } #endif + } else if (mode == FM_refresh) { + // Just bind the FBO. + rebuild_bitplanes(); } _gsg->set_current_properties(&get_fb_properties()); diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index cd5cd54e73..d7e4362db6 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -3320,8 +3320,8 @@ do_load_sub_image(CData *cdata, const PNMImage &image, int x, int y, int z, int nassertr(y >= 0 && y < tex_y_size, false); nassertr(z >= 0 && z < tex_z_size, false); - nassertr(image.get_x_size() + x < tex_x_size, false); - nassertr(image.get_y_size() + y < tex_y_size, false); + nassertr(image.get_x_size() + x <= tex_x_size, false); + nassertr(image.get_y_size() + y <= tex_y_size, false); // Flip y y = cdata->_y_size - (image.get_y_size() + y); diff --git a/panda/src/ode/odeTriMeshData.cxx b/panda/src/ode/odeTriMeshData.cxx index a58ed87d74..c78d09fc6d 100644 --- a/panda/src/ode/odeTriMeshData.cxx +++ b/panda/src/ode/odeTriMeshData.cxx @@ -30,7 +30,7 @@ get_data(dGeomID id) { if (iter != data_map.end()) { return iter->second; } - return 0; + return NULL; } void OdeTriMeshData:: diff --git a/panda/src/ode/odeTriMeshGeom.I b/panda/src/ode/odeTriMeshGeom.I index 9bd0ff6ac8..a560312c5d 100644 --- a/panda/src/ode/odeTriMeshGeom.I +++ b/panda/src/ode/odeTriMeshGeom.I @@ -35,7 +35,7 @@ set_tri_mesh_data(OdeTriMeshData &data) { INLINE PT(OdeTriMeshData) OdeTriMeshGeom:: get_tri_mesh_data() const { - nassertr(_id != 0 ,0); + nassertr(_id != 0, NULL); return OdeTriMeshData::get_data(_id); } diff --git a/panda/src/pgraph/clipPlaneAttrib.cxx b/panda/src/pgraph/clipPlaneAttrib.cxx index b07052125e..d647681f66 100644 --- a/panda/src/pgraph/clipPlaneAttrib.cxx +++ b/panda/src/pgraph/clipPlaneAttrib.cxx @@ -543,7 +543,7 @@ filter_to_max(int max_clip_planes) const { CPT(RenderAttrib) ClipPlaneAttrib:: compose_off(const RenderAttrib *other) const { const ClipPlaneAttrib *ta; - DCAST_INTO_R(ta, other, 0); + DCAST_INTO_R(ta, other, NULL); if (_off_all_planes || (!ta->_off_all_planes && ta->_off_planes.empty())) { // If we turn off all planes, or the other turns none off, the @@ -772,7 +772,7 @@ get_hash_impl() const { CPT(RenderAttrib) ClipPlaneAttrib:: compose_impl(const RenderAttrib *other) const { const ClipPlaneAttrib *ta; - DCAST_INTO_R(ta, other, 0); + DCAST_INTO_R(ta, other, NULL); if (ta->_off_all_planes) { // If the other type turns off all planes, it doesn't matter what diff --git a/panda/src/pgraph/portalClipper.cxx b/panda/src/pgraph/portalClipper.cxx index b805352688..2a1ca91827 100644 --- a/panda/src/pgraph/portalClipper.cxx +++ b/panda/src/pgraph/portalClipper.cxx @@ -42,7 +42,7 @@ PortalClipper:: PortalClipper(GeometricBoundingVolume *frustum, SceneSetup *scene_setup): _reduced_viewport_min(-1,-1), _reduced_viewport_max(1,1), -_clip_state(0) +_clip_state(NULL) { _previous = new GeomNode("my_frustum"); diff --git a/panda/src/pnmimage/pnm-image-filter.cxx b/panda/src/pnmimage/pnm-image-filter.cxx index 0e304e33f8..952334791d 100644 --- a/panda/src/pnmimage/pnm-image-filter.cxx +++ b/panda/src/pnmimage/pnm-image-filter.cxx @@ -713,7 +713,7 @@ box_filter_line(const PNMImage &image, // Get the final (partial) xel float x_contrib = x1 - (float)x_last; - if (x_contrib > 0.0001f) { + if (x_contrib > 0.0001f && x < image.get_x_size()) { box_filter_xel(image, x, y, x_contrib, y_contrib, color, pixel_count); } @@ -745,7 +745,7 @@ box_filter_region(const PNMImage &image, // Get the final (partial) row float y_contrib = y1 - (float)y_last; - if (y_contrib > 0.0001f) { + if (y_contrib > 0.0001f && y < image.get_y_size()) { box_filter_line(image, x0, y, x1, y_contrib, color, pixel_count); } diff --git a/pandatool/src/xfile/xParser.cxx.prebuilt b/pandatool/src/xfile/xParser.cxx.prebuilt index 606ead1db3..42c65a72a6 100644 --- a/pandatool/src/xfile/xParser.cxx.prebuilt +++ b/pandatool/src/xfile/xParser.cxx.prebuilt @@ -98,7 +98,7 @@ static XFile *x_file = (XFile *)NULL; static XFileNode *current_node = (XFileNode *)NULL; -static PT(XFileDataDef) current_data_def = (XFileDataDef *)NULL; +static PT(XFileDataDef) current_data_def; //////////////////////////////////////////////////////////////////// // Defining the interface to the parser. diff --git a/pandatool/src/xfile/xParser.yxx b/pandatool/src/xfile/xParser.yxx index b22804e212..9262fe473c 100644 --- a/pandatool/src/xfile/xParser.yxx +++ b/pandatool/src/xfile/xParser.yxx @@ -31,7 +31,7 @@ static XFile *x_file = (XFile *)NULL; static XFileNode *current_node = (XFileNode *)NULL; -static PT(XFileDataDef) current_data_def = (XFileDataDef *)NULL; +static PT(XFileDataDef) current_data_def; //////////////////////////////////////////////////////////////////// // Defining the interface to the parser. diff --git a/samples/chessboard/main.py b/samples/chessboard/main.py index 7da1d97a14..5c8b68302d 100755 --- a/samples/chessboard/main.py +++ b/samples/chessboard/main.py @@ -20,7 +20,7 @@ from direct.showbase.DirectObject import DirectObject from direct.task.Task import Task import sys -# First we define some contants for the colors +# First we define some constants for the colors BLACK = (0, 0, 0, 1) WHITE = (1, 1, 1, 1) HIGHLIGHT = (0, 1, 1, 1) @@ -33,7 +33,7 @@ PIECEBLACK = (.15, .15, .15, 1) # This is how we know where to position an object in 3D space based on a 2D mouse # position. It also assumes that we are dragging in the XY plane. # -# This is derived from the mathmatical of a plane, solved for a given point +# This is derived from the mathematical of a plane, solved for a given point def PointAtZ(z, point, vec): return point + vec * ((z - point.getZ()) / vec.getZ()) @@ -41,7 +41,7 @@ def PointAtZ(z, point, vec): def SquarePos(i): return LPoint3((i % 8) - 3.5, int(i // 8) - 3.5, 0) -# Helper function for determining wheter a square should be white or black +# Helper function for determining whether a square should be white or black # The modulo operations (%) generate the every-other pattern of a chess-board def SquareColor(i): if (i + ((i // 8) % 2)) % 2: @@ -84,7 +84,7 @@ class ChessboardDemo(ShowBase): # relative to it self.pickerNP = camera.attachNewNode(self.pickerNode) # Everything to be picked will use bit 1. This way if we were doing other - # collision we could seperate it + # collision we could separate it self.pickerNode.setFromCollideMask(BitMask32.bit(1)) self.pickerRay = CollisionRay() # Make our ray # Add it to the collision node @@ -96,7 +96,7 @@ class ChessboardDemo(ShowBase): # Now we create the chess board and its pieces # We will attach all of the squares to their own root. This way we can do the - # collision pass just on the sqaures and save the time of checking the rest + # collision pass just on the squares and save the time of checking the rest # of the scene self.squareRoot = render.attachNewNode("squareRoot") @@ -240,7 +240,7 @@ class ChessboardDemo(ShowBase): render.setLight(render.attachNewNode(ambientLight)) -# Class for a piece. This just handels loading the model and setting initial +# Class for a piece. This just handles loading the model and setting initial # position and color class Piece(object): def __init__(self, square, color): From e1c916cdc3634ec9ccd869dd810f2f412b4607a8 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 2 Apr 2017 14:44:51 +0200 Subject: [PATCH 085/254] interrogate: handle implicit destructors correctly --- dtool/src/interrogate/interfaceMakerPythonNative.cxx | 3 ++- dtool/src/interrogatedb/interrogateType.I | 8 ++++++++ dtool/src/interrogatedb/interrogateType.h | 1 + dtool/src/parser-inc/btBulletDynamicsCommon.h | 5 +++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index e4dbfd4084..6ca45df628 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -1133,7 +1133,8 @@ write_class_declarations(ostream &out, ostream *out_h, Object *obj) { // to a macro function. out << "typedef " << c_class_name << " " << class_name << "_localtype;\n"; if (obj->_itype.has_destructor() || - obj->_itype.destructor_is_inherited()) { + obj->_itype.destructor_is_inherited() || + obj->_itype.destructor_is_implicit()) { if (TypeManager::is_reference_count(type)) { out << "Define_Module_ClassRef"; diff --git a/dtool/src/interrogatedb/interrogateType.I b/dtool/src/interrogatedb/interrogateType.I index f6037fc571..b5527bbd23 100644 --- a/dtool/src/interrogatedb/interrogateType.I +++ b/dtool/src/interrogatedb/interrogateType.I @@ -343,6 +343,14 @@ destructor_is_inherited() const { return (_flags & F_inherited_destructor) != 0; } +/** + * + */ +INLINE bool InterrogateType:: +destructor_is_implicit() const { + return (_flags & F_implicit_destructor) != 0; +} + /** * */ diff --git a/dtool/src/interrogatedb/interrogateType.h b/dtool/src/interrogatedb/interrogateType.h index a1cedd1d82..151e10b5f5 100644 --- a/dtool/src/interrogatedb/interrogateType.h +++ b/dtool/src/interrogatedb/interrogateType.h @@ -82,6 +82,7 @@ public: INLINE FunctionIndex get_constructor(int n) const; INLINE bool has_destructor() const; INLINE bool destructor_is_inherited() const; + INLINE bool destructor_is_implicit() const; INLINE FunctionIndex get_destructor() const; INLINE int number_of_elements() const; INLINE ElementIndex get_element(int n) const; diff --git a/dtool/src/parser-inc/btBulletDynamicsCommon.h b/dtool/src/parser-inc/btBulletDynamicsCommon.h index f62fc5bee6..aaf2309f4d 100644 --- a/dtool/src/parser-inc/btBulletDynamicsCommon.h +++ b/dtool/src/parser-inc/btBulletDynamicsCommon.h @@ -65,7 +65,6 @@ class btPoint2PointConstraint; class btPolyhedralConvexShape; class btQuaternion; class btSequentialImpulseConstraintSolver; -class btScalar; class btSliderConstraint; class btSoftBodyHelpers; class btSoftBodyRigidBodyCollisionConfiguration; @@ -80,11 +79,13 @@ class btTranslationalLimitMotor; class btTriangleMesh; class btTypedConstraint; class btTypedObject; -class btVector3; class btVehicleRaycaster; template class btAlignedObjectArray; +struct btVector3 {}; +typedef double btScalar; + class btWheelInfo { public: class RaycastInfo; From 6f8b379bda0f0a86f77001ff68b4e304a2b4a5e9 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 2 Apr 2017 23:24:22 +0200 Subject: [PATCH 086/254] Big patch full of performance improvements This particularly benefits applications with a lot of nodes. --- dtool/src/dtoolbase/typeHandle.cxx | 4 + dtool/src/prc/configVariableBool.I | 7 +- dtool/src/prc/configVariableBool.cxx | 9 + dtool/src/prc/configVariableBool.h | 10 +- dtool/src/prc/notifyCategory.I | 10 + dtool/src/prc/notifyCategoryProxy.I | 10 + dtool/src/prc/pnotify.h | 19 +- panda/src/char/characterJointEffect.cxx | 8 +- panda/src/char/characterJointEffect.h | 2 +- panda/src/collide/collisionLevelState.I | 12 +- panda/src/collide/collisionLevelStateBase.h | 2 +- panda/src/collide/collisionNode.cxx | 2 +- panda/src/collide/collisionNode.h | 2 + panda/src/collide/collisionTraverser.cxx | 56 ++- panda/src/collide/collisionVisualizer.cxx | 5 +- panda/src/display/graphicsStateGuardian.cxx | 143 +++---- panda/src/display/graphicsStateGuardian.h | 2 +- panda/src/distort/projectionScreen.cxx | 2 +- panda/src/express/memoryUsage.I | 11 +- panda/src/express/memoryUsage.cxx | 10 + panda/src/express/memoryUsage.h | 2 + panda/src/express/pointerToBase.I | 54 +-- panda/src/express/pointerToBase.h | 2 +- panda/src/glstuff/glCgShaderContext_src.cxx | 5 + panda/src/glstuff/glCgShaderContext_src.h | 10 +- .../glstuff/glGraphicsStateGuardian_src.cxx | 2 +- panda/src/glstuff/glShaderContext_src.cxx | 83 +++- panda/src/glstuff/glShaderContext_src.h | 20 +- panda/src/gobj/adaptiveLru.cxx | 14 +- panda/src/gobj/geom.cxx | 76 +++- panda/src/gobj/geomPrimitive.I | 15 +- panda/src/gobj/geomPrimitive.cxx | 126 ++++-- panda/src/gobj/geomPrimitive.h | 1 + panda/src/gobj/geomVertexData.I | 4 +- panda/src/gobj/geomVertexData.h | 8 +- panda/src/gobj/internalName.h | 6 + panda/src/gobj/shader.cxx | 10 +- panda/src/gobj/shader.h | 3 +- panda/src/gobj/shaderContext.h | 5 +- .../src/grutil/pipeOcclusionCullTraverser.cxx | 33 +- panda/src/grutil/shaderTerrainMesh.cxx | 10 +- panda/src/mathutil/geometricBoundingVolume.I | 3 + panda/src/mathutil/geometricBoundingVolume.h | 6 + panda/src/parametrics/ropeNode.cxx | 4 +- panda/src/parametrics/sheetNode.cxx | 2 +- panda/src/pgraph/billboardEffect.cxx | 2 +- panda/src/pgraph/billboardEffect.h | 2 +- panda/src/pgraph/compassEffect.cxx | 2 +- panda/src/pgraph/compassEffect.h | 2 +- panda/src/pgraph/config_pgraph.cxx | 3 - panda/src/pgraph/cullPlanes.cxx | 5 +- panda/src/pgraph/cullPlanes.h | 6 + panda/src/pgraph/cullTraverser.I | 10 +- panda/src/pgraph/cullTraverser.cxx | 113 +++--- panda/src/pgraph/cullTraverserData.I | 60 +-- panda/src/pgraph/cullTraverserData.cxx | 95 +++-- panda/src/pgraph/cullTraverserData.h | 22 +- panda/src/pgraph/geomTransformer.cxx | 11 +- panda/src/pgraph/nodePath.I | 52 +-- panda/src/pgraph/nodePath.cxx | 59 ++- panda/src/pgraph/nodePath.h | 5 +- panda/src/pgraph/nodePathComponent.I | 9 + panda/src/pgraph/nodePathComponent.cxx | 11 - panda/src/pgraph/nodePathComponent.h | 10 +- panda/src/pgraph/nodePath_ext.cxx | 72 ++-- panda/src/pgraph/pandaNode.I | 4 +- panda/src/pgraph/pandaNode.h | 11 +- panda/src/pgraph/polylightEffect.cxx | 12 +- panda/src/pgraph/portalClipper.h | 2 +- panda/src/pgraph/portalNode.cxx | 4 +- panda/src/pgraph/renderAttrib.cxx | 29 +- panda/src/pgraph/renderAttrib.h | 2 +- panda/src/pgraph/renderEffect.cxx | 2 +- panda/src/pgraph/renderEffect.h | 2 +- panda/src/pgraph/renderEffects.cxx | 2 +- panda/src/pgraph/renderEffects.h | 2 +- panda/src/pgraph/renderState.I | 3 +- panda/src/pgraph/renderState.cxx | 64 +-- panda/src/pgraph/renderState.h | 8 +- panda/src/pgraph/shaderAttrib.I | 30 +- panda/src/pgraph/shaderAttrib.cxx | 166 ++++---- panda/src/pgraph/shaderAttrib.h | 10 +- panda/src/pgraph/shaderInput.I | 90 ++++- panda/src/pgraph/shaderInput.cxx | 33 +- panda/src/pgraph/shaderInput.h | 35 +- panda/src/pgraph/transformState.cxx | 364 ++++++++---------- panda/src/pgraph/transformState.h | 14 +- panda/src/pgraphnodes/ambientLight.h | 2 +- panda/src/pgraphnodes/fadeLodNode.cxx | 2 +- panda/src/pgraphnodes/lightLensNode.I | 2 +- panda/src/pgraphnodes/lightLensNode.h | 2 +- panda/src/pgraphnodes/lodNode.cxx | 16 +- .../src/pgraphnodes/nodeCullCallbackData.cxx | 2 +- panda/src/pgraphnodes/shaderGenerator.cxx | 4 +- panda/src/pipeline/pipelineCyclerTrueImpl.I | 10 + panda/src/pipeline/thread.I | 2 +- panda/src/putil/copyOnWriteObject.h | 6 + panda/src/putil/simpleHashMap.I | 28 +- panda/src/putil/simpleHashMap.h | 18 +- panda/src/putil/typedWritableReferenceCount.h | 5 + panda/src/putil/weakKeyHashMap.I | 30 +- panda/src/putil/weakKeyHashMap.h | 20 +- 102 files changed, 1410 insertions(+), 1009 deletions(-) diff --git a/dtool/src/dtoolbase/typeHandle.cxx b/dtool/src/dtoolbase/typeHandle.cxx index 4bbdbcbbb1..ed85da8d03 100644 --- a/dtool/src/dtoolbase/typeHandle.cxx +++ b/dtool/src/dtoolbase/typeHandle.cxx @@ -45,7 +45,9 @@ get_memory_usage(MemoryClass memory_class) const { void TypeHandle:: inc_memory_usage(MemoryClass memory_class, size_t size) { #ifdef DO_MEMORY_USAGE +#ifdef _DEBUG assert((int)memory_class >= 0 && (int)memory_class < (int)MC_limit); +#endif if ((*this) != TypeHandle::none()) { TypeRegistryNode *rnode = TypeRegistry::ptr()->look_up(*this, NULL); assert(rnode != (TypeRegistryNode *)NULL); @@ -67,7 +69,9 @@ inc_memory_usage(MemoryClass memory_class, size_t size) { void TypeHandle:: dec_memory_usage(MemoryClass memory_class, size_t size) { #ifdef DO_MEMORY_USAGE +#ifdef _DEBUG assert((int)memory_class >= 0 && (int)memory_class < (int)MC_limit); +#endif if ((*this) != TypeHandle::none()) { TypeRegistryNode *rnode = TypeRegistry::ptr()->look_up(*this, NULL); assert(rnode != (TypeRegistryNode *)NULL); diff --git a/dtool/src/prc/configVariableBool.I b/dtool/src/prc/configVariableBool.I index 4e6b0ab35f..7eba0820d0 100644 --- a/dtool/src/prc/configVariableBool.I +++ b/dtool/src/prc/configVariableBool.I @@ -67,7 +67,7 @@ operator = (bool value) { /** * Returns the variable's value. */ -INLINE ConfigVariableBool:: +ALWAYS_INLINE ConfigVariableBool:: operator bool () const { return get_value(); } @@ -100,12 +100,11 @@ set_value(bool value) { /** * Returns the variable's value. */ -INLINE bool ConfigVariableBool:: +ALWAYS_INLINE bool ConfigVariableBool:: get_value() const { TAU_PROFILE("bool ConfigVariableBool::get_value() const", " ", TAU_USER); if (!is_cache_valid(_local_modified)) { - mark_cache_valid(((ConfigVariableBool *)this)->_local_modified); - ((ConfigVariableBool *)this)->_cache = get_bool_word(0); + reload_value(); } return _cache; } diff --git a/dtool/src/prc/configVariableBool.cxx b/dtool/src/prc/configVariableBool.cxx index d063b06fd5..7fb604642d 100644 --- a/dtool/src/prc/configVariableBool.cxx +++ b/dtool/src/prc/configVariableBool.cxx @@ -12,3 +12,12 @@ */ #include "configVariableBool.h" + +/** + * Refreshes the cached value. + */ +void ConfigVariableBool:: +reload_value() const { + mark_cache_valid(_local_modified); + _cache = get_bool_word(0); +} diff --git a/dtool/src/prc/configVariableBool.h b/dtool/src/prc/configVariableBool.h index a0d8b0b1dd..9f486c4266 100644 --- a/dtool/src/prc/configVariableBool.h +++ b/dtool/src/prc/configVariableBool.h @@ -29,13 +29,13 @@ PUBLISHED: const string &description = string(), int flags = 0); INLINE void operator = (bool value); - INLINE operator bool () const; + ALWAYS_INLINE operator bool () const; INLINE size_t size() const; INLINE bool operator [] (size_t n) const; INLINE void set_value(bool value); - INLINE bool get_value() const; + ALWAYS_INLINE bool get_value() const; INLINE bool get_default_value() const; MAKE_PROPERTY(value, get_value, set_value); MAKE_PROPERTY(default_value, get_default_value); @@ -44,8 +44,10 @@ PUBLISHED: INLINE void set_word(size_t n, bool value); private: - AtomicAdjust::Integer _local_modified; - bool _cache; + void reload_value() const; + + mutable AtomicAdjust::Integer _local_modified; + mutable bool _cache; }; #include "configVariableBool.I" diff --git a/dtool/src/prc/notifyCategory.I b/dtool/src/prc/notifyCategory.I index a485447dcc..07d3634d92 100644 --- a/dtool/src/prc/notifyCategory.I +++ b/dtool/src/prc/notifyCategory.I @@ -70,7 +70,12 @@ is_on(NotifySeverity severity) const { */ INLINE bool NotifyCategory:: is_spam() const { + // Instruct the compiler to optimize for the usual case. +#ifdef __GNUC__ + return __builtin_expect(is_on(NS_spam), 0); +#else return is_on(NS_spam); +#endif } /** @@ -78,7 +83,12 @@ is_spam() const { */ INLINE bool NotifyCategory:: is_debug() const { + // Instruct the compiler to optimize for the usual case. +#ifdef __GNUC__ + return __builtin_expect(is_on(NS_debug), 0); +#else return is_on(NS_debug); +#endif } #else /** diff --git a/dtool/src/prc/notifyCategoryProxy.I b/dtool/src/prc/notifyCategoryProxy.I index 08c253f081..ae829eeedb 100644 --- a/dtool/src/prc/notifyCategoryProxy.I +++ b/dtool/src/prc/notifyCategoryProxy.I @@ -69,7 +69,12 @@ is_on(NotifySeverity severity) { template INLINE bool NotifyCategoryProxy:: is_spam() { + // Instruct the compiler to optimize for the usual case. +#ifdef __GNUC__ + return __builtin_expect(get_unsafe_ptr()->is_spam(), 0); +#else return get_unsafe_ptr()->is_spam(); +#endif } #else template @@ -86,7 +91,12 @@ is_spam() { template INLINE bool NotifyCategoryProxy:: is_debug() { + // Instruct the compiler to optimize for the usual case. +#ifdef __GNUC__ + return __builtin_expect(get_unsafe_ptr()->is_debug(), 0); +#else return get_unsafe_ptr()->is_debug(); +#endif } #else template diff --git a/dtool/src/prc/pnotify.h b/dtool/src/prc/pnotify.h index a8254cc910..414b97d2a4 100644 --- a/dtool/src/prc/pnotify.h +++ b/dtool/src/prc/pnotify.h @@ -122,6 +122,13 @@ private: // constant expressions and compilation will fail if the assertion is not // true. +#ifdef __GNUC__ +// Tell the optimizer to optimize for the case where the condition is true. +#define _nassert_check(condition) (__builtin_expect(!(condition), 0)) +#else +#define _nassert_check(condition) (!(condition)) +#endif + #ifdef NDEBUG #define nassertr(condition, return_value) @@ -131,14 +138,14 @@ private: #define nassertr_always(condition, return_value) \ { \ - if (!(condition)) { \ + if (_nassert_check(condition)) { \ return return_value; \ } \ } #define nassertv_always(condition) \ { \ - if (!(condition)) { \ + if (_nassert_check(condition)) { \ return; \ } \ } @@ -151,7 +158,7 @@ private: #define nassertr(condition, return_value) \ { \ - if (!(condition)) { \ + if (_nassert_check(condition)) { \ if (Notify::ptr()->assert_failure(#condition, __LINE__, __FILE__)) { \ return return_value; \ } \ @@ -160,7 +167,7 @@ private: #define nassertv(condition) \ { \ - if (!(condition)) { \ + if (_nassert_check(condition)) { \ if (Notify::ptr()->assert_failure(#condition, __LINE__, __FILE__)) { \ return; \ } \ @@ -168,7 +175,7 @@ private: } #define nassertd(condition) \ - if (!(condition) && \ + if (_nassert_check(condition) && \ Notify::ptr()->assert_failure(#condition, __LINE__, __FILE__)) #define nassertr_always(condition, return_value) nassertr(condition, return_value) @@ -177,7 +184,7 @@ private: #define nassert_raise(message) Notify::ptr()->assert_failure(message, __LINE__, __FILE__) #define enter_debugger_if(condition) \ - if (condition) { \ + if (_nassert_check(condition)) { \ Notify::ptr()->assert_failure(#condition, __LINE__, __FILE__); \ __asm { int 3 } \ } diff --git a/panda/src/char/characterJointEffect.cxx b/panda/src/char/characterJointEffect.cxx index ec0dec9de3..33441e35c2 100644 --- a/panda/src/char/characterJointEffect.cxx +++ b/panda/src/char/characterJointEffect.cxx @@ -122,8 +122,10 @@ void CharacterJointEffect:: cull_callback(CullTraverser *trav, CullTraverserData &data, CPT(TransformState) &node_transform, CPT(RenderState) &) const { - CPT(TransformState) dummy_transform = TransformState::make_identity(); - adjust_transform(dummy_transform, node_transform, data.node()); + if (_character.is_valid_pointer()) { + _character->update(); + } + node_transform = data.node()->get_transform(); } /** @@ -147,7 +149,7 @@ has_adjust_transform() const { void CharacterJointEffect:: adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *node) const { + const PandaNode *node) const { if (_character.is_valid_pointer()) { _character->update(); } diff --git a/panda/src/char/characterJointEffect.h b/panda/src/char/characterJointEffect.h index 031b75237c..0df4cea6fd 100644 --- a/panda/src/char/characterJointEffect.h +++ b/panda/src/char/characterJointEffect.h @@ -53,7 +53,7 @@ public: virtual bool has_adjust_transform() const; virtual void adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *node) const; + const PandaNode *node) const; protected: virtual int compare_to_impl(const RenderEffect *other) const; diff --git a/panda/src/collide/collisionLevelState.I b/panda/src/collide/collisionLevelState.I index 5ac7cb9063..5dc74aa691 100644 --- a/panda/src/collide/collisionLevelState.I +++ b/panda/src/collide/collisionLevelState.I @@ -111,10 +111,12 @@ any_in_bounds() { } #endif // NDEBUG - CPT(BoundingVolume) node_bv = node()->get_bounds(); + PandaNode *pnode = node(); + + CPT(BoundingVolume) node_bv = pnode->get_bounds(); if (node_bv->is_of_type(GeometricBoundingVolume::get_class_type())) { - const GeometricBoundingVolume *node_gbv; - DCAST_INTO_R(node_gbv, node_bv, false); + const GeometricBoundingVolume *node_gbv = (const GeometricBoundingVolume *)node_bv.p(); + CollideMask this_mask = pnode->get_net_collide_mask(); int num_colliders = get_num_colliders(); for (int c = 0; c < num_colliders; c++) { @@ -125,10 +127,10 @@ any_in_bounds() { // Don't even bother testing the bounding volume if there are no // collide bits in common between our collider and this node. CollideMask from_mask = cnode->get_from_collide_mask() & _include_mask; - if (!(from_mask & node()->get_net_collide_mask()).is_zero()) { + if (!(from_mask & this_mask).is_zero()) { // Also don't test a node with itself, or with any of its // descendants. - if (node() == cnode) { + if (pnode == cnode) { #ifndef NDEBUG if (collide_cat.is_spam()) { indent(collide_cat.spam(false), indent_level) diff --git a/panda/src/collide/collisionLevelStateBase.h b/panda/src/collide/collisionLevelStateBase.h index bde70562c2..4c2abccb58 100644 --- a/panda/src/collide/collisionLevelStateBase.h +++ b/panda/src/collide/collisionLevelStateBase.h @@ -51,7 +51,7 @@ public: INLINE CollisionLevelStateBase(const NodePath &node_path); INLINE CollisionLevelStateBase(const CollisionLevelStateBase &parent, - PandaNode *child); + PandaNode *child); INLINE CollisionLevelStateBase(const CollisionLevelStateBase ©); INLINE void operator = (const CollisionLevelStateBase ©); diff --git a/panda/src/collide/collisionNode.cxx b/panda/src/collide/collisionNode.cxx index da5aa38cc6..9de94617b3 100644 --- a/panda/src/collide/collisionNode.cxx +++ b/panda/src/collide/collisionNode.cxx @@ -196,7 +196,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { if (respect_prev_transform) { // Determine the previous frame's position, relative to the current // position. - NodePath node_path = data._node_path.get_node_path(); + NodePath node_path = data.get_node_path(); CPT(TransformState) transform = node_path.get_net_transform()->invert_compose(node_path.get_net_prev_transform()); if (!transform->is_identity()) { diff --git a/panda/src/collide/collisionNode.h b/panda/src/collide/collisionNode.h index 6c95e6d435..db731f7bcf 100644 --- a/panda/src/collide/collisionNode.h +++ b/panda/src/collide/collisionNode.h @@ -93,6 +93,8 @@ private: typedef pvector< COWPT(CollisionSolid) > Solids; Solids _solids; + friend class CollisionTraverser; + public: static void register_with_read_factory(); virtual void write_datagram(BamWriter *manager, Datagram &dg); diff --git a/panda/src/collide/collisionTraverser.cxx b/panda/src/collide/collisionTraverser.cxx index 5934a5e541..74973d6764 100644 --- a/panda/src/collide/collisionTraverser.cxx +++ b/panda/src/collide/collisionTraverser.cxx @@ -57,7 +57,7 @@ public: inline bool operator () (int a, int b) const { const CollisionTraverser::OrderedColliderDef &ocd_a = _trav._ordered_colliders[a]; const CollisionTraverser::OrderedColliderDef &ocd_b = _trav._ordered_colliders[b]; - return DCAST(CollisionNode, ocd_a._node_path.node())->get_collider_sort() < DCAST(CollisionNode, ocd_b._node_path.node())->get_collider_sort(); + return ((const CollisionNode *)ocd_a._node_path.node())->get_collider_sort() < ((const CollisionNode *)ocd_b._node_path.node())->get_collider_sort(); } const CollisionTraverser &_trav; @@ -1117,31 +1117,45 @@ compare_collider_to_node(CollisionEntry &entry, } if (within_node_bounds) { + Thread *current_thread = Thread::get_current_thread(); + CollisionNode *cnode; DCAST_INTO_V(cnode, entry._into_node); + int num_solids = cnode->get_num_solids(); - collide_cat.spam() - << "Colliding against CollisionNode " << entry._into_node - << " which has " << num_solids << " collision solids.\n"; - for (int s = 0; s < num_solids; ++s) { - entry._into = cnode->get_solid(s); + if (collide_cat.is_spam()) { + collide_cat.spam() + << "Colliding against CollisionNode " << entry._into_node + << " which has " << num_solids << " collision solids.\n"; + } - // We should allow a collision test for solid into itself, because the - // solid might be simply instanced into multiple different - // CollisionNodes. We are already filtering out tests for a - // CollisionNode into itself. - CPT(BoundingVolume) solid_bv = entry._into->get_bounds(); - const GeometricBoundingVolume *solid_gbv = NULL; - if (num_solids > 1 && - solid_bv->is_of_type(GeometricBoundingVolume::get_class_type())) { - // Only bother to test against each solid's bounding volume if we have - // more than one solid in the node, as a slight optimization. (If the - // node contains just one solid, then the node's bounding volume, - // which we just tested, is the same as the solid's bounding volume.) - DCAST_INTO_V(solid_gbv, solid_bv); + // Only bother to test against each solid's bounding volume if we have + // more than one solid in the node, as a slight optimization. (If the + // node contains just one solid, then the node's bounding volume, which + // we just tested, is the same as the solid's bounding volume.) + if (num_solids == 1) { + entry._into = cnode->_solids[0].get_read_pointer(current_thread); + Colliders::const_iterator ci; + ci = _colliders.find(entry.get_from_node_path()); + nassertv(ci != _colliders.end()); + entry.test_intersection((*ci).second, this); + } else { + CollisionNode::Solids::const_iterator si; + for (si = cnode->_solids.begin(); si != cnode->_solids.end(); ++si) { + entry._into = (*si).get_read_pointer(current_thread); + + // We should allow a collision test for solid into itself, because the + // solid might be simply instanced into multiple different + // CollisionNodes. We are already filtering out tests for a + // CollisionNode into itself. + CPT(BoundingVolume) solid_bv = entry._into->get_bounds(); + const GeometricBoundingVolume *solid_gbv = nullptr; + if (solid_bv->is_of_type(GeometricBoundingVolume::get_class_type())) { + solid_gbv = (const GeometricBoundingVolume *)solid_bv.p(); + } + + compare_collider_to_solid(entry, from_node_gbv, solid_gbv); } - - compare_collider_to_solid(entry, from_node_gbv, solid_gbv); } } } diff --git a/panda/src/collide/collisionVisualizer.cxx b/panda/src/collide/collisionVisualizer.cxx index 19699b9d6f..d58137ce68 100644 --- a/panda/src/collide/collisionVisualizer.cxx +++ b/panda/src/collide/collisionVisualizer.cxx @@ -111,10 +111,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { // its objects according to their appropriate net transform. xform_data._net_transform = TransformState::make_identity(); xform_data._view_frustum = trav->get_view_frustum(); - xform_data.apply_transform_and_state(trav, net_transform, - RenderState::make_empty(), - RenderEffects::make_empty(), - ClipPlaneAttrib::make()); + xform_data.apply_transform(net_transform); // Draw all the collision solids. Solids::const_iterator si; diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 5b46251ba8..e8ef03ce3b 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -903,16 +903,10 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, case Shader::SMO_identity: { return &LMatrix4::ident_mat(); } - case Shader::SMO_window_size: { - t = LMatrix4::translate_mat(_current_display_region->get_pixel_width(), - _current_display_region->get_pixel_height(), - 0.0); - return &t; - } + case Shader::SMO_window_size: case Shader::SMO_pixel_size: { - t = LMatrix4::translate_mat(_current_display_region->get_pixel_width(), - _current_display_region->get_pixel_height(), - 0.0); + LVecBase2i pixel_size = _current_display_region->get_pixel_size(); + t = LMatrix4::translate_mat(pixel_size[0], pixel_size[1], 0); return &t; } case Shader::SMO_frame_time: { @@ -1049,7 +1043,7 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, LColor const &c = lt->get_color(); LColor const &s = lt->get_specular_color(); t = np.get_net_transform()->get_mat() * - get_scene()->get_world_transform()->get_mat(); + _scene_setup->get_world_transform()->get_mat(); LVecBase3 d = -(t.xform_vec(lt->get_direction())); d.normalize(); LVecBase3 h = d + LVecBase3(0,-1,0); @@ -1066,11 +1060,12 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, LColor const &c = lt->get_color(); LColor const &s = lt->get_specular_color(); t = np.get_net_transform()->get_mat() * - get_scene()->get_world_transform()->get_mat(); + _scene_setup->get_world_transform()->get_mat(); LVecBase3 p = (t.xform_point(lt->get_point())); LVecBase3 a = lt->get_attenuation(); - PN_stdfloat lnear = lt->get_lens(0)->get_near(); - PN_stdfloat lfar = lt->get_lens(0)->get_far(); + Lens *lens = lt->get_lens(0); + PN_stdfloat lnear = lens->get_near(); + PN_stdfloat lfar = lens->get_far(); t = LMatrix4(c[0],c[1],c[2],c[3],s[0],s[1],s[2],s[3],p[0],p[1],p[2],lnear,a[0],a[1],a[2],lfar); return &t; } @@ -1086,7 +1081,7 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, LColor const &s = lt->get_specular_color(); PN_stdfloat cutoff = ccos(deg_2_rad(lens->get_hfov() * 0.5f)); t = np.get_net_transform()->get_mat() * - get_scene()->get_world_transform()->get_mat(); + _scene_setup->get_world_transform()->get_mat(); LVecBase3 p = t.xform_point(lens->get_nodal_point()); LVecBase3 d = -(t.xform_vec(lens->get_view_vector())); t = LMatrix4(c[0],c[1],c[2],c[3],s[0],s[1],s[2],s[3],p[0],p[1],p[2],0,d[0],d[1],d[2],cutoff); @@ -1109,7 +1104,7 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, Light *light_obj = light.node()->as_light(); nassertr(light_obj != (Light *)NULL, &LMatrix4::zeros_mat()); - if (light_obj->get_type() == AmbientLight::get_class_type()) { + if (light_obj->is_ambient_light()) { cur_ambient_light += light_obj->get_color(); } } @@ -1155,27 +1150,31 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, case Shader::SMO_plane_x: { const NodePath &np = _target_shader->get_shader_input_nodepath(name); nassertr(!np.is_empty(), &LMatrix4::zeros_mat()); - nassertr(np.node()->is_of_type(PlaneNode::get_class_type()), &LMatrix4::zeros_mat()); - LPlane p = DCAST(PlaneNode, np.node())->get_plane(); + const PlaneNode *plane_node; + DCAST_INTO_R(plane_node, np.node(), &LMatrix4::zeros_mat()); + LPlane p = plane_node->get_plane(); t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,p[0],p[1],p[2],p[3]); return &t; } case Shader::SMO_clipplane_x: { - const ClipPlaneAttrib *cpa = DCAST(ClipPlaneAttrib, _target_rs->get_attrib_def(ClipPlaneAttrib::get_class_slot())); + const ClipPlaneAttrib *cpa; + _target_rs->get_attrib_def(cpa); int planenr = atoi(name->get_name().c_str()); if (planenr >= cpa->get_num_on_planes()) { return &LMatrix4::zeros_mat(); } const NodePath &np = cpa->get_on_plane(planenr); nassertr(!np.is_empty(), &LMatrix4::zeros_mat()); - nassertr(np.node()->is_of_type(PlaneNode::get_class_type()), &LMatrix4::zeros_mat()); - LPlane p (DCAST(PlaneNode, np.node())->get_plane()); + const PlaneNode *plane_node; + DCAST_INTO_R(plane_node, np.node(), &LMatrix4::zeros_mat()); + LPlane p (plane_node->get_plane()); p.xform(np.get_net_transform()->get_mat()); // World-space t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,p[0],p[1],p[2],p[3]); return &t; } case Shader::SMO_apiview_clipplane_i: { - const ClipPlaneAttrib *cpa = DCAST(ClipPlaneAttrib, _target_rs->get_attrib_def(ClipPlaneAttrib::get_class_slot())); + const ClipPlaneAttrib *cpa; + _target_rs->get_attrib_def(cpa); if (index >= cpa->get_num_on_planes()) { return &LMatrix4::zeros_mat(); } @@ -1186,7 +1185,7 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, DCAST_INTO_R(plane_node, plane.node(), &LMatrix4::zeros_mat()); CPT(TransformState) transform = - get_scene()->get_cs_world_transform()->compose( + _scene_setup->get_cs_world_transform()->compose( plane.get_transform(_scene_setup->get_scene_root().get_parent())); LPlane xformed_plane = plane_node->get_plane() * transform->get_mat(); @@ -1206,24 +1205,24 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, return &t; } case Shader::SMO_world_to_view: { - return &(get_scene()->get_world_transform()->get_mat()); + return &(_scene_setup->get_world_transform()->get_mat()); break; } case Shader::SMO_view_to_world: { - return &(get_scene()->get_camera_transform()->get_mat()); + return &(_scene_setup->get_camera_transform()->get_mat()); } case Shader::SMO_model_to_view: { - return &(get_external_transform()->get_mat()); + return &(_inv_cs_transform->compose(_internal_transform)->get_mat()); } case Shader::SMO_model_to_apiview: { - return &(get_internal_transform()->get_mat()); + return &(_internal_transform->get_mat()); } case Shader::SMO_view_to_model: { - t = get_external_transform()->get_inverse()->get_mat(); + t = _internal_transform->invert_compose(_cs_transform)->get_mat(); return &t; } case Shader::SMO_apiview_to_model: { - t = get_internal_transform()->get_inverse()->get_mat(); + t = _internal_transform->get_inverse()->get_mat(); return &t; } case Shader::SMO_apiview_to_view: { @@ -1268,13 +1267,13 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, const NodePath &np = _target_shader->get_shader_input_nodepath(name); nassertr(!np.is_empty(), &LMatrix4::ident_mat()); t = np.get_net_transform()->get_mat() * - get_scene()->get_world_transform()->get_mat(); + _scene_setup->get_world_transform()->get_mat(); return &t; } case Shader::SMO_view_to_view_x: { const NodePath &np = _target_shader->get_shader_input_nodepath(name); nassertr(!np.is_empty(), &LMatrix4::ident_mat()); - t = get_scene()->get_camera_transform()->get_mat() * + t = _scene_setup->get_camera_transform()->get_mat() * np.get_net_transform()->get_inverse()->get_mat(); return &t; } @@ -1283,13 +1282,13 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, nassertr(!np.is_empty(), &LMatrix4::ident_mat()); t = LMatrix4::convert_mat(_internal_coordinate_system, _coordinate_system) * np.get_net_transform()->get_mat() * - get_scene()->get_world_transform()->get_mat(); + _scene_setup->get_world_transform()->get_mat(); return &t; } case Shader::SMO_view_to_apiview_x: { const NodePath &np = _target_shader->get_shader_input_nodepath(name); nassertr(!np.is_empty(), &LMatrix4::ident_mat()); - t = (get_scene()->get_camera_transform()->get_mat() * + t = (_scene_setup->get_camera_transform()->get_mat() * np.get_net_transform()->get_inverse()->get_mat() * LMatrix4::convert_mat(_coordinate_system, _internal_coordinate_system)); return &t; @@ -1297,20 +1296,22 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, case Shader::SMO_clip_x_to_view: { const NodePath &np = _target_shader->get_shader_input_nodepath(name); nassertr(!np.is_empty(), &LMatrix4::ident_mat()); - nassertr(np.node()->is_of_type(LensNode::get_class_type()), &LMatrix4::ident_mat()); - Lens *lens = DCAST(LensNode, np.node())->get_lens(); + const LensNode *node; + DCAST_INTO_R(node, np.node(), &LMatrix4::ident_mat()); + const Lens *lens = node->get_lens(); t = lens->get_projection_mat_inv(_current_stereo_channel) * LMatrix4::convert_mat(lens->get_coordinate_system(), _coordinate_system) * np.get_net_transform()->get_mat() * - get_scene()->get_world_transform()->get_mat(); + _scene_setup->get_world_transform()->get_mat(); return &t; } case Shader::SMO_view_to_clip_x: { const NodePath &np = _target_shader->get_shader_input_nodepath(name); nassertr(!np.is_empty(), &LMatrix4::ident_mat()); - nassertr(np.node()->is_of_type(LensNode::get_class_type()), &LMatrix4::ident_mat()); - Lens *lens = DCAST(LensNode, np.node())->get_lens(); - t = get_scene()->get_camera_transform()->get_mat() * + const LensNode *node; + DCAST_INTO_R(node, np.node(), &LMatrix4::ident_mat()); + const Lens *lens = node->get_lens(); + t = _scene_setup->get_camera_transform()->get_mat() * np.get_net_transform()->get_inverse()->get_mat() * LMatrix4::convert_mat(_coordinate_system, lens->get_coordinate_system()) * lens->get_projection_mat(_current_stereo_channel); @@ -1319,20 +1320,22 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, case Shader::SMO_apiclip_x_to_view: { const NodePath &np = _target_shader->get_shader_input_nodepath(name); nassertr(!np.is_empty(), &LMatrix4::ident_mat()); - nassertr(np.node()->is_of_type(LensNode::get_class_type()), &LMatrix4::ident_mat()); - Lens *lens = DCAST(LensNode, np.node())->get_lens(); + const LensNode *node; + DCAST_INTO_R(node, np.node(), &LMatrix4::ident_mat()); + const Lens *lens = node->get_lens(); t = calc_projection_mat(lens)->get_inverse()->get_mat() * get_cs_transform_for(lens->get_coordinate_system())->get_inverse()->get_mat() * np.get_net_transform()->get_mat() * - get_scene()->get_world_transform()->get_mat(); + _scene_setup->get_world_transform()->get_mat(); return &t; } case Shader::SMO_view_to_apiclip_x: { const NodePath &np = _target_shader->get_shader_input_nodepath(name); nassertr(!np.is_empty(), &LMatrix4::ident_mat()); - nassertr(np.node()->is_of_type(LensNode::get_class_type()), &LMatrix4::ident_mat()); - Lens *lens = DCAST(LensNode, np.node())->get_lens(); - t = get_scene()->get_camera_transform()->get_mat() * + const LensNode *node; + DCAST_INTO_R(node, np.node(), &LMatrix4::ident_mat()); + const Lens *lens = node->get_lens(); + t = _scene_setup->get_camera_transform()->get_mat() * np.get_net_transform()->get_inverse()->get_mat() * get_cs_transform_for(lens->get_coordinate_system())->get_mat() * calc_projection_mat(lens)->get_mat(); @@ -1383,7 +1386,7 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, Light *light_obj = light.node()->as_light(); nassertr(light_obj != (Light *)NULL, &LMatrix4::ident_mat()); - if (light_obj->get_type() != AmbientLight::get_class_type()) { + if (!light_obj->is_ambient_light()) { if (i++ == index) { return fetch_specified_member(light, name, t); } @@ -1430,7 +1433,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) static const CPT_InternalName IN_constantAttenuation("constantAttenuation"); static const CPT_InternalName IN_linearAttenuation("linearAttenuation"); static const CPT_InternalName IN_quadraticAttenuation("quadraticAttenuation"); - static const CPT_InternalName IN_shadowMatrix("shadowMatrix"); + static const CPT_InternalName IN_shadowViewMatrix("shadowViewMatrix"); PandaNode *node = NULL; if (!np.is_empty()) { @@ -1454,7 +1457,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) } Light *light = node->as_light(); nassertr(light != (Light *)NULL, &LMatrix4::ident_mat()); - if (node->is_of_type(AmbientLight::get_class_type())) { + if (node->is_ambient_light()) { LColor c = light->get_color(); c.componentwise_mult(_light_color_scale); t.set_row(3, c); @@ -1470,7 +1473,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) } Light *light = node->as_light(); nassertr(light != (Light *)NULL, &LMatrix4::ones_mat()); - if (node->is_of_type(AmbientLight::get_class_type())) { + if (node->is_ambient_light()) { // Ambient light has no diffuse color. t.set_row(3, LColor(0.0f, 0.0f, 0.0f, 1.0f)); } else { @@ -1493,7 +1496,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) if (np.is_empty()) { t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0); return &t; - } else if (node->is_of_type(AmbientLight::get_class_type())) { + } else if (node->is_ambient_light()) { // Ambient light has no position. t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); return &t; @@ -1503,7 +1506,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) CPT(TransformState) transform = np.get_transform(_scene_setup->get_scene_root().get_parent()); LVector3 dir = -(light->get_direction() * transform->get_mat()); - dir *= get_scene()->get_cs_world_transform()->get_mat(); + dir *= _scene_setup->get_cs_world_transform()->get_mat(); t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,dir[0],dir[1],dir[2],0); return &t; } else { @@ -1513,7 +1516,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) nassertr(lens != (Lens *)NULL, &LMatrix4::ident_mat()); CPT(TransformState) transform = - get_scene()->get_cs_world_transform()->compose( + _scene_setup->get_cs_world_transform()->compose( np.get_transform(_scene_setup->get_scene_root().get_parent())); const LMatrix4 &light_mat = transform->get_mat(); @@ -1526,7 +1529,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) if (np.is_empty()) { t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0); return &t; - } else if (node->is_of_type(AmbientLight::get_class_type())) { + } else if (node->is_ambient_light()) { // Ambient light has no half-vector. t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); return &t; @@ -1536,7 +1539,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) CPT(TransformState) transform = np.get_transform(_scene_setup->get_scene_root().get_parent()); LVector3 dir = -(light->get_direction() * transform->get_mat()); - dir *= get_scene()->get_cs_world_transform()->get_mat(); + dir *= _scene_setup->get_cs_world_transform()->get_mat(); dir.normalize(); dir += LVector3(0, 0, 1); dir.normalize(); @@ -1549,7 +1552,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) nassertr(lens != (Lens *)NULL, &LMatrix4::ident_mat()); CPT(TransformState) transform = - get_scene()->get_cs_world_transform()->compose( + _scene_setup->get_cs_world_transform()->compose( np.get_transform(_scene_setup->get_scene_root().get_parent())); const LMatrix4 &light_mat = transform->get_mat(); @@ -1565,7 +1568,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) if (node == (PandaNode *)NULL) { t.set_row(3, LVector3(0.0f, 0.0f, -1.0f)); return &t; - } else if (node->is_of_type(AmbientLight::get_class_type())) { + } else if (node->is_ambient_light()) { // Ambient light has no spot direction. t.set_row(3, LVector3(0.0f, 0.0f, 0.0f)); return &t; @@ -1576,7 +1579,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) nassertr(lens != (Lens *)NULL, &LMatrix4::ident_mat()); CPT(TransformState) transform = - get_scene()->get_cs_world_transform()->compose( + _scene_setup->get_cs_world_transform()->compose( np.get_transform(_scene_setup->get_scene_root().get_parent())); const LMatrix4 &light_mat = transform->get_mat(); @@ -1670,7 +1673,7 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) t.set_row(3, LVecBase4(light->get_attenuation()[2])); return &t; - } else if (attrib == IN_shadowMatrix) { + } else if (attrib == IN_shadowViewMatrix) { static const LMatrix4 biasmat(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, @@ -1684,8 +1687,8 @@ fetch_specified_member(const NodePath &np, CPT_InternalName attrib, LMatrix4 &t) DCAST_INTO_R(lnode, node, &LMatrix4::ident_mat()); Lens *lens = lnode->get_lens(); - t = get_external_transform()->get_mat() * - get_scene()->get_camera_transform()->get_mat() * + t = _inv_cs_transform->get_mat() * + _scene_setup->get_camera_transform()->get_mat() * np.get_net_transform()->get_inverse()->get_mat() * LMatrix4::convert_mat(_coordinate_system, lens->get_coordinate_system()); @@ -1785,7 +1788,7 @@ fetch_specified_texture(Shader::ShaderTexSpec &spec, SamplerState &sampler, Light *light_obj = light.node()->as_light(); nassertr(light_obj != (Light *)NULL, NULL); - if (light_obj->get_type() != AmbientLight::get_class_type()) { + if (!light_obj->is_ambient_light()) { if (i++ == spec._stage) { PT(Texture) tex = get_shadow_map(light); if (tex != (Texture *)NULL) { @@ -2663,7 +2666,7 @@ do_issue_light() { _lighting_enabled = true; } - if (light_obj->get_type() == AmbientLight::get_class_type()) { + if (light_obj->is_ambient_light()) { // Ambient lights don't require specific light ids; simply add in the // ambient contribution to the current total cur_ambient_light += light_obj->get_color(); @@ -3143,11 +3146,12 @@ async_reload_texture(TextureContext *tc) { */ PT(Texture) GraphicsStateGuardian:: get_shadow_map(const NodePath &light_np, GraphicsOutputBase *host) { - nassertr(light_np.node()->is_of_type(DirectionalLight::get_class_type()) || - light_np.node()->is_of_type(PointLight::get_class_type()) || - light_np.node()->is_of_type(Spotlight::get_class_type()), NULL); + PandaNode *node = light_np.node(); + nassertr(node->is_of_type(DirectionalLight::get_class_type()) || + node->is_of_type(PointLight::get_class_type()) || + node->is_of_type(Spotlight::get_class_type()), NULL); - PT(LightLensNode) light = DCAST(LightLensNode, light_np.node()); + LightLensNode *light = (LightLensNode *)node; if (light == NULL || !light->_shadow_caster) { // TODO: return dummy shadow map (all white). return NULL; @@ -3177,11 +3181,12 @@ get_shadow_map(const NodePath &light_np, GraphicsOutputBase *host) { PT(Texture) GraphicsStateGuardian:: make_shadow_buffer(const NodePath &light_np, GraphicsOutputBase *host) { // Make sure everything is valid. - nassertr(light_np.node()->is_of_type(DirectionalLight::get_class_type()) || - light_np.node()->is_of_type(PointLight::get_class_type()) || - light_np.node()->is_of_type(Spotlight::get_class_type()), NULL); + PandaNode *node = light_np.node(); + nassertr(node->is_of_type(DirectionalLight::get_class_type()) || + node->is_of_type(PointLight::get_class_type()) || + node->is_of_type(Spotlight::get_class_type()), NULL); - PT(LightLensNode) light = DCAST(LightLensNode, light_np.node()); + LightLensNode *light = (LightLensNode *)node; if (light == NULL || !light->_shadow_caster) { return NULL; } diff --git a/panda/src/display/graphicsStateGuardian.h b/panda/src/display/graphicsStateGuardian.h index a5dbce4a11..a300771f1f 100644 --- a/panda/src/display/graphicsStateGuardian.h +++ b/panda/src/display/graphicsStateGuardian.h @@ -286,7 +286,7 @@ PUBLISHED: MAKE_PROPERTY(driver_shader_version_minor, get_driver_shader_version_minor); bool set_scene(SceneSetup *scene_setup); - virtual SceneSetup *get_scene() const; + virtual SceneSetup *get_scene() const FINAL; MAKE_PROPERTY(scene, get_scene, set_scene); public: diff --git a/panda/src/distort/projectionScreen.cxx b/panda/src/distort/projectionScreen.cxx index fd319031e6..1991bfc120 100644 --- a/panda/src/distort/projectionScreen.cxx +++ b/panda/src/distort/projectionScreen.cxx @@ -103,7 +103,7 @@ make_copy() const { bool ProjectionScreen:: cull_callback(CullTraverser *, CullTraverserData &data) { if (_auto_recompute) { - recompute_if_stale(data._node_path.get_node_path()); + recompute_if_stale(data.get_node_path()); } return true; } diff --git a/panda/src/express/memoryUsage.I b/panda/src/express/memoryUsage.I index 619da5a736..f9de4f8c93 100644 --- a/panda/src/express/memoryUsage.I +++ b/panda/src/express/memoryUsage.I @@ -295,10 +295,13 @@ show_trend_ages() { */ INLINE MemoryUsage *MemoryUsage:: get_global_ptr() { - if (_global_ptr == (MemoryUsage *)NULL) { - init_memory_hook(); - _global_ptr = new MemoryUsage(*memory_hook); - memory_hook = _global_ptr; +#ifdef __GNUC__ + // Tell the compiler that this is an unlikely branch. + if (__builtin_expect(_global_ptr == nullptr, 0)) { +#else + if (_global_ptr == nullptr) { +#endif + init_memory_usage(); } return _global_ptr; diff --git a/panda/src/express/memoryUsage.cxx b/panda/src/express/memoryUsage.cxx index 1aea4fe825..a834da9dad 100644 --- a/panda/src/express/memoryUsage.cxx +++ b/panda/src/express/memoryUsage.cxx @@ -489,6 +489,16 @@ MemoryUsage(const MemoryHook ©) : MemoryHook(copy) { _total_size = 0; } +/** + * Initializes the global MemoryUsage pointer. + */ +void MemoryUsage:: +init_memory_usage() { + init_memory_hook(); + _global_ptr = new MemoryUsage(*memory_hook); + memory_hook = _global_ptr; +} + /** * This callback method is called whenever the total allocated heap size * exceeds _max_heap_size. It's mainly intended for reporting memory leaks, diff --git a/panda/src/express/memoryUsage.h b/panda/src/express/memoryUsage.h index b52f71f7ea..eb4cc6856e 100644 --- a/panda/src/express/memoryUsage.h +++ b/panda/src/express/memoryUsage.h @@ -95,6 +95,8 @@ private: MemoryUsage(const MemoryHook ©); INLINE static MemoryUsage *get_global_ptr(); + static void init_memory_usage(); + void ns_record_pointer(ReferenceCount *ptr); void ns_update_type(ReferenceCount *ptr, TypeHandle type); void ns_update_type(ReferenceCount *ptr, TypedObject *typed_ptr); diff --git a/panda/src/express/pointerToBase.I b/panda/src/express/pointerToBase.I index 296dc5d3bb..d57064967b 100644 --- a/panda/src/express/pointerToBase.I +++ b/panda/src/express/pointerToBase.I @@ -21,9 +21,7 @@ PointerToBase(To *ptr) { if (ptr != (To *)NULL) { ptr->ref(); #ifdef DO_MEMORY_USAGE - if (MemoryUsage::get_track_memory_usage()) { - update_type(ptr); - } + update_type(ptr); #endif } } @@ -38,11 +36,6 @@ PointerToBase(const PointerToBase ©) { if (_void_ptr != NULL) { To *ptr = (To *)_void_ptr; ptr->ref(); -#ifdef DO_MEMORY_USAGE - if (MemoryUsage::get_track_memory_usage()) { - update_type(ptr); - } -#endif } } @@ -108,17 +101,15 @@ reassign(To *ptr) { To *old_ptr = (To *)_void_ptr; _void_ptr = (void *)ptr; - if (ptr != (To *)NULL) { + if (ptr != nullptr) { ptr->ref(); #ifdef DO_MEMORY_USAGE - if (MemoryUsage::get_track_memory_usage()) { - update_type(ptr); - } + update_type(ptr); #endif } // Now delete the old pointer. - if (old_ptr != (To *)NULL) { + if (old_ptr != nullptr) { unref_delete(old_ptr); } } @@ -130,7 +121,24 @@ reassign(To *ptr) { template INLINE void PointerToBase:: reassign(const PointerToBase ©) { - reassign((To *)copy._void_ptr); + if (copy._void_ptr != _void_ptr) { + // First save the old pointer; we won't delete it until we have assigned + // the new one. We do this just in case there are cascading effects from + // deleting this pointer that might inadvertently delete the new one. + // (Don't laugh--it's happened!) + To *old_ptr = (To *)_void_ptr; + To *new_ptr = (To *)copy._void_ptr; + + _void_ptr = copy._void_ptr; + if (new_ptr != nullptr) { + new_ptr->ref(); + } + + // Now delete the old pointer. + if (old_ptr != nullptr) { + unref_delete(old_ptr); + } + } } #ifdef DO_MEMORY_USAGE @@ -139,15 +147,17 @@ reassign(const PointerToBase ©) { * object, if we know the type ourselves. */ template -void PointerToBase:: +INLINE void PointerToBase:: update_type(To *ptr) { - TypeHandle type = get_type_handle(To); - if (type == TypeHandle::none()) { - do_init_type(To); - type = get_type_handle(To); - } - if (type != TypeHandle::none()) { - MemoryUsage::update_type(ptr, type); + if (MemoryUsage::get_track_memory_usage()) { + TypeHandle type = get_type_handle(To); + if (type == TypeHandle::none()) { + do_init_type(To); + type = get_type_handle(To); + } + if (type != TypeHandle::none()) { + MemoryUsage::update_type(ptr, type); + } } } #endif // DO_MEMORY_USAGE diff --git a/panda/src/express/pointerToBase.h b/panda/src/express/pointerToBase.h index b85e6ec856..d19edd6b5c 100644 --- a/panda/src/express/pointerToBase.h +++ b/panda/src/express/pointerToBase.h @@ -45,7 +45,7 @@ protected: INLINE void reassign(const PointerToBase ©); #ifdef DO_MEMORY_USAGE - void update_type(To *ptr); + INLINE void update_type(To *ptr); #endif // DO_MEMORY_USAGE // No assignment or retrieval functions are declared in PointerToBase, diff --git a/panda/src/glstuff/glCgShaderContext_src.cxx b/panda/src/glstuff/glCgShaderContext_src.cxx index 8497c7de71..329594eb38 100644 --- a/panda/src/glstuff/glCgShaderContext_src.cxx +++ b/panda/src/glstuff/glCgShaderContext_src.cxx @@ -399,6 +399,7 @@ unbind() { void CLP(CgShaderContext):: set_state_and_transform(const RenderState *target_rs, const TransformState *modelview_transform, + const TransformState *camera_transform, const TransformState *projection_transform) { if (!valid()) { @@ -410,6 +411,10 @@ set_state_and_transform(const RenderState *target_rs, if (_modelview_transform != modelview_transform) { _modelview_transform = modelview_transform; + altered |= (Shader::SSD_transform & ~Shader::SSD_view_transform); + } + if (_camera_transform != camera_transform) { + _camera_transform = camera_transform; altered |= Shader::SSD_transform; } if (_projection_transform != projection_transform) { diff --git a/panda/src/glstuff/glCgShaderContext_src.h b/panda/src/glstuff/glCgShaderContext_src.h index ae76989d77..49d451d442 100644 --- a/panda/src/glstuff/glCgShaderContext_src.h +++ b/panda/src/glstuff/glCgShaderContext_src.h @@ -25,7 +25,7 @@ class CLP(GraphicsStateGuardian); /** * xyz */ -class EXPCL_GL CLP(CgShaderContext) : public ShaderContext { +class EXPCL_GL CLP(CgShaderContext) FINAL : public ShaderContext { public: friend class CLP(GraphicsStateGuardian); @@ -39,7 +39,8 @@ public: void set_state_and_transform(const RenderState *state, const TransformState *modelview_transform, - const TransformState *projection_transform); + const TransformState *camera_transform, + const TransformState *projection_transform) OVERRIDE; void issue_parameters(int altered) OVERRIDE; void update_transform_table(const TransformTable *table); @@ -77,6 +78,7 @@ private: WCPT(RenderState) _state_rs; CPT(TransformState) _modelview_transform; + CPT(TransformState) _camera_transform; CPT(TransformState) _projection_transform; GLint _frame_number; @@ -93,10 +95,10 @@ public: register_type(_type_handle, CLASSPREFIX_QUOTED "CgShaderContext", ShaderContext::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} + virtual TypeHandle force_init_type() OVERRIDE {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 5c73772b50..51636ccd73 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -10350,7 +10350,7 @@ set_state_and_transform(const RenderState *target, // Update all of the state that is bound to the shader program. if (_current_shader_context != NULL) { - _current_shader_context->set_state_and_transform(target, transform, _projection_mat); + _current_shader_context->set_state_and_transform(target, transform, _scene_setup->get_camera_transform(), _projection_mat); } #endif diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 41b004775f..65a4a1c01c 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -874,7 +874,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { matrix_name.substr(0, 12) == "LightSource[" && sscanf(matrix_name.c_str(), "LightSource[%d].%s", &bind._index, name_buffer) == 2) { // A matrix member of a p3d_LightSource struct. - if (strncmp(name_buffer, "shadowMatrix", 127) == 0) { + if (strncmp(name_buffer, "shadowViewMatrix", 127) == 0) { if (inverse) { // Tack inverse back onto the end. strcpy(name_buffer + strlen(name_buffer), "Inverse"); @@ -884,7 +884,25 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { bind._part[0] = Shader::SMO_light_source_i_attrib; bind._arg[0] = InternalName::make(name_buffer); bind._part[1] = Shader::SMO_identity; + bind._arg[1] = NULL; + } else if (strncmp(name_buffer, "shadowMatrix", 127) == 0) { + // Only supported for backward compatibility: includes the model + // matrix. Not very efficient to do this. + bind._func = Shader::SMF_compose; + bind._part[0] = Shader::SMO_model_to_apiview; + bind._arg[0] = NULL; + bind._part[1] = Shader::SMO_light_source_i_attrib; + bind._arg[1] = InternalName::make("shadowViewMatrix"); + + static bool warned = false; + if (!warned) { + warned = true; + GLCAT.warning() + << "p3d_LightSource[].shadowMatrix is deprecated; use " + "shadowViewMatrix instead, which transforms from view space " + "instead of model space.\n"; + } } else { GLCAT.error() << "p3d_LightSource struct does not provide a matrix named " << matrix_name << "!\n"; return; @@ -1163,11 +1181,16 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { bind._index = index; bind._part[0] = Shader::SMO_light_source_i_attrib; bind._arg[0] = InternalName::make(member_name); - bind._dep[0] = Shader::SSD_general | Shader::SSD_light | Shader::SSD_frame | Shader::SSD_transform; + bind._dep[0] = Shader::SSD_general | Shader::SSD_light | Shader::SSD_frame; bind._part[1] = Shader::SMO_identity; bind._arg[1] = NULL; bind._dep[1] = Shader::SSD_NONE; + if (member_name == "position" || member_name == "halfVector" || + member_name == "spotDirection") { + bind._dep[0] |= Shader::SSD_view_transform; + } + switch (param_type) { case GL_FLOAT: bind._piece = Shader::SMP_row3x1; @@ -1250,7 +1273,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { bind._func = Shader::SMF_compose; bind._part[0] = Shader::SMO_world_to_view; bind._part[1] = Shader::SMO_view_to_apiview; - bind._dep[0] = Shader::SSD_general | Shader::SSD_transform; + bind._dep[0] = Shader::SSD_general | Shader::SSD_view_transform; bind._dep[1] = Shader::SSD_general; _shader->_mat_spec.push_back(bind); _shader->_mat_deps |= bind._dep[0] | bind._dep[1]; @@ -1262,7 +1285,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { bind._part[0] = Shader::SMO_apiview_to_view; bind._part[1] = Shader::SMO_view_to_world; bind._dep[0] = Shader::SSD_general; - bind._dep[1] = Shader::SSD_general | Shader::SSD_transform; + bind._dep[1] = Shader::SSD_general | Shader::SSD_view_transform; _shader->_mat_spec.push_back(bind); _shader->_mat_deps |= bind._dep[0] | bind._dep[1]; return; @@ -1383,22 +1406,43 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { bind._id = arg_id; bind._piece = Shader::SMP_whole; bind._func = Shader::SMF_first; + bind._part[1] = Shader::SMO_identity; + bind._arg[1] = NULL; + bind._dep[1] = Shader::SSD_NONE; PT(InternalName) iname = InternalName::make(param_name); if (iname->get_parent() != InternalName::get_root()) { // It might be something like an attribute of a shader input, like a // light parameter. It might also just be a custom struct // parameter. We can't know yet, sadly. - bind._part[0] = Shader::SMO_mat_constant_x_attrib; - bind._arg[0] = InternalName::make(param_name); - bind._dep[0] = Shader::SSD_general | Shader::SSD_shaderinputs | Shader::SSD_frame | Shader::SSD_transform; + if (iname->get_basename() == "shadowMatrix") { + // Special exception for shadowMatrix, which is deprecated, + // because it includes the model transformation. It is far more + // efficient to do that in the shader instead. + static bool warned = false; + if (!warned) { + warned = true; + GLCAT.warning() + << "light.shadowMatrix inputs are deprecated; use " + "shadowViewMatrix instead, which transforms from view " + "space instead of model space.\n"; + } + bind._func = Shader::SMF_compose; + bind._part[0] = Shader::SMO_model_to_apiview; + bind._arg[0] = NULL; + bind._dep[0] = Shader::SSD_general | Shader::SSD_transform; + bind._part[1] = Shader::SMO_mat_constant_x_attrib; + bind._arg[1] = InternalName::make("shadowViewMatrix"); + bind._dep[1] = Shader::SSD_general | Shader::SSD_shaderinputs | Shader::SSD_frame | Shader::SSD_view_transform; + } else { + bind._part[0] = Shader::SMO_mat_constant_x_attrib; + bind._arg[0] = InternalName::make(param_name); + bind._dep[0] = Shader::SSD_general | Shader::SSD_shaderinputs | Shader::SSD_frame | Shader::SSD_view_transform; + } } else { bind._part[0] = Shader::SMO_mat_constant_x; bind._arg[0] = InternalName::make(param_name); bind._dep[0] = Shader::SSD_general | Shader::SSD_shaderinputs | Shader::SSD_frame; } - bind._part[1] = Shader::SMO_identity; - bind._arg[1] = NULL; - bind._dep[1] = Shader::SSD_NONE; _shader->_mat_spec.push_back(bind); _shader->_mat_deps |= bind._dep[0]; return; @@ -1430,9 +1474,9 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { bind._func = Shader::SMF_first; bind._part[0] = Shader::SMO_vec_constant_x_attrib; bind._arg[0] = iname; - // We need SSD_transform since some attributes (eg. light position) - // have to be transformed to view space. - bind._dep[0] = Shader::SSD_general | Shader::SSD_shaderinputs | Shader::SSD_frame | Shader::SSD_transform; + // We need SSD_view_transform since some attributes (eg. light + // position) have to be transformed to view space. + bind._dep[0] = Shader::SSD_general | Shader::SSD_shaderinputs | Shader::SSD_frame | Shader::SSD_view_transform; bind._part[1] = Shader::SMO_identity; bind._arg[1] = NULL; bind._dep[1] = Shader::SSD_NONE; @@ -1822,6 +1866,7 @@ unbind() { void CLP(ShaderContext):: set_state_and_transform(const RenderState *target_rs, const TransformState *modelview_transform, + const TransformState *camera_transform, const TransformState *projection_transform) { // Find out which state properties have changed. @@ -1829,6 +1874,10 @@ set_state_and_transform(const RenderState *target_rs, if (_modelview_transform != modelview_transform) { _modelview_transform = modelview_transform; + altered |= (Shader::SSD_transform & ~Shader::SSD_view_transform); + } + if (_camera_transform != camera_transform) { + _camera_transform = camera_transform; altered |= Shader::SSD_transform; } if (_projection_transform != projection_transform) { @@ -2440,17 +2489,17 @@ update_shader_texture_bindings(ShaderContext *prev) { const ParamTextureImage *param = NULL; Texture *tex; - const ShaderInput *sinp = _glgsg->_target_shader->get_shader_input(input._name); - switch (sinp->get_value_type()) { + const ShaderInput &sinp = _glgsg->_target_shader->get_shader_input(input._name); + switch (sinp.get_value_type()) { case ShaderInput::M_texture_image: - param = (const ParamTextureImage *)sinp->get_param(); + param = (const ParamTextureImage *)sinp.get_param(); tex = param->get_texture(); break; case ShaderInput::M_texture: // People find it convenient to be able to pass a texture without // further ado. - tex = sinp->get_texture(); + tex = sinp.get_texture(); break; case ShaderInput::M_invalid: diff --git a/panda/src/glstuff/glShaderContext_src.h b/panda/src/glstuff/glShaderContext_src.h index e143774ed6..97c9b5940c 100644 --- a/panda/src/glstuff/glShaderContext_src.h +++ b/panda/src/glstuff/glShaderContext_src.h @@ -26,7 +26,7 @@ class CLP(GraphicsStateGuardian); /** * xyz */ -class EXPCL_GL CLP(ShaderContext) : public ShaderContext { +class EXPCL_GL CLP(ShaderContext) FINAL : public ShaderContext { public: friend class CLP(GraphicsStateGuardian); @@ -41,18 +41,19 @@ public: bool get_sampler_texture_type(int &out, GLenum param_type); INLINE bool valid(void); - void bind(); - void unbind(); + void bind() OVERRIDE; + void unbind() OVERRIDE; void set_state_and_transform(const RenderState *state, const TransformState *modelview_transform, - const TransformState *projection_transform); + const TransformState *camera_transform, + const TransformState *projection_transform) OVERRIDE; - void issue_parameters(int altered); + void issue_parameters(int altered) OVERRIDE; void update_transform_table(const TransformTable *table); void update_slider_table(const SliderTable *table); - void disable_shader_vertex_arrays(); - bool update_shader_vertex_arrays(ShaderContext *prev, bool force); + void disable_shader_vertex_arrays() OVERRIDE; + bool update_shader_vertex_arrays(ShaderContext *prev, bool force) OVERRIDE; void disable_shader_texture_bindings() OVERRIDE; void update_shader_texture_bindings(ShaderContext *prev) OVERRIDE; void update_shader_buffer_bindings(ShaderContext *prev) OVERRIDE; @@ -68,6 +69,7 @@ private: WCPT(RenderState) _state_rs; CPT(TransformState) _modelview_transform; + CPT(TransformState) _camera_transform; CPT(TransformState) _projection_transform; /* @@ -126,10 +128,10 @@ public: register_type(_type_handle, CLASSPREFIX_QUOTED "ShaderContext", ShaderContext::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} + virtual TypeHandle force_init_type() OVERRIDE {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/gobj/adaptiveLru.cxx b/panda/src/gobj/adaptiveLru.cxx index 8b68f0e9b2..a74fcfcb0d 100644 --- a/panda/src/gobj/adaptiveLru.cxx +++ b/panda/src/gobj/adaptiveLru.cxx @@ -114,12 +114,16 @@ update_page(AdaptiveLruPage *page) { update_frames = (_current_frame_identifier - page->_update_frame_identifier); if (update_frames > 0) { - PN_stdfloat update_average_frame_utilization = - (PN_stdfloat) (page->_update_total_usage) / (PN_stdfloat)update_frames; + if (page->_update_total_usage > 0) { + PN_stdfloat update_average_frame_utilization = + (PN_stdfloat) (page->_update_total_usage) / (PN_stdfloat)update_frames; - page->_average_frame_utilization = - calculate_exponential_moving_average(update_average_frame_utilization, - page->_average_frame_utilization); + page->_average_frame_utilization = + calculate_exponential_moving_average(update_average_frame_utilization, + page->_average_frame_utilization); + } else { + page->_average_frame_utilization *= 1.0f - _weight; + } target_priority = page->_priority; if (page->_average_frame_utilization >= 1.0f) { diff --git a/panda/src/gobj/geom.cxx b/panda/src/gobj/geom.cxx index eb44a46abb..66d7c19e62 100644 --- a/panda/src/gobj/geom.cxx +++ b/panda/src/gobj/geom.cxx @@ -655,28 +655,72 @@ unify_in_place(int max_indices, bool preserve_order) { // Should we split it up again to satisfy max_indices? if (prim->get_num_vertices() > max_indices) { + // Copy prim into smaller prims, no one of which has more than + // max_indices vertices. + GeomPrimitivePipelineReader reader(prim, current_thread); + // Copy prim into smaller prims, no one of which has more than // max_indices vertices. int i = 0; + int num_primitives = reader.get_num_primitives(); + int num_vertices_per_primitive = prim->get_num_vertices_per_primitive(); + int num_unused_vertices_per_primitive = prim->get_num_unused_vertices_per_primitive(); + if (num_vertices_per_primitive != 0) { + // This is a simple primitive type like a triangle, where all the + // primitives share the same number of vertices. + int total_vertices_per_primitive = num_vertices_per_primitive + num_unused_vertices_per_primitive; + int max_primitives = max_indices / total_vertices_per_primitive; + const unsigned char *ptr = reader.get_read_pointer(true); + size_t stride = reader.get_index_stride(); - while (i < prim->get_num_primitives()) { - PT(GeomPrimitive) smaller = prim->make_copy(); - smaller->clear_vertices(); - while (i < prim->get_num_primitives() && - smaller->get_num_vertices() + prim->get_primitive_num_vertices(i) < max_indices) { - int start = prim->get_primitive_start(i); - int end = prim->get_primitive_end(i); - for (int n = start; n < end; ++n) { - smaller->add_vertex(prim->get_vertex(n)); + while (i < num_primitives) { + PT(GeomPrimitive) smaller = prim->make_copy(); + smaller->clear_vertices(); + + // Since the number of vertices is consistent, we can calculate how + // many primitives will fit, and copy them all in one go. + int copy_primitives = min((num_primitives - i), max_primitives); + int num_vertices = copy_primitives * total_vertices_per_primitive; + nassertv(num_vertices > 0); + { + GeomVertexArrayDataHandle writer(smaller->modify_vertices(), current_thread); + writer.unclean_set_num_rows(num_vertices); + memcpy(writer.get_write_pointer(), ptr, stride * (size_t)(num_vertices - num_unused_vertices_per_primitive)); } - smaller->close_primitive(); - ++i; + cdata->_primitives.push_back(smaller.p()); + + ptr += stride * (size_t)num_vertices; + i += copy_primitives; } + } else { + // This is a complex primitive type like a triangle strip. + CPTA_int ends = reader.get_ends(); + int start = 0; + int end = ends[0]; - cdata->_primitives.push_back(smaller.p()); + while (i < num_primitives) { + PT(GeomPrimitive) smaller = prim->make_copy(); + smaller->clear_vertices(); + + while (smaller->get_num_vertices() + (end - start) < max_indices) { + for (int n = start; n < end; ++n) { + smaller->add_vertex(reader.get_vertex(n)); + } + smaller->close_primitive(); + + ++i; + if (i >= num_primitives) { + break; + } + + start = end + num_unused_vertices_per_primitive; + end = ends[i]; + } + + cdata->_primitives.push_back(smaller.p()); + } } - } else { // The prim has few enough vertices; keep it. cdata->_primitives.push_back(prim); @@ -925,7 +969,8 @@ bool Geom:: check_valid() const { Thread *current_thread = Thread::get_current_thread(); GeomPipelineReader geom_reader(this, current_thread); - GeomVertexDataPipelineReader data_reader(geom_reader.get_vertex_data(), current_thread); + CPT(GeomVertexData) vertex_data = geom_reader.get_vertex_data(); + GeomVertexDataPipelineReader data_reader(vertex_data, current_thread); data_reader.check_array_readers(); return geom_reader.check_valid(&data_reader); } @@ -1212,6 +1257,9 @@ compute_internal_bounds(Geom::CData *cdata, Thread *current_thread) const { InternalName::get_vertex(), cdata, current_thread); + nassertv(!pmin.is_nan()); + nassertv(!pmax.is_nan()); + BoundingVolume::BoundsType btype = cdata->_bounds_type; if (btype == BoundingVolume::BT_default) { btype = bounds_type; diff --git a/panda/src/gobj/geomPrimitive.I b/panda/src/gobj/geomPrimitive.I index 1dceada335..9863701e21 100644 --- a/panda/src/gobj/geomPrimitive.I +++ b/panda/src/gobj/geomPrimitive.I @@ -124,8 +124,19 @@ get_vertex(int i) const { */ INLINE int GeomPrimitive:: get_num_primitives() const { - GeomPrimitivePipelineReader reader(this, Thread::get_current_thread()); - return reader.get_num_primitives(); + int num_vertices_per_primitive = get_num_vertices_per_primitive(); + + if (num_vertices_per_primitive == 0) { + // This is a complex primitive type like a triangle strip: each primitive + // uses a different number of vertices. + CDReader cdata(_cycler); + return cdata->_ends.size(); + + } else { + // This is a simple primitive type like a triangle: each primitive uses + // the same number of vertices. + return (get_num_vertices() / num_vertices_per_primitive); + } } /** diff --git a/panda/src/gobj/geomPrimitive.cxx b/panda/src/gobj/geomPrimitive.cxx index b96249cc83..23a905f8e3 100644 --- a/panda/src/gobj/geomPrimitive.cxx +++ b/panda/src/gobj/geomPrimitive.cxx @@ -165,16 +165,17 @@ add_vertex(int vertex) { consider_elevate_index_type(cdata, vertex); - int num_primitives = get_num_primitives(); - if (num_primitives > 0 && - requires_unused_vertices() && - get_num_vertices() == get_primitive_end(num_primitives - 1)) { - // If we are beginning a new primitive, give the derived class a chance to - // insert some degenerate vertices. - if (cdata->_vertices.is_null()) { - do_make_indexed(cdata); + if (requires_unused_vertices()) { + int num_primitives = get_num_primitives(); + if (num_primitives > 0 && + get_num_vertices() == get_primitive_end(num_primitives - 1)) { + // If we are beginning a new primitive, give the derived class a chance to + // insert some degenerate vertices. + if (cdata->_vertices.is_null()) { + do_make_indexed(cdata); + } + append_unused_vertices(cdata->_vertices.get_write_pointer(), vertex); } - append_unused_vertices(cdata->_vertices.get_write_pointer(), vertex); } if (cdata->_vertices.is_null()) { @@ -199,11 +200,28 @@ add_vertex(int vertex) { do_make_indexed(cdata); } - PT(GeomVertexArrayData) array_obj = cdata->_vertices.get_write_pointer(); - GeomVertexWriter index(array_obj, 0); - index.set_row_unsafe(array_obj->get_num_rows()); + { + GeomVertexArrayDataHandle handle(cdata->_vertices.get_write_pointer(), + Thread::get_current_thread()); + int num_rows = handle.get_num_rows(); + handle.set_num_rows(num_rows + 1); - index.add_data1i(vertex); + unsigned char *ptr = handle.get_write_pointer(); + switch (cdata->_index_type) { + case GeomEnums::NT_uint8: + ((uint8_t *)ptr)[num_rows] = vertex; + break; + case GeomEnums::NT_uint16: + ((uint16_t *)ptr)[num_rows] = vertex; + break; + case GeomEnums::NT_uint32: + ((uint32_t *)ptr)[num_rows] = vertex; + break; + default: + nassertv(false); + break; + } + } cdata->_modified = Geom::get_next_modified(); cdata->_got_minmax = false; @@ -888,21 +906,9 @@ make_points() const { // First, get a list of all of the vertices referenced by the original // primitive. BitArray bits; - int num_vertices = get_num_vertices(); - if (is_indexed()) { - CPT(GeomVertexArrayData) vertices = get_vertices(); - int strip_cut_index = get_strip_cut_index(); - GeomVertexReader index(vertices, 0); - for (int vi = 0; vi < num_vertices; ++vi) { - nassertr(!index.is_at_end(), NULL); - int vertex = index.get_data1i(); - if (vertex != strip_cut_index) { - bits.set_bit(vertex); - } - } - } else { - int first_vertex = get_first_vertex(); - bits.set_range(first_vertex, num_vertices); + { + GeomPrimitivePipelineReader reader(this, Thread::get_current_thread()); + reader.get_referenced_vertices(bits); } // Now construct a new index array with just those bits. @@ -2200,9 +2206,21 @@ get_vertex(int i) const { // The indexed case. nassertr(i >= 0 && i < get_num_vertices(), -1); - GeomVertexReader index(_vertices, 0); - index.set_row_unsafe(i); - return index.get_data1i(); + const unsigned char *ptr = get_read_pointer(true); + switch (_cdata->_index_type) { + case GeomEnums::NT_uint8: + return ((uint8_t *)ptr)[i]; + break; + case GeomEnums::NT_uint16: + return ((uint16_t *)ptr)[i]; + break; + case GeomEnums::NT_uint32: + return ((uint32_t *)ptr)[i]; + break; + default: + nassertr(false, -1); + return -1; + } } else { // The nonindexed case. @@ -2229,6 +2247,52 @@ get_num_primitives() const { } } +/** + * Turns on all the bits corresponding to the vertices that are referenced + * by this GeomPrimitive. + */ +void GeomPrimitivePipelineReader:: +get_referenced_vertices(BitArray &bits) const { + int num_vertices = get_num_vertices(); + + if (is_indexed()) { + int strip_cut_index = get_strip_cut_index(); + const unsigned char *ptr = get_read_pointer(true); + switch (get_index_type()) { + case GeomEnums::NT_uint8: + for (int vi = 0; vi < num_vertices; ++vi) { + int index = ((const uint8_t *)ptr)[vi]; + if (index != strip_cut_index) { + bits.set_bit(index); + } + } + break; + case GeomEnums::NT_uint16: + for (int vi = 0; vi < num_vertices; ++vi) { + int index = ((const uint16_t *)ptr)[vi]; + if (index != strip_cut_index) { + bits.set_bit(index); + } + } + break; + case GeomEnums::NT_uint32: + for (int vi = 0; vi < num_vertices; ++vi) { + int index = ((const uint32_t *)ptr)[vi]; + if (index != strip_cut_index) { + bits.set_bit(index); + } + } + break; + default: + nassertv(false); + break; + } + } else { + // Nonindexed case. + bits.set_range(get_first_vertex(), num_vertices); + } +} + /** * */ diff --git a/panda/src/gobj/geomPrimitive.h b/panda/src/gobj/geomPrimitive.h index 0880e77c7a..eefaf1054c 100644 --- a/panda/src/gobj/geomPrimitive.h +++ b/panda/src/gobj/geomPrimitive.h @@ -371,6 +371,7 @@ public: INLINE int get_num_vertices() const; int get_vertex(int i) const; int get_num_primitives() const; + void get_referenced_vertices(BitArray &bits) const; INLINE int get_min_vertex() const; INLINE int get_max_vertex() const; INLINE int get_data_size_bytes() const; diff --git a/panda/src/gobj/geomVertexData.I b/panda/src/gobj/geomVertexData.I index 888db97c88..47fe0ef41b 100644 --- a/panda/src/gobj/geomVertexData.I +++ b/panda/src/gobj/geomVertexData.I @@ -756,7 +756,7 @@ GeomVertexDataPipelineReader(const GeomVertexData *object, * */ INLINE void GeomVertexDataPipelineReader:: -set_object(CPT(GeomVertexData) object) { +set_object(const GeomVertexData *object) { #ifdef DO_PIPELINING if (_cdata != NULL) { unref_delete((CycleData *)_cdata); @@ -764,7 +764,7 @@ set_object(CPT(GeomVertexData) object) { #endif // DO_PIPELINING _array_readers.clear(); - _object.swap(object); + _object = (GeomVertexData *)object; _cdata = (GeomVertexData::CData *)_object->_cycler.read_unlocked(_current_thread); _got_array_readers = false; diff --git a/panda/src/gobj/geomVertexData.h b/panda/src/gobj/geomVertexData.h index 8e236029ae..37839d98b8 100644 --- a/panda/src/gobj/geomVertexData.h +++ b/panda/src/gobj/geomVertexData.h @@ -432,7 +432,7 @@ public: INLINE UpdateSeq get_modified() const; protected: - PT(GeomVertexData) _object; + GeomVertexData *_object; Thread *_current_thread; GeomVertexData::CData *_cdata; }; @@ -440,6 +440,8 @@ protected: /** * Encapsulates the data from a GeomVertexData, pre-fetched for one stage of * the pipeline. + * Does not hold a reference to the GeomVertexData, so make sure it does not + * go out of scope. */ class EXPCL_PANDA_GOBJ GeomVertexDataPipelineReader : public GeomVertexDataPipelineBase { public: @@ -448,7 +450,7 @@ public: ALLOC_DELETED_CHAIN(GeomVertexDataPipelineReader); - INLINE void set_object(CPT(GeomVertexData) object); + INLINE void set_object(const GeomVertexData *object); INLINE const GeomVertexData *get_object() const; INLINE void check_array_readers() const; @@ -504,6 +506,8 @@ private: /** * Encapsulates the data from a GeomVertexData, pre-fetched for one stage of * the pipeline. + * Does not hold a reference to the GeomVertexData, so make sure it does not + * go out of scope. */ class EXPCL_PANDA_GOBJ GeomVertexDataPipelineWriter : public GeomVertexDataPipelineBase { public: diff --git a/panda/src/gobj/internalName.h b/panda/src/gobj/internalName.h index 7485e6f758..bc636eb1c9 100644 --- a/panda/src/gobj/internalName.h +++ b/panda/src/gobj/internalName.h @@ -178,6 +178,12 @@ private: static TypeHandle _texcoord_type_handle; }; +#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + INLINE ostream &operator << (ostream &out, const InternalName &tcn); /** diff --git a/panda/src/gobj/shader.cxx b/panda/src/gobj/shader.cxx index 27a055a794..f0cb8e0506 100644 --- a/panda/src/gobj/shader.cxx +++ b/panda/src/gobj/shader.cxx @@ -390,8 +390,10 @@ cp_dependency(ShaderMatInput inp) { if ((inp == SMO_model_to_view) || (inp == SMO_view_to_model) || (inp == SMO_model_to_apiview) || - (inp == SMO_apiview_to_model) || - (inp == SMO_view_to_world) || + (inp == SMO_apiview_to_model)) { + dep |= SSD_transform; + } + if ((inp == SMO_view_to_world) || (inp == SMO_world_to_view) || (inp == SMO_view_x_to_view) || (inp == SMO_view_to_view_x) || @@ -404,7 +406,7 @@ cp_dependency(ShaderMatInput inp) { (inp == SMO_dlight_x) || (inp == SMO_plight_x) || (inp == SMO_slight_x)) { - dep |= SSD_transform; + dep |= SSD_view_transform; } if ((inp == SMO_texpad_x) || (inp == SMO_texpix_x) || @@ -449,7 +451,7 @@ cp_dependency(ShaderMatInput inp) { (inp == SMO_light_source_i_attrib)) { dep |= SSD_light; if (inp == SMO_light_source_i_attrib) { - dep |= SSD_transform; + dep |= SSD_view_transform; } } if ((inp == SMO_light_product_i_ambient) || diff --git a/panda/src/gobj/shader.h b/panda/src/gobj/shader.h index e7e843b9c6..2eb0bc910a 100644 --- a/panda/src/gobj/shader.h +++ b/panda/src/gobj/shader.h @@ -287,7 +287,7 @@ public: enum ShaderStateDep { SSD_NONE = 0x000, SSD_general = 0x001, - SSD_transform = 0x002, + SSD_transform = 0x2002, SSD_color = 0x004, SSD_colorscale = 0x008, SSD_material = 0x010, @@ -299,6 +299,7 @@ public: SSD_frame = 0x400, SSD_projection = 0x800, SSD_texture = 0x1000, + SSD_view_transform= 0x2000, }; enum ShaderBug { diff --git a/panda/src/gobj/shaderContext.h b/panda/src/gobj/shaderContext.h index 7a5312faa2..a8d8add8ed 100644 --- a/panda/src/gobj/shaderContext.h +++ b/panda/src/gobj/shaderContext.h @@ -32,7 +32,10 @@ class EXPCL_PANDA_GOBJ ShaderContext: public SavedContext { public: INLINE ShaderContext(Shader *se); - INLINE virtual void set_state_and_transform(const RenderState *, const TransformState *, const TransformState*) {}; + virtual void set_state_and_transform(const RenderState *, + const TransformState *, + const TransformState *, + const TransformState *) {}; INLINE virtual bool valid() { return false; } INLINE virtual void bind() {}; diff --git a/panda/src/grutil/pipeOcclusionCullTraverser.cxx b/panda/src/grutil/pipeOcclusionCullTraverser.cxx index 91ebeb6559..1052d5ace5 100644 --- a/panda/src/grutil/pipeOcclusionCullTraverser.cxx +++ b/panda/src/grutil/pipeOcclusionCullTraverser.cxx @@ -464,42 +464,33 @@ void PipeOcclusionCullTraverser:: make_box() { PT(GeomVertexData) vdata = new GeomVertexData ("occlusion_box", GeomVertexFormat::get_v3(), Geom::UH_static); - GeomVertexWriter vertex(vdata, InternalName::get_vertex()); + vdata->unclean_set_num_rows(8); - vertex.add_data3(0.0f, 0.0f, 0.0f); - vertex.add_data3(0.0f, 0.0f, 1.0f); - vertex.add_data3(0.0f, 1.0f, 0.0f); - vertex.add_data3(0.0f, 1.0f, 1.0f); - vertex.add_data3(1.0f, 0.0f, 0.0f); - vertex.add_data3(1.0f, 0.0f, 1.0f); - vertex.add_data3(1.0f, 1.0f, 0.0f); - vertex.add_data3(1.0f, 1.0f, 1.0f); + { + GeomVertexWriter vertex(vdata, InternalName::get_vertex()); + vertex.set_data3(0.0f, 0.0f, 0.0f); + vertex.set_data3(0.0f, 0.0f, 1.0f); + vertex.set_data3(0.0f, 1.0f, 0.0f); + vertex.set_data3(0.0f, 1.0f, 1.0f); + vertex.set_data3(1.0f, 0.0f, 0.0f); + vertex.set_data3(1.0f, 0.0f, 1.0f); + vertex.set_data3(1.0f, 1.0f, 0.0f); + vertex.set_data3(1.0f, 1.0f, 1.0f); + } PT(GeomTriangles) tris = new GeomTriangles(Geom::UH_static); tris->add_vertices(0, 4, 5); - tris->close_primitive(); tris->add_vertices(0, 5, 1); - tris->close_primitive(); tris->add_vertices(4, 6, 7); - tris->close_primitive(); tris->add_vertices(4, 7, 5); - tris->close_primitive(); tris->add_vertices(6, 2, 3); - tris->close_primitive(); tris->add_vertices(6, 3, 7); - tris->close_primitive(); tris->add_vertices(2, 0, 1); - tris->close_primitive(); tris->add_vertices(2, 1, 3); - tris->close_primitive(); tris->add_vertices(1, 5, 7); - tris->close_primitive(); tris->add_vertices(1, 7, 3); - tris->close_primitive(); tris->add_vertices(2, 6, 4); - tris->close_primitive(); tris->add_vertices(2, 4, 0); - tris->close_primitive(); _box_geom = new Geom(vdata); _box_geom->add_primitive(tris); diff --git a/panda/src/grutil/shaderTerrainMesh.cxx b/panda/src/grutil/shaderTerrainMesh.cxx index c01c851345..a7f6b1d8af 100644 --- a/panda/src/grutil/shaderTerrainMesh.cxx +++ b/panda/src/grutil/shaderTerrainMesh.cxx @@ -513,15 +513,15 @@ void ShaderTerrainMesh::add_for_draw(CullTraverser *trav, CullTraverserData &dat nassertv(current_shader_attrib != NULL); current_shader_attrib = DCAST(ShaderAttrib, current_shader_attrib)->set_shader_input( - new ShaderInput("ShaderTerrainMesh.terrain_size", LVecBase2i(_size)) ); + ShaderInput("ShaderTerrainMesh.terrain_size", LVecBase2i(_size))); current_shader_attrib = DCAST(ShaderAttrib, current_shader_attrib)->set_shader_input( - new ShaderInput("ShaderTerrainMesh.chunk_size", LVecBase2i(_chunk_size))); + ShaderInput("ShaderTerrainMesh.chunk_size", LVecBase2i(_chunk_size))); current_shader_attrib = DCAST(ShaderAttrib, current_shader_attrib)->set_shader_input( - new ShaderInput("ShaderTerrainMesh.view_index", LVecBase2i(_current_view_index))); + ShaderInput("ShaderTerrainMesh.view_index", LVecBase2i(_current_view_index))); current_shader_attrib = DCAST(ShaderAttrib, current_shader_attrib)->set_shader_input( - new ShaderInput("ShaderTerrainMesh.data_texture", _data_texture)); + ShaderInput("ShaderTerrainMesh.data_texture", _data_texture)); current_shader_attrib = DCAST(ShaderAttrib, current_shader_attrib)->set_shader_input( - new ShaderInput("ShaderTerrainMesh.heightfield", _heightfield_tex)); + ShaderInput("ShaderTerrainMesh.heightfield", _heightfield_tex)); current_shader_attrib = DCAST(ShaderAttrib, current_shader_attrib)->set_instance_count( traversal_data.emitted_chunks); diff --git a/panda/src/mathutil/geometricBoundingVolume.I b/panda/src/mathutil/geometricBoundingVolume.I index 21a32c4b48..beef98f9ff 100644 --- a/panda/src/mathutil/geometricBoundingVolume.I +++ b/panda/src/mathutil/geometricBoundingVolume.I @@ -16,6 +16,9 @@ */ INLINE_MATHUTIL GeometricBoundingVolume:: GeometricBoundingVolume() { +#ifdef DO_MEMORY_USAGE + MemoryUsage::update_type(this, this); +#endif } /** diff --git a/panda/src/mathutil/geometricBoundingVolume.h b/panda/src/mathutil/geometricBoundingVolume.h index 90c794d832..cc48177f17 100644 --- a/panda/src/mathutil/geometricBoundingVolume.h +++ b/panda/src/mathutil/geometricBoundingVolume.h @@ -83,6 +83,12 @@ private: static TypeHandle _type_handle; }; +#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + #include "geometricBoundingVolume.I" #endif diff --git a/panda/src/parametrics/ropeNode.cxx b/panda/src/parametrics/ropeNode.cxx index c799595888..365795adf7 100644 --- a/panda/src/parametrics/ropeNode.cxx +++ b/panda/src/parametrics/ropeNode.cxx @@ -132,9 +132,9 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { if (curve != (NurbsCurveEvaluator *)NULL) { PT(NurbsCurveResult) result; if (has_matrix()) { - result = curve->evaluate(data._node_path.get_node_path(), get_matrix()); + result = curve->evaluate(data.get_node_path(), get_matrix()); } else { - result = curve->evaluate(data._node_path.get_node_path()); + result = curve->evaluate(data.get_node_path()); } if (result->get_num_segments() > 0) { diff --git a/panda/src/parametrics/sheetNode.cxx b/panda/src/parametrics/sheetNode.cxx index 34496bca68..b4e4cc5a4d 100644 --- a/panda/src/parametrics/sheetNode.cxx +++ b/panda/src/parametrics/sheetNode.cxx @@ -129,7 +129,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { if (get_num_u_subdiv() > 0 && get_num_v_subdiv() > 0) { NurbsSurfaceEvaluator *surface = get_surface(); if (surface != (NurbsSurfaceEvaluator *)NULL) { - PT(NurbsSurfaceResult) result = surface->evaluate(data._node_path.get_node_path()); + PT(NurbsSurfaceResult) result = surface->evaluate(data.get_node_path()); if (result->get_num_u_segments() > 0 && result->get_num_v_segments() > 0) { render_sheet(trav, data, result); diff --git a/panda/src/pgraph/billboardEffect.cxx b/panda/src/pgraph/billboardEffect.cxx index dad0638245..737b370c42 100644 --- a/panda/src/pgraph/billboardEffect.cxx +++ b/panda/src/pgraph/billboardEffect.cxx @@ -164,7 +164,7 @@ has_adjust_transform() const { void BillboardEffect:: adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *) const { + const PandaNode *) const { // A BillboardEffect can only affect the net transform when it is to a // particular node. A billboard to a camera is camera-dependent, of course, // so it has no effect in the absence of any particular camera viewing it. diff --git a/panda/src/pgraph/billboardEffect.h b/panda/src/pgraph/billboardEffect.h index 2d528453f9..284182ba91 100644 --- a/panda/src/pgraph/billboardEffect.h +++ b/panda/src/pgraph/billboardEffect.h @@ -60,7 +60,7 @@ public: virtual bool has_adjust_transform() const; virtual void adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *node) const; + const PandaNode *node) const; protected: virtual int compare_to_impl(const RenderEffect *other) const; diff --git a/panda/src/pgraph/compassEffect.cxx b/panda/src/pgraph/compassEffect.cxx index c1e0cf24a8..d972e7f45a 100644 --- a/panda/src/pgraph/compassEffect.cxx +++ b/panda/src/pgraph/compassEffect.cxx @@ -157,7 +157,7 @@ has_adjust_transform() const { void CompassEffect:: adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *) const { + const PandaNode *) const { if (_properties == 0) { // Nothing to do. return; diff --git a/panda/src/pgraph/compassEffect.h b/panda/src/pgraph/compassEffect.h index 60ec6d03e9..6600820bb1 100644 --- a/panda/src/pgraph/compassEffect.h +++ b/panda/src/pgraph/compassEffect.h @@ -78,7 +78,7 @@ public: virtual bool has_adjust_transform() const; virtual void adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *node) const; + const PandaNode *node) const; protected: virtual int compare_to_impl(const RenderEffect *other) const; diff --git a/panda/src/pgraph/config_pgraph.cxx b/panda/src/pgraph/config_pgraph.cxx index 10b9fb04d3..f481a2aeb1 100644 --- a/panda/src/pgraph/config_pgraph.cxx +++ b/panda/src/pgraph/config_pgraph.cxx @@ -78,7 +78,6 @@ #include "scissorAttrib.h" #include "scissorEffect.h" #include "shadeModelAttrib.h" -#include "shaderInput.h" #include "shaderAttrib.h" #include "shader.h" #include "showBoundsEffect.h" @@ -449,7 +448,6 @@ init_libpgraph() { ScissorAttrib::init_type(); ScissorEffect::init_type(); ShadeModelAttrib::init_type(); - ShaderInput::init_type(); ShaderAttrib::init_type(); ShowBoundsEffect::init_type(); StateMunger::init_type(); @@ -502,7 +500,6 @@ init_libpgraph() { ScissorAttrib::register_with_read_factory(); ScissorEffect::register_with_read_factory(); ShadeModelAttrib::register_with_read_factory(); - ShaderInput::register_with_read_factory(); ShaderAttrib::register_with_read_factory(); ShowBoundsEffect::register_with_read_factory(); TexMatrixAttrib::register_with_read_factory(); diff --git a/panda/src/pgraph/cullPlanes.cxx b/panda/src/pgraph/cullPlanes.cxx index 782637c973..43a249403b 100644 --- a/panda/src/pgraph/cullPlanes.cxx +++ b/panda/src/pgraph/cullPlanes.cxx @@ -315,11 +315,10 @@ do_cull(int &result, CPT(RenderState) &state, result = BoundingVolume::IF_all | BoundingVolume::IF_possible | BoundingVolume::IF_some; - CPT(ClipPlaneAttrib) orig_cpa = DCAST(ClipPlaneAttrib, state->get_attrib(ClipPlaneAttrib::get_class_slot())); - CPT(CullPlanes) new_planes = this; - if (orig_cpa == (ClipPlaneAttrib *)NULL) { + const ClipPlaneAttrib *orig_cpa; + if (!state->get_attrib(orig_cpa)) { // If there are no clip planes in the state, the node is completely in // front of all zero of the clip planes. (This can happen if someone // directly changes the state during the traversal.) diff --git a/panda/src/pgraph/cullPlanes.h b/panda/src/pgraph/cullPlanes.h index 483eb2d30a..c091eebdc9 100644 --- a/panda/src/pgraph/cullPlanes.h +++ b/panda/src/pgraph/cullPlanes.h @@ -74,6 +74,12 @@ private: Occluders _occluders; }; +#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + #include "cullPlanes.I" #endif diff --git a/panda/src/pgraph/cullTraverser.I b/panda/src/pgraph/cullTraverser.I index 180b94b37a..5da999d673 100644 --- a/panda/src/pgraph/cullTraverser.I +++ b/panda/src/pgraph/cullTraverser.I @@ -200,20 +200,14 @@ do_traverse(CullTraverserData &data) { if (is_in_view(data)) { if (pgraph_cat.is_spam()) { pgraph_cat.spam() - << "\n" << data._node_path + << "\n" << data.get_node_path() << " " << data._draw_mask << "\n"; } PandaNodePipelineReader *node_reader = data.node_reader(); int fancy_bits = node_reader->get_fancy_bits(); - if ((fancy_bits & (PandaNode::FB_transform | - PandaNode::FB_state | - PandaNode::FB_effects | - PandaNode::FB_tag | - PandaNode::FB_draw_mask | - PandaNode::FB_cull_callback)) == 0 && - data._cull_planes->is_empty()) { + if (fancy_bits == 0 && data._cull_planes->is_empty()) { // Nothing interesting in this node; just move on. } else { diff --git a/panda/src/pgraph/cullTraverser.cxx b/panda/src/pgraph/cullTraverser.cxx index 5d08b4e5dd..a796718828 100644 --- a/panda/src/pgraph/cullTraverser.cxx +++ b/panda/src/pgraph/cullTraverser.cxx @@ -113,10 +113,8 @@ traverse(const NodePath &root) { GeometricBoundingVolume *local_frustum = NULL; PT(BoundingVolume) bv = _scene_setup->get_lens()->make_bounds(); - if (bv != (BoundingVolume *)NULL && - bv->is_of_type(GeometricBoundingVolume::get_class_type())) { - - local_frustum = DCAST(GeometricBoundingVolume, bv); + if (bv != nullptr) { + local_frustum = bv->as_geometric_bounding_volume(); } // This local_frustum is in camera space @@ -199,19 +197,18 @@ traverse_below(CullTraverserData &data) { PandaNode::Children children = node_reader->get_children(); node_reader->release(); int num_children = children.get_num_children(); - if (node->has_selective_visibility()) { + if (!node->has_selective_visibility()) { + for (int i = 0; i < num_children; ++i) { + CullTraverserData next_data(data, children.get_child(i)); + do_traverse(next_data); + } + } else { int i = node->get_first_visible_child(); while (i < num_children) { CullTraverserData next_data(data, children.get_child(i)); do_traverse(next_data); i = node->get_next_visible_child(i); } - - } else { - for (int i = 0; i < num_children; i++) { - CullTraverserData next_data(data, children.get_child(i)); - do_traverse(next_data); - } } } @@ -235,12 +232,12 @@ draw_bounding_volume(const BoundingVolume *vol, if (bounds_viz != (Geom *)NULL) { _geoms_pcollector.add_level(2); CullableObject *outer_viz = - new CullableObject(bounds_viz, get_bounds_outer_viz_state(), + new CullableObject(move(bounds_viz), get_bounds_outer_viz_state(), internal_transform); _cull_handler->record_object(outer_viz, this); CullableObject *inner_viz = - new CullableObject(bounds_viz, get_bounds_inner_viz_state(), + new CullableObject(move(bounds_viz), get_bounds_inner_viz_state(), internal_transform); _cull_handler->record_object(inner_viz, this); } @@ -270,7 +267,7 @@ show_bounds(CullTraverserData &data, bool tight) { if (bounds_viz != (Geom *)NULL) { _geoms_pcollector.add_level(1); CullableObject *outer_viz = - new CullableObject(bounds_viz, get_bounds_outer_viz_state(), + new CullableObject(move(bounds_viz), get_bounds_outer_viz_state(), internal_transform); _cull_handler->record_object(outer_viz, this); } @@ -281,7 +278,7 @@ show_bounds(CullTraverserData &data, bool tight) { if (node->is_geom_node()) { // Also show the bounding volumes of included Geoms. internal_transform = internal_transform->compose(node->get_transform()); - GeomNode *gnode = DCAST(GeomNode, node); + GeomNode *gnode = (GeomNode *)node; int num_geoms = gnode->get_num_geoms(); for (int i = 0; i < num_geoms; ++i) { draw_bounding_volume(gnode->get_geom(i)->get_bounds(), @@ -334,29 +331,31 @@ make_bounds_viz(const BoundingVolume *vol) { const BoundingHexahedron *fvol = DCAST(BoundingHexahedron, vol); PT(GeomVertexData) vdata = new GeomVertexData - ("bounds", GeomVertexFormat::get_v3(), - Geom::UH_stream); - GeomVertexWriter vertex(vdata, InternalName::get_vertex()); + ("bounds", GeomVertexFormat::get_v3(), Geom::UH_stream); + vdata->unclean_set_num_rows(8); - for (int i = 0; i < 8; ++i ) { - vertex.add_data3(fvol->get_point(i)); + { + GeomVertexWriter vertex(vdata, InternalName::get_vertex()); + for (int i = 0; i < 8; ++i) { + vertex.set_data3(fvol->get_point(i)); + } } PT(GeomLines) lines = new GeomLines(Geom::UH_stream); - lines->add_vertices(0, 1); lines->close_primitive(); - lines->add_vertices(1, 2); lines->close_primitive(); - lines->add_vertices(2, 3); lines->close_primitive(); - lines->add_vertices(3, 0); lines->close_primitive(); + lines->add_vertices(0, 1); + lines->add_vertices(1, 2); + lines->add_vertices(2, 3); + lines->add_vertices(3, 0); - lines->add_vertices(4, 5); lines->close_primitive(); - lines->add_vertices(5, 6); lines->close_primitive(); - lines->add_vertices(6, 7); lines->close_primitive(); - lines->add_vertices(7, 4); lines->close_primitive(); + lines->add_vertices(4, 5); + lines->add_vertices(5, 6); + lines->add_vertices(6, 7); + lines->add_vertices(7, 4); - lines->add_vertices(0, 4); lines->close_primitive(); - lines->add_vertices(1, 5); lines->close_primitive(); - lines->add_vertices(2, 6); lines->close_primitive(); - lines->add_vertices(3, 7); lines->close_primitive(); + lines->add_vertices(0, 4); + lines->add_vertices(1, 5); + lines->add_vertices(2, 6); + lines->add_vertices(3, 7); geom = new Geom(vdata); geom->add_primitive(lines); @@ -368,39 +367,29 @@ make_bounds_viz(const BoundingVolume *vol) { box.local_object(); PT(GeomVertexData) vdata = new GeomVertexData - ("bounds", GeomVertexFormat::get_v3(), - Geom::UH_stream); - GeomVertexWriter vertex(vdata, InternalName::get_vertex()); + ("bounds", GeomVertexFormat::get_v3(), Geom::UH_stream); + vdata->unclean_set_num_rows(8); - for (int i = 0; i < 8; ++i ) { - vertex.add_data3(box.get_point(i)); + { + GeomVertexWriter vertex(vdata, InternalName::get_vertex()); + for (int i = 0; i < 8; ++i) { + vertex.set_data3(box.get_point(i)); + } } PT(GeomTriangles) tris = new GeomTriangles(Geom::UH_stream); tris->add_vertices(0, 4, 5); - tris->close_primitive(); tris->add_vertices(0, 5, 1); - tris->close_primitive(); tris->add_vertices(4, 6, 7); - tris->close_primitive(); tris->add_vertices(4, 7, 5); - tris->close_primitive(); tris->add_vertices(6, 2, 3); - tris->close_primitive(); tris->add_vertices(6, 3, 7); - tris->close_primitive(); tris->add_vertices(2, 0, 1); - tris->close_primitive(); tris->add_vertices(2, 1, 3); - tris->close_primitive(); tris->add_vertices(1, 5, 7); - tris->close_primitive(); tris->add_vertices(1, 7, 3); - tris->close_primitive(); tris->add_vertices(2, 6, 4); - tris->close_primitive(); tris->add_vertices(2, 4, 0); - tris->close_primitive(); geom = new Geom(vdata); geom->add_primitive(tris); @@ -430,19 +419,21 @@ make_tight_bounds_viz(PandaNode *node) const { _current_thread); if (found_any) { PT(GeomVertexData) vdata = new GeomVertexData - ("bounds", GeomVertexFormat::get_v3(), - Geom::UH_stream); - GeomVertexWriter vertex(vdata, InternalName::get_vertex(), - _current_thread); + ("bounds", GeomVertexFormat::get_v3(), Geom::UH_stream); + vdata->unclean_set_num_rows(8); - vertex.add_data3(n[0], n[1], n[2]); - vertex.add_data3(n[0], n[1], x[2]); - vertex.add_data3(n[0], x[1], n[2]); - vertex.add_data3(n[0], x[1], x[2]); - vertex.add_data3(x[0], n[1], n[2]); - vertex.add_data3(x[0], n[1], x[2]); - vertex.add_data3(x[0], x[1], n[2]); - vertex.add_data3(x[0], x[1], x[2]); + { + GeomVertexWriter vertex(vdata, InternalName::get_vertex(), + _current_thread); + vertex.set_data3(n[0], n[1], n[2]); + vertex.set_data3(n[0], n[1], x[2]); + vertex.set_data3(n[0], x[1], n[2]); + vertex.set_data3(n[0], x[1], x[2]); + vertex.set_data3(x[0], n[1], n[2]); + vertex.set_data3(x[0], n[1], x[2]); + vertex.set_data3(x[0], x[1], n[2]); + vertex.set_data3(x[0], x[1], x[2]); + } PT(GeomLinestrips) strip = new GeomLinestrips(Geom::UH_stream); diff --git a/panda/src/pgraph/cullTraverserData.I b/panda/src/pgraph/cullTraverserData.I index 4367d1608e..e2a9a64c95 100644 --- a/panda/src/pgraph/cullTraverserData.I +++ b/panda/src/pgraph/cullTraverserData.I @@ -20,7 +20,8 @@ CullTraverserData(const NodePath &start, const RenderState *state, GeometricBoundingVolume *view_frustum, Thread *current_thread) : - _node_path(start), + _next(nullptr), + _start(start._head), _node_reader(start.node(), current_thread), _net_transform(net_transform), _state(state), @@ -34,44 +35,16 @@ CullTraverserData(const NodePath &start, _node_reader.check_cached(check_bounds); } -/** - * - */ -INLINE CullTraverserData:: -CullTraverserData(const CullTraverserData ©) : - _node_path(copy._node_path), - _node_reader(copy._node_reader), - _net_transform(copy._net_transform), - _state(copy._state), - _view_frustum(copy._view_frustum), - _cull_planes(copy._cull_planes), - _draw_mask(copy._draw_mask), - _portal_depth(copy._portal_depth) -{ -} - -/** - * - */ -INLINE void CullTraverserData:: -operator = (const CullTraverserData ©) { - _node_path = copy._node_path; - _node_reader = copy._node_reader; - _net_transform = copy._net_transform; - _state = copy._state; - _view_frustum = copy._view_frustum; - _cull_planes = copy._cull_planes; - _draw_mask = copy._draw_mask; - _portal_depth = copy._portal_depth; -} - /** * This constructor creates a CullTraverserData object that reflects the next * node down in the traversal. */ INLINE CullTraverserData:: CullTraverserData(const CullTraverserData &parent, PandaNode *child) : - _node_path(parent._node_path, child), + _next(&parent), +#ifdef _DEBUG + _start(nullptr), +#endif _node_reader(child, parent._node_reader.get_current_thread()), _net_transform(parent._net_transform), _state(parent._state), @@ -86,19 +59,12 @@ CullTraverserData(const CullTraverserData &parent, PandaNode *child) : _node_reader.check_cached(check_bounds); } -/** - * - */ -INLINE CullTraverserData:: -~CullTraverserData() { -} - /** * Returns the node traversed to so far. */ INLINE PandaNode *CullTraverserData:: node() const { - return _node_path.node(); + return (PandaNode *)_node_reader.get_node(); } /** @@ -117,6 +83,18 @@ node_reader() const { return &_node_reader; } +/** + * Constructs and returns an actual NodePath that represents the same path we + * have just traversed. + */ +INLINE NodePath CullTraverserData:: +get_node_path() const { + NodePath result; + result._head = r_get_node_path(); + nassertr(result._head != nullptr, NodePath::fail()); + return result; +} + /** * Returns the modelview transform: the relative transform from the camera to * the model. diff --git a/panda/src/pgraph/cullTraverserData.cxx b/panda/src/pgraph/cullTraverserData.cxx index b6bb5911f4..1a8280948f 100644 --- a/panda/src/pgraph/cullTraverserData.cxx +++ b/panda/src/pgraph/cullTraverserData.cxx @@ -46,25 +46,33 @@ apply_transform_and_state(CullTraverser *trav) { } _node_reader.compose_draw_mask(_draw_mask); - apply_transform_and_state(trav, _node_reader.get_transform(), - MOVE(node_state), _node_reader.get_effects(), - _node_reader.get_off_clip_planes()); + const RenderEffects *node_effects = _node_reader.get_effects(); + if (!node_effects->has_cull_callback()) { + apply_transform(_node_reader.get_transform()); + } else { + // The cull callback may decide to modify the node_transform. + CPT(TransformState) node_transform = _node_reader.get_transform(); + node_effects->cull_callback(trav, *this, node_transform, node_state); + apply_transform(node_transform); + } + + if (!node_state->is_empty()) { + _state = _state->compose(node_state); + } + + if (clip_plane_cull) { + _cull_planes = _cull_planes->apply_state(trav, this, + (const ClipPlaneAttrib *)node_state->get_attrib(ClipPlaneAttrib::get_class_slot()), + (const ClipPlaneAttrib *)_node_reader.get_off_clip_planes(), + (const OccluderEffect *)node_effects->get_effect(OccluderEffect::get_class_type())); + } } /** - * Applies the indicated transform and state changes (e.g. as extracted from - * a node) onto the current data. This also evaluates billboards, etc. + * Applies the indicated transform changes onto the current data. */ void CullTraverserData:: -apply_transform_and_state(CullTraverser *trav, - CPT(TransformState) node_transform, - CPT(RenderState) node_state, - CPT(RenderEffects) node_effects, - const RenderAttrib *off_clip_planes) { - if (node_effects->has_cull_callback()) { - node_effects->cull_callback(trav, *this, node_transform, node_state); - } - +apply_transform(const TransformState *node_transform) { if (!node_transform->is_identity()) { _net_transform = _net_transform->compose(node_transform); @@ -95,15 +103,40 @@ apply_transform_and_state(CullTraverser *trav, } } } +} - _state = _state->compose(node_state); - - if (clip_plane_cull) { - _cull_planes = _cull_planes->apply_state(trav, this, - (const ClipPlaneAttrib *)node_state->get_attrib(ClipPlaneAttrib::get_class_slot()), - (const ClipPlaneAttrib *)off_clip_planes, - (const OccluderEffect *)node_effects->get_effect(OccluderEffect::get_class_type())); +/** + * The private, recursive implementation of get_node_path(), this returns the + * NodePathComponent representing the NodePath. + */ +PT(NodePathComponent) CullTraverserData:: +r_get_node_path() const { + if (_next == nullptr) { + nassertr(_start != nullptr, nullptr); + return _start; } + +#ifdef _DEBUG + nassertr(_start == nullptr, nullptr); +#endif + nassertr(node() != nullptr, nullptr); + + PT(NodePathComponent) comp = _next->r_get_node_path(); + nassertr(comp != nullptr, nullptr); + + Thread *current_thread = Thread::get_current_thread(); + int pipeline_stage = current_thread->get_pipeline_stage(); + PT(NodePathComponent) result = + PandaNode::get_component(comp, node(), pipeline_stage, current_thread); + if (result == nullptr) { + // This means we found a disconnected chain in the CullTraverserData's + // ancestry: the node above this node isn't connected. In this case, + // don't attempt to go higher; just truncate the NodePath at the bottom of + // the disconnect. + return PandaNode::get_top_component(node(), true, pipeline_stage, current_thread); + } + + return result; } /** @@ -121,7 +154,7 @@ is_in_view_impl() { if (pgraph_cat.is_spam()) { pgraph_cat.spam() - << _node_path << " cull result = " << hex << result << dec << "\n"; + << get_node_path() << " cull result = " << hex << result << dec << "\n"; } if (result == BoundingVolume::IF_no_intersection) { @@ -136,8 +169,7 @@ is_in_view_impl() { // If we have fake view-frustum culling enabled, instead of actually // culling an object we simply force it to be drawn in red wireframe. _view_frustum = (GeometricBoundingVolume *)NULL; - CPT(RenderState) fake_state = get_fake_view_frustum_cull_state(); - _state = _state->compose(fake_state); + _state = _state->compose(get_fake_view_frustum_cull_state()); #endif } else if ((result & BoundingVolume::IF_all) != 0) { @@ -170,7 +202,7 @@ is_in_view_impl() { if (pgraph_cat.is_spam()) { pgraph_cat.spam() - << _node_path << " cull planes cull result = " << hex + << get_node_path() << " cull planes cull result = " << hex << result << dec << "\n"; _cull_planes->write(pgraph_cat.spam(false)); } @@ -182,7 +214,7 @@ is_in_view_impl() { if (pgraph_cat.is_spam()) { pgraph_cat.spam() - << _node_path << " is_final, cull planes disabled, state:\n"; + << get_node_path() << " is_final, cull planes disabled, state:\n"; _state->write(pgraph_cat.spam(false), 2); } } @@ -196,8 +228,7 @@ is_in_view_impl() { return false; } _cull_planes = CullPlanes::make_empty(); - CPT(RenderState) fake_state = get_fake_view_frustum_cull_state(); - _state = _state->compose(fake_state); + _state = _state->compose(get_fake_view_frustum_cull_state()); #endif } else if ((result & BoundingVolume::IF_all) != 0) { @@ -215,15 +246,15 @@ is_in_view_impl() { * Returns a RenderState for rendering stuff in red wireframe, strictly for * the fake_view_frustum_cull effect. */ -CPT(RenderState) CullTraverserData:: +const RenderState *CullTraverserData:: get_fake_view_frustum_cull_state() { #ifdef NDEBUG - return NULL; + return nullptr; #else // Once someone asks for this pointer, we hold its reference count and never // free it. - static CPT(RenderState) state = (const RenderState *)NULL; - if (state == (const RenderState *)NULL) { + static CPT(RenderState) state; + if (state == nullptr) { state = RenderState::make (ColorAttrib::make_flat(LColor(1.0f, 0.0f, 0.0f, 1.0f)), TextureAttrib::make_all_off(), diff --git a/panda/src/pgraph/cullTraverserData.h b/panda/src/pgraph/cullTraverserData.h index 80d523fe0c..e275dcfd93 100644 --- a/panda/src/pgraph/cullTraverserData.h +++ b/panda/src/pgraph/cullTraverserData.h @@ -44,11 +44,8 @@ public: const RenderState *state, GeometricBoundingVolume *view_frustum, Thread *current_thread); - INLINE CullTraverserData(const CullTraverserData ©); - INLINE void operator = (const CullTraverserData ©); INLINE CullTraverserData(const CullTraverserData &parent, PandaNode *child); - INLINE ~CullTraverserData(); PUBLISHED: INLINE PandaNode *node() const; @@ -57,6 +54,8 @@ public: INLINE PandaNodePipelineReader *node_reader(); INLINE const PandaNodePipelineReader *node_reader() const; + INLINE NodePath get_node_path() const; + PUBLISHED: INLINE CPT(TransformState) get_modelview_transform(const CullTraverser *trav) const; INLINE CPT(TransformState) get_internal_transform(const CullTraverser *trav) const; @@ -66,14 +65,15 @@ PUBLISHED: INLINE bool is_this_node_hidden(const DrawMask &camera_mask) const; void apply_transform_and_state(CullTraverser *trav); - void apply_transform_and_state(CullTraverser *trav, - CPT(TransformState) node_transform, - CPT(RenderState) node_state, - CPT(RenderEffects) node_effects, - const RenderAttrib *off_clip_planes); + void apply_transform(const TransformState *node_transform); + +private: + // We store a chain leading all the way to the root, so that we can compose + // a NodePath. We may be able to eliminate this requirement in the future. + const CullTraverserData *_next; + NodePathComponent *_start; public: - WorkingNodePath _node_path; PandaNodePipelineReader _node_reader; CPT(TransformState) _net_transform; CPT(RenderState) _state; @@ -83,8 +83,10 @@ public: int _portal_depth; private: + PT(NodePathComponent) r_get_node_path() const; + bool is_in_view_impl(); - static CPT(RenderState) get_fake_view_frustum_cull_state(); + static const RenderState *get_fake_view_frustum_cull_state(); }; /* okcircular */ diff --git a/panda/src/pgraph/geomTransformer.cxx b/panda/src/pgraph/geomTransformer.cxx index 04207356bd..65c1ca6c80 100644 --- a/panda/src/pgraph/geomTransformer.cxx +++ b/panda/src/pgraph/geomTransformer.cxx @@ -151,7 +151,7 @@ transform_vertices(GeomNode *node, const LMatrix4 &mat) { GeomNode::GeomEntry &entry = (*gi); PT(Geom) new_geom = entry._geom.get_read_pointer()->make_copy(); if (transform_vertices(new_geom, mat)) { - entry._geom = new_geom; + entry._geom = move(new_geom); any_changed = true; } } @@ -1439,13 +1439,8 @@ remove_unused_vertices(const GeomVertexData *vdata) { any_referenced = true; int num_primitives = geom->get_num_primitives(); for (int i = 0; i < num_primitives; ++i) { - CPT(GeomPrimitive) prim = geom->get_primitive(i); - - GeomPrimitivePipelineReader reader(prim, current_thread); - int num_vertices = reader.get_num_vertices(); - for (int vi = 0; vi < num_vertices; ++vi) { - referenced_vertices.set_bit(reader.get_vertex(vi)); - } + GeomPrimitivePipelineReader reader(geom->get_primitive(i), current_thread); + reader.get_referenced_vertices(referenced_vertices); } } diff --git a/panda/src/pgraph/nodePath.I b/panda/src/pgraph/nodePath.I index cfcef09112..efe133c215 100644 --- a/panda/src/pgraph/nodePath.I +++ b/panda/src/pgraph/nodePath.I @@ -1080,7 +1080,7 @@ get_sa() const { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_float &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1088,7 +1088,7 @@ set_shader_input(CPT_InternalName id, const PTA_float &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_double &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1096,7 +1096,7 @@ set_shader_input(CPT_InternalName id, const PTA_double &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_int &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1104,7 +1104,7 @@ set_shader_input(CPT_InternalName id, const PTA_int &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_LVecBase4 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1112,7 +1112,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase4 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_LVecBase3 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } @@ -1121,7 +1121,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase3 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_LVecBase2 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1129,7 +1129,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase2 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const LVecBase4 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1137,7 +1137,7 @@ set_shader_input(CPT_InternalName id, const LVecBase4 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const LVecBase3 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1145,7 +1145,7 @@ set_shader_input(CPT_InternalName id, const LVecBase3 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const LVecBase2 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1153,7 +1153,7 @@ set_shader_input(CPT_InternalName id, const LVecBase2 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_LVecBase4i &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1161,7 +1161,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase4i &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_LVecBase3i &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } @@ -1170,7 +1170,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase3i &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_LVecBase2i &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1178,7 +1178,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase2i &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const LVecBase4i &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1186,7 +1186,7 @@ set_shader_input(CPT_InternalName id, const LVecBase4i &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const LVecBase3i &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1194,7 +1194,7 @@ set_shader_input(CPT_InternalName id, const LVecBase3i &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const LVecBase2i &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1202,7 +1202,7 @@ set_shader_input(CPT_InternalName id, const LVecBase2i &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_LMatrix4 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1210,7 +1210,7 @@ set_shader_input(CPT_InternalName id, const PTA_LMatrix4 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const PTA_LMatrix3 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1218,7 +1218,7 @@ set_shader_input(CPT_InternalName id, const PTA_LMatrix3 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const LMatrix4 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1226,7 +1226,7 @@ set_shader_input(CPT_InternalName id, const LMatrix4 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const LMatrix3 &v, int priority) { - set_shader_input(new ShaderInput(id, v, priority)); + set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -1234,7 +1234,7 @@ set_shader_input(CPT_InternalName id, const LMatrix3 &v, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, Texture *tex, int priority) { - set_shader_input(new ShaderInput(id, tex, priority)); + set_shader_input(ShaderInput(move(id), tex, priority)); } /** @@ -1242,7 +1242,7 @@ set_shader_input(CPT_InternalName id, Texture *tex, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, Texture *tex, const SamplerState &sampler, int priority) { - set_shader_input(new ShaderInput(id, tex, sampler, priority)); + set_shader_input(ShaderInput(move(id), tex, sampler, priority)); } /** @@ -1250,7 +1250,7 @@ set_shader_input(CPT_InternalName id, Texture *tex, const SamplerState &sampler, */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, Texture *tex, bool read, bool write, int z, int n, int priority) { - set_shader_input(new ShaderInput(id, tex, read, write, z, n, priority)); + set_shader_input(ShaderInput(move(id), tex, read, write, z, n, priority)); } /** @@ -1258,7 +1258,7 @@ set_shader_input(CPT_InternalName id, Texture *tex, bool read, bool write, int z */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, ShaderBuffer *buf, int priority) { - set_shader_input(new ShaderInput(id, buf, priority)); + set_shader_input(ShaderInput(move(id), buf, priority)); } /** @@ -1266,7 +1266,7 @@ set_shader_input(CPT_InternalName id, ShaderBuffer *buf, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, const NodePath &np, int priority) { - set_shader_input(new ShaderInput(id, np, priority)); + set_shader_input(ShaderInput(move(id), np, priority)); } /** @@ -1274,7 +1274,7 @@ set_shader_input(CPT_InternalName id, const NodePath &np, int priority) { */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, int n1, int n2, int n3, int n4, int priority) { - set_shader_input(new ShaderInput(id, LVecBase4i(n1, n2, n3, n4), priority)); + set_shader_input(ShaderInput(move(id), LVecBase4i(n1, n2, n3, n4), priority)); } /** @@ -1282,7 +1282,7 @@ set_shader_input(CPT_InternalName id, int n1, int n2, int n3, int n4, int priori */ INLINE void NodePath:: set_shader_input(CPT_InternalName id, PN_stdfloat n1, PN_stdfloat n2, PN_stdfloat n3, PN_stdfloat n4, int priority) { - set_shader_input(new ShaderInput(id, LVecBase4(n1, n2, n3, n4), priority)); + set_shader_input(ShaderInput(move(id), LVecBase4(n1, n2, n3, n4), priority)); } /** diff --git a/panda/src/pgraph/nodePath.cxx b/panda/src/pgraph/nodePath.cxx index de0cf7c4fb..f0056e703f 100644 --- a/panda/src/pgraph/nodePath.cxx +++ b/panda/src/pgraph/nodePath.cxx @@ -697,8 +697,10 @@ get_state(const NodePath &other, Thread *current_thread) const { return other.get_net_state(current_thread)->invert_compose(RenderState::make_empty()); } +#if defined(_DEBUG) || (defined(HAVE_THREADS) && defined(SIMPLE_THREADS)) nassertr(verify_complete(current_thread), RenderState::make_empty()); nassertr(other.verify_complete(current_thread), RenderState::make_empty()); +#endif int a_count, b_count; if (find_common_ancestor(*this, other, a_count, b_count, current_thread) == (NodePathComponent *)NULL) { @@ -767,8 +769,10 @@ get_transform(const NodePath &other, Thread *current_thread) const { return other.get_net_transform(current_thread)->invert_compose(TransformState::make_identity()); } +#if defined(_DEBUG) || (defined(HAVE_THREADS) && defined(SIMPLE_THREADS)) nassertr(verify_complete(current_thread), TransformState::make_identity()); nassertr(other.verify_complete(current_thread), TransformState::make_identity()); +#endif int a_count, b_count; if (find_common_ancestor(*this, other, a_count, b_count, current_thread) == (NodePathComponent *)NULL) { @@ -852,8 +856,10 @@ get_prev_transform(const NodePath &other, Thread *current_thread) const { return other.get_net_prev_transform(current_thread)->invert_compose(TransformState::make_identity()); } +#if defined(_DEBUG) || (defined(HAVE_THREADS) && defined(SIMPLE_THREADS)) nassertr(verify_complete(current_thread), TransformState::make_identity()); nassertr(other.verify_complete(current_thread), TransformState::make_identity()); +#endif int a_count, b_count; if (find_common_ancestor(*this, other, a_count, b_count, current_thread) == (NodePathComponent *)NULL) { @@ -3255,35 +3261,36 @@ get_shader() const { * */ void NodePath:: -set_shader_input(const ShaderInput *inp) { +set_shader_input(ShaderInput inp) { nassertv_always(!is_empty()); + PandaNode *pnode = node(); const RenderAttrib *attrib = - node()->get_attrib(ShaderAttrib::get_class_slot()); - if (attrib != (const RenderAttrib *)NULL) { - const ShaderAttrib *sa = DCAST(ShaderAttrib, attrib); - node()->set_attrib(sa->set_shader_input(inp)); + pnode->get_attrib(ShaderAttrib::get_class_slot()); + if (attrib != nullptr) { + const ShaderAttrib *sa = (const ShaderAttrib *)attrib; + pnode->set_attrib(sa->set_shader_input(inp)); } else { // Create a new ShaderAttrib for this node. CPT(ShaderAttrib) sa = DCAST(ShaderAttrib, ShaderAttrib::make()); - node()->set_attrib(sa->set_shader_input(inp)); + pnode->set_attrib(sa->set_shader_input(inp)); } } /** * */ -const ShaderInput *NodePath:: +ShaderInput NodePath:: get_shader_input(CPT_InternalName id) const { - nassertr_always(!is_empty(), NULL); + nassertr_always(!is_empty(), ShaderInput::get_blank()); const RenderAttrib *attrib = node()->get_attrib(ShaderAttrib::get_class_slot()); - if (attrib != (const RenderAttrib *)NULL) { - const ShaderAttrib *sa = DCAST(ShaderAttrib, attrib); + if (attrib != nullptr) { + const ShaderAttrib *sa = (const ShaderAttrib *)attrib; return sa->get_shader_input(id); } - return NULL; + return ShaderInput::get_blank(); } /** @@ -5786,17 +5793,22 @@ r_get_net_transform(NodePathComponent *comp, Thread *current_thread) const { if (comp == (NodePathComponent *)NULL) { return TransformState::make_identity(); } else { + PandaNode *node = comp->get_node(); int pipeline_stage = current_thread->get_pipeline_stage(); CPT(TransformState) net_transform = r_get_net_transform(comp->get_next(pipeline_stage, current_thread), current_thread); - PandaNode *node = comp->get_node(); - CPT(TransformState) transform = node->get_transform(current_thread); - CPT(RenderEffects) effects = node->get_effects(current_thread); - if (effects->has_adjust_transform()) { - effects->adjust_transform(net_transform, transform, node); + PandaNode::CDReader node_cdata(node->_cycler, current_thread); + if (!node_cdata->_effects->has_adjust_transform()) { + if (node_cdata->_transform->is_identity()) { + return net_transform; + } else { + return net_transform->compose(node_cdata->_transform); + } + } else { + CPT(TransformState) transform = node_cdata->_transform.p(); + node_cdata->_effects->adjust_transform(net_transform, transform, node); + return net_transform->compose(transform); } - - return net_transform->compose(transform); } } @@ -5814,16 +5826,21 @@ r_get_partial_transform(NodePathComponent *comp, int n, if (n == 0 || comp == (NodePathComponent *)NULL) { return TransformState::make_identity(); } else { - if (comp->get_node()->get_effects(current_thread)->has_adjust_transform()) { + PandaNode *node = comp->get_node(); + PandaNode::CDReader node_cdata(node->_cycler, current_thread); + if (node_cdata->_effects->has_adjust_transform()) { return NULL; } - CPT(TransformState) transform = comp->get_node()->get_transform(current_thread); int pipeline_stage = current_thread->get_pipeline_stage(); CPT(TransformState) partial = r_get_partial_transform(comp->get_next(pipeline_stage, current_thread), n - 1, current_thread); if (partial == (const TransformState *)NULL) { return NULL; } - return partial->compose(transform); + if (node_cdata->_transform->is_identity()) { + return partial; + } else { + return partial->compose(node_cdata->_transform); + } } } diff --git a/panda/src/pgraph/nodePath.h b/panda/src/pgraph/nodePath.h index 6aeeda6d01..e6eaca10cd 100644 --- a/panda/src/pgraph/nodePath.h +++ b/panda/src/pgraph/nodePath.h @@ -629,7 +629,7 @@ PUBLISHED: void set_shader_auto(BitMask32 shader_switch, int priority=0); void clear_shader(); - void set_shader_input(const ShaderInput *inp); + void set_shader_input(ShaderInput input); INLINE void set_shader_input(CPT_InternalName id, Texture *tex, int priority=0); INLINE void set_shader_input(CPT_InternalName id, Texture *tex, const SamplerState &sampler, int priority=0); INLINE void set_shader_input(CPT_InternalName id, Texture *tex, bool read, bool write, int z=-1, int n=0, int priority=0); @@ -665,7 +665,7 @@ PUBLISHED: void set_instance_count(int instance_count); const Shader *get_shader() const; - const ShaderInput *get_shader_input(CPT_InternalName id) const; + ShaderInput get_shader_input(CPT_InternalName id) const; int get_instance_count() const; void set_tex_transform(TextureStage *stage, const TransformState *transform); @@ -1029,6 +1029,7 @@ private: friend class NodePathCollection; friend class WorkingNodePath; friend class WeakNodePath; + friend class CullTraverserData; }; INLINE ostream &operator << (ostream &out, const NodePath &node_path); diff --git a/panda/src/pgraph/nodePathComponent.I b/panda/src/pgraph/nodePathComponent.I index fa16ebe2b9..d3abe36c07 100644 --- a/panda/src/pgraph/nodePathComponent.I +++ b/panda/src/pgraph/nodePathComponent.I @@ -75,6 +75,15 @@ has_key() const { return (_key != 0); } +/** + * Returns the next component in the path. + */ +INLINE NodePathComponent *NodePathComponent:: +get_next(int pipeline_stage, Thread *current_thread) const { + CDStageReader cdata(_cycler, pipeline_stage, current_thread); + return cdata->_next; +} + INLINE ostream &operator << (ostream &out, const NodePathComponent &comp) { comp.output(out); return out; diff --git a/panda/src/pgraph/nodePathComponent.cxx b/panda/src/pgraph/nodePathComponent.cxx index 4dbacc4539..a9f8a38788 100644 --- a/panda/src/pgraph/nodePathComponent.cxx +++ b/panda/src/pgraph/nodePathComponent.cxx @@ -92,17 +92,6 @@ get_length(int pipeline_stage, Thread *current_thread) const { return cdata->_length; } -/** - * Returns the next component in the path. - */ -NodePathComponent *NodePathComponent:: -get_next(int pipeline_stage, Thread *current_thread) const { - CDStageReader cdata(_cycler, pipeline_stage, current_thread); - NodePathComponent *next = cdata->_next; - - return next; -} - /** * Checks that the length indicated by the component is one more than the * length of its predecessor. If this is broken, fixes it and returns true diff --git a/panda/src/pgraph/nodePathComponent.h b/panda/src/pgraph/nodePathComponent.h index fbe4625c14..b0ed69a389 100644 --- a/panda/src/pgraph/nodePathComponent.h +++ b/panda/src/pgraph/nodePathComponent.h @@ -39,7 +39,7 @@ * graph, and the NodePathComponents are stored in the nodes themselves to * allow the nodes to keep these up to date as the scene graph is manipulated. */ -class EXPCL_PANDA_PGRAPH NodePathComponent : public ReferenceCount { +class EXPCL_PANDA_PGRAPH NodePathComponent FINAL : public ReferenceCount { private: NodePathComponent(PandaNode *node, NodePathComponent *next, int pipeline_stage, Thread *current_thread); @@ -55,7 +55,7 @@ public: int get_key() const; bool is_top_node(int pipeline_stage, Thread *current_thread) const; - NodePathComponent *get_next(int pipeline_stage, Thread *current_thread) const; + INLINE NodePathComponent *get_next(int pipeline_stage, Thread *current_thread) const; int get_length(int pipeline_stage, Thread *current_thread) const; bool fix_length(int pipeline_stage, Thread *current_thread); @@ -125,6 +125,12 @@ private: friend class NodePath; }; +#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + INLINE ostream &operator << (ostream &out, const NodePathComponent &comp); #include "nodePathComponent.I" diff --git a/panda/src/pgraph/nodePath_ext.cxx b/panda/src/pgraph/nodePath_ext.cxx index 60cbe19a1c..1d1449b423 100644 --- a/panda/src/pgraph/nodePath_ext.cxx +++ b/panda/src/pgraph/nodePath_ext.cxx @@ -278,7 +278,7 @@ set_shader_inputs(PyObject *args, PyObject *kwargs) { } CPT_InternalName name(string(buffer, length)); - ShaderInput *input = nullptr; + ShaderInput input(nullptr, 0); if (PyTuple_CheckExact(value)) { // A tuple is interpreted as a vector. @@ -300,13 +300,13 @@ set_shader_inputs(PyObject *args, PyObject *kwargs) { for (Py_ssize_t i = 0; i < size; ++i) { vec[i] = (PN_stdfloat)PyFloat_AsDouble(PyTuple_GET_ITEM(value, i)); } - input = new ShaderInput(name, vec); + input = ShaderInput(move(name), vec); } else { LVecBase4i vec(0); for (Py_ssize_t i = 0; i < size; ++i) { vec[i] = (int)PyLong_AsLong(PyTuple_GET_ITEM(value, i)); } - input = new ShaderInput(name, vec); + input = ShaderInput(move(name), vec); } } else if (DtoolCanThisBeAPandaInstance(value)) { @@ -314,91 +314,91 @@ set_shader_inputs(PyObject *args, PyObject *kwargs) { void *ptr; if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_Texture))) { - input = new ShaderInput(name, (Texture *)ptr); + input = ShaderInput(move(name), (Texture *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_NodePath))) { - input = new ShaderInput(name, *(const NodePath *)ptr); + input = ShaderInput(move(name), *(const NodePath *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_float))) { - input = new ShaderInput(name, *(const PTA_float *)ptr); + input = ShaderInput(move(name), *(const PTA_float *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_double))) { - input = new ShaderInput(name, *(const PTA_double *)ptr); + input = ShaderInput(move(name), *(const PTA_double *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_int))) { - input = new ShaderInput(name, *(const PTA_int *)ptr); + input = ShaderInput(move(name), *(const PTA_int *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4f))) { - input = new ShaderInput(name, *(const PTA_LVecBase4f *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase4f *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3f))) { - input = new ShaderInput(name, *(const PTA_LVecBase3f *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase3f *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2f))) { - input = new ShaderInput(name, *(const PTA_LVecBase2f *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase2f *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLMatrix4f))) { - input = new ShaderInput(name, *(const PTA_LMatrix4f *)ptr); + input = ShaderInput(move(name), *(const PTA_LMatrix4f *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LMatrix3f))) { - input = new ShaderInput(name, *(const PTA_LMatrix3f *)ptr); + input = ShaderInput(move(name), *(const PTA_LMatrix3f *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4d))) { - input = new ShaderInput(name, *(const PTA_LVecBase4d *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase4d *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3d))) { - input = new ShaderInput(name, *(const PTA_LVecBase3d *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase3d *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2d))) { - input = new ShaderInput(name, *(const PTA_LVecBase2d *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase2d *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLMatrix4d))) { - input = new ShaderInput(name, *(const PTA_LMatrix4d *)ptr); + input = ShaderInput(move(name), *(const PTA_LMatrix4d *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LMatrix3d))) { - input = new ShaderInput(name, *(const PTA_LMatrix3d *)ptr); + input = ShaderInput(move(name), *(const PTA_LMatrix3d *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4i))) { - input = new ShaderInput(name, *(const PTA_LVecBase4i *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase4i *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3i))) { - input = new ShaderInput(name, *(const PTA_LVecBase3i *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase3i *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2i))) { - input = new ShaderInput(name, *(const PTA_LVecBase2i *)ptr); + input = ShaderInput(move(name), *(const PTA_LVecBase2i *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4f))) { - input = new ShaderInput(name, *(const LVecBase4f *)ptr); + input = ShaderInput(move(name), *(const LVecBase4f *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3f))) { - input = new ShaderInput(name, *(const LVecBase3f *)ptr); + input = ShaderInput(move(name), *(const LVecBase3f *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2f))) { - input = new ShaderInput(name, *(const LVecBase2f *)ptr); + input = ShaderInput(move(name), *(const LVecBase2f *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4d))) { - input = new ShaderInput(name, *(const LVecBase4d *)ptr); + input = ShaderInput(move(name), *(const LVecBase4d *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3d))) { - input = new ShaderInput(name, *(const LVecBase3d *)ptr); + input = ShaderInput(move(name), *(const LVecBase3d *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2d))) { - input = new ShaderInput(name, *(const LVecBase2d *)ptr); + input = ShaderInput(move(name), *(const LVecBase2d *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4i))) { - input = new ShaderInput(name, *(const LVecBase4i *)ptr); + input = ShaderInput(move(name), *(const LVecBase4i *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3i))) { - input = new ShaderInput(name, *(const LVecBase3i *)ptr); + input = ShaderInput(move(name), *(const LVecBase3i *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2i))) { - input = new ShaderInput(name, *(const LVecBase2i *)ptr); + input = ShaderInput(move(name), *(const LVecBase2i *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_ShaderBuffer))) { - input = new ShaderInput(name, (ShaderBuffer *)ptr); + input = ShaderInput(move(name), (ShaderBuffer *)ptr); } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_ParamValueBase))) { - input = new ShaderInput(name, (ParamValueBase *)ptr); + input = ShaderInput(move(name), (ParamValueBase *)ptr); } else { Dtool_Raise_TypeError("unknown type passed to NodePath.set_shader_inputs"); @@ -406,22 +406,22 @@ set_shader_inputs(PyObject *args, PyObject *kwargs) { } } else if (PyFloat_Check(value)) { - input = new ShaderInput(name, LVecBase4(PyFloat_AS_DOUBLE(value), 0, 0, 0)); + input = ShaderInput(move(name), LVecBase4(PyFloat_AS_DOUBLE(value), 0, 0, 0)); #if PY_MAJOR_VERSION < 3 } else if (PyInt_Check(value)) { - input = new ShaderInput(name, LVecBase4i((int)PyInt_AS_LONG(value), 0, 0, 0)); + input = ShaderInput(move(name), LVecBase4i((int)PyInt_AS_LONG(value), 0, 0, 0)); #endif } else if (PyLong_Check(value)) { - input = new ShaderInput(name, LVecBase4i((int)PyLong_AsLong(value), 0, 0, 0)); + input = ShaderInput(move(name), LVecBase4i((int)PyLong_AsLong(value), 0, 0, 0)); } else { Dtool_Raise_TypeError("unknown type passed to NodePath.set_shader_inputs"); return; } - attrib->_inputs[move(name)] = input; + attrib->_inputs[input.get_name()] = move(input); } node->set_attrib(ShaderAttrib::return_new(attrib)); diff --git a/panda/src/pgraph/pandaNode.I b/panda/src/pgraph/pandaNode.I index 747f322a36..ecff479445 100644 --- a/panda/src/pgraph/pandaNode.I +++ b/panda/src/pgraph/pandaNode.I @@ -1482,7 +1482,7 @@ get_net_collide_mask() const { * Returns a ClipPlaneAttrib which represents the union of all of the clip * planes that have been turned *off* at this level and below. */ -INLINE CPT(RenderAttrib) PandaNodePipelineReader:: +INLINE const RenderAttrib *PandaNodePipelineReader:: get_off_clip_planes() const { nassertr(_cdata->_last_update == _cdata->_next_update, _cdata->_off_clip_planes); return _cdata->_off_clip_planes; @@ -1493,7 +1493,7 @@ get_off_clip_planes() const { * contains the user bounding volume, the internal bounding volume, and all of * the children's bounding volumes. */ -INLINE CPT(BoundingVolume) PandaNodePipelineReader:: +INLINE const BoundingVolume *PandaNodePipelineReader:: get_bounds() const { nassertr(_cdata->_last_bounds_update == _cdata->_next_update, _cdata->_external_bounds); return _cdata->_external_bounds; diff --git a/panda/src/pgraph/pandaNode.h b/panda/src/pgraph/pandaNode.h index e9f3204ccd..b55f160588 100644 --- a/panda/src/pgraph/pandaNode.h +++ b/panda/src/pgraph/pandaNode.h @@ -827,6 +827,7 @@ private: friend class PandaNodePipelineReader; friend class EggLoader; friend class Extension; + friend class CullTraverserData; }; /** @@ -877,8 +878,8 @@ public: INLINE bool has_tag(const string &key) const; INLINE CollideMask get_net_collide_mask() const; - INLINE CPT(RenderAttrib) get_off_clip_planes() const; - INLINE CPT(BoundingVolume) get_bounds() const; + INLINE const RenderAttrib *get_off_clip_planes() const; + INLINE const BoundingVolume *get_bounds() const; INLINE int get_nested_vertices() const; INLINE bool is_final() const; INLINE int get_fancy_bits() const; @@ -906,6 +907,12 @@ private: }; +#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + INLINE ostream &operator << (ostream &out, const PandaNode &node) { node.output(out); return out; diff --git a/panda/src/pgraph/polylightEffect.cxx b/panda/src/pgraph/polylightEffect.cxx index f2c49b7f91..acbd41b18f 100644 --- a/panda/src/pgraph/polylightEffect.cxx +++ b/panda/src/pgraph/polylightEffect.cxx @@ -136,9 +136,9 @@ do_poly_light(const SceneSetup *scene, const CullTraverserData *data, const Tran if (light->is_enabled()) { // if enabled get all the properties PN_stdfloat light_radius = light->get_radius(); // Calculate the distance of the node from the light dist = - // light_iter->second->get_distance(data->_node_path.get_node_path()); + // light_iter->second->get_distance(data->get_node_path()); const NodePath lightnp = *light_iter; - LPoint3 relative_point = data->_node_path.get_node_path().get_relative_point(lightnp, light->get_pos()); + LPoint3 relative_point = data->get_node_path().get_relative_point(lightnp, light->get_pos()); if (_effect_center[2]) { dist = (relative_point - _effect_center).length(); // this counts height difference @@ -155,7 +155,7 @@ do_poly_light(const SceneSetup *scene, const CullTraverserData *data, const Tran // LPoint3 camera_position = camera.get_relative_point(lightnp, // light->get_pos()); LPoint3 camera_position = lightnp.get_relative_point(camera, LPoint3(0,0,0)); - LPoint3 avatar_position = lightnp.get_relative_point(data->_node_path.get_node_path(), LPoint3(0,0,0)); + LPoint3 avatar_position = lightnp.get_relative_point(data->get_node_path(), LPoint3(0,0,0)); LVector3 light_camera = camera_position - light_position; LVector3 light_avatar = avatar_position - light_position; light_camera.normalize(); @@ -263,7 +263,7 @@ do_poly_light(const SceneSetup *scene, const CullTraverserData *data, const Tran if (num_lights) { // was_under_polylight = true; - // data->_node_path.get_node_path().set_color_scale_off(); + // data->get_node_path().set_color_scale_off(); if (polylight_info) pgraph_cat.debug() << "num lights = " << num_lights << endl; @@ -320,8 +320,8 @@ do_poly_light(const SceneSetup *scene, const CullTraverserData *data, const Tran else { if (was_under_polylight) { // under no polylight influence...so clear the color scale - // data->_node_path.get_node_path().clear_color_scale(); - // data->_node_path.get_node_path().set_color_scale(scene_color); + // data->get_node_path().clear_color_scale(); + // data->get_node_path().set_color_scale(scene_color); was_under_polylight = false; } } diff --git a/panda/src/pgraph/portalClipper.h b/panda/src/pgraph/portalClipper.h index a1c8f5b179..b6cee9e3a7 100644 --- a/panda/src/pgraph/portalClipper.h +++ b/panda/src/pgraph/portalClipper.h @@ -119,7 +119,7 @@ private: LPoint2 _reduced_viewport_max; CPT(RenderState) _clip_state; // each portal node needs to know the clip state of its "parent" portal Node - PortalNode *_portal_node; // current working portal for dereference ease + const PortalNode *_portal_node; // current working portal for dereference ease // int _num_vert; LVertex _coords[4]; diff --git a/panda/src/pgraph/portalNode.cxx b/panda/src/pgraph/portalNode.cxx index d70eacd17e..dccfef23c4 100644 --- a/panda/src/pgraph/portalNode.cxx +++ b/panda/src/pgraph/portalNode.cxx @@ -213,7 +213,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { portal_viewer->get_reduced_viewport(old_reduced_viewport_min, old_reduced_viewport_max); PT(BoundingHexahedron) old_bh = portal_viewer->get_reduced_frustum(); - if (portal_viewer->prepare_portal(data._node_path.get_node_path())) { + if (portal_viewer->prepare_portal(data.get_node_path())) { if ((reduced_frustum = portal_viewer->get_reduced_frustum())) { // remember current clip state, we might change it CPT(RenderState) old_clip_state = portal_viewer->get_clip_state(); @@ -241,7 +241,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { // camera space to this portal node's space (because the clip planes // are attached to this node) PT(BoundingHexahedron) temp_bh = DCAST(BoundingHexahedron, vf->make_copy()); - CPT(TransformState) temp_frustum_transform = data._node_path.get_node_path().get_net_transform()->invert_compose(portal_viewer->_scene_setup->get_cull_center().get_net_transform()); + CPT(TransformState) temp_frustum_transform = data.get_node_path().get_net_transform()->invert_compose(portal_viewer->_scene_setup->get_cull_center().get_net_transform()); portal_cat.spam() << "clipping plane frustum transform " << *temp_frustum_transform << endl; portal_cat.spam() << "frustum before transform " << *temp_bh << endl; diff --git a/panda/src/pgraph/renderAttrib.cxx b/panda/src/pgraph/renderAttrib.cxx index 334898a510..3a7b511381 100644 --- a/panda/src/pgraph/renderAttrib.cxx +++ b/panda/src/pgraph/renderAttrib.cxx @@ -22,7 +22,7 @@ LightReMutex *RenderAttrib::_attribs_lock = NULL; RenderAttrib::Attribs *RenderAttrib::_attribs = NULL; TypeHandle RenderAttrib::_type_handle; -int RenderAttrib::_garbage_index = 0; +size_t RenderAttrib::_garbage_index = 0; PStatCollector RenderAttrib::_garbage_collect_pcollector("*:State Cache:Garbage Collect"); @@ -195,8 +195,8 @@ list_attribs(ostream &out) { LightReMutexHolder holder(*_attribs_lock); out << _attribs->get_num_entries() << " attribs:\n"; - int size = _attribs->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _attribs->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_attribs->has_element(si)) { continue; } @@ -219,7 +219,9 @@ garbage_collect() { PStatTimer timer(_garbage_collect_pcollector); int orig_size = _attribs->get_num_entries(); +#ifdef _DEBUG nassertr(_attribs->validate(), 0); +#endif // How many elements to process this pass? int size = _attribs->get_size(); @@ -230,11 +232,9 @@ garbage_collect() { num_this_pass = min(num_this_pass, size); int stop_at_element = (_garbage_index + num_this_pass) % size; - int num_elements = 0; - int si = _garbage_index; + size_t si = _garbage_index; do { if (_attribs->has_element(si)) { - ++num_elements; RenderAttrib *attrib = (RenderAttrib *)_attribs->get_key(si); if (attrib->get_ref_count() == 1) { // This attrib has recently been unreffed to 1 (the one we added when @@ -250,9 +250,12 @@ garbage_collect() { si = (si + 1) % size; } while (si != stop_at_element); _garbage_index = si; - nassertr(_attribs->validate(), 0); - int new_size = _attribs->get_num_entries(); +#ifdef _DEBUG + nassertr(_attribs->validate(), 0); +#endif + + size_t new_size = _attribs->get_num_entries(); return orig_size - new_size; } @@ -272,8 +275,8 @@ validate_attribs() { pgraph_cat.error() << "RenderAttrib::_attribs cache is invalid!\n"; - int size = _attribs->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _attribs->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_attribs->has_element(si)) { continue; } @@ -285,14 +288,14 @@ validate_attribs() { return false; } - int size = _attribs->get_size(); - int si = 0; + size_t size = _attribs->get_size(); + size_t si = 0; while (si < size && !_attribs->has_element(si)) { ++si; } nassertr(si < size, false); nassertr(_attribs->get_key(si)->get_ref_count() >= 0, false); - int snext = si; + size_t snext = si; ++snext; while (snext < size && !_attribs->has_element(snext)) { ++snext; diff --git a/panda/src/pgraph/renderAttrib.h b/panda/src/pgraph/renderAttrib.h index 12dd33b720..9d6ed83a1a 100644 --- a/panda/src/pgraph/renderAttrib.h +++ b/panda/src/pgraph/renderAttrib.h @@ -196,7 +196,7 @@ private: // This keeps track of our current position through the garbage collection // cycle. - static int _garbage_index; + static size_t _garbage_index; static PStatCollector _garbage_collect_pcollector; diff --git a/panda/src/pgraph/renderEffect.cxx b/panda/src/pgraph/renderEffect.cxx index ceada3a109..09572cc445 100644 --- a/panda/src/pgraph/renderEffect.cxx +++ b/panda/src/pgraph/renderEffect.cxx @@ -160,7 +160,7 @@ has_adjust_transform() const { */ void RenderEffect:: adjust_transform(CPT(TransformState) &, CPT(TransformState) &, - PandaNode *) const { + const PandaNode *) const { } /** diff --git a/panda/src/pgraph/renderEffect.h b/panda/src/pgraph/renderEffect.h index f8a55de869..d739f5cee7 100644 --- a/panda/src/pgraph/renderEffect.h +++ b/panda/src/pgraph/renderEffect.h @@ -68,7 +68,7 @@ public: virtual bool has_adjust_transform() const; virtual void adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *node) const; + const PandaNode *node) const; PUBLISHED: INLINE int compare_to(const RenderEffect &other) const; diff --git a/panda/src/pgraph/renderEffects.cxx b/panda/src/pgraph/renderEffects.cxx index 18c7565a3f..639f11be9b 100644 --- a/panda/src/pgraph/renderEffects.cxx +++ b/panda/src/pgraph/renderEffects.cxx @@ -492,7 +492,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data, void RenderEffects:: adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *node) const { + const PandaNode *node) const { Effects::const_iterator ei; for (ei = _effects.begin(); ei != _effects.end(); ++ei) { (*ei)._effect->adjust_transform(net_transform, node_transform, node); diff --git a/panda/src/pgraph/renderEffects.h b/panda/src/pgraph/renderEffects.h index e1ece7d2b3..6ccf7eb05f 100644 --- a/panda/src/pgraph/renderEffects.h +++ b/panda/src/pgraph/renderEffects.h @@ -102,7 +102,7 @@ public: INLINE bool has_adjust_transform() const; void adjust_transform(CPT(TransformState) &net_transform, CPT(TransformState) &node_transform, - PandaNode *node) const; + const PandaNode *node) const; static void init_states(); diff --git a/panda/src/pgraph/renderState.I b/panda/src/pgraph/renderState.I index c6d0520ec4..75b6f1070a 100644 --- a/panda/src/pgraph/renderState.I +++ b/panda/src/pgraph/renderState.I @@ -522,7 +522,8 @@ INLINE void RenderState:: check_hash() const { // This pretends to be a const function, even though it's not, because it // only updates a transparent cache value. - if ((_flags & F_hash_known) == 0) { + if ((_flags & F_hash_known) != 0) { + } else { ((RenderState *)this)->calc_hash(); } } diff --git a/panda/src/pgraph/renderState.cxx b/panda/src/pgraph/renderState.cxx index de3a58b2ba..e92f284cc1 100644 --- a/panda/src/pgraph/renderState.cxx +++ b/panda/src/pgraph/renderState.cxx @@ -40,7 +40,7 @@ LightReMutex *RenderState::_states_lock = NULL; RenderState::States *RenderState::_states = NULL; const RenderState *RenderState::_empty_state = NULL; UpdateSeq RenderState::_last_cycle_detect; -int RenderState::_garbage_index = 0; +size_t RenderState::_garbage_index = 0; PStatCollector RenderState::_cache_update_pcollector("*:State Cache:Update"); PStatCollector RenderState::_garbage_collect_pcollector("*:State Cache:Garbage Collect"); @@ -75,6 +75,10 @@ RenderState() : _cache_stats.add_num_states(1); _read_overrides = NULL; _generated_shader = NULL; + +#ifdef DO_MEMORY_USAGE + MemoryUsage::update_type(this, this); +#endif } /** @@ -97,6 +101,10 @@ RenderState(const RenderState ©) : _cache_stats.add_num_states(1); _read_overrides = NULL; _generated_shader = NULL; + +#ifdef DO_MEMORY_USAGE + MemoryUsage::update_type(this, this); +#endif } /** @@ -617,7 +625,7 @@ adjust_all_priorities(int adjustment) const { */ bool RenderState:: unref() const { - if (!state_cache || garbage_collect_states) { + if (garbage_collect_states || !state_cache) { // If we're not using the cache at all, or if we're relying on garbage // collection, just allow the pointer to unref normally. return ReferenceCount::unref(); @@ -774,8 +782,8 @@ get_num_unused_states() { typedef pmap StateCount; StateCount state_count; - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } @@ -871,8 +879,8 @@ clear_cache() { TempStates temp_states; temp_states.reserve(orig_size); - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } @@ -938,27 +946,30 @@ garbage_collect() { if (_states == (States *)NULL || !garbage_collect_states) { return num_attribs; } + + bool break_and_uniquify = (auto_break_cycles && uniquify_transforms); + LightReMutexHolder holder(*_states_lock); PStatTimer timer(_garbage_collect_pcollector); int orig_size = _states->get_num_entries(); // How many elements to process this pass? - int size = _states->get_size(); - int num_this_pass = int(size * garbage_collect_states_rate); - if (num_this_pass <= 0) { + size_t size = _states->get_size(); + size_t num_this_pass = int((int)size * garbage_collect_states_rate); + if (size <= 0 || num_this_pass <= 0) { return num_attribs; } - num_this_pass = min(num_this_pass, size); - int stop_at_element = (_garbage_index + num_this_pass) % size; - int num_elements = 0; - int si = _garbage_index; + size_t si = _garbage_index; + + num_this_pass = min(num_this_pass, size); + size_t stop_at_element = (si + num_this_pass) % (size - 1); + do { if (_states->has_element(si)) { - ++num_elements; RenderState *state = (RenderState *)_states->get_key(si); - if (auto_break_cycles && uniquify_states) { + if (break_and_uniquify) { if (state->get_cache_ref_count() > 0 && state->get_ref_count() == state->get_cache_ref_count()) { // If we have removed all the references to this state not in the @@ -982,10 +993,13 @@ garbage_collect() { } } - si = (si + 1) % size; + si = (si + 1) & (size - 1); } while (si != stop_at_element); _garbage_index = si; + +#ifdef _DEBUG nassertr(_states->validate(), 0); +#endif int new_size = _states->get_num_entries(); return orig_size - new_size + num_attribs; @@ -999,8 +1013,8 @@ void RenderState:: clear_munger_cache() { LightReMutexHolder holder(*_states_lock); - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } @@ -1034,8 +1048,8 @@ list_cycles(ostream &out) { VisitedStates visited; CompositionCycleDesc cycle_desc; - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } @@ -1113,8 +1127,8 @@ list_states(ostream &out) { out << _states->get_num_entries() << " states:\n"; - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } @@ -1148,14 +1162,14 @@ validate_states() { return false; } - int size = _states->get_size(); - int si = 0; + size_t size = _states->get_size(); + size_t si = 0; while (si < size && !_states->has_element(si)) { ++si; } nassertr(si < size, false); nassertr(_states->get_key(si)->get_ref_count() >= 0, false); - int snext = si; + size_t snext = si; ++snext; while (snext < size && !_states->has_element(snext)) { ++snext; diff --git a/panda/src/pgraph/renderState.h b/panda/src/pgraph/renderState.h index c15efe68ad..f91f02cd3e 100644 --- a/panda/src/pgraph/renderState.h +++ b/panda/src/pgraph/renderState.h @@ -278,7 +278,7 @@ private: // This keeps track of our current position through the garbage collection // cycle. - static int _garbage_index; + static size_t _garbage_index; static PStatCollector _cache_update_pcollector; static PStatCollector _garbage_collect_pcollector; @@ -368,6 +368,12 @@ private: friend class Extension; }; +#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + INLINE ostream &operator << (ostream &out, const RenderState &state) { state.output(out); return out; diff --git a/panda/src/pgraph/shaderAttrib.I b/panda/src/pgraph/shaderAttrib.I index f3667b27d9..6513604ae9 100644 --- a/panda/src/pgraph/shaderAttrib.I +++ b/panda/src/pgraph/shaderAttrib.I @@ -110,7 +110,7 @@ has_shader_input(CPT_InternalName id) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const PTA_float &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -118,7 +118,7 @@ set_shader_input(CPT_InternalName id, const PTA_float &v, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const PTA_double &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -126,7 +126,7 @@ set_shader_input(CPT_InternalName id, const PTA_double &v, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const PTA_LVecBase4 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -134,7 +134,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase4 &v, int priority) cons */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const PTA_LVecBase3 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } @@ -143,7 +143,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase3 &v, int priority) cons */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const PTA_LVecBase2 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -151,7 +151,7 @@ set_shader_input(CPT_InternalName id, const PTA_LVecBase2 &v, int priority) cons */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const LVecBase4 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -159,7 +159,7 @@ set_shader_input(CPT_InternalName id, const LVecBase4 &v, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const LVecBase3 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -167,7 +167,7 @@ set_shader_input(CPT_InternalName id, const LVecBase3 &v, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const LVecBase2 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -175,7 +175,7 @@ set_shader_input(CPT_InternalName id, const LVecBase2 &v, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const PTA_LMatrix4 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -183,7 +183,7 @@ set_shader_input(CPT_InternalName id, const PTA_LMatrix4 &v, int priority) const */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const PTA_LMatrix3 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -191,7 +191,7 @@ set_shader_input(CPT_InternalName id, const PTA_LMatrix3 &v, int priority) const */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const LMatrix4 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -199,7 +199,7 @@ set_shader_input(CPT_InternalName id, const LMatrix4 &v, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const LMatrix3 &v, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), v, priority)); + return set_shader_input(ShaderInput(move(id), v, priority)); } /** @@ -207,7 +207,7 @@ set_shader_input(CPT_InternalName id, const LMatrix3 &v, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, Texture *tex, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), tex, priority)); + return set_shader_input(ShaderInput(move(id), tex, priority)); } /** @@ -215,7 +215,7 @@ set_shader_input(CPT_InternalName id, Texture *tex, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, const NodePath &np, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), np, priority)); + return set_shader_input(ShaderInput(move(id), np, priority)); } /** @@ -223,7 +223,7 @@ set_shader_input(CPT_InternalName id, const NodePath &np, int priority) const { */ INLINE CPT(RenderAttrib) ShaderAttrib:: set_shader_input(CPT_InternalName id, double n1, double n2, double n3, double n4, int priority) const { - return set_shader_input(new ShaderInput(MOVE(id), LVecBase4((PN_stdfloat)n1, (PN_stdfloat)n2, (PN_stdfloat)n3, (PN_stdfloat)n4), priority)); + return set_shader_input(ShaderInput(move(id), LVecBase4((PN_stdfloat)n1, (PN_stdfloat)n2, (PN_stdfloat)n3, (PN_stdfloat)n4), priority)); } INLINE bool ShaderAttrib:: diff --git a/panda/src/pgraph/shaderAttrib.cxx b/panda/src/pgraph/shaderAttrib.cxx index 2e6ac7cd77..6435ceed5d 100644 --- a/panda/src/pgraph/shaderAttrib.cxx +++ b/panda/src/pgraph/shaderAttrib.cxx @@ -193,13 +193,13 @@ clear_flag(int flag) const { * */ CPT(RenderAttrib) ShaderAttrib:: -set_shader_input(const ShaderInput *input) const { +set_shader_input(ShaderInput input) const { ShaderAttrib *result = new ShaderAttrib(*this); - Inputs::iterator i = result->_inputs.find(input->get_name()); + Inputs::iterator i = result->_inputs.find(input.get_name()); if (i == result->_inputs.end()) { - result->_inputs.insert(Inputs::value_type(input->get_name(), input)); + result->_inputs.insert(Inputs::value_type(input.get_name(), move(input))); } else { - i->second = input; + i->second = move(input); } return return_new(result); } @@ -248,13 +248,13 @@ clear_all_shader_inputs() const { * Returns the ShaderInput of the given name. If no such name is found, this * function does not return NULL --- it returns the "blank" ShaderInput. */ -const ShaderInput *ShaderAttrib:: +const ShaderInput &ShaderAttrib:: get_shader_input(const InternalName *id) const { Inputs::const_iterator i = _inputs.find(id); - if (i == _inputs.end()) { - return ShaderInput::get_blank(); - } else { + if (i != _inputs.end()) { return (*i).second; + } else { + return ShaderInput::get_blank(); } } @@ -262,7 +262,7 @@ get_shader_input(const InternalName *id) const { * Returns the ShaderInput of the given name. If no such name is found, this * function does not return NULL --- it returns the "blank" ShaderInput. */ -const ShaderInput *ShaderAttrib:: +const ShaderInput &ShaderAttrib:: get_shader_input(const string &id) const { return get_shader_input(InternalName::make(id)); } @@ -275,20 +275,21 @@ const NodePath &ShaderAttrib:: get_shader_input_nodepath(const InternalName *id) const { static NodePath resfail; Inputs::const_iterator i = _inputs.find(id); - if (i == _inputs.end()) { - ostringstream strm; - strm << "Shader input " << id->get_name() << " is not present.\n"; - nassert_raise(strm.str()); - return resfail; - } else { - const ShaderInput *p = (*i).second; - if (p->get_value_type() != ShaderInput::M_nodepath) { + if (i != _inputs.end()) { + const ShaderInput &p = (*i).second; + if (p.get_value_type() == ShaderInput::M_nodepath) { + return ((const ParamNodePath *)p.get_value())->get_value(); + } else { ostringstream strm; strm << "Shader input " << id->get_name() << " is not a nodepath.\n"; nassert_raise(strm.str()); return resfail; } - return p->get_nodepath(); + } else { + ostringstream strm; + strm << "Shader input " << id->get_name() << " is not present.\n"; + nassert_raise(strm.str()); + return resfail; } // Satisfy compiler. @@ -303,19 +304,14 @@ LVecBase4 ShaderAttrib:: get_shader_input_vector(InternalName *id) const { static LVecBase4 resfail(0,0,0,0); Inputs::const_iterator i = _inputs.find(id); - if (i == _inputs.end()) { - ostringstream strm; - strm << "Shader input " << id->get_name() << " is not present.\n"; - nassert_raise(strm.str()); - return resfail; - } else { - const ShaderInput *p = (*i).second; + if (i != _inputs.end()) { + const ShaderInput &p = (*i).second; - if (p->get_value_type() == ShaderInput::M_vector) { - return p->get_vector(); + if (p.get_value_type() == ShaderInput::M_vector) { + return p.get_vector(); - } else if (p->get_value_type() == ShaderInput::M_numeric && p->get_ptr()._size <= 4) { - const Shader::ShaderPtrData &ptr = p->get_ptr(); + } else if (p.get_value_type() == ShaderInput::M_numeric && p.get_ptr()._size <= 4) { + const Shader::ShaderPtrData &ptr = p.get_ptr(); switch (ptr._type) { case Shader::SPT_float: @@ -339,19 +335,23 @@ get_shader_input_vector(InternalName *id) const { } } - } else if (p->get_value_type() == ShaderInput::M_param) { + } else if (p.get_value_type() == ShaderInput::M_param) { // Temporary solution until the new param system - ParamValueBase *param = p->get_param(); + TypedWritableReferenceCount *param = p.get_value(); if (param != NULL && param->is_of_type(ParamVecBase4::get_class_type())) { - return ((const ParamVecBase4 *) param)->get_value(); + return ((const ParamVecBase4 *)param)->get_value(); } } ostringstream strm; strm << "Shader input " << id->get_name() << " is not a vector.\n"; nassert_raise(strm.str()); - return resfail; + } else { + ostringstream strm; + strm << "Shader input " << id->get_name() << " is not present.\n"; + nassert_raise(strm.str()); } + return resfail; } /** @@ -361,21 +361,21 @@ get_shader_input_vector(InternalName *id) const { const Shader::ShaderPtrData *ShaderAttrib:: get_shader_input_ptr(const InternalName *id) const { Inputs::const_iterator i = _inputs.find(id); - if (i == _inputs.end()) { - ostringstream strm; - strm << "Shader input " << id->get_name() << " is not present.\n"; - nassert_raise(strm.str()); - return NULL; - } else { - const ShaderInput *p = (*i).second; - if (p->get_value_type() != ShaderInput::M_numeric && - p->get_value_type() != ShaderInput::M_vector) { + if (i != _inputs.end()) { + const ShaderInput &p = (*i).second; + if (p.get_value_type() != ShaderInput::M_numeric && + p.get_value_type() != ShaderInput::M_vector) { ostringstream strm; strm << "Shader input " << id->get_name() << " is not a PTA(float/double) type.\n"; nassert_raise(strm.str()); return NULL; } - return &(p->get_ptr()); + return &(p.get_ptr()); + } else { + ostringstream strm; + strm << "Shader input " << id->get_name() << " is not present.\n"; + nassert_raise(strm.str()); + return NULL; } } @@ -389,24 +389,39 @@ get_shader_input_ptr(const InternalName *id) const { Texture *ShaderAttrib:: get_shader_input_texture(const InternalName *id, SamplerState *sampler) const { Inputs::const_iterator i = _inputs.find(id); - if (i == _inputs.end()) { - ostringstream strm; - strm << "Shader input " << id->get_name() << " is not present.\n"; - nassert_raise(strm.str()); - return NULL; - } else { - const ShaderInput *p = (*i).second; - if (p->get_value_type() != ShaderInput::M_texture && - p->get_value_type() != ShaderInput::M_texture_sampler) { + if (i != _inputs.end()) { + const ShaderInput &p = (*i).second; + switch (p.get_value_type()) { + case ShaderInput::M_texture: + { + Texture *tex = (Texture *)p.get_value(); + if (sampler) { + *sampler = tex->get_default_sampler(); + } + return tex; + } + + case ShaderInput::M_texture_sampler: + { + const ParamTextureSampler *param = (const ParamTextureSampler *)p.get_value(); + if (sampler) { + *sampler = param->get_sampler(); + } + return param->get_texture(); + } + + default: ostringstream strm; strm << "Shader input " << id->get_name() << " is not a texture.\n"; nassert_raise(strm.str()); return NULL; } - if (sampler != NULL) { - *sampler = p->get_sampler(); - } - return p->get_texture(); + + } else { + ostringstream strm; + strm << "Shader input " << id->get_name() << " is not present.\n"; + nassert_raise(strm.str()); + return NULL; } } @@ -417,22 +432,17 @@ get_shader_input_texture(const InternalName *id, SamplerState *sampler) const { const LMatrix4 &ShaderAttrib:: get_shader_input_matrix(const InternalName *id, LMatrix4 &matrix) const { Inputs::const_iterator i = _inputs.find(id); - if (i == _inputs.end()) { - ostringstream strm; - strm << "Shader input " << id->get_name() << " is not present.\n"; - nassert_raise(strm.str()); - return LMatrix4::ident_mat(); - } else { - const ShaderInput *p = (*i).second; + if (i != _inputs.end()) { + const ShaderInput &p = (*i).second; - if (p->get_value_type() == ShaderInput::M_nodepath) { - const NodePath &np = p->get_nodepath(); + if (p.get_value_type() == ShaderInput::M_nodepath) { + const NodePath &np = p.get_nodepath(); nassertr(!np.is_empty(), LMatrix4::ident_mat()); return np.get_transform()->get_mat(); - } else if (p->get_value_type() == ShaderInput::M_numeric && - p->get_ptr()._size >= 16 && (p->get_ptr()._size & 15) == 0) { - const Shader::ShaderPtrData &ptr = p->get_ptr(); + } else if (p.get_value_type() == ShaderInput::M_numeric && + p.get_ptr()._size >= 16 && (p.get_ptr()._size & 15) == 0) { + const Shader::ShaderPtrData &ptr = p.get_ptr(); switch (ptr._type) { case Shader::SPT_float: { @@ -460,6 +470,11 @@ get_shader_input_matrix(const InternalName *id, LMatrix4 &matrix) const { strm << "Shader input " << id->get_name() << " is not a NodePath, LMatrix4 or PTA_LMatrix4.\n"; nassert_raise(strm.str()); return LMatrix4::ident_mat(); + } else { + ostringstream strm; + strm << "Shader input " << id->get_name() << " is not present.\n"; + nassert_raise(strm.str()); + return LMatrix4::ident_mat(); } } @@ -476,11 +491,11 @@ get_shader_input_buffer(const InternalName *id) const { nassert_raise(strm.str()); return NULL; } else { - const ShaderInput *p = (*i).second; + const ShaderInput &p = (*i).second; - if (p->get_value_type() == ShaderInput::M_buffer) { + if (p.get_value_type() == ShaderInput::M_buffer) { ShaderBuffer *value; - DCAST_INTO_R(value, p->_value, NULL); + DCAST_INTO_R(value, p._value, NULL); return value; } @@ -615,8 +630,7 @@ get_hash_impl() const { Inputs::const_iterator ii; for (ii = _inputs.begin(); ii != _inputs.end(); ++ii) { - hash = pointer_hash::add_hash(hash, (*ii).first); - hash = pointer_hash::add_hash(hash, (*ii).second); + hash = (*ii).second.add_hash(hash); } return hash; @@ -649,13 +663,13 @@ compose_impl(const RenderAttrib *other) const { Inputs::const_iterator iover; for (iover=over->_inputs.begin(); iover!=over->_inputs.end(); ++iover) { const InternalName *id = (*iover).first; - const ShaderInput *dover = (*iover).second; + const ShaderInput &dover = (*iover).second; Inputs::iterator iattr = attr->_inputs.find(id); if (iattr == attr->_inputs.end()) { attr->_inputs.insert(Inputs::value_type(id,dover)); } else { - const ShaderInput *dattr = (*iattr).second; - if (dattr->get_priority() <= dover->get_priority()) { + const ShaderInput &dattr = (*iattr).second; + if (dattr.get_priority() <= dover.get_priority()) { iattr->second = iover->second; } } diff --git a/panda/src/pgraph/shaderAttrib.h b/panda/src/pgraph/shaderAttrib.h index ebdcca499c..719106c0b6 100644 --- a/panda/src/pgraph/shaderAttrib.h +++ b/panda/src/pgraph/shaderAttrib.h @@ -71,7 +71,7 @@ PUBLISHED: CPT(RenderAttrib) clear_shader() const; // Shader Inputs - CPT(RenderAttrib) set_shader_input(const ShaderInput *inp) const; + CPT(RenderAttrib) set_shader_input(ShaderInput input) const; INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, Texture *tex, int priority=0) const; INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const NodePath &np, int priority=0) const; @@ -104,8 +104,8 @@ PUBLISHED: INLINE bool has_shader_input(CPT_InternalName id) const; const Shader *get_shader() const; - const ShaderInput *get_shader_input(const InternalName *id) const; - const ShaderInput *get_shader_input(const string &id) const; + const ShaderInput &get_shader_input(const InternalName *id) const; + const ShaderInput &get_shader_input(const string &id) const; const NodePath &get_shader_input_nodepath(const InternalName *id) const; LVecBase4 get_shader_input_vector(InternalName *id) const; @@ -145,7 +145,9 @@ private: bool _auto_ramp_on; bool _auto_shadow_on; - typedef pmap Inputs; + // We don't keep a reference to the InternalName, since this is also already + // stored on the ShaderInput object. + typedef pmap Inputs; Inputs _inputs; friend class Extension; diff --git a/panda/src/pgraph/shaderInput.I b/panda/src/pgraph/shaderInput.I index 7344717e47..30d1bab97a 100644 --- a/panda/src/pgraph/shaderInput.I +++ b/panda/src/pgraph/shaderInput.I @@ -13,13 +13,6 @@ * @date 2010-04-06 */ -/** - * - */ -INLINE ShaderInput:: -~ShaderInput() { -} - /** * */ @@ -424,6 +417,81 @@ ShaderInput(CPT_InternalName name, const LVecBase2i &vec, int priority) : { } +/** + * + */ +INLINE bool ShaderInput:: +operator == (const ShaderInput &other) const { + if (_type != other._type || _name != other._name || _priority != other._priority) { + return false; + } + switch (_type) { + case M_invalid: + return true; + + case M_vector: + return _stored_vector == other._stored_vector; + + case M_numeric: + return _stored_ptr._ptr == other._stored_ptr._ptr; + + default: + return _value == other._value; + } +} + +/** + * + */ +INLINE bool ShaderInput:: +operator != (const ShaderInput &other) const { + if (_type != other._type || _name != other._name || _priority != other._priority) { + return true; + } + switch (_type) { + case M_invalid: + return false; + + case M_vector: + return _stored_vector != other._stored_vector; + + case M_numeric: + return _stored_ptr._ptr != other._stored_ptr._ptr; + + default: + return _value != other._value; + } +} + +/** + * + */ +INLINE bool ShaderInput:: +operator < (const ShaderInput &other) const { + if (_type != other._type) { + return (_type < other._type); + } + if (_name != other._name) { + return (_name < other._name); + } + if (_priority != other._priority) { + return (_priority < other._priority); + } + switch (_type) { + case M_invalid: + return false; + + case M_vector: + return _stored_vector < other._stored_vector; + + case M_numeric: + return _stored_ptr._ptr < other._stored_ptr._ptr; + + default: + return _value < other._value; + } +} + /** * */ @@ -471,3 +539,11 @@ INLINE ParamValueBase *ShaderInput:: get_param() const { return DCAST(ParamValueBase, _value); } + +/** + * + */ +INLINE TypedWritableReferenceCount *ShaderInput:: +get_value() const { + return _value.p(); +} diff --git a/panda/src/pgraph/shaderInput.cxx b/panda/src/pgraph/shaderInput.cxx index 3ee38ef70a..44fb91cf23 100644 --- a/panda/src/pgraph/shaderInput.cxx +++ b/panda/src/pgraph/shaderInput.cxx @@ -15,18 +15,13 @@ #include "paramNodePath.h" #include "paramTexture.h" -TypeHandle ShaderInput::_type_handle; - /** * Returns a static ShaderInput object with name NULL, priority zero, type * INVALID, and all value-fields cleared. */ -const ShaderInput *ShaderInput:: +const ShaderInput &ShaderInput:: get_blank() { - static CPT(ShaderInput) blank; - if (blank == 0) { - blank = new ShaderInput(NULL, 0); - } + static ShaderInput blank(nullptr, 0); return blank; } @@ -66,6 +61,30 @@ ShaderInput(CPT_InternalName name, Texture *tex, const SamplerState &sampler, in { } +/** + * + */ +size_t ShaderInput:: +add_hash(size_t hash) const { + hash = int_hash::add_hash(hash, _type); + hash = pointer_hash::add_hash(hash, _name); + hash = int_hash::add_hash(hash, _priority); + + switch (_type) { + case M_invalid: + return hash; + + case M_vector: + return _stored_vector.add_hash(hash); + + case M_numeric: + return pointer_hash::add_hash(hash, _stored_ptr._ptr); + + default: + return pointer_hash::add_hash(hash, _value); + } +} + /** * Warning: no error checking is done. This *will* crash if get_value_type() * is not M_nodepath. diff --git a/panda/src/pgraph/shaderInput.h b/panda/src/pgraph/shaderInput.h index c91c790618..ebf630fcaa 100644 --- a/panda/src/pgraph/shaderInput.h +++ b/panda/src/pgraph/shaderInput.h @@ -17,7 +17,6 @@ #define SHADERINPUT_H #include "pandabase.h" -#include "typedWritableReferenceCount.h" #include "pointerTo.h" #include "internalName.h" #include "paramValue.h" @@ -37,10 +36,7 @@ * This is a small container class that can hold any one of the value types * that can be passed as input to a shader. */ -class EXPCL_PANDA_PGRAPH ShaderInput : public TypedWritableReferenceCount { -public: - INLINE ~ShaderInput(); - +class EXPCL_PANDA_PGRAPH ShaderInput { PUBLISHED: // Used when binding texture images. enum AccessFlags { @@ -49,7 +45,7 @@ PUBLISHED: A_layered = 0x04, }; - static const ShaderInput *get_blank(); + static const ShaderInput &get_blank(); INLINE ShaderInput(CPT_InternalName name, int priority=0); INLINE ShaderInput(CPT_InternalName name, Texture *tex, int priority=0); INLINE ShaderInput(CPT_InternalName name, ParamValueBase *param, int priority=0); @@ -102,6 +98,12 @@ PUBLISHED: M_buffer, }; + INLINE bool operator == (const ShaderInput &other) const; + INLINE bool operator != (const ShaderInput &other) const; + INLINE bool operator < (const ShaderInput &other) const; + + size_t add_hash(size_t hash) const; + INLINE const InternalName *get_name() const; INLINE int get_value_type() const; @@ -114,7 +116,10 @@ PUBLISHED: const SamplerState &get_sampler() const; public: + ShaderInput() DEFAULT_CTOR; + INLINE ParamValueBase *get_param() const; + INLINE TypedWritableReferenceCount *get_value() const; static void register_with_read_factory(); @@ -127,26 +132,8 @@ private: int _type; friend class ShaderAttrib; - -public: - static TypeHandle get_class_type() { - return _type_handle; - } - static void init_type() { - TypedWritableReferenceCount::init_type(); - register_type(_type_handle, "ShaderInput", - TypedWritableReferenceCount::get_class_type()); - } - virtual TypeHandle get_type() const { - return get_class_type(); - } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} - -private: - static TypeHandle _type_handle; }; - #include "shaderInput.I" #endif // SHADERINPUT_H diff --git a/panda/src/pgraph/transformState.cxx b/panda/src/pgraph/transformState.cxx index 4d1aade0ec..be1ed4a15a 100644 --- a/panda/src/pgraph/transformState.cxx +++ b/panda/src/pgraph/transformState.cxx @@ -29,7 +29,7 @@ TransformState::States *TransformState::_states = NULL; CPT(TransformState) TransformState::_identity_state; CPT(TransformState) TransformState::_invalid_state; UpdateSeq TransformState::_last_cycle_detect; -int TransformState::_garbage_index = 0; +size_t TransformState::_garbage_index = 0; bool TransformState::_uniquify_matrix = true; PStatCollector TransformState::_cache_update_pcollector("*:State Cache:Update"); @@ -62,6 +62,10 @@ TransformState() : _lock("TransformState") { _flags = F_is_identity | F_singular_known | F_is_2d; _inv_mat = (LMatrix4 *)NULL; _cache_stats.add_num_states(1); + +#ifdef DO_MEMORY_USAGE + MemoryUsage::update_type(this, this); +#endif } /** @@ -608,33 +612,74 @@ compose(const TransformState *other) const { return do_compose(other); } - // Is this composition already cached? - CPT(TransformState) result; - { - LightReMutexHolder holder(*_states_lock); - int index = _composition_cache.find(other); - if (index != -1) { - const Composition &comp = _composition_cache.get_data(index); - result = comp._result; - } - if (result != (TransformState *)NULL) { - _cache_stats.inc_hits(); - } - } + LightReMutexHolder holder(*_states_lock); - if (result != (TransformState *)NULL) { - // Success! - return result; + // Is this composition already cached? + int index = _composition_cache.find(other); + if (index != -1) { + const Composition &comp = _composition_cache.get_data(index); + if (comp._result != nullptr) { + // Success! + _cache_stats.inc_hits(); + return comp._result; + } } // Not in the cache. Compute a new result. It's important that we don't // hold the lock while we do this, or we lose the benefit of // parallelization. - result = do_compose(other); + CPT(TransformState) result = do_compose(other); - // It's OK to cast away the constness of this pointer, because the cache is - // a transparent property of the class. - return ((TransformState *)this)->store_compose(other, result); + if (index != -1) { + Composition &comp = _composition_cache.modify_data(index); + // Well, it wasn't cached already, but we already had an entry (probably + // created for the reverse direction), so use the same entry to store + // the new result. + comp._result = result; + + if (result != (const TransformState *)this) { + // See the comments below about the need to up the reference count + // only when the result is not the same as this. + result->cache_ref(); + } + // Here's the cache! + _cache_stats.inc_hits(); + return result; + } + _cache_stats.inc_misses(); + + // We need to make a new cache entry, both in this object and in the other + // object. We make both records so the other TransformState object will + // know to delete the entry from this object when it destructs, and vice- + // versa. + + // The cache entry in this object is the only one that indicates the result; + // the other will be NULL for now. + _cache_stats.add_total_size(1); + _cache_stats.inc_adds(_composition_cache.get_size() == 0); + + _composition_cache[other]._result = result; + + if (other != this) { + _cache_stats.add_total_size(1); + _cache_stats.inc_adds(other->_composition_cache.get_size() == 0); + other->_composition_cache[this]._result = NULL; + } + + if (result != (TransformState *)this) { + // If the result of do_compose() is something other than this, explicitly + // increment the reference count. We have to be sure to decrement it + // again later, when the composition entry is removed from the cache. + result->cache_ref(); + + // (If the result was just this again, we still store the result, but we + // don't increment the reference count, since that would be a self- + // referential leak.) + } + + _cache_stats.maybe_report("TransformState"); + + return result; } /** @@ -676,32 +721,69 @@ invert_compose(const TransformState *other) const { LightReMutexHolder holder(*_states_lock); - CPT(TransformState) result; - { - LightReMutexHolder holder(*_states_lock); - int index = _invert_composition_cache.find(other); - if (index != -1) { - const Composition &comp = _invert_composition_cache.get_data(index); - result = comp._result; - } - if (result != (TransformState *)NULL) { + int index = _invert_composition_cache.find(other); + if (index != -1) { + const Composition &comp = _invert_composition_cache.get_data(index); + if (comp._result != nullptr) { + // Success! _cache_stats.inc_hits(); + return comp._result; } } - if (result != (TransformState *)NULL) { - // Success! - return result; - } - // Not in the cache. Compute a new result. It's important that we don't // hold the lock while we do this, or we lose the benefit of // parallelization. - result = do_invert_compose(other); + CPT(TransformState) result = do_invert_compose(other); - // It's OK to cast away the constness of this pointer, because the cache is - // a transparent property of the class. - return ((TransformState *)this)->store_invert_compose(other, result); + // Is this composition already cached? + if (index != -1) { + Composition &comp = _invert_composition_cache.modify_data(index); + // Well, it wasn't cached already, but we already had an entry (probably + // created for the reverse direction), so use the same entry to store + // the new result. + comp._result = result; + + if (result != (const TransformState *)this) { + // See the comments below about the need to up the reference count + // only when the result is not the same as this. + result->cache_ref(); + } + // Here's the cache! + _cache_stats.inc_hits(); + return result; + } + _cache_stats.inc_misses(); + + // We need to make a new cache entry, both in this object and in the other + // object. We make both records so the other TransformState object will + // know to delete the entry from this object when it destructs, and vice- + // versa. + + // The cache entry in this object is the only one that indicates the result; + // the other will be NULL for now. + _cache_stats.add_total_size(1); + _cache_stats.inc_adds(_invert_composition_cache.get_size() == 0); + _invert_composition_cache[other]._result = result; + + if (other != this) { + _cache_stats.add_total_size(1); + _cache_stats.inc_adds(other->_invert_composition_cache.get_size() == 0); + other->_invert_composition_cache[this]._result = NULL; + } + + if (result != (TransformState *)this) { + // If the result of compose() is something other than this, explicitly + // increment the reference count. We have to be sure to decrement it + // again later, when the composition entry is removed from the cache. + result->cache_ref(); + + // (If the result was just this again, we still store the result, but we + // don't increment the reference count, since that would be a self- + // referential leak.) + } + + return result; } /** @@ -712,7 +794,7 @@ invert_compose(const TransformState *other) const { */ bool TransformState:: unref() const { - if (!transform_cache || garbage_collect_states) { + if (garbage_collect_states || !transform_cache) { // If we're not using the cache at all, or if we're relying on garbage // collection, just allow the pointer to unref normally. return ReferenceCount::unref(); @@ -760,8 +842,8 @@ bool TransformState:: validate_composition_cache() const { LightReMutexHolder holder(*_states_lock); - int size = _composition_cache.get_size(); - for (int i = 0; i < size; ++i) { + size_t size = _composition_cache.get_size(); + for (size_t i = 0; i < size; ++i) { if (!_composition_cache.has_element(i)) { continue; } @@ -955,15 +1037,15 @@ get_num_unused_states() { typedef pmap StateCount; StateCount state_count; - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } const TransformState *state = _states->get_key(si); - int i; - int cache_size = state->_composition_cache.get_size(); + size_t i; + size_t cache_size = state->_composition_cache.get_size(); for (i = 0; i < cache_size; ++i) { if (state->_composition_cache.has_element(i)) { const TransformState *result = state->_composition_cache.get_data(i)._result; @@ -1053,8 +1135,8 @@ clear_cache() { TempStates temp_states; temp_states.reserve(orig_size); - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } @@ -1116,27 +1198,30 @@ garbage_collect() { if (_states == (States *)NULL || !garbage_collect_states) { return 0; } + + bool break_and_uniquify = (auto_break_cycles && uniquify_transforms); + LightReMutexHolder holder(*_states_lock); PStatTimer timer(_garbage_collect_pcollector); - int orig_size = _states->get_num_entries(); + size_t orig_size = _states->get_num_entries(); // How many elements to process this pass? - int size = _states->get_size(); - int num_this_pass = int(size * garbage_collect_states_rate); - if (num_this_pass <= 0) { + size_t size = _states->get_size(); + size_t num_this_pass = int(size * garbage_collect_states_rate); + if (size <= 0 || num_this_pass <= 0) { return 0; } - num_this_pass = min(num_this_pass, size); - int stop_at_element = (_garbage_index + num_this_pass) % size; - int num_elements = 0; - int si = _garbage_index; + size_t si = _garbage_index; + + num_this_pass = min(num_this_pass, size); + size_t stop_at_element = (si + num_this_pass) & (size - 1); + do { if (_states->has_element(si)) { - ++num_elements; TransformState *state = (TransformState *)_states->get_key(si); - if (auto_break_cycles && uniquify_transforms) { + if (break_and_uniquify) { if (state->get_cache_ref_count() > 0 && state->get_ref_count() == state->get_cache_ref_count()) { // If we have removed all the references to this state not in the @@ -1160,10 +1245,13 @@ garbage_collect() { } } - si = (si + 1) % size; + si = (si + 1) & (size - 1); } while (si != stop_at_element); _garbage_index = si; + +#ifdef _DEBUG nassertr(_states->validate(), 0); +#endif int new_size = _states->get_num_entries(); return orig_size - new_size; @@ -1193,8 +1281,8 @@ list_cycles(ostream &out) { VisitedStates visited; CompositionCycleDesc cycle_desc; - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } @@ -1272,8 +1360,8 @@ list_states(ostream &out) { out << _states->get_num_entries() << " states:\n"; - int size = _states->get_size(); - for (int si = 0; si < size; ++si) { + size_t size = _states->get_size(); + for (size_t si = 0; si < size; ++si) { if (!_states->has_element(si)) { continue; } @@ -1307,14 +1395,14 @@ validate_states() { return false; } - int size = _states->get_size(); - int si = 0; + size_t size = _states->get_size(); + size_t si = 0; while (si < size && !_states->has_element(si)) { ++si; } nassertr(si < size, false); nassertr(_states->get_key(si)->get_ref_count() >= 0, false); - int snext = si; + size_t snext = si; ++snext; while (snext < size && !_states->has_element(snext)) { ++snext; @@ -1533,150 +1621,6 @@ do_compose(const TransformState *other) const { } } -/** - * Stores the result of a composition in the cache. Returns the stored result - * (it may be a different object than the one passed in, due to another thread - * having computed the composition first). - */ -CPT(TransformState) TransformState:: -store_compose(const TransformState *other, const TransformState *result) { - // Identity should have already been screened. - nassertr(!is_identity(), other); - nassertr(!other->is_identity(), this); - - // So should have validity. - nassertr(!is_invalid(), this); - nassertr(!other->is_invalid(), other); - - LightReMutexHolder holder(*_states_lock); - - // Is this composition already cached? - int index = _composition_cache.find(other); - if (index != -1) { - Composition &comp = _composition_cache.modify_data(index); - if (comp._result == (const TransformState *)NULL) { - // Well, it wasn't cached already, but we already had an entry (probably - // created for the reverse direction), so use the same entry to store - // the new result. - comp._result = result; - - if (result != (const TransformState *)this) { - // See the comments below about the need to up the reference count - // only when the result is not the same as this. - result->cache_ref(); - } - } - // Here's the cache! - _cache_stats.inc_hits(); - return comp._result; - } - _cache_stats.inc_misses(); - - // We need to make a new cache entry, both in this object and in the other - // object. We make both records so the other TransformState object will - // know to delete the entry from this object when it destructs, and vice- - // versa. - - // The cache entry in this object is the only one that indicates the result; - // the other will be NULL for now. - _cache_stats.add_total_size(1); - _cache_stats.inc_adds(_composition_cache.get_size() == 0); - - _composition_cache[other]._result = result; - - if (other != this) { - _cache_stats.add_total_size(1); - _cache_stats.inc_adds(other->_composition_cache.get_size() == 0); - ((TransformState *)other)->_composition_cache[this]._result = NULL; - } - - if (result != (TransformState *)this) { - // If the result of do_compose() is something other than this, explicitly - // increment the reference count. We have to be sure to decrement it - // again later, when the composition entry is removed from the cache. - result->cache_ref(); - - // (If the result was just this again, we still store the result, but we - // don't increment the reference count, since that would be a self- - // referential leak.) - } - - _cache_stats.maybe_report("TransformState"); - - return result; -} - -/** - * Stores the result of a composition in the cache. Returns the stored result - * (it may be a different object than the one passed in, due to another thread - * having computed the composition first). - */ -CPT(TransformState) TransformState:: -store_invert_compose(const TransformState *other, const TransformState *result) { - // Identity should have already been screened. - nassertr(!is_identity(), other); - - // So should have validity. - nassertr(!is_invalid(), this); - nassertr(!other->is_invalid(), other); - - nassertr(other != this, make_identity()); - - LightReMutexHolder holder(*_states_lock); - - // Is this composition already cached? - int index = _invert_composition_cache.find(other); - if (index != -1) { - Composition &comp = ((TransformState *)this)->_invert_composition_cache.modify_data(index); - if (comp._result == (const TransformState *)NULL) { - // Well, it wasn't cached already, but we already had an entry (probably - // created for the reverse direction), so use the same entry to store - // the new result. - comp._result = result; - - if (result != (const TransformState *)this) { - // See the comments below about the need to up the reference count - // only when the result is not the same as this. - result->cache_ref(); - } - } - // Here's the cache! - _cache_stats.inc_hits(); - return comp._result; - } - _cache_stats.inc_misses(); - - // We need to make a new cache entry, both in this object and in the other - // object. We make both records so the other TransformState object will - // know to delete the entry from this object when it destructs, and vice- - // versa. - - // The cache entry in this object is the only one that indicates the result; - // the other will be NULL for now. - _cache_stats.add_total_size(1); - _cache_stats.inc_adds(_invert_composition_cache.get_size() == 0); - _invert_composition_cache[other]._result = result; - - if (other != this) { - _cache_stats.add_total_size(1); - _cache_stats.inc_adds(other->_invert_composition_cache.get_size() == 0); - ((TransformState *)other)->_invert_composition_cache[this]._result = NULL; - } - - if (result != (TransformState *)this) { - // If the result of compose() is something other than this, explicitly - // increment the reference count. We have to be sure to decrement it - // again later, when the composition entry is removed from the cache. - result->cache_ref(); - - // (If the result was just this again, we still store the result, but we - // don't increment the reference count, since that would be a self- - // referential leak.) - } - - return result; -} - /** * The private implemention of invert_compose(). */ diff --git a/panda/src/pgraph/transformState.h b/panda/src/pgraph/transformState.h index 3287fb1853..3fd628be7c 100644 --- a/panda/src/pgraph/transformState.h +++ b/panda/src/pgraph/transformState.h @@ -234,9 +234,7 @@ private: static CPT(TransformState) return_unique(TransformState *state); CPT(TransformState) do_compose(const TransformState *other) const; - CPT(TransformState) store_compose(const TransformState *other, const TransformState *result); CPT(TransformState) do_invert_compose(const TransformState *other) const; - CPT(TransformState) store_invert_compose(const TransformState *other, const TransformState *result); void detect_and_break_cycles(); static bool r_detect_cycles(const TransformState *start_state, const TransformState *current_state, @@ -288,8 +286,8 @@ private: }; typedef SimpleHashMap CompositionCache; - CompositionCache _composition_cache; - CompositionCache _invert_composition_cache; + mutable CompositionCache _composition_cache; + mutable CompositionCache _invert_composition_cache; // This is used to mark nodes as we visit them to detect cycles. UpdateSeq _cycle_detect; @@ -297,7 +295,7 @@ private: // This keeps track of our current position through the garbage collection // cycle. - static int _garbage_index; + static size_t _garbage_index; static bool _uniquify_matrix; @@ -408,6 +406,12 @@ private: friend class Extension; }; +#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + INLINE ostream &operator << (ostream &out, const TransformState &state) { state.output(out); return out; diff --git a/panda/src/pgraphnodes/ambientLight.h b/panda/src/pgraphnodes/ambientLight.h index e52122bdde..23623d7afe 100644 --- a/panda/src/pgraphnodes/ambientLight.h +++ b/panda/src/pgraphnodes/ambientLight.h @@ -33,7 +33,7 @@ protected: public: virtual PandaNode *make_copy() const; virtual void write(ostream &out, int indent_level) const; - virtual bool is_ambient_light() const; + virtual bool is_ambient_light() const FINAL; PUBLISHED: virtual int get_class_priority() const; diff --git a/panda/src/pgraphnodes/fadeLodNode.cxx b/panda/src/pgraphnodes/fadeLodNode.cxx index 5f1f8d15ec..de952457e8 100644 --- a/panda/src/pgraphnodes/fadeLodNode.cxx +++ b/panda/src/pgraphnodes/fadeLodNode.cxx @@ -93,7 +93,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { consider_verify_lods(trav, data); Camera *camera = trav->get_scene()->get_camera_node(); - NodePath this_np = data._node_path.get_node_path(); + NodePath this_np = data.get_node_path(); FadeLODNodeData *ldata = DCAST(FadeLODNodeData, camera->get_aux_scene_data(this_np)); diff --git a/panda/src/pgraphnodes/lightLensNode.I b/panda/src/pgraphnodes/lightLensNode.I index ddb2808e86..8fff5b2533 100644 --- a/panda/src/pgraphnodes/lightLensNode.I +++ b/panda/src/pgraphnodes/lightLensNode.I @@ -15,7 +15,7 @@ * Returns whether this light is configured to cast shadows or not. */ INLINE bool LightLensNode:: -is_shadow_caster() { +is_shadow_caster() const { return _shadow_caster; } diff --git a/panda/src/pgraphnodes/lightLensNode.h b/panda/src/pgraphnodes/lightLensNode.h index d4e0c7385d..0c4b329b16 100644 --- a/panda/src/pgraphnodes/lightLensNode.h +++ b/panda/src/pgraphnodes/lightLensNode.h @@ -34,7 +34,7 @@ PUBLISHED: LightLensNode(const string &name, Lens *lens = new PerspectiveLens()); virtual ~LightLensNode(); - INLINE bool is_shadow_caster(); + INLINE bool is_shadow_caster() const; INLINE void set_shadow_caster(bool caster); INLINE void set_shadow_caster(bool caster, int buffer_xsize, int buffer_ysize, int sort = -10); diff --git a/panda/src/pgraphnodes/lodNode.cxx b/panda/src/pgraphnodes/lodNode.cxx index 5936b0634b..4c2ca87528 100644 --- a/panda/src/pgraphnodes/lodNode.cxx +++ b/panda/src/pgraphnodes/lodNode.cxx @@ -330,7 +330,7 @@ compute_child(CullTraverser *trav, CullTraverserData &data) { * trav->get_scene()->get_camera_node()->get_lod_scale())) { if (pgraph_cat.is_debug()) { pgraph_cat.debug() - << data._node_path << " at distance " << sqrt(dist2) + << data.get_node_path() << " at distance " << sqrt(dist2) << ", selected child " << index << "\n"; } @@ -340,7 +340,7 @@ compute_child(CullTraverser *trav, CullTraverserData &data) { if (pgraph_cat.is_debug()) { pgraph_cat.debug() - << data._node_path << " at distance " << sqrt(dist2) + << data.get_node_path() << " at distance " << sqrt(dist2) << ", no children in range.\n"; } @@ -393,20 +393,14 @@ show_switches_cull_callback(CullTraverser *trav, CullTraverserData &data) { // And draw the spindle in this color. CullTraverserData next_data2(data, sw.get_spindle_viz()); - next_data2.apply_transform_and_state(trav, viz_transform, - RenderState::make_empty(), - RenderEffects::make_empty(), - ClipPlaneAttrib::make()); + next_data2.apply_transform(viz_transform); trav->traverse(next_data2); } // Draw the rings for this switch level. We do this after we have drawn // the geometry and the spindle. CullTraverserData next_data(data, sw.get_ring_viz()); - next_data.apply_transform_and_state(trav, viz_transform, - RenderState::make_empty(), - RenderEffects::make_empty(), - ClipPlaneAttrib::make()); + next_data.apply_transform(viz_transform); trav->traverse(next_data); } } @@ -650,7 +644,7 @@ do_auto_verify_lods(CullTraverser *trav, CullTraverserData &data) { const Switch &sw = cdata->_switch_vector[index]; ostringstream strm; strm - << "Level " << index << " geometry of " << data._node_path + << "Level " << index << " geometry of " << data.get_node_path() << " is larger than its switch radius; suggest radius of " << suggested_radius << " instead of " << sw.get_in() << " (configure verify-lods 0 to ignore this error)"; diff --git a/panda/src/pgraphnodes/nodeCullCallbackData.cxx b/panda/src/pgraphnodes/nodeCullCallbackData.cxx index d0bf763e98..b0cbd9d980 100644 --- a/panda/src/pgraphnodes/nodeCullCallbackData.cxx +++ b/panda/src/pgraphnodes/nodeCullCallbackData.cxx @@ -41,7 +41,7 @@ void NodeCullCallbackData:: upcall() { PandaNode *node = _data.node(); if (node->is_of_type(CallbackNode::get_class_type())) { - CallbackNode *cbnode = DCAST(CallbackNode, _data.node()); + CallbackNode *cbnode = (CallbackNode *)node; // OK, render this node. Rendering a CallbackNode means creating a // CullableObject for the draw_callback, if any. We don't need to pass diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index 2c840e46ee..63973c6bc3 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -284,7 +284,7 @@ analyze_renderstate(const RenderState *rs) { PandaNode *light_obj = light.node(); nassertv(light_obj != (PandaNode *)NULL); - if (light_obj->get_type() == AmbientLight::get_class_type()) { + if (light_obj->is_ambient_light()) { if (_material->has_ambient()) { LColor a = _material->get_ambient(); if ((a[0]!=0.0)||(a[1]!=0.0)||(a[2]!=0.0)) { @@ -298,7 +298,7 @@ analyze_renderstate(const RenderState *rs) { } else if (light_obj->is_of_type(LightLensNode::get_class_type())) { _lights_np.push_back(light); _lights.push_back((LightLensNode *)light_obj); - if (DCAST(LightLensNode, light_obj)->is_shadow_caster()) { + if (((const LightLensNode *)light_obj)->is_shadow_caster()) { _shadows = true; } _lighting = true; diff --git a/panda/src/pipeline/pipelineCyclerTrueImpl.I b/panda/src/pipeline/pipelineCyclerTrueImpl.I index 2c393d0546..9b078a6a30 100644 --- a/panda/src/pipeline/pipelineCyclerTrueImpl.I +++ b/panda/src/pipeline/pipelineCyclerTrueImpl.I @@ -231,6 +231,8 @@ read_stage_unlocked(int pipeline_stage) const { TAU_PROFILE("const CycleData *PipelineCyclerTrueImpl::read_stage_unlocked(int)", " ", TAU_USER); #ifdef _DEBUG nassertr(pipeline_stage >= 0 && pipeline_stage < _num_stages, NULL); +#elif defined(__has_builtin) && __has_builtin(__builtin_assume) + __builtin_assume(pipeline_stage >= 0); #endif return _data[pipeline_stage]._cdata; } @@ -248,6 +250,8 @@ read_stage(int pipeline_stage, Thread *current_thread) const { TAU_PROFILE("const CycleData *PipelineCyclerTrueImpl::read_stage(int, Thread *)", " ", TAU_USER); #ifdef _DEBUG nassertr(pipeline_stage >= 0 && pipeline_stage < _num_stages, NULL); +#elif defined(__has_builtin) && __has_builtin(__builtin_assume) + __builtin_assume(pipeline_stage >= 0); #endif _lock.acquire(current_thread); return _data[pipeline_stage]._cdata; @@ -278,6 +282,8 @@ elevate_read_stage(int pipeline_stage, const CycleData *pointer, #ifdef _DEBUG nassertr(pipeline_stage >= 0 && pipeline_stage < _num_stages, NULL); nassertr(_data[pipeline_stage]._cdata == pointer, NULL); +#elif defined(__has_builtin) && __has_builtin(__builtin_assume) + __builtin_assume(pipeline_stage >= 0); #endif CycleData *new_pointer = write_stage(pipeline_stage, current_thread); _lock.release(); @@ -296,6 +302,8 @@ elevate_read_stage_upstream(int pipeline_stage, const CycleData *pointer, #ifdef _DEBUG nassertr(pipeline_stage >= 0 && pipeline_stage < _num_stages, NULL); nassertr(_data[pipeline_stage]._cdata == pointer, NULL); +#elif defined(__has_builtin) && __has_builtin(__builtin_assume) + __builtin_assume(pipeline_stage >= 0); #endif CycleData *new_pointer = write_stage_upstream(pipeline_stage, force_to_0, current_thread); @@ -313,6 +321,8 @@ release_write_stage(int pipeline_stage, CycleData *pointer) { nassertv(pipeline_stage >= 0 && pipeline_stage < _num_stages); nassertv(_data[pipeline_stage]._cdata == pointer); nassertv(_data[pipeline_stage]._writes_outstanding > 0); +#elif defined(__has_builtin) && __has_builtin(__builtin_assume) + __builtin_assume(pipeline_stage >= 0); #endif --(_data[pipeline_stage]._writes_outstanding); _lock.release(); diff --git a/panda/src/pipeline/thread.I b/panda/src/pipeline/thread.I index b6ae48469a..321d24da6a 100644 --- a/panda/src/pipeline/thread.I +++ b/panda/src/pipeline/thread.I @@ -78,7 +78,7 @@ get_pipeline_stage() const { // However, since we guarantee that this is never less than zero, clang // offers a nice way to avoid that. int pipeline_stage = _pipeline_stage; - __builtin_assume(_pipeline_stage >= 0); + __builtin_assume(pipeline_stage >= 0); return pipeline_stage; #else return _pipeline_stage; diff --git a/panda/src/putil/copyOnWriteObject.h b/panda/src/putil/copyOnWriteObject.h index 12ea5baf24..37302ea44a 100644 --- a/panda/src/putil/copyOnWriteObject.h +++ b/panda/src/putil/copyOnWriteObject.h @@ -161,6 +161,12 @@ private: static TypeHandle _type_handle; }; +#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + #include "copyOnWriteObject.I" #endif diff --git a/panda/src/putil/simpleHashMap.I b/panda/src/putil/simpleHashMap.I index d68fae9542..74245fd606 100644 --- a/panda/src/putil/simpleHashMap.I +++ b/panda/src/putil/simpleHashMap.I @@ -235,8 +235,8 @@ get_size() const { */ template INLINE bool SimpleHashMap:: -has_element(int n) const { - nassertr(n >= 0 && n < (int)_table_size, false); +has_element(size_t n) const { + nassertr(n < _table_size, false); return (get_exists_array()[n] != 0); } @@ -249,7 +249,7 @@ has_element(int n) const { */ template INLINE const Key &SimpleHashMap:: -get_key(int n) const { +get_key(size_t n) const { nassertr(has_element(n), _table[n]._key); return _table[n]._key; } @@ -263,7 +263,7 @@ get_key(int n) const { */ template INLINE const Value &SimpleHashMap:: -get_data(int n) const { +get_data(size_t n) const { nassertr(has_element(n), _table[n]._data); return _table[n]._data; } @@ -277,7 +277,7 @@ get_data(int n) const { */ template INLINE Value &SimpleHashMap:: -modify_data(int n) { +modify_data(size_t n) { nassertr(has_element(n), _table[n]._data); return _table[n]._data; } @@ -291,7 +291,7 @@ modify_data(int n) { */ template INLINE void SimpleHashMap:: -set_data(int n, const Value &data) { +set_data(size_t n, const Value &data) { nassertv(has_element(n)); _table[n]._data = data; } @@ -305,7 +305,7 @@ set_data(int n, const Value &data) { */ template void SimpleHashMap:: -remove_element(int n) { +remove_element(size_t n) { nassertv(has_element(n)); clear_element(n); @@ -314,7 +314,7 @@ remove_element(int n) { // Now we have put a hole in the table. If there was a hash conflict in the // slot following this one, we have to move it down to close the hole. - size_t i = (size_t)n; + size_t i = n; i = (i + 1) & (_table_size - 1); while (has_element(i)) { size_t wants_index = get_hash(_table[i]._key); @@ -403,12 +403,14 @@ bool SimpleHashMap:: validate() const { size_t count = 0; + const unsigned char *exists_array = get_exists_array(); + for (size_t i = 0; i < _table_size; ++i) { - if (has_element(i)) { + if (exists_array[i] != 0) { ++count; size_t ideal_index = get_hash(_table[i]._key); size_t wants_index = ideal_index; - while (wants_index != i && has_element(wants_index)) { + while (wants_index != i && exists_array[wants_index] != 0) { wants_index = (wants_index + 1) & (_table_size - 1); } if (wants_index != i) { @@ -455,7 +457,7 @@ get_hash(const Key &key) const { */ template INLINE bool SimpleHashMap:: -is_element(int n, const Key &key) const { +is_element(size_t n, const Key &key) const { nassertr(has_element(n), false); return _comp.is_equal(_table[n]._key, key); } @@ -466,7 +468,7 @@ is_element(int n, const Key &key) const { */ template INLINE void SimpleHashMap:: -store_new_element(int n, const Key &key, const Value &data) { +store_new_element(size_t n, const Key &key, const Value &data) { new(&_table[n]) TableEntry(key, data); get_exists_array()[n] = true; } @@ -476,7 +478,7 @@ store_new_element(int n, const Key &key, const Value &data) { */ template INLINE void SimpleHashMap:: -clear_element(int n) { +clear_element(size_t n) { _table[n].~TableEntry(); get_exists_array()[n] = false; } diff --git a/panda/src/putil/simpleHashMap.h b/panda/src/putil/simpleHashMap.h index 7954cd943e..c1a25fc7f9 100644 --- a/panda/src/putil/simpleHashMap.h +++ b/panda/src/putil/simpleHashMap.h @@ -42,12 +42,12 @@ public: INLINE Value &operator [] (const Key &key); INLINE size_t get_size() const; - INLINE bool has_element(int n) const; - INLINE const Key &get_key(int n) const; - INLINE const Value &get_data(int n) const; - INLINE Value &modify_data(int n); - INLINE void set_data(int n, const Value &data); - void remove_element(int n); + INLINE bool has_element(size_t n) const; + INLINE const Key &get_key(size_t n) const; + INLINE const Value &get_data(size_t n) const; + INLINE Value &modify_data(size_t n); + INLINE void set_data(size_t n, const Value &data); + void remove_element(size_t n); INLINE size_t get_num_entries() const; INLINE bool is_empty() const; @@ -61,9 +61,9 @@ private: INLINE size_t get_hash(const Key &key) const; - INLINE bool is_element(int n, const Key &key) const; - INLINE void store_new_element(int n, const Key &key, const Value &data); - INLINE void clear_element(int n); + INLINE bool is_element(size_t n, const Key &key) const; + INLINE void store_new_element(size_t n, const Key &key, const Value &data); + INLINE void clear_element(size_t n); INLINE unsigned char *get_exists_array() const; void new_table(); diff --git a/panda/src/putil/typedWritableReferenceCount.h b/panda/src/putil/typedWritableReferenceCount.h index 97d7d90029..51803d7b36 100644 --- a/panda/src/putil/typedWritableReferenceCount.h +++ b/panda/src/putil/typedWritableReferenceCount.h @@ -61,6 +61,11 @@ private: static TypeHandle _type_handle; }; +#ifdef DO_MEMORY_USAGE +template<> +INLINE void PointerToBase::update_type(To *ptr) {} +#endif + #include "typedWritableReferenceCount.I" #endif diff --git a/panda/src/putil/weakKeyHashMap.I b/panda/src/putil/weakKeyHashMap.I index b4b007f998..f894411f24 100644 --- a/panda/src/putil/weakKeyHashMap.I +++ b/panda/src/putil/weakKeyHashMap.I @@ -234,8 +234,8 @@ get_size() const { */ template INLINE bool WeakKeyHashMap:: -has_element(int n) const { - nassertr(n >= 0 && n < (int)_table_size, false); +has_element(size_t n) const { + nassertr(n < _table_size, false); return (get_exists_array()[n] != 0 && !_table[n]._key.was_deleted()); } @@ -248,7 +248,7 @@ has_element(int n) const { */ template INLINE const Key *WeakKeyHashMap:: -get_key(int n) const { +get_key(size_t n) const { nassertr(has_element(n), _table[n]._key); return _table[n]._key; } @@ -262,7 +262,7 @@ get_key(int n) const { */ template INLINE const Value &WeakKeyHashMap:: -get_data(int n) const { +get_data(size_t n) const { nassertr(has_element(n), _table[n]._data); return _table[n]._data; } @@ -276,7 +276,7 @@ get_data(int n) const { */ template INLINE Value &WeakKeyHashMap:: -modify_data(int n) { +modify_data(size_t n) { nassertr(has_element(n), _table[n]._data); return _table[n]._data; } @@ -290,7 +290,7 @@ modify_data(int n) { */ template INLINE void WeakKeyHashMap:: -set_data(int n, const Value &data) { +set_data(size_t n, const Value &data) { nassertv(has_element(n)); _table[n]._data = data; } @@ -305,7 +305,7 @@ set_data(int n, const Value &data) { */ template INLINE void WeakKeyHashMap:: -set_data(int n, Value &&data) { +set_data(size_t n, Value &&data) { nassertv(has_element(n)); _table[n]._data = move(data); } @@ -320,7 +320,7 @@ set_data(int n, Value &&data) { */ template void WeakKeyHashMap:: -remove_element(int n) { +remove_element(size_t n) { nassertv(get_exists_array()[n] != 0); clear_element(n); @@ -329,7 +329,7 @@ remove_element(int n) { // Now we have put a hole in the table. If there was a hash conflict in the // slot following this one, we have to move it down to close the hole. - size_t i = (size_t)n; + size_t i = n; i = (i + 1) & (_table_size - 1); while (get_exists_array()[i] != 0) { if (_table[i]._key.was_deleted()) { @@ -430,15 +430,17 @@ bool WeakKeyHashMap:: validate() const { size_t count = 0; + const unsigned char *exists_array = get_exists_array(); + for (size_t i = 0; i < _table_size; ++i) { - if (get_exists_array()[i] != 0) { + if (exists_array[i] != 0) { ++count; if (_table[i]._key.was_deleted()) { continue; } size_t ideal_index = get_hash(_table[i]._key.get_orig()); size_t wants_index = ideal_index; - while (wants_index != i && get_exists_array()[i] != 0) { + while (wants_index != i && exists_array[wants_index] != 0) { wants_index = (wants_index + 1) & (_table_size - 1); } if (wants_index != i) { @@ -485,7 +487,7 @@ get_hash(const Key *key) const { */ template INLINE bool WeakKeyHashMap:: -is_element(int n, const Key *key) const { +is_element(size_t n, const Key *key) const { nassertr(has_element(n), false); return _table[n]._key == key; } @@ -496,7 +498,7 @@ is_element(int n, const Key *key) const { */ template INLINE void WeakKeyHashMap:: -store_new_element(int n, const Key *key, const Value &data) { +store_new_element(size_t n, const Key *key, const Value &data) { if (get_exists_array()[n] != 0) { // There was already an element in this spot. This can happen if it was a // pointer that had already been deleted. @@ -513,7 +515,7 @@ store_new_element(int n, const Key *key, const Value &data) { */ template INLINE void WeakKeyHashMap:: -clear_element(int n) { +clear_element(size_t n) { _table[n].~TableEntry(); get_exists_array()[n] = false; } diff --git a/panda/src/putil/weakKeyHashMap.h b/panda/src/putil/weakKeyHashMap.h index 98a8863ee2..bbb7077998 100644 --- a/panda/src/putil/weakKeyHashMap.h +++ b/panda/src/putil/weakKeyHashMap.h @@ -45,15 +45,15 @@ public: INLINE Value &operator [] (const Key *key); INLINE size_t get_size() const; - INLINE bool has_element(int n) const; - INLINE const Key *get_key(int n) const; - INLINE const Value &get_data(int n) const; - INLINE Value &modify_data(int n); - INLINE void set_data(int n, const Value &data); + INLINE bool has_element(size_t n) const; + INLINE const Key *get_key(size_t n) const; + INLINE const Value &get_data(size_t n) const; + INLINE Value &modify_data(size_t n); + INLINE void set_data(size_t n, const Value &data); #ifdef USE_MOVE_SEMANTICS - INLINE void set_data(int n, Value &&data); + INLINE void set_data(size_t n, Value &&data); #endif - void remove_element(int n); + void remove_element(size_t n); INLINE size_t get_num_entries() const; INLINE bool is_empty() const; @@ -65,9 +65,9 @@ public: private: INLINE size_t get_hash(const Key *key) const; - INLINE bool is_element(int n, const Key *key) const; - INLINE void store_new_element(int n, const Key *key, const Value &data); - INLINE void clear_element(int n); + INLINE bool is_element(size_t n, const Key *key) const; + INLINE void store_new_element(size_t n, const Key *key, const Value &data); + INLINE void clear_element(size_t n); INLINE unsigned char *get_exists_array() const; void new_table(); From 2980bbc955d4177f3c8d1c5e7c87e74a3f5f3a79 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 3 Apr 2017 01:41:28 +0200 Subject: [PATCH 087/254] android: fix error when uploading BGRA image --- panda/src/glstuff/glGraphicsStateGuardian_src.cxx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 51636ccd73..b147c9182e 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -9260,18 +9260,22 @@ get_internal_image_format(Texture *tex, bool force_sized) const { return GL_RGBA16F; } else #endif -#ifndef OPENGLES +#ifdef OPENGLES + { + // In OpenGL ES, the internal format must match the external format. + return _supports_bgr ? GL_BGRA : GL_RGBA; + } +#else if (tex->get_component_type() == Texture::T_unsigned_short) { return GL_RGBA16; } else if (tex->get_component_type() == Texture::T_short) { return GL_RGBA16_SNORM; } else if (tex->get_component_type() == Texture::T_byte) { return GL_RGBA8_SNORM; - } else -#endif - { + } else { return force_sized ? GL_RGBA8 : GL_RGBA; } +#endif case Texture::F_rgba4: return GL_RGBA4; @@ -12702,6 +12706,9 @@ upload_simple_texture(CLP(TextureContext) *gtc) { _data_transferred_pcollector.add_level(image_size); #endif +#ifdef OPENGLES + internal_format = external_format; +#endif glTexImage2D(GL_TEXTURE_2D, 0, internal_format, width, height, 0, external_format, component_type, image_ptr); From 019700cb1aadb162476729e6f14b9852c8fe271f Mon Sep 17 00:00:00 2001 From: sean5470 Date: Sun, 2 Apr 2017 11:25:01 -0400 Subject: [PATCH 088/254] Maya 2017 support Added entries to compile Maya 2017 plugins. --- makepanda/makepandacore.py | 3 ++- pandatool/src/mayaprogs/mayapath.cxx | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 2f6482c68f..20fac66d52 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -76,7 +76,8 @@ MAYAVERSIONINFO = [("MAYA6", "6.0"), ("MAYA2014","2014"), ("MAYA2015","2015"), ("MAYA2016","2016"), - ("MAYA20165","2016.5") + ("MAYA20165","2016.5"), + ("MAYA2017","2017") ] MAXVERSIONINFO = [("MAX6", "SOFTWARE\\Autodesk\\3DSMAX\\6.0", "installdir", "maxsdk\\cssdk\\include"), diff --git a/pandatool/src/mayaprogs/mayapath.cxx b/pandatool/src/mayaprogs/mayapath.cxx index aac472759d..428e4ba128 100644 --- a/pandatool/src/mayaprogs/mayapath.cxx +++ b/pandatool/src/mayaprogs/mayapath.cxx @@ -98,6 +98,7 @@ struct MayaVerInfo maya_versions[] = { { "MAYA2015", "2015"}, { "MAYA2016", "2016"}, { "MAYA20165", "2016.5"}, + { "MAYA2017", "2017"}, { 0, 0 }, }; From 97cd007af35c1f822fe5a166a4709e4416e7f974 Mon Sep 17 00:00:00 2001 From: sean5470 Date: Sun, 2 Apr 2017 17:40:34 -0400 Subject: [PATCH 089/254] bam2egg: retain model nodes added code to retain model nodes that are not DCS nodes. --- panda/src/egg2pg/eggSaver.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/panda/src/egg2pg/eggSaver.cxx b/panda/src/egg2pg/eggSaver.cxx index 133bddc874..5eeb98f42c 100644 --- a/panda/src/egg2pg/eggSaver.cxx +++ b/panda/src/egg2pg/eggSaver.cxx @@ -940,6 +940,9 @@ apply_node_properties(EggGroup *egg_group, PandaNode *node, bool allow_backstage ModelNode *model_node = DCAST(ModelNode, node); switch (model_node->get_preserve_transform()) { case ModelNode::PT_none: + egg_group->set_model_flag(true); + break; + case ModelNode::PT_drop_node: break; From f7af155e93d549a43382210f41d14b9068a74a59 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 3 Apr 2017 13:57:40 +0200 Subject: [PATCH 090/254] Compile with VS 2015 Express, build assimp on Windows --- makepanda/makepanda.py | 13 ++++++++++--- makepanda/makepandacore.py | 15 ++++++++++++--- panda/src/dxgsg9/config_dxgsg9.cxx | 5 ----- panda/src/dxgsg9/dxGeomMunger9.cxx | 4 ++-- panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx | 4 ++-- panda/src/dxgsg9/dxIndexBufferContext9.cxx | 2 +- pandatool/src/maxegg/maxEgg.rc | 3 ++- pandatool/src/maxprogs/maxImportRes.rc | 4 ++-- 8 files changed, 31 insertions(+), 19 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index d682f76e71..af00b2ea3b 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -571,6 +571,10 @@ if (COMPILER == "MSVC"): #LibName(pkg, 'ddraw.lib') LibName(pkg, 'dxguid.lib') + if SDK.get("VISUALSTUDIO_VERSION") == '14.0': + # dxerr needs this for __vsnwprintf definition. + LibName(pkg, 'legacy_stdio_definitions.lib') + if not PkgSkip("FREETYPE") and os.path.isdir(GetThirdpartyDir() + "freetype/include/freetype2"): IncDirectory("FREETYPE", GetThirdpartyDir() + "freetype/include/freetype2") @@ -637,7 +641,6 @@ if (COMPILER == "MSVC"): if (PkgSkip("FFTW")==0): LibName("FFTW", GetThirdpartyDir() + "fftw/lib/rfftw.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("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/highgui.lib") if (PkgSkip("OPENCV")==0): LibName("OPENCV", GetThirdpartyDir() + "opencv/lib/cvaux.lib") @@ -652,6 +655,9 @@ if (COMPILER == "MSVC"): if (PkgSkip("FCOLLADA")==0): LibName("FCOLLADA", GetThirdpartyDir() + "fcollada/lib/FCollada.lib") IncDirectory("FCOLLADA", GetThirdpartyDir() + "fcollada/include/FCollada") + if (PkgSkip("ASSIMP")==0): + LibName("ASSIMP", GetThirdpartyDir() + "assimp/lib/assimp.lib") + IncDirectory("ASSIMP", GetThirdpartyDir() + "assimp/include/assimp") if (PkgSkip("SQUISH")==0): if GetOptimize() <= 2: LibName("SQUISH", GetThirdpartyDir() + "squish/lib/squishd.lib") @@ -2875,7 +2881,8 @@ if tp_dir is not None: CopyFile(GetOutputDir() + "/" + base, tp_lib) if GetTarget() == 'windows': - CopyAllFiles(GetOutputDir() + "/bin/", tp_dir + "extras/bin/") + if os.path.isdir(os.path.join(tp_dir, "extras", "bin")): + CopyAllFiles(GetOutputDir() + "/bin/", tp_dir + "extras/bin/") if not PkgSkip("PYTHON") and not RTDIST: # We need to copy the Python DLL to the bin directory for now. @@ -5575,7 +5582,7 @@ if not PkgSkip("PANDATOOL") and not PkgSkip("ASSIMP"): TargetAdd('p3assimp_composite1.obj', opts=OPTS, input='p3assimp_composite1.cxx') TargetAdd('libp3assimp.dll', input='p3assimp_composite1.obj') TargetAdd('libp3assimp.dll', input=COMMON_PANDA_LIBS) - TargetAdd('libp3assimp.dll', opts=OPTS) + TargetAdd('libp3assimp.dll', opts=OPTS+['ZLIB']) # # DIRECTORY: pandatool/src/daeprogs/ diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 20fac66d52..ab1ec01feb 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -2384,6 +2384,8 @@ def SetupVisualStudioEnviron(): os.environ["VCINSTALLDIR"] = SDK["VISUALSTUDIO"] + "VC" os.environ["WindowsSdkDir"] = SDK["MSPLATFORM"] + winsdk_ver = SDK["MSPLATFORM_VERSION"] + # Determine the directories to look in based on the architecture. arch = GetTargetArch() bindir = "" @@ -2399,9 +2401,16 @@ def SetupVisualStudioEnviron(): # Special version of the tools that run on x86. bindir = 'x86_' + bindir - binpath = SDK["VISUALSTUDIO"] + "VC\\bin\\" + bindir - if not os.path.isdir(binpath): - exit("Couldn't find compilers in %s. You may need to install the Windows SDK 7.1 and the Visual C++ 2010 SP1 Compiler Update for Windows SDK 7.1." % binpath) + vc_binpath = SDK["VISUALSTUDIO"] + "VC\\bin" + binpath = os.path.join(vc_binpath, bindir) + if not os.path.isfile(binpath + "\\cl.exe"): + # Try the x86 tools, those should work just as well. + if arch == 'x64' and os.path.isfile(vc_binpath + "\\x86_amd64\\cl.exe"): + binpath = "{0}\\x86_amd64;{0}".format(vc_binpath) + elif winsdk_ver.startswith('10.'): + exit("Couldn't find compilers in %s. You may need to install the Windows SDK 7.1 and the Visual C++ 2010 SP1 Compiler Update for Windows SDK 7.1." % binpath) + else: + exit("Couldn't find compilers in %s." % binpath) AddToPathEnv("PATH", binpath) AddToPathEnv("PATH", SDK["VISUALSTUDIO"] + "Common7\\IDE") diff --git a/panda/src/dxgsg9/config_dxgsg9.cxx b/panda/src/dxgsg9/config_dxgsg9.cxx index 037d8dd919..64831d08c9 100644 --- a/panda/src/dxgsg9/config_dxgsg9.cxx +++ b/panda/src/dxgsg9/config_dxgsg9.cxx @@ -265,8 +265,3 @@ init_libdxgsg9() { PandaSystem *ps = PandaSystem::get_global_ptr(); ps->add_system("DirectX9"); } - -// Necessary to allow use of dxerr from MSVC 2015 -#if _MSC_VER >= 1900 -int (WINAPIV * __vsnprintf)(char *, size_t, const char*, va_list) = _vsnprintf; -#endif diff --git a/panda/src/dxgsg9/dxGeomMunger9.cxx b/panda/src/dxgsg9/dxGeomMunger9.cxx index aaadacb119..44729ae0cd 100644 --- a/panda/src/dxgsg9/dxGeomMunger9.cxx +++ b/panda/src/dxgsg9/dxGeomMunger9.cxx @@ -164,7 +164,7 @@ munge_format_impl(const GeomVertexFormat *orig, // Now go through the remaining arrays and make sure they are tightly // packed. If not, repack them. - for (int i = 0; i < new_format->get_num_arrays(); ++i) { + for (size_t i = 0; i < new_format->get_num_arrays(); ++i) { CPT(GeomVertexArrayFormat) orig_a = new_format->get_array(i); if (orig_a->count_unused_space() != 0) { PT(GeomVertexArrayFormat) new_a = new GeomVertexArrayFormat; @@ -267,7 +267,7 @@ premunge_format_impl(const GeomVertexFormat *orig) { // Now go through the remaining arrays and make sure they are tightly // packed. If not, repack them. - for (int i = 0; i < new_format->get_num_arrays(); ++i) { + for (size_t i = 0; i < new_format->get_num_arrays(); ++i) { CPT(GeomVertexArrayFormat) orig_a = new_format->get_array(i); if (orig_a->count_unused_space() != 0) { PT(GeomVertexArrayFormat) new_a = new GeomVertexArrayFormat; diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 4b5efc2b8c..2f47afe6cf 100644 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -863,7 +863,7 @@ prepare_display_region(DisplayRegionPipelineReader *dr) { dr->get_region_pixels_i(l, u, w, h); // Create the viewport - D3DVIEWPORT9 vp = { l, u, w, h, 0.0f, 1.0f }; + D3DVIEWPORT9 vp = { (DWORD)l, (DWORD)u, (DWORD)w, (DWORD)h, 0.0f, 1.0f }; _current_viewport = vp; HRESULT hr = _d3d_device->SetViewport(&_current_viewport); if (FAILED(hr)) { @@ -1185,7 +1185,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, const TransformTable *table = data_reader->get_transform_table(); if (table != (TransformTable *)NULL) { - for (int i = 0; i < table->get_num_transforms(); i++) { + for (size_t i = 0; i < table->get_num_transforms(); ++i) { LMatrix4 mat; table->get_transform(i)->mult_matrix(mat, _internal_transform->get_mat()); const D3DMATRIX *d3d_mat = (const D3DMATRIX *)mat.get_data(); diff --git a/panda/src/dxgsg9/dxIndexBufferContext9.cxx b/panda/src/dxgsg9/dxIndexBufferContext9.cxx index fada562e55..a29dff17b3 100644 --- a/panda/src/dxgsg9/dxIndexBufferContext9.cxx +++ b/panda/src/dxgsg9/dxIndexBufferContext9.cxx @@ -168,7 +168,7 @@ upload_data(const GeomPrimitivePipelineReader *reader, bool force) { if (data_pointer == NULL) { return false; } - int data_size = reader->get_data_size_bytes(); + size_t data_size = (size_t)reader->get_data_size_bytes(); if (reader->get_index_type() == GeomEnums::NT_uint8) { // We widen 8-bits indices to 16-bits. diff --git a/pandatool/src/maxegg/maxEgg.rc b/pandatool/src/maxegg/maxEgg.rc index 161b0ec456..a037734218 100644 --- a/pandatool/src/maxegg/maxEgg.rc +++ b/pandatool/src/maxegg/maxEgg.rc @@ -7,7 +7,8 @@ // // Generated from the TEXTINCLUDE 2 resource. // -#include "afxres.h" +#include "WinResrc.h" +#define IDC_STATIC -1 ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS diff --git a/pandatool/src/maxprogs/maxImportRes.rc b/pandatool/src/maxprogs/maxImportRes.rc index a8041e52d7..b4f2e778e9 100644 --- a/pandatool/src/maxprogs/maxImportRes.rc +++ b/pandatool/src/maxprogs/maxImportRes.rc @@ -7,8 +7,8 @@ // // Generated from the TEXTINCLUDE 2 resource. // -#include "afxres.h" - +#include "WinResrc.h" +#define IDC_STATIC -1 //////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS From de745ed47350b3b7ed3e5a9d73578d1d7cc1946d Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 7 Apr 2017 13:42:43 +0200 Subject: [PATCH 091/254] readme: update with helpful notes about installing and wheels --- README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c1cf59a4df..b87fd4ca10 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,23 @@ resources. If you get stuck, ask for help from our active Panda3D is licensed under the Modified BSD License. See the LICENSE file for more details. +Installing Panda3D +================== + +By far, the easiest way to install the latest development build of Panda3D +into an existing Python installation is using the following command: + +```bash +pip install --pre --extra-index-url https://archive.panda3d.org/ panda3d +``` + +If you prefer to install the full SDK with all tools, the latest development +builds can be obtained from this page: + +https://www.panda3d.org/download.php?sdk&version=devel + +These are automatically kept up-to-date with the latest GitHub version of Panda. + Building Panda3D ================ @@ -64,7 +81,7 @@ for you to install, depending on your distribution). The following command illustrates how to build Panda3D with some common options: ```bash -python2.7 makepanda/makepanda.py --everything --installer --no-egl --no-gles --no-gles2 +python makepanda/makepanda.py --everything --installer --no-egl --no-gles --no-gles2 --no-opencv ``` You will probably see some warnings saying that it's unable to find several @@ -93,6 +110,9 @@ may have to use the installpanda.py script instead, which will directly copy the files into the appropriate locations on your computer. You may have to run the `ldconfig` tool in order to update your library cache after installing Panda3D. +Alternatively, you can add the `--wheel` option, which will produce a .whl +file that can be installed into a Python installation using `pip`. + macOS ----- From 2669cc87104f502f02438217bdd5a34bfab8519c Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 7 Apr 2017 13:44:37 +0200 Subject: [PATCH 092/254] Remove unused macros --- dtool/src/dtoolbase/dtoolbase.h | 12 ------------ dtool/src/prc/pnotify.h | 9 --------- 2 files changed, 21 deletions(-) diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index 965069614e..ae74fd644f 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -58,18 +58,6 @@ #pragma warning (disable : 4267) /* C4577: 'noexcept' used with no exception handling mode specified */ #pragma warning (disable : 4577) - -#if _MSC_VER >= 1300 - #if _MSC_VER >= 1310 - #define USING_MSVC7_1 -// #pragma message("VC 7.1") - #else -// #pragma message("VC 7.0") - #endif -#define USING_MSVC7 -#else -// #pragma message("VC 6.0") -#endif #endif /* WIN32_VC */ #ifndef __has_builtin diff --git a/dtool/src/prc/pnotify.h b/dtool/src/prc/pnotify.h index 414b97d2a4..e51022c28a 100644 --- a/dtool/src/prc/pnotify.h +++ b/dtool/src/prc/pnotify.h @@ -152,8 +152,6 @@ private: #define nassert_raise(message) Notify::write_string(message) -#define enter_debugger_if(condition) ((void)0) - #else // NDEBUG #define nassertr(condition, return_value) \ @@ -183,13 +181,6 @@ private: #define nassert_raise(message) Notify::ptr()->assert_failure(message, __LINE__, __FILE__) -#define enter_debugger_if(condition) \ - if (_nassert_check(condition)) { \ - Notify::ptr()->assert_failure(#condition, __LINE__, __FILE__); \ - __asm { int 3 } \ - } - - #endif // NDEBUG #if __cplusplus >= 201103 From a175ad6a82b416cca997a0e1ec7a6d5953884bb5 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 7 Apr 2017 13:56:47 +0200 Subject: [PATCH 093/254] interrogate: fix compile error with default values that call scoped functions --- dtool/src/cppparser/cppExpression.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dtool/src/cppparser/cppExpression.cxx b/dtool/src/cppparser/cppExpression.cxx index 0dff4f64b8..adbbaea14e 100644 --- a/dtool/src/cppparser/cppExpression.cxx +++ b/dtool/src/cppparser/cppExpression.cxx @@ -1658,7 +1658,12 @@ output(ostream &out, int indent_level, CPPScope *scope, bool) const { break; case T_function: - out << _u._fgroup->_name; + // Pick any instance; they all have the same name anyway. + if (!_u._fgroup->_instances.empty() && _u._fgroup->_instances[0]->_ident != NULL) { + _u._fgroup->_instances[0]->_ident->output(out, scope); + } else { + out << _u._fgroup->_name; + } break; case T_unknown_ident: From fa1b656961feb0b0323ea46898eed7c450178813 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 9 Apr 2017 22:14:20 +0200 Subject: [PATCH 094/254] glgsg: fix get_host() of GL FBO. Fixes LP 1672560 shadow bug --- panda/src/glstuff/glGraphicsBuffer_src.cxx | 10 ++++++++++ panda/src/glstuff/glGraphicsBuffer_src.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index a4daaf3931..e76f8fccb9 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -1501,6 +1501,16 @@ open_buffer() { return true; } +/** + * This is normally called only from within make_texture_buffer(). When + * called on a ParasiteBuffer, it returns the host of that buffer; but when + * called on some other buffer, it returns the buffer itself. + */ +GraphicsOutput *CLP(GraphicsBuffer):: +get_host() { + return _host; +} + /** * Closes the buffer right now. Called from the window thread. */ diff --git a/panda/src/glstuff/glGraphicsBuffer_src.h b/panda/src/glstuff/glGraphicsBuffer_src.h index 9f99850a7f..d119148247 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.h +++ b/panda/src/glstuff/glGraphicsBuffer_src.h @@ -77,6 +77,8 @@ public: void unregister_shared_depth_buffer(GraphicsOutput *graphics_output); protected: + virtual GraphicsOutput *get_host(); + virtual void close_buffer(); virtual bool open_buffer(); From e67ebd80cd0d29dc18f4829907f7781c195d487f Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 14 Apr 2017 19:37:18 +0200 Subject: [PATCH 095/254] glgsg: deal with false negatives with feature checks on Intel --- panda/src/glstuff/glGraphicsStateGuardian_src.cxx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index b147c9182e..e1a250df9a 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -1139,7 +1139,7 @@ reset() { _supports_multisample = false; #else _supports_multisample = - has_extension("GL_ARB_multisample") || is_at_least_gl_version(1, 3); + is_at_least_gl_version(1, 3) || has_extension("GL_ARB_multisample"); #endif #ifdef OPENGLES_1 @@ -1305,7 +1305,7 @@ reset() { if (gl_support_shadow_filter && _supports_depth_texture && (is_at_least_gl_version(1, 4) || has_extension("GL_ARB_shadow")) && - has_extension("GL_ARB_fragment_program_shadow")) { + (is_at_least_gl_version(2, 0) || has_extension("GL_ARB_fragment_program_shadow"))) { _supports_shadow_filter = true; } #endif @@ -2550,8 +2550,8 @@ reset() { _border_clamp = _edge_clamp; #ifndef OPENGLES if (gl_support_clamp_to_border && - (has_extension("GL_ARB_texture_border_clamp") || - is_at_least_gl_version(1, 3))) { + (is_at_least_gl_version(1, 3) || + has_extension("GL_ARB_texture_border_clamp"))) { _border_clamp = GL_CLAMP_TO_BORDER; } #endif @@ -2580,6 +2580,11 @@ reset() { _mirror_clamp = GL_MIRROR_CLAMP_EXT; _mirror_edge_clamp = GL_MIRROR_CLAMP_TO_EDGE_EXT; _mirror_border_clamp = GL_MIRROR_CLAMP_TO_BORDER_EXT; + + } else if (is_at_least_gl_version(4, 4) || + has_extension("GL_ARB_texture_mirror_clamp_to_edge")) { + _mirror_clamp = GL_MIRROR_CLAMP_TO_EDGE; + _mirror_edge_clamp = GL_MIRROR_CLAMP_TO_EDGE; } #endif From 353ccfebc1ef9fd7b85f7fe4d1183a070731bc35 Mon Sep 17 00:00:00 2001 From: wezu Date: Sat, 22 Apr 2017 13:39:14 +0200 Subject: [PATCH 096/254] Remove print() from Messenger.find() and Messenger.findAll() If one needs to use find() or findAll() not for debugging purposes (like for getting the function or arguments for some binding), then the print functions in these methods are really unwelcome. find() is the only nice way to get this info (other then de-name-mangling __callbacks) --- direct/src/showbase/Messenger.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/direct/src/showbase/Messenger.py b/direct/src/showbase/Messenger.py index 20c02ce17a..92d2014503 100644 --- a/direct/src/showbase/Messenger.py +++ b/direct/src/showbase/Messenger.py @@ -531,7 +531,6 @@ class Messenger: keys.sort() for event in keys: if repr(event).find(needle) >= 0: - print(self.__eventRepr(event)) return {event: self.__callbacks[event]} def findAll(self, needle, limit=None): @@ -545,7 +544,6 @@ class Messenger: keys.sort() for event in keys: if repr(event).find(needle) >= 0: - print(self.__eventRepr(event)) matches[event] = self.__callbacks[event] # if the limit is not None, decrement and # check for break: From 160f652d5856bd854ebfb6e97f05fc44b9846ee4 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 17 Apr 2017 12:39:02 +0200 Subject: [PATCH 097/254] text: use HarfBuzz for text shaping; support right-to-left text --- direct/src/gui/OnscreenText.py | 17 +++- dtool/src/parser-inc/ft2build.h | 1 + makepanda/makepanda.py | 11 ++- panda/src/text/config_text.cxx | 8 +- panda/src/text/config_text.h | 1 + panda/src/text/dynamicTextFont.cxx | 70 +++++++++++++++- panda/src/text/dynamicTextFont.h | 7 ++ panda/src/text/textAssembler.cxx | 124 ++++++++++++++++++++++++++++- panda/src/text/textAssembler.h | 4 + panda/src/text/textProperties.I | 36 +++++++++ panda/src/text/textProperties.cxx | 60 +++++++++----- panda/src/text/textProperties.h | 14 ++++ 12 files changed, 325 insertions(+), 28 deletions(-) diff --git a/direct/src/gui/OnscreenText.py b/direct/src/gui/OnscreenText.py index 1af714c44a..c3accf191d 100644 --- a/direct/src/gui/OnscreenText.py +++ b/direct/src/gui/OnscreenText.py @@ -35,7 +35,8 @@ class OnscreenText(NodePath): font = None, parent = None, sort = 0, - mayChange = True): + mayChange = True, + direction = None): """ Make a text node from string, put it into the 2d sg and set it up with all the indicated parameters. @@ -95,6 +96,9 @@ class OnscreenText(NodePath): mayChange: pass true if the text or its properties may need to be changed at runtime, false if it is static once created (which leads to better memory optimization). + + direction: this can be set to 'ltr' or 'rtl' to override the + direction of the text. """ if parent == None: parent = aspect2d @@ -192,6 +196,17 @@ class OnscreenText(NodePath): textNode.setFrameColor(frame[0], frame[1], frame[2], frame[3]) textNode.setFrameAsMargin(0.1, 0.1, 0.1, 0.1) + if direction is not None: + if isinstance(direction, str): + direction = direction.lower() + if direction == 'rtl': + direction = TextProperties.D_rtl + elif direction == 'ltr': + direction = TextProperties.D_ltr + else: + raise ValueError('invalid direction') + textNode.setDirection(direction) + # Create a transform for the text for our scale and position. # We'd rather do it here, on the text itself, rather than on # our NodePath, so we have one fewer transforms in the scene diff --git a/dtool/src/parser-inc/ft2build.h b/dtool/src/parser-inc/ft2build.h index 6b4184a467..80966f984d 100644 --- a/dtool/src/parser-inc/ft2build.h +++ b/dtool/src/parser-inc/ft2build.h @@ -29,6 +29,7 @@ class FT_Library; class FT_Bitmap; class FT_Vector; class FT_Span; +class FT_Outline; #endif diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index af00b2ea3b..66b3f57545 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -80,8 +80,9 @@ PkgListSet(["PYTHON", "DIRECT", # Python support "VORBIS", "FFMPEG", "SWSCALE", "SWRESAMPLE", # Audio decoding "ODE", "PHYSX", "BULLET", "PANDAPHYSICS", # Physics "SPEEDTREE", # SpeedTree - "ZLIB", "PNG", "JPEG", "TIFF", "OPENEXR", "SQUISH", "FREETYPE", # 2D Formats support + "ZLIB", "PNG", "JPEG", "TIFF", "OPENEXR", "SQUISH", # 2D Formats support ] + MAYAVERSIONS + MAXVERSIONS + [ "FCOLLADA", "ASSIMP", "EGG", # 3D Formats support + "FREETYPE", "HARFBUZZ", # Text rendering "VRPN", "OPENSSL", # Transport "FFTW", # Algorithm helpers "ARTOOLKIT", "OPENCV", "DIRECTCAM", "VISION", # Augmented Reality @@ -638,6 +639,7 @@ if (COMPILER == "MSVC"): if (PkgSkip("NVIDIACG")==0): LibName("CGDX9", GetThirdpartyDir() + "nvidiacg/lib/cgD3D9.lib") if (PkgSkip("NVIDIACG")==0): LibName("NVIDIACG", GetThirdpartyDir() + "nvidiacg/lib/cg.lib") if (PkgSkip("FREETYPE")==0): LibName("FREETYPE", GetThirdpartyDir() + "freetype/lib/freetype.lib") + if (PkgSkip("HARFBUZZ")==0): LibName("HARFBUZZ", GetThirdpartyDir() + "harfbuzz/lib/harfbuzz.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("ARTOOLKIT")==0):LibName("ARTOOLKIT",GetThirdpartyDir() + "artoolkit/lib/libAR.lib") @@ -803,6 +805,7 @@ if (COMPILER=="GCC"): SmartPkgEnable("FFTW", "", ("rfftw", "fftw"), ("fftw.h", "rfftw.h")) SmartPkgEnable("FMODEX", "", ("fmodex"), ("fmodex", "fmodex/fmod.h")) SmartPkgEnable("FREETYPE", "freetype2", ("freetype"), ("freetype2", "freetype2/freetype/freetype.h")) + SmartPkgEnable("HARFBUZZ", "harfbuzz", ("harfbuzz"), ("harfbuzz", "harfbuzz/hb-ft.h")) SmartPkgEnable("GL", "gl", ("GL"), ("GL/gl.h"), framework = "OpenGL") SmartPkgEnable("GLES", "glesv1_cm", ("GLESv1_CM"), ("GLES/gl.h"), framework = "OpenGLES") SmartPkgEnable("GLES2", "glesv2", ("GLESv2"), ("GLES2/gl2.h")) #framework = "OpenGLES"? @@ -3806,7 +3809,9 @@ if (PkgSkip("FREETYPE")==0 and not RUNTIME): # if (not RUNTIME): - OPTS=['DIR:panda/src/text', 'BUILDING:PANDA', 'ZLIB', 'FREETYPE'] + DefSymbol("HARFBUZZ", "HAVE_HARFBUZZ") + + OPTS=['DIR:panda/src/text', 'BUILDING:PANDA', 'ZLIB', 'FREETYPE', 'HARFBUZZ'] TargetAdd('p3text_composite1.obj', opts=OPTS, input='p3text_composite1.cxx') TargetAdd('p3text_composite2.obj', opts=OPTS, input='p3text_composite2.cxx') @@ -3956,7 +3961,7 @@ if (not RUNTIME): # if (not RUNTIME): - OPTS=['DIR:panda/metalibs/panda', 'BUILDING:PANDA', 'JPEG', 'PNG', + OPTS=['DIR:panda/metalibs/panda', 'BUILDING:PANDA', 'JPEG', 'PNG', 'HARFBUZZ', 'TIFF', 'OPENEXR', 'ZLIB', 'OPENSSL', 'FREETYPE', 'FFTW', 'ADVAPI', 'WINSOCK2', 'SQUISH', 'NVIDIACG', 'VORBIS', 'WINUSER', 'WINMM', 'WINGDI', 'IPHLPAPI'] diff --git a/panda/src/text/config_text.cxx b/panda/src/text/config_text.cxx index 36ef375afe..9475eabf55 100644 --- a/panda/src/text/config_text.cxx +++ b/panda/src/text/config_text.cxx @@ -52,7 +52,13 @@ ConfigVariableBool text_kerning ("text-kerning", false, PRC_DESC("Set this true to enable kerning when the font provides kerning " "tables. This can result in more aesthetically pleasing spacing " - "between individual glyphs.")); + "between individual glyphs. Has no effect when text-use-harfbuzz " + "is true, since HarfBuzz offers superior kerning support.")); + +ConfigVariableBool text_use_harfbuzz +("text-use-harfbuzz", false, + PRC_DESC("Set this true to enable HarfBuzz support, which offers superior " + "text shaping and better support for non-Latin text.")); ConfigVariableInt text_anisotropic_degree ("text-anisotropic-degree", 1, diff --git a/panda/src/text/config_text.h b/panda/src/text/config_text.h index 4e5ca1a6ed..895072fdf6 100644 --- a/panda/src/text/config_text.h +++ b/panda/src/text/config_text.h @@ -31,6 +31,7 @@ NotifyCategoryDecl(text, EXPCL_PANDA_TEXT, EXPTP_PANDA_TEXT); extern ConfigVariableBool text_flatten; extern ConfigVariableBool text_dynamic_merge; extern ConfigVariableBool text_kerning; +extern ConfigVariableBool text_use_harfbuzz; extern ConfigVariableInt text_anisotropic_degree; extern ConfigVariableInt text_texture_margin; extern ConfigVariableDouble text_poly_margin; diff --git a/panda/src/text/dynamicTextFont.cxx b/panda/src/text/dynamicTextFont.cxx index f066e07c35..3a349a6d69 100644 --- a/panda/src/text/dynamicTextFont.cxx +++ b/panda/src/text/dynamicTextFont.cxx @@ -44,6 +44,10 @@ #include "textureAttrib.h" #include "transparencyAttrib.h" +#ifdef HAVE_HARFBUZZ +#include +#endif + TypeHandle DynamicTextFont::_type_handle; @@ -114,7 +118,8 @@ DynamicTextFont(const DynamicTextFont ©) : _has_outline(copy._has_outline), _tex_format(copy._tex_format), _needs_image_processing(copy._needs_image_processing), - _preferred_page(0) + _preferred_page(0), + _hb_font(nullptr) { } @@ -123,6 +128,11 @@ DynamicTextFont(const DynamicTextFont ©) : */ DynamicTextFont:: ~DynamicTextFont() { +#ifdef HAVE_HARFBUZZ + if (_hb_font != nullptr) { + hb_font_destroy(_hb_font); + } +#endif } /** @@ -203,6 +213,13 @@ clear() { _cache.clear(); _pages.clear(); _empty_glyphs.clear(); + +#ifdef HAVE_HARFBUZZ + if (_hb_font != nullptr) { + hb_font_destroy(_hb_font); + _hb_font = nullptr; + } +#endif } /** @@ -305,6 +322,55 @@ get_kerning(int first, int second) const { return delta.x / (_font_pixels_per_unit * 64); } +/** + * Like get_glyph, but uses a glyph index. + */ +bool DynamicTextFont:: +get_glyph_by_index(int character, int glyph_index, CPT(TextGlyph) &glyph) { + if (!_is_valid) { + glyph = nullptr; + return false; + } + + Cache::iterator ci = _cache.find(glyph_index); + if (ci != _cache.end()) { + glyph = (*ci).second; + } else { + FT_Face face = acquire_face(); + glyph = make_glyph(character, face, glyph_index); + _cache.insert(Cache::value_type(glyph_index, glyph.p())); + release_face(face); + } + + if (glyph.is_null()) { + glyph = get_invalid_glyph(); + return false; + } + + return true; +} + +/** + * If Panda was compiled with HarfBuzz enabled, returns a HarfBuzz font for + * this font. + */ +hb_font_t *DynamicTextFont:: +get_hb_font() const { +#ifdef HAVE_HARFBUZZ + if (_hb_font != nullptr) { + return _hb_font; + } + + FT_Face face = acquire_face(); + _hb_font = hb_ft_font_create(face, nullptr); + release_face(face); + + return _hb_font; +#else + return nullptr; +#endif +} + /** * Called from both constructors to set up some initial values. */ @@ -328,6 +394,8 @@ initialize() { _winding_order = WO_default; _preferred_page = 0; + + _hb_font = nullptr; } /** diff --git a/panda/src/text/dynamicTextFont.h b/panda/src/text/dynamicTextFont.h index 26433deef6..775fa6a450 100644 --- a/panda/src/text/dynamicTextFont.h +++ b/panda/src/text/dynamicTextFont.h @@ -31,6 +31,8 @@ class NurbsCurveResult; +typedef struct hb_font_t hb_font_t; + /** * A DynamicTextFont is a special TextFont object that rasterizes its glyphs * from a standard font file (e.g. a TTF file) on the fly. It requires the @@ -125,6 +127,9 @@ public: virtual bool get_glyph(int character, CPT(TextGlyph) &glyph); virtual PN_stdfloat get_kerning(int first, int second) const; + bool get_glyph_by_index(int character, int glyph_index, CPT(TextGlyph) &glyph); + hb_font_t *get_hb_font() const; + private: void initialize(); void update_filters(); @@ -171,6 +176,8 @@ private: typedef pvector< PT(TextGlyph) > EmptyGlyphs; EmptyGlyphs _empty_glyphs; + mutable hb_font_t *_hb_font; + public: static TypeHandle get_class_type() { return _type_handle; diff --git a/panda/src/text/textAssembler.cxx b/panda/src/text/textAssembler.cxx index 7b8470116b..745488e7c1 100644 --- a/panda/src/text/textAssembler.cxx +++ b/panda/src/text/textAssembler.cxx @@ -31,10 +31,15 @@ #include "geomVertexData.h" #include "geom.h" #include "modelNode.h" +#include "dynamicTextFont.h" #include #include // for sprintf +#ifdef HAVE_HARFBUZZ +#include +#endif + // This is the factor by which CT_small scales the character down. static const PN_stdfloat small_accent_scale = 0.6f; @@ -1408,6 +1413,12 @@ assemble_row(TextAssembler::TextRow &row, PN_stdfloat underscore_start = 0.0f; const TextProperties *underscore_properties = NULL; + const ComputedProperties *prev_cprops; + +#ifdef HAVE_HARFBUZZ + hb_buffer_t *harfbuff = nullptr; +#endif + TextString::const_iterator si; for (si = row._string.begin(); si != row._string.end(); ++si) { const TextCharacter &tch = (*si); @@ -1448,10 +1459,29 @@ assemble_row(TextAssembler::TextRow &row, LVecBase4 frame = graphic->get_frame(); line_height = max(line_height, frame[3] - frame[2]); } else { - // [fabius] this is not the right place to calc line height (see below) - // line_height = max(line_height, font->get_line_height()); + line_height = max(line_height, font->get_line_height() * properties->get_glyph_scale() * properties->get_text_scale()); } +#ifdef HAVE_HARFBUZZ + if (tch._cprops != prev_cprops || graphic != nullptr) { + if (harfbuff != nullptr && hb_buffer_get_length(harfbuff) > 0) { + // Shape the buffer accumulated so far. + shape_buffer(harfbuff, placed_glyphs, xpos, prev_cprops->_properties); + hb_buffer_reset(harfbuff); + + } else if (harfbuff == nullptr && text_use_harfbuzz && + font->is_of_type(DynamicTextFont::get_class_type())) { + harfbuff = hb_buffer_create(); + } + prev_cprops = tch._cprops; + } + + if (graphic == nullptr && harfbuff != nullptr) { + hb_buffer_add(harfbuff, character, character); + continue; + } +#endif + if (character == ' ') { // A space is a special case. xpos += properties->get_glyph_scale() * properties->get_text_scale() * font->get_space_advance(); @@ -1613,10 +1643,16 @@ assemble_row(TextAssembler::TextRow &row, } xpos += advance * glyph_scale; - line_height = max(line_height, font->get_line_height() * glyph_scale); } } +#ifdef HAVE_HARFBUZZ + if (harfbuff != nullptr && hb_buffer_get_length(harfbuff) > 0) { + shape_buffer(harfbuff, placed_glyphs, xpos, prev_cprops->_properties); + } + hb_buffer_destroy(harfbuff); +#endif + if (underscore && underscore_start != xpos) { draw_underscore(placed_glyphs, underscore_start, xpos, underscore_properties); @@ -1640,6 +1676,88 @@ assemble_row(TextAssembler::TextRow &row, } } +/** + * Places the glyphs collected from a HarfBuzz buffer. + */ +void TextAssembler:: +shape_buffer(hb_buffer_t *buf, PlacedGlyphs &placed_glyphs, PN_stdfloat &xpos, + const TextProperties &properties) { + +#ifdef HAVE_HARFBUZZ + // If we did not specify a text direction, harfbuzz will guess it based on + // the script we are using. + hb_direction_t direction = HB_DIRECTION_INVALID; + if (properties.has_direction()) { + switch (properties.get_direction()) { + case TextProperties::D_ltr: + direction = HB_DIRECTION_LTR; + break; + case TextProperties::D_rtl: + direction = HB_DIRECTION_RTL; + break; + } + } + hb_buffer_set_direction(buf, direction); + hb_buffer_guess_segment_properties(buf); + + DynamicTextFont *font = DCAST(DynamicTextFont, properties.get_font()); + hb_font_t *hb_font = font->get_hb_font(); + hb_shape(hb_font, buf, NULL, 0); + + PN_stdfloat glyph_scale = properties.get_glyph_scale() * properties.get_text_scale(); + PN_stdfloat scale = glyph_scale / (font->get_pixels_per_unit() * font->get_scale_factor() * 64.0); + + unsigned int glyph_count; + hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(buf, &glyph_count); + hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count); + + for (unsigned int i = 0; i < glyph_count; ++i) { + int character = glyph_info[i].cluster; + int glyph_index = glyph_info[i].codepoint; + + CPT(TextGlyph) glyph; + if (!font->get_glyph_by_index(character, glyph_index, glyph)) { + char buffer[512]; + sprintf(buffer, "U+%04x", character); + text_cat.warning() + << "No definition in " << font->get_name() + << " for character " << buffer; + if (character < 128 && isprint((unsigned int)character)) { + text_cat.warning(false) + << " ('" << (char)character << "')"; + } + text_cat.warning(false) + << "\n"; + } + + PN_stdfloat advance = glyph_pos[i].x_advance * scale; + if (glyph->is_whitespace()) { + // A space is a special case. + xpos += advance; + continue; + } + + PN_stdfloat x_offset = glyph_pos[i].x_offset * scale; + PN_stdfloat y_offset = glyph_pos[i].y_offset * scale; + + // Build up a GlyphPlacement, indicating all of the Geoms that go into + // this character. Normally, there is only one Geom per character, but + // it may involve multiple Geoms if we need to add cheesy accents or + // ligatures. + GlyphPlacement placement; + placement._glyph = move(glyph); + placement._scale = glyph_scale; + placement._xpos = xpos + x_offset; + placement._ypos = properties.get_glyph_shift() + y_offset; + placement._slant = properties.get_slant(); + placement._properties = &properties; + placed_glyphs.push_back(placement); + + xpos += advance; + } +#endif +} + /** * Creates the geometry to render the underscore line for the indicated range * of glyphs in this row. diff --git a/panda/src/text/textAssembler.h b/panda/src/text/textAssembler.h index 64b4c7ef03..3b45d729b1 100644 --- a/panda/src/text/textAssembler.h +++ b/panda/src/text/textAssembler.h @@ -28,6 +28,7 @@ #include "pmap.h" +typedef struct hb_buffer_t hb_buffer_t; class TextEncoder; class TextGraphic; @@ -247,6 +248,9 @@ private: PN_stdfloat &row_width, PN_stdfloat &line_height, TextProperties::Alignment &align, PN_stdfloat &wordwrap); + void shape_buffer(hb_buffer_t *buf, PlacedGlyphs &glyphs, PN_stdfloat &xpos, + const TextProperties &properties); + // These interfaces are for implementing cheesy accent marks and ligatures // when the font doesn't support them. enum CheesyPosition { diff --git a/panda/src/text/textProperties.I b/panda/src/text/textProperties.I index 4e73399be1..e3e296c95f 100644 --- a/panda/src/text/textProperties.I +++ b/panda/src/text/textProperties.I @@ -797,3 +797,39 @@ INLINE PN_stdfloat TextProperties:: get_text_scale() const { return _text_scale; } + +/** + * Specifies the text direction. If none is specified, it will be guessed + * based on the contents of the string. + */ +INLINE void TextProperties:: +set_direction(Direction direction) { + _direction = direction; + _specified |= F_has_direction; +} + +/** + * Clears the text direction setting. If no text direction is specified, it + * will be guessed based on the contents of the string. + */ +INLINE void TextProperties:: +clear_direction() { + _specified &= ~F_has_direction; + _direction = D_ltr; +} + +/** + * + */ +INLINE bool TextProperties:: +has_direction() const { + return (_specified & F_has_direction) != 0; +} + +/** + * Returns the direction of the text as specified by set_direction(). + */ +INLINE TextProperties::Direction TextProperties:: +get_direction() const { + return _direction; +} diff --git a/panda/src/text/textProperties.cxx b/panda/src/text/textProperties.cxx index 94b02ffc11..341f2385a3 100644 --- a/panda/src/text/textProperties.cxx +++ b/panda/src/text/textProperties.cxx @@ -31,26 +31,27 @@ TypeHandle TextProperties::_type_handle; * */ TextProperties:: -TextProperties() { - _specified = 0; +TextProperties() : + _specified(0), - _small_caps = text_small_caps; - _small_caps_scale = text_small_caps_scale; - _slant = 0.0f; - _underscore = false; - _underscore_height = 0.0f; - _align = A_left; - _indent_width = 0.0f; - _wordwrap_width = 0.0f; - _preserve_trailing_whitespace = false; - _text_color.set(1.0f, 1.0f, 1.0f, 1.0f); - _shadow_color.set(0.0f, 0.0f, 0.0f, 1.0f); - _shadow_offset.set(0.0f, 0.0f); - _draw_order = 1; - _tab_width = text_tab_width; - _glyph_scale = 1.0f; - _glyph_shift = 0.0f; - _text_scale = 1.0f; + _small_caps(text_small_caps), + _small_caps_scale(text_small_caps_scale), + _slant(0.0f), + _underscore(false), + _underscore_height(0.0f), + _align(A_left), + _indent_width(0.0f), + _wordwrap_width(0.0f), + _preserve_trailing_whitespace(false), + _text_color(1.0f, 1.0f, 1.0f, 1.0f), + _shadow_color(0.0f, 0.0f, 0.0f, 1.0f), + _shadow_offset(0.0f, 0.0f), + _draw_order(1), + _tab_width(text_tab_width), + _glyph_scale(1.0f), + _glyph_shift(0.0f), + _text_scale(1.0f), + _direction(D_rtl) { } /** @@ -89,6 +90,7 @@ operator = (const TextProperties ©) { _glyph_scale = copy._glyph_scale; _glyph_shift = copy._glyph_shift; _text_scale = copy._text_scale; + _direction = copy._direction; _text_state.clear(); _shadow_state.clear(); @@ -163,6 +165,9 @@ operator == (const TextProperties &other) const { if ((_specified & F_has_text_scale) && _text_scale != other._text_scale) { return false; } + if ((_specified & F_has_direction) && _direction != other._direction) { + return false; + } return true; } @@ -238,6 +243,9 @@ add_properties(const TextProperties &other) { if (other.has_text_scale()) { set_text_scale(other.get_text_scale()); } + if (other.has_direction()) { + set_direction(other.get_direction()); + } } @@ -361,6 +369,20 @@ write(ostream &out, int indent_level) const { indent(out, indent_level) << "text scale is " << get_text_scale() << "\n"; } + + if (has_direction()) { + indent(out, indent_level) + << "direction is "; + switch (get_direction()) { + case D_ltr: + out << "D_ltr\n"; + break; + + case D_rtl: + out << "D_rtl\n"; + break; + } + } } /** diff --git a/panda/src/text/textProperties.h b/panda/src/text/textProperties.h index c320e9a37b..af899f7b59 100644 --- a/panda/src/text/textProperties.h +++ b/panda/src/text/textProperties.h @@ -49,6 +49,11 @@ PUBLISHED: A_boxed_center }; + enum Direction { + D_ltr, + D_rtl, + }; + TextProperties(); TextProperties(const TextProperties ©); void operator = (const TextProperties ©); @@ -160,6 +165,11 @@ PUBLISHED: INLINE bool has_text_scale() const; INLINE PN_stdfloat get_text_scale() const; + INLINE void set_direction(Direction direction); + INLINE void clear_direction(); + INLINE bool has_direction() const; + INLINE Direction get_direction() const; + void add_properties(const TextProperties &other); void write(ostream &out, int indent_level = 0) const; @@ -197,6 +207,8 @@ PUBLISHED: set_glyph_shift, clear_glyph_shift); MAKE_PROPERTY2(text_scale, has_text_scale, get_text_scale, set_text_scale, clear_text_scale); + MAKE_PROPERTY2(direction, has_direction, get_direction, + set_direction, clear_direction); public: const RenderState *get_text_state() const; @@ -225,6 +237,7 @@ private: F_has_underscore = 0x00010000, F_has_underscore_height = 0x00020000, F_has_text_scale = 0x00040000, + F_has_direction = 0x00080000, }; int _specified; @@ -248,6 +261,7 @@ private: PN_stdfloat _glyph_scale; PN_stdfloat _glyph_shift; PN_stdfloat _text_scale; + Direction _direction; mutable CPT(RenderState) _text_state; mutable CPT(RenderState) _shadow_state; From a3bef3e2854eab2614a48d737328b01a6e257dd7 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 25 Apr 2017 12:37:45 +0200 Subject: [PATCH 098/254] makepanda: allow building without harfbuzz --- makepanda/makepanda.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 66b3f57545..af4cb2dca5 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -3809,7 +3809,8 @@ if (PkgSkip("FREETYPE")==0 and not RUNTIME): # if (not RUNTIME): - DefSymbol("HARFBUZZ", "HAVE_HARFBUZZ") + if not PkgSkip("HARFBUZZ"): + DefSymbol("HARFBUZZ", "HAVE_HARFBUZZ") OPTS=['DIR:panda/src/text', 'BUILDING:PANDA', 'ZLIB', 'FREETYPE', 'HARFBUZZ'] TargetAdd('p3text_composite1.obj', opts=OPTS, input='p3text_composite1.cxx') From 4e1f9c012a76e7f89bae8db3930db78e66d35536 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 3 May 2017 12:02:13 +0200 Subject: [PATCH 099/254] makepanda: set LANGUAGE=en to fix lib detection on German systems [skip ci] --- makepanda/makepandacore.py | 1 + 1 file changed, 1 insertion(+) diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index ab1ec01feb..feab23e98a 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -2533,6 +2533,7 @@ def SetupBuildEnvironment(compiler): # Setting it to UTF-8 is necessary for Python 3 modules to import # correctly. os.environ["LC_ALL"] = "en_US.UTF-8" + os.environ["LANGUAGE"] = "en" if compiler == "MSVC": # Add the visual studio tools to PATH et al. From a1a99c49c02b6e46c676b4e72265403e0405d86d Mon Sep 17 00:00:00 2001 From: wolfgangp Date: Sat, 6 May 2017 02:16:07 +0200 Subject: [PATCH 100/254] =?UTF-8?q?Buffer=20protocol=20support=20for=20(Co?= =?UTF-8?q?nst)PointerToArray=20of=20vectors=20and=20matr=E2=80=A6=20(#148?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panda/src/express/pointerToArray_ext.I | 270 +++++++++++++++++++++++++ panda/src/express/pointerToArray_ext.h | 33 +++ 2 files changed, 303 insertions(+) diff --git a/panda/src/express/pointerToArray_ext.I b/panda/src/express/pointerToArray_ext.I index 7502334e6e..b7126e8363 100644 --- a/panda/src/express/pointerToArray_ext.I +++ b/panda/src/express/pointerToArray_ext.I @@ -11,6 +11,64 @@ * @date 2015-02-08 */ +/** + * This is a helper function to set most attributes of a Py_buffer in a manner + * that accommodates square matrices (in accordance with PEP 3118). It is tested + * for use with NumPy. The resulting array will be of shape + * (num_matrices, size, size) where size is the number of matrix rows (=columns) + */ +INLINE void set_matrix_view(Py_buffer &view, int flags, int length, int size, bool double_prec, bool read_only) { + int item_size, mat_size; + const char *format; + + if (double_prec) { + item_size = sizeof(double); + format = get_format_code(double); + } else { + item_size = sizeof(float); + format = get_format_code(float); + } + + if (size == 3 && !double_prec) { + mat_size = sizeof(LMatrix3f); + } else if (size == 3 && double_prec) { + mat_size = sizeof(LMatrix3d); + } else if (size == 4 && !double_prec) { + mat_size = sizeof(UnalignedLMatrix4f); + } else if (size == 4 && double_prec) { + mat_size = sizeof(UnalignedLMatrix4d); + } + + view.len = length * mat_size; + view.readonly = (read_only ? 1 : 0); + view.itemsize = item_size; + view.format = NULL; + if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) { + view.format = (char*) format; + } + view.ndim = 3; + view.shape = NULL; + if ((flags & PyBUF_ND) == PyBUF_ND) { + // This leaks, which sucks, but __releasebuffer__ doesn't give us the same + // pointer, so we would need to store it elsewhere if we wanted to delete + // it there. Eh, it's just an int, who cares. + Py_ssize_t* shape = new Py_ssize_t[3]; + shape[0] = length; + shape[1] = size; + shape[2] = size; + view.shape = shape; + } + view.strides = NULL; + if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) { + Py_ssize_t* strides = new Py_ssize_t[3]; + strides[0] = mat_size; + strides[1] = item_size * size; + strides[2] = item_size; + view.strides = strides; + } + view.suboffsets = NULL; +} + /** * This special constructor accepts a Python list of elements, or a Python * string (or a bytes object, in Python 3), or any object that supports the @@ -226,6 +284,110 @@ __getbuffer__(PyObject *self, Py_buffer *view, int flags) { #endif } +/** + * This is used to implement the buffer protocol, in order to allow efficient + * access to the array data through a Python memoryview object. + */ +template<> +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) { +#if PY_VERSION_HEX >= 0x02060000 + if (self != NULL) { + Py_INCREF(self); + } + view->obj = self; + view->buf = (void*) this->_this->p(); + set_matrix_view(*view, flags, this->_this->size(), 3, false, false); + + // Store a reference to ourselves on the Py_buffer object as a reminder that + // we have increased our refcount. + this->_this->ref(); + view->internal = (void*) this->_this; + + return 0; +#else + return -1; +#endif +} + +/** + * This is used to implement the buffer protocol, in order to allow efficient + * access to the array data through a Python memoryview object. + */ +template<> +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) { +#if PY_VERSION_HEX >= 0x02060000 + if (self != NULL) { + Py_INCREF(self); + } + view->obj = self; + view->buf = (void*) this->_this->p(); + set_matrix_view(*view, flags, this->_this->size(), 3, true, false); + + // Store a reference to ourselves on the Py_buffer object as a reminder that + // we have increased our refcount. + this->_this->ref(); + view->internal = (void*) this->_this; + + return 0; +#else + return -1; +#endif +} + +/** + * This is used to implement the buffer protocol, in order to allow efficient + * access to the array data through a Python memoryview object. + */ +template<> +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) { +#if PY_VERSION_HEX >= 0x02060000 + if (self != NULL) { + Py_INCREF(self); + } + view->obj = self; + view->buf = (void*) this->_this->p(); + set_matrix_view(*view, flags, this->_this->size(), 4, false, false); + + // Store a reference to ourselves on the Py_buffer object as a reminder that + // we have increased our refcount. + this->_this->ref(); + view->internal = (void*) this->_this; + + return 0; +#else + return -1; +#endif +} + +/** + * This is used to implement the buffer protocol, in order to allow efficient + * access to the array data through a Python memoryview object. + */ +template<> +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) { +#if PY_VERSION_HEX >= 0x02060000 + if (self != NULL) { + Py_INCREF(self); + } + view->obj = self; + view->buf = (void*) this->_this->p(); + set_matrix_view(*view, flags, this->_this->size(), 4, true, false); + + // Store a reference to ourselves on the Py_buffer object as a reminder that + // we have increased our refcount. + this->_this->ref(); + view->internal = (void*) this->_this; + + return 0; +#else + return -1; +#endif +} + /** * Releases the buffer allocated by __getbuffer__. */ @@ -299,6 +461,114 @@ __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { #endif } +template<> +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) const { +#if PY_VERSION_HEX >= 0x02060000 + if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) { + PyErr_SetString(PyExc_BufferError, + "Object is not writable."); + return -1; + } + if (self != NULL) { + Py_INCREF(self); + } + view->obj = self; + view->buf = (void*) this->_this->p(); + set_matrix_view(*view, flags, this->_this->size(), 3, false, true); + + // Store a reference to ourselves on the Py_buffer object as a reminder that + // we have increased our refcount. + this->_this->ref(); + view->internal = (void*) this->_this; + + return 0; +#else + return -1; +#endif +} + +template<> +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) const { +#if PY_VERSION_HEX >= 0x02060000 + if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) { + PyErr_SetString(PyExc_BufferError, + "Object is not writable."); + return -1; + } + if (self != NULL) { + Py_INCREF(self); + } + view->obj = self; + view->buf = (void*) this->_this->p(); + set_matrix_view(*view, flags, this->_this->size(), 3, true, true); + + // Store a reference to ourselves on the Py_buffer object as a reminder that + // we have increased our refcount. + this->_this->ref(); + view->internal = (void*) this->_this; + + return 0; +#else + return -1; +#endif +} + +template<> +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) const { +#if PY_VERSION_HEX >= 0x02060000 + if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) { + PyErr_SetString(PyExc_BufferError, + "Object is not writable."); + return -1; + } + if (self != NULL) { + Py_INCREF(self); + } + view->obj = self; + view->buf = (void*) this->_this->p(); + set_matrix_view(*view, flags, this->_this->size(), 4, false, true); + + // Store a reference to ourselves on the Py_buffer object as a reminder that + // we have increased our refcount. + this->_this->ref(); + view->internal = (void*) this->_this; + + return 0; +#else + return -1; +#endif +} + +template<> +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) const { +#if PY_VERSION_HEX >= 0x02060000 + if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) { + PyErr_SetString(PyExc_BufferError, + "Object is not writable."); + return -1; + } + if (self != NULL) { + Py_INCREF(self); + } + view->obj = self; + view->buf = (void*) this->_this->p(); + set_matrix_view(*view, flags, this->_this->size(), 4, true, true); + + // Store a reference to ourselves on the Py_buffer object as a reminder that + // we have increased our refcount. + this->_this->ref(); + view->internal = (void*) this->_this; + + return 0; +#else + return -1; +#endif +} + /** * Releases the buffer allocated by __getbuffer__. */ diff --git a/panda/src/express/pointerToArray_ext.h b/panda/src/express/pointerToArray_ext.h index 73ec780675..9fea54cbc4 100644 --- a/panda/src/express/pointerToArray_ext.h +++ b/panda/src/express/pointerToArray_ext.h @@ -19,6 +19,7 @@ #include "extension.h" #include "py_panda.h" #include "pointerToArray.h" +#include "luse.h" /** * This class defines the extension methods for PointerToArray, which are @@ -39,6 +40,15 @@ public: INLINE void __releasebuffer__(PyObject *self, Py_buffer *view) const; }; +template<> + INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags); +template<> + INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags); +template<> + INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags); +template<> + INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags); + /** * This class defines the extension methods for ConstPointerToArray, which are * called instead of any C++ methods with the same prototype. @@ -57,6 +67,15 @@ public: INLINE void __releasebuffer__(PyObject *self, Py_buffer *view) const; }; +template<> + INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; +template<> + INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; +template<> + INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; +template<> + INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; + #ifdef _MSC_VER // Ugh... MSVC needs this because they still don't have a decent linker. #include "PTA_uchar.h" @@ -104,6 +123,20 @@ define_format_code("Q", unsigned long long); define_format_code("f", float); define_format_code("d", double); +define_format_code("2f", LVecBase2f); +define_format_code("2d", LVecBase2d); +define_format_code("2i", LVecBase2i); +define_format_code("3f", LVecBase3f); +define_format_code("3d", LVecBase3d); +define_format_code("3i", LVecBase3i); +define_format_code("4f", UnalignedLVecBase4f); +define_format_code("4d", UnalignedLVecBase4d); +define_format_code("4i", UnalignedLVecBase4i); +// define_format_code("9f", LMatrix3f); +// define_format_code("9d", LMatrix3d); +// define_format_code("16f", UnalignedLMatrix4f); +// define_format_code("16d", UnalignedLMatrix4d); + #include "pointerToArray_ext.I" #endif // CPPPARSER From e15cfd74e8bd19cffbfea723eb583af63e307ad0 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 13 May 2017 21:40:22 +0200 Subject: [PATCH 101/254] Prevent assertion when calculating bounds for geom without vertices --- panda/src/gobj/geom.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/panda/src/gobj/geom.cxx b/panda/src/gobj/geom.cxx index 66d7c19e62..2b16a915cd 100644 --- a/panda/src/gobj/geom.cxx +++ b/panda/src/gobj/geom.cxx @@ -1257,15 +1257,15 @@ compute_internal_bounds(Geom::CData *cdata, Thread *current_thread) const { InternalName::get_vertex(), cdata, current_thread); - nassertv(!pmin.is_nan()); - nassertv(!pmax.is_nan()); - BoundingVolume::BoundsType btype = cdata->_bounds_type; if (btype == BoundingVolume::BT_default) { btype = bounds_type; } if (found_any) { + nassertv(!pmin.is_nan()); + nassertv(!pmax.is_nan()); + // Then we put the bounding volume around both of those points. PN_stdfloat avg_box_area; switch (btype) { From 325ac4c114b68afbcd224f42442c2c32a8519545 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 13 May 2017 21:59:29 +0200 Subject: [PATCH 102/254] Fix memory tracking bug - DeletedBufferChain erroneously showed leak --- dtool/src/dtoolbase/deletedBufferChain.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dtool/src/dtoolbase/deletedBufferChain.cxx b/dtool/src/dtoolbase/deletedBufferChain.cxx index 0451ada7d3..27d7214d79 100644 --- a/dtool/src/dtoolbase/deletedBufferChain.cxx +++ b/dtool/src/dtoolbase/deletedBufferChain.cxx @@ -106,8 +106,8 @@ deallocate(void *ptr, TypeHandle type_handle) { assert(ptr != (void *)NULL); #ifdef DO_MEMORY_USAGE - type_handle.dec_memory_usage(TypeHandle::MC_deleted_chain_active, - _buffer_size + flag_reserved_bytes); + const size_t alloc_size = _buffer_size + flag_reserved_bytes + MEMORY_HOOK_ALIGNMENT - 1; + type_handle.dec_memory_usage(TypeHandle::MC_deleted_chain_active, alloc_size); // type_handle.inc_memory_usage(TypeHandle::MC_deleted_chain_inactive, // _buffer_size + flag_reserved_bytes); From 81e414030e587c8c0377e9010b12cc7c6995eee5 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 13 May 2017 23:30:09 +0200 Subject: [PATCH 103/254] Fix RenderState cache leak - gc did not work properly (Thanks to deflected for helping to track this down) --- panda/src/pgraph/renderState.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/panda/src/pgraph/renderState.cxx b/panda/src/pgraph/renderState.cxx index e92f284cc1..d8cd5a6dd3 100644 --- a/panda/src/pgraph/renderState.cxx +++ b/panda/src/pgraph/renderState.cxx @@ -947,8 +947,6 @@ garbage_collect() { return num_attribs; } - bool break_and_uniquify = (auto_break_cycles && uniquify_transforms); - LightReMutexHolder holder(*_states_lock); PStatTimer timer(_garbage_collect_pcollector); @@ -961,10 +959,12 @@ garbage_collect() { return num_attribs; } + bool break_and_uniquify = (auto_break_cycles && uniquify_transforms); + size_t si = _garbage_index; num_this_pass = min(num_this_pass, size); - size_t stop_at_element = (si + num_this_pass) % (size - 1); + size_t stop_at_element = (si + num_this_pass) & (size - 1); do { if (_states->has_element(si)) { From 560fd4eb3d4fef02e156a2c6f278458bf16561fc Mon Sep 17 00:00:00 2001 From: deflected Date: Sat, 13 May 2017 23:33:52 +0200 Subject: [PATCH 104/254] panda: Get rid of few warnings - Correct missing override - Correct deprecated XKeycodeToKeysym - Correct deprecated @exec for FreeBSD pkg plist Signed-off-by: deflected Closes #144 --- makepanda/makepanda.py | 6 +++--- panda/src/display/get_x11.h | 1 + panda/src/egg/eggLine.h | 11 +++++++---- panda/src/egg/eggNurbsCurve.h | 9 ++++++--- panda/src/egg/eggNurbsSurface.h | 11 +++++++---- panda/src/egg/eggPatch.h | 9 ++++++--- panda/src/egg/eggPoint.h | 11 +++++++---- panda/src/egg/eggPolygon.h | 11 +++++++---- panda/src/egg/eggTriangleFan.h | 15 +++++++++------ panda/src/egg/eggTriangleStrip.h | 13 ++++++++----- panda/src/x11display/x11GraphicsWindow.cxx | 2 +- 11 files changed, 62 insertions(+), 37 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index af4cb2dca5..69b4265801 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -864,7 +864,7 @@ if (COMPILER=="GCC"): if not PkgSkip("NVIDIACG") and not RUNTIME: SmartPkgEnable("CGGL", "", ("CgGL"), "Cg/cgGL.h", thirdparty_dir = "nvidiacg") if not RUNTIME: - SmartPkgEnable("X11", "x11", "X11", ("X11", "X11/Xlib.h")) + SmartPkgEnable("X11", "x11", "X11", ("X11", "X11/Xlib.h", "X11/XKBlib.h")) if GetHost() != "darwin": # Workaround for an issue where pkg-config does not include this path @@ -7216,8 +7216,8 @@ def MakeInstallerFreeBSD(): plist_txt += os.path.join(root, f)[21:] + "\n" if not RUNTIME: - plist_txt += "@exec /sbin/ldconfig -m /usr/local/lib\n" - plist_txt += "@unexec /sbin/ldconfig -R\n" + plist_txt += "@postexec /sbin/ldconfig -m /usr/local/lib\n" + plist_txt += "@postunexec /sbin/ldconfig -R\n" for remdir in ("lib/panda3d", "share/panda3d", "include/panda3d"): for root, dirs, files in os.walk("targetroot/usr/local/" + remdir, False): diff --git a/panda/src/display/get_x11.h b/panda/src/display/get_x11.h index f9112766d7..57ca5cf44e 100644 --- a/panda/src/display/get_x11.h +++ b/panda/src/display/get_x11.h @@ -45,6 +45,7 @@ struct XVisualInfo; #else #include "pre_x11_include.h" +#include #include #include #include diff --git a/panda/src/egg/eggLine.h b/panda/src/egg/eggLine.h index 059dfa7648..72ea411cdc 100644 --- a/panda/src/egg/eggLine.h +++ b/panda/src/egg/eggLine.h @@ -31,7 +31,7 @@ PUBLISHED: virtual EggLine *make_copy() const OVERRIDE; - virtual void write(ostream &out, int indent_level) const; + virtual void write(ostream &out, int indent_level) const OVERRIDE; INLINE bool has_thick() const; INLINE double get_thick() const; @@ -39,7 +39,7 @@ PUBLISHED: INLINE void clear_thick(); protected: - virtual int get_num_lead_vertices() const; + virtual int get_num_lead_vertices() const OVERRIDE; private: double _thick; @@ -54,10 +54,13 @@ public: register_type(_type_handle, "EggLine", EggCompositePrimitive::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { + return get_class_type(); + } + virtual TypeHandle force_init_type() OVERRIDE { + init_type(); return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/egg/eggNurbsCurve.h b/panda/src/egg/eggNurbsCurve.h index 9797a12ea8..4225549736 100644 --- a/panda/src/egg/eggNurbsCurve.h +++ b/panda/src/egg/eggNurbsCurve.h @@ -50,7 +50,7 @@ PUBLISHED: INLINE double get_knot(int k) const; MAKE_SEQ(get_knots, get_num_knots, get_knot); - virtual void write(ostream &out, int indent_level) const; + virtual void write(ostream &out, int indent_level) const OVERRIDE; MAKE_PROPERTY(order, get_order, set_order); MAKE_PROPERTY(degree, get_degree); @@ -72,10 +72,13 @@ public: register_type(_type_handle, "EggNurbsCurve", EggCurve::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { + return get_class_type(); + } + virtual TypeHandle force_init_type() OVERRIDE { + init_type(); return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/egg/eggNurbsSurface.h b/panda/src/egg/eggNurbsSurface.h index 8e09d43fbd..83900282f0 100644 --- a/panda/src/egg/eggNurbsSurface.h +++ b/panda/src/egg/eggNurbsSurface.h @@ -75,14 +75,14 @@ PUBLISHED: MAKE_SEQ(get_v_knots, get_num_v_knots, get_v_knot); INLINE EggVertex *get_cv(int ui, int vi) const; - virtual void write(ostream &out, int indent_level) const; + virtual void write(ostream &out, int indent_level) const OVERRIDE; public: Curves _curves_on_surface; Trims _trims; protected: - virtual void r_apply_texmats(EggTextureCollection &textures); + virtual void r_apply_texmats(EggTextureCollection &textures) OVERRIDE; private: typedef vector_double Knots; @@ -101,10 +101,13 @@ public: register_type(_type_handle, "EggNurbsSurface", EggSurface::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { + return get_class_type(); + } + virtual TypeHandle force_init_type() OVERRIDE { + init_type(); return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/egg/eggPatch.h b/panda/src/egg/eggPatch.h index 63cfc61353..4358149131 100644 --- a/panda/src/egg/eggPatch.h +++ b/panda/src/egg/eggPatch.h @@ -30,7 +30,7 @@ PUBLISHED: virtual EggPatch *make_copy() const OVERRIDE; - virtual void write(ostream &out, int indent_level) const; + virtual void write(ostream &out, int indent_level) const OVERRIDE; public: static TypeHandle get_class_type() { @@ -41,10 +41,13 @@ public: register_type(_type_handle, "EggPatch", EggPrimitive::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { + return get_class_type(); + } + virtual TypeHandle force_init_type() OVERRIDE { + init_type(); return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/egg/eggPoint.h b/panda/src/egg/eggPoint.h index ae7d7e1d34..93ed683133 100644 --- a/panda/src/egg/eggPoint.h +++ b/panda/src/egg/eggPoint.h @@ -40,9 +40,9 @@ PUBLISHED: INLINE void set_perspective(bool perspective); INLINE void clear_perspective(); - virtual bool cleanup(); + virtual bool cleanup() OVERRIDE; - virtual void write(ostream &out, int indent_level) const; + virtual void write(ostream &out, int indent_level) const OVERRIDE; private: enum Flags { @@ -64,10 +64,13 @@ public: register_type(_type_handle, "EggPoint", EggPrimitive::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { + return get_class_type(); + } + virtual TypeHandle force_init_type() OVERRIDE { + init_type(); return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/egg/eggPolygon.h b/panda/src/egg/eggPolygon.h index a549af3bf7..5d25c554be 100644 --- a/panda/src/egg/eggPolygon.h +++ b/panda/src/egg/eggPolygon.h @@ -29,7 +29,7 @@ PUBLISHED: virtual EggPolygon *make_copy() const OVERRIDE; - virtual bool cleanup(); + virtual bool cleanup() OVERRIDE; bool calculate_normal(LNormald &result, CoordinateSystem cs = CS_default) const; bool is_planar() const; @@ -39,7 +39,7 @@ PUBLISHED: INLINE bool triangulate_into(EggGroupNode *container, bool convex_also) const; PT(EggPolygon) triangulate_in_place(bool convex_also); - virtual void write(ostream &out, int indent_level) const; + virtual void write(ostream &out, int indent_level) const OVERRIDE; private: bool decomp_concave(EggGroupNode *container, int asum, int x, int y) const; @@ -55,10 +55,13 @@ public: register_type(_type_handle, "EggPolygon", EggPrimitive::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { + return get_class_type(); + } + virtual TypeHandle force_init_type() OVERRIDE { + init_type(); return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/egg/eggTriangleFan.h b/panda/src/egg/eggTriangleFan.h index 0a5e3f1e35..f2ca8e32b5 100644 --- a/panda/src/egg/eggTriangleFan.h +++ b/panda/src/egg/eggTriangleFan.h @@ -31,12 +31,12 @@ PUBLISHED: virtual EggTriangleFan *make_copy() const OVERRIDE; - virtual void write(ostream &out, int indent_level) const; - virtual void apply_first_attribute(); + virtual void write(ostream &out, int indent_level) const OVERRIDE; + virtual void apply_first_attribute() OVERRIDE; protected: - virtual int get_num_lead_vertices() const; - virtual bool do_triangulate(EggGroupNode *container) const; + virtual int get_num_lead_vertices() const OVERRIDE; + virtual bool do_triangulate(EggGroupNode *container) const OVERRIDE; public: static TypeHandle get_class_type() { @@ -47,10 +47,13 @@ public: register_type(_type_handle, "EggTriangleFan", EggCompositePrimitive::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { + return get_class_type(); + } + virtual TypeHandle force_init_type() OVERRIDE { + init_type(); return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/egg/eggTriangleStrip.h b/panda/src/egg/eggTriangleStrip.h index 202172d1cd..a84d0cd751 100644 --- a/panda/src/egg/eggTriangleStrip.h +++ b/panda/src/egg/eggTriangleStrip.h @@ -31,11 +31,11 @@ PUBLISHED: virtual EggTriangleStrip *make_copy() const OVERRIDE; - virtual void write(ostream &out, int indent_level) const; + virtual void write(ostream &out, int indent_level) const OVERRIDE; protected: - virtual int get_num_lead_vertices() const; - virtual bool do_triangulate(EggGroupNode *container) const; + virtual int get_num_lead_vertices() const OVERRIDE; + virtual bool do_triangulate(EggGroupNode *container) const OVERRIDE; public: static TypeHandle get_class_type() { @@ -46,10 +46,13 @@ public: register_type(_type_handle, "EggTriangleStrip", EggCompositePrimitive::get_class_type()); } - virtual TypeHandle get_type() const { + virtual TypeHandle get_type() const OVERRIDE { + return get_class_type(); + } + virtual TypeHandle force_init_type() OVERRIDE { + init_type(); return get_class_type(); } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/x11display/x11GraphicsWindow.cxx b/panda/src/x11display/x11GraphicsWindow.cxx index 3ea2cd3fb0..17a8121efc 100644 --- a/panda/src/x11display/x11GraphicsWindow.cxx +++ b/panda/src/x11display/x11GraphicsWindow.cxx @@ -2051,7 +2051,7 @@ get_keyboard_map() const { continue; } - KeySym sym = XKeycodeToKeysym(_display, k, 0); + KeySym sym = XkbKeycodeToKeysym(_display, k, 0, 0); ButtonHandle button = map_button(sym); if (button == ButtonHandle::none()) { continue; From 652f2d7f21e4fa8733ee315c5e5432acc3602545 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 14 May 2017 22:17:41 +0200 Subject: [PATCH 105/254] bullet: improve performance of adding geometry to BulletTriangleMesh --- dtool/src/parser-inc/btBulletDynamicsCommon.h | 1 + panda/src/bullet/bulletSoftBodyNode.cxx | 2 +- panda/src/bullet/bulletTriangleMesh.I | 15 +- panda/src/bullet/bulletTriangleMesh.cxx | 307 ++++++++++++------ panda/src/bullet/bulletTriangleMesh.h | 12 +- panda/src/bullet/bulletTriangleMeshShape.cxx | 2 +- 6 files changed, 213 insertions(+), 126 deletions(-) diff --git a/dtool/src/parser-inc/btBulletDynamicsCommon.h b/dtool/src/parser-inc/btBulletDynamicsCommon.h index aaf2309f4d..5185d952b2 100644 --- a/dtool/src/parser-inc/btBulletDynamicsCommon.h +++ b/dtool/src/parser-inc/btBulletDynamicsCommon.h @@ -76,6 +76,7 @@ class btStaticPlaneShape; class btStridingMeshInterface; class btTransform; class btTranslationalLimitMotor; +class btTriangleIndexVertexArray; class btTriangleMesh; class btTypedConstraint; class btTypedObject; diff --git a/panda/src/bullet/bulletSoftBodyNode.cxx b/panda/src/bullet/bulletSoftBodyNode.cxx index 349dbe4389..1d5a70d93f 100644 --- a/panda/src/bullet/bulletSoftBodyNode.cxx +++ b/panda/src/bullet/bulletSoftBodyNode.cxx @@ -197,7 +197,7 @@ transform_changed() { _soft->scale(new_scale); } - _sync = ts; + _sync = move(ts); } } diff --git a/panda/src/bullet/bulletTriangleMesh.I b/panda/src/bullet/bulletTriangleMesh.I index 4c3b8f83b8..33b9b9bf47 100644 --- a/panda/src/bullet/bulletTriangleMesh.I +++ b/panda/src/bullet/bulletTriangleMesh.I @@ -14,19 +14,9 @@ /** * */ -INLINE BulletTriangleMesh:: -~BulletTriangleMesh() { - - delete _mesh; -} - -/** - * - */ -btTriangleMesh *BulletTriangleMesh:: +INLINE btStridingMeshInterface *BulletTriangleMesh:: ptr() const { - - return _mesh; + return (btStridingMeshInterface *)&_mesh; } /** @@ -34,7 +24,6 @@ ptr() const { */ INLINE ostream & operator << (ostream &out, const BulletTriangleMesh &obj) { - obj.output(out); return out; } diff --git a/panda/src/bullet/bulletTriangleMesh.cxx b/panda/src/bullet/bulletTriangleMesh.cxx index d776d572d7..7dd5d00c69 100644 --- a/panda/src/bullet/bulletTriangleMesh.cxx +++ b/panda/src/bullet/bulletTriangleMesh.cxx @@ -23,150 +23,231 @@ TypeHandle BulletTriangleMesh::_type_handle; * */ BulletTriangleMesh:: -BulletTriangleMesh() { - - _mesh = new btTriangleMesh(); +BulletTriangleMesh() + : _welding_distance(0) { + btIndexedMesh mesh; + mesh.m_numTriangles = 0; + mesh.m_numVertices = 0; + mesh.m_indexType = PHY_INTEGER; + mesh.m_triangleIndexBase = nullptr; + mesh.m_triangleIndexStride = 3 * sizeof(int); + mesh.m_vertexBase = nullptr; + mesh.m_vertexStride = sizeof(btVector3); + _mesh.addIndexedMesh(mesh); } /** - * + * Returns the number of triangles in this triangle mesh. */ int BulletTriangleMesh:: get_num_triangles() const { - - return _mesh->getNumTriangles(); + return _indices.size() / 3; } /** - * + * Used to reserve memory in anticipation of the given amount of vertices and + * indices being added to the triangle mesh. This is useful if you are about + * to call add_triangle() many times, to prevent unnecessary reallocations. */ void BulletTriangleMesh:: preallocate(int num_verts, int num_indices) { - - _mesh->preallocateVertices(num_verts); - _mesh->preallocateIndices(num_indices); + _vertices.reserve(num_verts); + _indices.reserve(num_indices); } /** + * Adds a triangle with the indicated coordinates. * + * If remove_duplicate_vertices is true, it will make sure that it does not + * add duplicate vertices if they already exist in the triangle mesh, within + * the tolerance specified by set_welding_distance(). This comes at a + * significant performance cost, especially for large meshes. */ void BulletTriangleMesh:: add_triangle(const LPoint3 &p0, const LPoint3 &p1, const LPoint3 &p2, bool remove_duplicate_vertices) { - nassertv(!p0.is_nan()); nassertv(!p1.is_nan()); nassertv(!p2.is_nan()); - _mesh->addTriangle( - LVecBase3_to_btVector3(p0), - LVecBase3_to_btVector3(p1), - LVecBase3_to_btVector3(p2), - remove_duplicate_vertices); + btIndexedMesh &mesh = _mesh.getIndexedMeshArray()[0]; + mesh.m_numTriangles++; + + if (!remove_duplicate_vertices) { + unsigned int index = _vertices.size(); + _indices.push_back(index++); + _indices.push_back(index++); + _indices.push_back(index++); + + _vertices.push_back(LVecBase3_to_btVector3(p0)); + _vertices.push_back(LVecBase3_to_btVector3(p1)); + _vertices.push_back(LVecBase3_to_btVector3(p2)); + mesh.m_numVertices += 3; + mesh.m_vertexBase = (unsigned char*)&_vertices[0]; + } else { + _indices.push_back(find_or_add_vertex(p0)); + _indices.push_back(find_or_add_vertex(p1)); + _indices.push_back(find_or_add_vertex(p2)); + } + + mesh.m_triangleIndexBase = (unsigned char *)&_indices[0]; } /** + * Sets the square of the distance at which vertices will be merged + * together when adding geometry with remove_duplicate_vertices set to true. * + * The default is 0, meaning vertices will only be merged if they have the + * exact same position. */ void BulletTriangleMesh:: set_welding_distance(PN_stdfloat distance) { - - _mesh->m_weldingThreshold = distance; + _welding_distance = distance; } /** - * + * Returns the value previously set with set_welding_distance(), or the + * value of 0 if none was set. */ PN_stdfloat BulletTriangleMesh:: get_welding_distance() const { - - return _mesh->m_weldingThreshold; + return _welding_distance; } /** + * Adds the geometry from the indicated Geom from the triangle mesh. This is + * a one-time copy operation, and future updates to the Geom will not be + * reflected. * + * If remove_duplicate_vertices is true, it will make sure that it does not + * add duplicate vertices if they already exist in the triangle mesh, within + * the tolerance specified by set_welding_distance(). This comes at a + * significant performance cost, especially for large meshes. */ void BulletTriangleMesh:: add_geom(const Geom *geom, bool remove_duplicate_vertices, const TransformState *ts) { - nassertv(geom); nassertv(ts); - LMatrix4 m = ts->get_mat(); - - // Collect points - pvector points; - CPT(GeomVertexData) vdata = geom->get_vertex_data(); + size_t num_vertices = vdata->get_num_rows(); GeomVertexReader reader = GeomVertexReader(vdata, InternalName::get_vertex()); - while (!reader.is_at_end()) { - points.push_back(m.xform_point(reader.get_data3())); - } + btIndexedMesh &mesh = _mesh.getIndexedMeshArray()[0]; - // Convert points - btVector3 *vertices = new btVector3[points.size()]; + if (!remove_duplicate_vertices) { + // Fast path: directly copy the vertices and indices. + mesh.m_numVertices += num_vertices; + unsigned int index_offset = _vertices.size(); + _vertices.reserve(_vertices.size() + num_vertices); - int i = 0; - pvector::const_iterator it; - for (it=points.begin(); it!=points.end(); it++) { - LPoint3 v = *it; - vertices[i] = LVecBase3_to_btVector3(v); - i++; - } + if (ts->is_identity()) { + while (!reader.is_at_end()) { + _vertices.push_back(LVecBase3_to_btVector3(reader.get_data3())); + } + } else { + LMatrix4 m = ts->get_mat(); + while (!reader.is_at_end()) { + _vertices.push_back(LVecBase3_to_btVector3(m.xform_point(reader.get_data3()))); + } + } - // Add triangles - for (int k=0; kget_num_primitives(); k++) { + for (int k = 0; k < geom->get_num_primitives(); ++k) { + CPT(GeomPrimitive) prim = geom->get_primitive(k); + prim = prim->decompose(); - CPT(GeomPrimitive) prim = geom->get_primitive(k); - prim = prim->decompose(); + if (prim->is_of_type(GeomTriangles::get_class_type())) { + int num_vertices = prim->get_num_vertices(); + _indices.reserve(_indices.size() + num_vertices); + mesh.m_numTriangles += num_vertices / 3; - for (int l=0; lget_num_primitives(); l++) { + GeomVertexReader index(prim->get_vertices(), 0); + while (!index.is_at_end()) { + _indices.push_back(index_offset + index.get_data1i()); + } + } + } - int s = prim->get_primitive_start(l); - int e = prim->get_primitive_end(l); + } else { + // Collect points + pvector points; + points.reserve(_vertices.size() + num_vertices); - nassertv(e - s == 3); + if (ts->is_identity()) { + while (!reader.is_at_end()) { + points.push_back(reader.get_data3()); + } + } else { + LMatrix4 m = ts->get_mat(); + while (!reader.is_at_end()) { + points.push_back(m.xform_point(reader.get_data3())); + } + } - btVector3 v0 = vertices[prim->get_vertex(s)]; - btVector3 v1 = vertices[prim->get_vertex(s+1)]; - btVector3 v2 = vertices[prim->get_vertex(s+2)]; + // Add triangles + for (int k = 0; k < geom->get_num_primitives(); ++k) { + CPT(GeomPrimitive) prim = geom->get_primitive(k); + prim = prim->decompose(); - _mesh->addTriangle(v0, v1, v2, remove_duplicate_vertices); + if (prim->is_of_type(GeomTriangles::get_class_type())) { + int num_vertices = prim->get_num_vertices(); + _indices.reserve(_indices.size() + num_vertices); + mesh.m_numTriangles += num_vertices / 3; + + GeomVertexReader index(prim->get_vertices(), 0); + while (!index.is_at_end()) { + _indices.push_back(find_or_add_vertex(points[index.get_data1i()])); + } + } } } - delete [] vertices; + // Reset the pointers, since the vectors may have been reallocated. + mesh.m_vertexBase = (unsigned char*)&_vertices[0]; + mesh.m_triangleIndexBase = (unsigned char *)&_indices[0]; } /** + * Adds triangle information from an array of points and indices referring to + * these points. This is more efficient than adding triangles one at a time. * + * If remove_duplicate_vertices is true, it will make sure that it does not + * add duplicate vertices if they already exist in the triangle mesh, within + * the tolerance specified by set_welding_distance(). This comes at a + * significant performance cost, especially for large meshes. */ void BulletTriangleMesh:: add_array(const PTA_LVecBase3 &points, const PTA_int &indices, bool remove_duplicate_vertices) { + btIndexedMesh &mesh = _mesh.getIndexedMeshArray()[0]; - // Convert vertices - btVector3 *vertices = new btVector3[points.size()]; + _indices.reserve(_indices.size() + indices.size()); - int i = 0; - PTA_LVecBase3::const_iterator it; - for (it=points.begin(); it!=points.end(); it++) { - LVecBase3 v = *it; - vertices[i] = LVecBase3_to_btVector3(v); - i++; + if (!remove_duplicate_vertices) { + unsigned int index_offset = _vertices.size(); + for (size_t i = 0; i < indices.size(); ++i) { + _indices.push_back(index_offset + indices[i]); + } + + _vertices.reserve(_vertices.size() + points.size()); + for (size_t i = 0; i < points.size(); ++i) { + _vertices.push_back(LVecBase3_to_btVector3(points[i])); + } + + mesh.m_numVertices += points.size(); + + } else { + // Add the points one by one. + _indices.reserve(_indices.size() + indices.size()); + for (size_t i = 0; i < indices.size(); ++i) { + LVecBase3 p = points[indices[i]]; + _indices.push_back(find_or_add_vertex(p)); + } } - // Add triangles - int j = 0; - while (j+2 < (int)indices.size()) { + mesh.m_numTriangles += indices.size() / 3; - btVector3 v0 = vertices[indices[j++]]; - btVector3 v1 = vertices[indices[j++]]; - btVector3 v2 = vertices[indices[j++]]; - - _mesh->addTriangle(v0, v1, v2, remove_duplicate_vertices); - } - - delete [] vertices; + // Reset the pointers, since the vectors may have been reallocated. + mesh.m_vertexBase = (unsigned char*)&_vertices[0]; + mesh.m_triangleIndexBase = (unsigned char *)&_indices[0]; } /** @@ -174,8 +255,7 @@ add_array(const PTA_LVecBase3 &points, const PTA_int &indices, bool remove_dupli */ void BulletTriangleMesh:: output(ostream &out) const { - - out << get_type() << ", " << _mesh->getNumTriangles(); + out << get_type() << ", " << get_num_triangles() << " triangles"; } /** @@ -183,19 +263,39 @@ output(ostream &out) const { */ void BulletTriangleMesh:: write(ostream &out, int indent_level) const { - indent(out, indent_level) << get_type() << ":" << endl; - IndexedMeshArray& array = _mesh->getIndexedMeshArray(); - for (int i=0; i < array.size(); i++) { + const IndexedMeshArray &array = _mesh.getIndexedMeshArray(); + for (size_t i = 0; i < array.size(); ++i) { indent(out, indent_level + 2) << "IndexedMesh " << i << ":" << endl; - btIndexedMesh meshPart = array.at(i); - - indent(out, indent_level + 4) << "num triangles:" << meshPart.m_numTriangles << endl; - indent(out, indent_level + 4) << "num vertices:" << meshPart.m_numVertices << endl; + const btIndexedMesh &mesh = array[0]; + indent(out, indent_level + 4) << "num triangles:" << mesh.m_numTriangles << endl; + indent(out, indent_level + 4) << "num vertices:" << mesh.m_numVertices << endl; } } +/** + * Finds the indicated vertex and returns its index. If it was not found, + * adds it as a new vertex and returns its index. + */ +unsigned int BulletTriangleMesh:: +find_or_add_vertex(const LVecBase3 &p) { + btVector3 vertex = LVecBase3_to_btVector3(p); + + for (unsigned int i = 0; i < _vertices.size(); ++i) { + if ((_vertices[i] - vertex).length2() <= _welding_distance) { + return i; + } + } + + _vertices.push_back(vertex); + + btIndexedMesh &mesh = _mesh.getIndexedMeshArray()[0]; + mesh.m_numVertices++; + mesh.m_vertexBase = (unsigned char*)&_vertices[0]; + return _vertices.size() - 1; +} + /** * Tells the BamReader how to create objects of type BulletTriangleMesh. */ @@ -215,7 +315,7 @@ write_datagram(BamWriter *manager, Datagram &dg) { // In case we ever want to represent more than 1 indexed mesh. dg.add_int32(1); - btIndexedMesh &mesh = _mesh->getIndexedMeshArray()[0]; + btIndexedMesh &mesh = _mesh.getIndexedMeshArray()[0]; dg.add_int32(mesh.m_numVertices); dg.add_int32(mesh.m_numTriangles); @@ -238,22 +338,12 @@ write_datagram(BamWriter *manager, Datagram &dg) { const unsigned char *iptr = mesh.m_triangleIndexBase; nassertv(iptr != NULL || mesh.m_numTriangles == 0); - if (_mesh->getUse32bitIndices()) { - for (int i = 0; i < mesh.m_numTriangles; ++i) { - int *triangle = (int *)iptr; - dg.add_int32(triangle[0]); - dg.add_int32(triangle[1]); - dg.add_int32(triangle[2]); - iptr += mesh.m_triangleIndexStride; - } - } else { - for (int i = 0; i < mesh.m_numTriangles; ++i) { - short int *triangle = (short int *)iptr; - dg.add_int32(triangle[0]); - dg.add_int32(triangle[1]); - dg.add_int32(triangle[2]); - iptr += mesh.m_triangleIndexStride; - } + for (int i = 0; i < mesh.m_numTriangles; ++i) { + int *triangle = (int *)iptr; + dg.add_int32(triangle[0]); + dg.add_int32(triangle[1]); + dg.add_int32(triangle[2]); + iptr += mesh.m_triangleIndexStride; } } @@ -287,23 +377,26 @@ fillin(DatagramIterator &scan, BamReader *manager) { int num_triangles = scan.get_int32(); nassertv(scan.get_bool() == true); + btIndexedMesh &mesh = _mesh.getIndexedMeshArray()[0]; + mesh.m_numVertices = num_vertices; + mesh.m_numTriangles = num_triangles; + // Read and add the vertices. - _mesh->preallocateVertices(num_vertices); + _vertices.clear(); + _vertices.reserve(num_vertices); for (int i = 0; i < num_vertices; ++i) { PN_stdfloat x = scan.get_stdfloat(); PN_stdfloat y = scan.get_stdfloat(); PN_stdfloat z = scan.get_stdfloat(); - _mesh->findOrAddVertex(btVector3(x, y, z), false); + _vertices.push_back(btVector3(x, y, z)); } // Now read and add the indices. - int num_indices = num_triangles * 3; - _mesh->preallocateIndices(num_indices); - for (int i = 0; i < num_indices; ++i) { - _mesh->addIndex(scan.get_int32()); - } + size_t num_indices = (size_t)num_triangles * 3; + _indices.resize(num_indices); + scan.extract_bytes((unsigned char *)&_indices[0], num_indices * sizeof(int)); - // Since we manually added the vertices individually, we have to update the - // triangle count appropriately. - _mesh->getIndexedMeshArray()[0].m_numTriangles = num_triangles; + // Reset the pointers, since the vectors may have been reallocated. + mesh.m_vertexBase = (unsigned char*)&_vertices[0]; + mesh.m_triangleIndexBase = (unsigned char *)&_indices[0]; } diff --git a/panda/src/bullet/bulletTriangleMesh.h b/panda/src/bullet/bulletTriangleMesh.h index 71dfe39a50..2c3b5c0626 100644 --- a/panda/src/bullet/bulletTriangleMesh.h +++ b/panda/src/bullet/bulletTriangleMesh.h @@ -30,10 +30,9 @@ * */ class EXPCL_PANDABULLET BulletTriangleMesh : public TypedWritableReferenceCount { - PUBLISHED: BulletTriangleMesh(); - INLINE ~BulletTriangleMesh(); + ~BulletTriangleMesh() DEFAULT_DTOR; void add_triangle(const LPoint3 &p0, const LPoint3 &p1, @@ -59,10 +58,15 @@ PUBLISHED: MAKE_PROPERTY(welding_distance, get_welding_distance, set_welding_distance); public: - INLINE btTriangleMesh *ptr() const; + INLINE btStridingMeshInterface *ptr() const; private: - btTriangleMesh *_mesh; + unsigned int find_or_add_vertex(const LVecBase3 &p); + + btTriangleIndexVertexArray _mesh; + btAlignedObjectArray _vertices; + btAlignedObjectArray _indices; + PN_stdfloat _welding_distance; public: static void register_with_read_factory(); diff --git a/panda/src/bullet/bulletTriangleMeshShape.cxx b/panda/src/bullet/bulletTriangleMeshShape.cxx index 62252db221..024768aff1 100644 --- a/panda/src/bullet/bulletTriangleMeshShape.cxx +++ b/panda/src/bullet/bulletTriangleMeshShape.cxx @@ -145,7 +145,7 @@ complete_pointers(TypedWritable **p_list, BamReader *manager) { _mesh = DCAST(BulletTriangleMesh, p_list[pi++]); - btTriangleMesh *mesh_ptr = _mesh->ptr(); + btStridingMeshInterface *mesh_ptr = _mesh->ptr(); nassertr(mesh_ptr != NULL, pi); if (_dynamic) { From a387fb9f35bea76b1a48ee4470c90e72e128b4db Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 14 May 2017 22:18:52 +0200 Subject: [PATCH 106/254] interrogate: nullptr handling, faster kwargs handling in some cases --- dtool/src/interrogate/functionRemap.cxx | 29 +- .../interfaceMakerPythonNative.cxx | 272 +++++++++++++----- dtool/src/interrogate/interrogateBuilder.cxx | 4 + dtool/src/interrogate/typeManager.cxx | 21 ++ dtool/src/interrogate/typeManager.h | 1 + .../src/interrogatedb/interrogate_interface.h | 6 +- dtool/src/interrogatedb/py_panda.I | 22 ++ dtool/src/interrogatedb/py_panda.cxx | 173 ++++++++++- dtool/src/interrogatedb/py_panda.h | 19 ++ dtool/src/parser-inc/stddef.h | 2 - dtool/src/parser-inc/stdtypedefs.h | 6 +- dtool/src/pystub/pystub.cxx | 18 +- 12 files changed, 482 insertions(+), 91 deletions(-) diff --git a/dtool/src/interrogate/functionRemap.cxx b/dtool/src/interrogate/functionRemap.cxx index 085d9421d1..d58cdf8b88 100644 --- a/dtool/src/interrogate/functionRemap.cxx +++ b/dtool/src/interrogate/functionRemap.cxx @@ -869,8 +869,14 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak } if (_args_type == InterfaceMaker::AT_varargs) { - // Of course methods named "make" can still take kwargs. - _args_type = InterfaceMaker::AT_keyword_args; + // Of course methods named "make" can still take kwargs, if they are + // named. + for (int i = first_param; i < _parameters.size(); ++i) { + if (_parameters[i]._has_name) { + _args_type = InterfaceMaker::AT_keyword_args; + break; + } + } } } else if (fname == "operator /") { @@ -898,8 +904,13 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak } else { if (_args_type == InterfaceMaker::AT_varargs) { // Every other method can take keyword arguments, if they take more - // than one argument. - _args_type |= InterfaceMaker::AT_keyword_args; + // than one argument, and the arguments are named. + for (int i = first_param; i < _parameters.size(); ++i) { + if (_parameters[i]._has_name) { + _args_type |= InterfaceMaker::AT_keyword_args; + break; + } + } } } break; @@ -941,8 +952,14 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak _flags |= F_coerce_constructor; } - // Constructors always take varargs and keyword args. - _args_type = InterfaceMaker::AT_keyword_args; + // Constructors always take varargs, and possibly keyword args. + _args_type = InterfaceMaker::AT_varargs; + for (int i = first_param; i < _parameters.size(); ++i) { + if (_parameters[i]._has_name) { + _args_type = InterfaceMaker::AT_keyword_args; + break; + } + } break; default: diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index 6ca45df628..c4dd2d3b21 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -3389,6 +3389,7 @@ write_function_for_name(ostream &out, Object *obj, FunctionRemap *remap = NULL; int max_required_args = 0; bool all_nonconst = true; + bool has_keywords = false; out << "/**\n * Python function wrapper for:\n"; for (ri = remaps.begin(); ri != remaps.end(); ++ri) { @@ -3404,6 +3405,10 @@ write_function_for_name(ostream &out, Object *obj, all_nonconst = false; } + if (remap->_args_type == AT_keyword_args) { + has_keywords = true; + } + max_required_args = max(max_num_args, max_required_args); for (int i = min_num_args; i <= max_num_args; ++i) { @@ -3450,6 +3455,19 @@ write_function_for_name(ostream &out, Object *obj, return; } + if (args_type == AT_keyword_args && !has_keywords) { + // We don't actually take keyword arguments. Make sure we didn't get any. + out << " if (kwds != NULL && PyDict_Size(kwds) > 0) {\n"; + out << "#ifdef NDEBUG\n"; + error_raise_return(out, 4, return_flags, "TypeError", "function takes no keyword arguments"); + out << "#else\n"; + error_raise_return(out, 4, return_flags, "TypeError", + methodNameFromCppName(remap, "", false) + "() takes no keyword arguments"); + out << "#endif\n"; + out << " }\n"; + args_type = AT_varargs; + } + if (args_type == AT_keyword_args || args_type == AT_varargs) { max_required_args = collapse_default_remaps(map_sets, max_required_args); } @@ -3461,6 +3479,7 @@ write_function_for_name(ostream &out, Object *obj, args_type, return_flags); } else if (map_sets.size() > 1 && (args_type == AT_varargs || args_type == AT_keyword_args)) { + // We have more than one remap. switch (args_type) { case AT_keyword_args: indent(out, 2) << "int parameter_count = (int)PyTuple_Size(args);\n"; @@ -3498,16 +3517,50 @@ write_function_for_name(ostream &out, Object *obj, indent(out, 2) << "case " << i << ":\n"; num_args.insert(i + add_self); } - indent(out, 4) << "{\n"; num_args.insert(max_args + add_self); - if (min_args == 1 && max_args == 1 && args_type == AT_varargs) { - // Might as well, since we already checked the number of args. - indent(out, 6) << " PyObject *arg = PyTuple_GET_ITEM(args, 0);\n"; + bool strip_keyword_args = false; + + // Check whether any remap actually takes keyword arguments. If not, + // then we don't have to bother checking that for every remap. + if (args_type == AT_keyword_args && max_args > 0) { + strip_keyword_args = true; + + std::set::iterator sii; + for (sii = mii->second.begin(); sii != mii->second.end(); ++sii) { + remap = (*sii); + int first_param = remap->_has_this ? 1 : 0; + for (int i = first_param; i < remap->_parameters.size(); ++i) { + if (remap->_parameters[i]._has_name) { + strip_keyword_args = false; + break; + } + } + } + } + + if (strip_keyword_args) { + // None of the remaps take any keyword arguments, so let's check that + // we take none. This saves some checks later on. + indent(out, 4) << "if (kwds == NULL || ((PyDictObject *)kwds)->ma_used == 0) {\n"; + if (min_args == 1 && min_args == 1) { + indent(out, 4) << " PyObject *arg = PyTuple_GET_ITEM(args, 0);\n"; + write_function_forset(out, mii->second, min_args, max_args, expected_params, 6, + coercion_allowed, true, AT_single_arg, return_flags, true, !all_nonconst); + } else { + write_function_forset(out, mii->second, min_args, max_args, expected_params, 6, + coercion_allowed, true, AT_varargs, return_flags, true, !all_nonconst); + } + } else if (min_args == 1 && max_args == 1 && args_type == AT_varargs) { + // We already checked that the args tuple has only one argument, so + // we might as well extract that from the tuple now. + indent(out, 4) << "{\n"; + indent(out, 4) << " PyObject *arg = PyTuple_GET_ITEM(args, 0);\n"; write_function_forset(out, mii->second, min_args, max_args, expected_params, 6, coercion_allowed, true, AT_single_arg, return_flags, true, !all_nonconst); } else { + indent(out, 4) << "{\n"; write_function_forset(out, mii->second, min_args, max_args, expected_params, 6, coercion_allowed, true, args_type, return_flags, true, !all_nonconst); } @@ -3574,14 +3627,14 @@ write_function_for_name(ostream &out, Object *obj, if (mii->first == 0 && args_type != AT_no_args) { switch (args_type) { case AT_keyword_args: - out << " if (PyTuple_Size(args) > 0 || (kwds != NULL && PyDict_Size(kwds) > 0)) {\n"; + out << " if (!Dtool_CheckNoArgs(args, kwds)) {\n"; out << " int parameter_count = (int)PyTuple_Size(args);\n"; out << " if (kwds != NULL) {\n"; out << " parameter_count += (int)PyDict_Size(kwds);\n"; out << " }\n"; break; case AT_varargs: - out << " if (PyTuple_Size(args) > 0) {\n"; + out << " if (!Dtool_CheckNoArgs(args)) {\n"; out << " const int parameter_count = (int)PyTuple_GET_SIZE(args);\n"; break; case AT_single_arg: @@ -3607,14 +3660,14 @@ write_function_for_name(ostream &out, Object *obj, } else if (args_type == AT_keyword_args && max_required_args == 1 && mii->first == 1) { // Check this to be sure, as we handle the case of only 1 keyword arg in // write_function_forset (not using ParseTupleAndKeywords). - out << " int parameter_count = (int)PyTuple_Size(args);\n" - " if (kwds != NULL) {\n" - " parameter_count += (int)PyDict_Size(kwds);\n" - " }\n" + out << " int parameter_count = (int)PyTuple_Size(args);\n" + " if (kwds != NULL) {\n" + " parameter_count += (int)PyDict_Size(kwds);\n" + " }\n" " if (parameter_count != 1) {\n" "#ifdef NDEBUG\n"; error_raise_return(out, 4, return_flags, "TypeError", - "function takes exactly 1 argument"); + "function takes exactly 1 argument"); out << "#else\n"; error_raise_return(out, 4, return_flags, "TypeError", methodNameFromCppName(remap, "", false) + "() takes exactly 1 argument (%d given)", @@ -4067,7 +4120,9 @@ int get_type_sort(CPPType *type) { // printf(" %s\n",type->get_local_name().c_str()); // The highest numbered one will be checked first. - if (TypeManager::is_pointer_to_Py_buffer(type)) { + if (TypeManager::is_nullptr(type)) { + return 15; + } else if (TypeManager::is_pointer_to_Py_buffer(type)) { return 14; } else if (TypeManager::is_pointer_to_PyTypeObject(type)) { return 13; @@ -4247,14 +4302,16 @@ write_function_forset(ostream &out, args_type == AT_keyword_args) { sii = remapsin.begin(); remap = (*sii); - first_param_name = remap->_parameters[(int)remap->_has_this]._name; - same_first_param = true; + if (remap->_parameters[(int)remap->_has_this]._has_name) { + first_param_name = remap->_parameters[(int)remap->_has_this]._name; + same_first_param = true; - for (++sii; sii != remapsin.end(); ++sii) { - remap = (*sii); - if (remap->_parameters[(int)remap->_has_this]._name != first_param_name) { - same_first_param = false; - break; + for (++sii; sii != remapsin.end(); ++sii) { + remap = (*sii); + if (remap->_parameters[(int)remap->_has_this]._name != first_param_name) { + same_first_param = false; + break; + } } } } @@ -4263,21 +4320,9 @@ write_function_forset(ostream &out, // Yes, they all have the same argument name (or there is only one remap). // Extract it from the dict so we don't have to call // ParseTupleAndKeywords. - indent(out, indent_level) << "PyObject *arg = NULL;\n"; - indent(out, indent_level) << "if (PyTuple_GET_SIZE(args) == 1) {\n"; - indent(out, indent_level) << " arg = PyTuple_GET_ITEM(args, 0);\n"; - indent(out, indent_level) << "} else if (kwds != NULL) {\n"; - indent(out, indent_level) << " arg = PyDict_GetItemString(kwds, \"" << first_param_name << "\");\n"; - indent(out, indent_level) << "}\n"; - if (report_errors) { - indent(out, indent_level) << "if (arg == (PyObject *)NULL) {\n"; - error_raise_return(out, indent_level + 2, return_flags, "TypeError", - "Required argument '" + first_param_name + "' (pos 1) not found"); - indent(out, indent_level) << "}\n"; - } else { - indent(out, indent_level) << "if (arg != (PyObject *)NULL) {\n"; - indent_level += 2; - } + indent(out, indent_level) << "PyObject *arg;\n"; + indent(out, indent_level) << "if (Dtool_ExtractArg(&arg, args, kwds, \"" << first_param_name << "\")) {\n"; + indent_level += 2; args_type = AT_single_arg; } @@ -4448,7 +4493,7 @@ write_function_forset(ostream &out, } // Close the brace we opened earlier. - if (same_first_param && !report_errors) { + if (same_first_param) { indent_level -= 2; indent(out, indent_level) << "}\n"; } @@ -4517,6 +4562,8 @@ write_function_instance(ostream &out, FunctionRemap *remap, string parameter_list; string container; string type_check; + string param_name; + bool has_keywords = false; vector_string pexprs; LineStream extra_convert; ostringstream extra_param_check; @@ -4612,7 +4659,7 @@ write_function_instance(ostream &out, FunctionRemap *remap, CPPType *orig_type = param->get_orig_type(); CPPType *type = param->get_new_type(); CPPExpression *default_value = param->get_default_value(); - string param_name = remap->get_parameter_name(pn); + param_name = remap->get_parameter_name(pn); if (!is_cpp_type_legal(orig_type)) { // We can't wrap this. We sometimes get here for default arguments. @@ -4667,7 +4714,14 @@ write_function_instance(ostream &out, FunctionRemap *remap, } string reported_name = remap->_parameters[pn]._name; - keyword_list += "\"" + reported_name + "\", "; + if (!keyword_list.empty()) { + keyword_list += ", \"" + reported_name + "\""; + } else { + keyword_list = "\"" + reported_name + "\""; + } + if (remap->_parameters[pn]._has_name) { + has_keywords = true; + } if (param->new_type_is_atomic_string()) { @@ -4869,6 +4923,19 @@ write_function_instance(ostream &out, FunctionRemap *remap, pexpr_string = "(PyObject_IsTrue(" + param_name + ") != 0)"; expected_params += "bool"; + } else if (TypeManager::is_nullptr(type)) { + if (args_type == AT_single_arg) { + type_check = "arg == Py_None"; + param_name = "arg"; + } else { + indent(out, indent_level) << "PyObject *" << param_name << default_expr << ";\n"; + extra_param_check << " && " << param_name << " == Py_None"; + format_specifiers += "O"; + parameter_list += ", &" + param_name; + } + pexpr_string = "NULL"; + expected_params += "NoneType"; + } else if (TypeManager::is_char(type)) { indent(out, indent_level) << "char " << param_name << default_expr << ";\n"; @@ -4907,27 +4974,43 @@ write_function_instance(ostream &out, FunctionRemap *remap, only_pyobjects = false; } else if (TypeManager::is_size(type)) { - // It certainly isn't the exact same thing as size_t, but Py_ssize_t - // should at least be the same size. The problem with mapping this to - // unsigned int is that that doesn't work well on 64-bit systems, on - // which size_t is a 64-bit integer. - indent(out, indent_level) << "Py_ssize_t " << param_name << default_expr << ";\n"; - format_specifiers += "n"; - parameter_list += ", &" + param_name; + if (args_type == AT_single_arg) { + type_check = "PyLongOrInt_Check(arg)"; + + extra_convert << + "size_t arg_val = PyLongOrInt_AsSize_t(arg);\n" + "#ifndef NDEBUG\n" + "if (arg_val == (size_t)-1 && _PyErr_OCCURRED()) {\n"; + error_return(extra_convert, 2, return_flags); + extra_convert << + "}\n" + "#endif\n"; + + pexpr_string = "arg_val"; + + } else { + // It certainly isn't the exact same thing as size_t, but Py_ssize_t + // should at least be the same size. The problem with mapping this to + // unsigned int is that that doesn't work well on 64-bit systems, on + // which size_t is a 64-bit integer. + indent(out, indent_level) << "Py_ssize_t " << param_name << default_expr << ";\n"; + format_specifiers += "n"; + parameter_list += ", &" + param_name; + + extra_convert + << "#ifndef NDEBUG\n" + << "if (" << param_name << " < 0) {\n"; + + error_raise_return(extra_convert, 2, return_flags, "OverflowError", + "can't convert negative value %zd to size_t", + param_name); + extra_convert + << "}\n" + << "#endif\n"; + } expected_params += "int"; only_pyobjects = false; - extra_convert - << "#ifndef NDEBUG\n" - << "if (" << param_name << " < 0) {\n"; - - error_raise_return(extra_convert, 2, return_flags, "OverflowError", - "can't convert negative value %zd to size_t", - param_name); - extra_convert - << "}\n" - << "#endif\n"; - } else if (TypeManager::is_longlong(type)) { // It's not trivial to do overflow checking for a long long, so we // simply don't do it. @@ -5555,15 +5638,60 @@ write_function_instance(ostream &out, FunctionRemap *remap, switch (args_type) { case AT_keyword_args: // Wrapper takes a varargs tuple and a keyword args dict. - indent(out, indent_level) - << "static const char *keyword_list[] = {" << keyword_list << "NULL};\n"; - indent(out, indent_level) - << "if (PyArg_ParseTupleAndKeywords(args, kwds, \"" - << format_specifiers << ":" << method_name - << "\", (char **)keyword_list" << parameter_list << ")) {\n"; + if (has_keywords) { + if (only_pyobjects && max_num_args == 1) { + // But we are only expecting one object arg, which is an easy common + // case we have implemented ourselves. + if (min_num_args == 1) { + indent(out, indent_level) + << "if (Dtool_ExtractArg(&" << param_name << ", args, kwds, " << keyword_list << ")) {\n"; + } else { + indent(out, indent_level) + << "if (Dtool_ExtractOptionalArg(&" << param_name << ", args, kwds, " << keyword_list << ")) {\n"; + } + } else { + // We have to use the more expensive PyArg_ParseTupleAndKeywords. + clear_error = true; + indent(out, indent_level) + << "static const char *keyword_list[] = {" << keyword_list << ", NULL};\n"; + indent(out, indent_level) + << "if (PyArg_ParseTupleAndKeywords(args, kwds, \"" + << format_specifiers << ":" << method_name + << "\", (char **)keyword_list" << parameter_list << ")) {\n"; + } + + } else if (only_pyobjects) { + // This function actually has no named parameters, so let's not take + // any keyword arguments. + if (max_num_args == 1) { + if (min_num_args == 1) { + indent(out, indent_level) + << "if (Dtool_ExtractArg(&" << param_name << ", args, kwds)) {\n"; + } else { + indent(out, indent_level) + << "if (Dtool_ExtractOptionalArg(&" << param_name << ", args, kwds)) {\n"; + } + } else if (max_num_args == 0) { + indent(out, indent_level) + << "if (Dtool_CheckNoArgs(args, kwds)) {\n"; + } else { + clear_error = true; + indent(out, indent_level) + << "if ((kwds == NULL || PyDict_Size(kwds) == 0) && PyArg_UnpackTuple(args, \"" + << methodNameFromCppName(remap, "", false) + << "\", " << min_num_args << ", " << max_num_args + << parameter_list << ")) {\n"; + } + + } else { + clear_error = true; + indent(out, indent_level) + << "if ((kwds == NULL || PyDict_Size(kwds) == 0) && PyArg_ParseTuple(args, \"" + << format_specifiers << ":" << method_name + << "\"" << parameter_list << ")) {\n"; + } ++open_scopes; - clear_error = true; indent_level += 2; break; @@ -5572,20 +5700,28 @@ write_function_instance(ostream &out, FunctionRemap *remap, if (only_pyobjects) { // All parameters are PyObject*, so we can use the slightly more // efficient PyArg_UnpackTuple function instead. - indent(out, indent_level) - << "if (PyArg_UnpackTuple(args, \"" - << methodNameFromCppName(remap, "", false) - << "\", " << min_num_args << ", " << max_num_args - << parameter_list << ")) {\n"; + if (min_num_args == 1 && max_num_args == 1) { + indent(out, indent_level) + << "if (PyTuple_GET_SIZE(args) == 1) {\n"; + indent(out, indent_level + 2) + << param_name << " = PyTuple_GET_ITEM(args, 0);\n"; + } else { + clear_error = true; + indent(out, indent_level) + << "if (PyArg_UnpackTuple(args, \"" + << methodNameFromCppName(remap, "", false) + << "\", " << min_num_args << ", " << max_num_args + << parameter_list << ")) {\n"; + } } else { + clear_error = true; indent(out, indent_level) << "if (PyArg_ParseTuple(args, \"" << format_specifiers << ":" << method_name << "\"" << parameter_list << ")) {\n"; } ++open_scopes; - clear_error = true; indent_level += 2; break; diff --git a/dtool/src/interrogate/interrogateBuilder.cxx b/dtool/src/interrogate/interrogateBuilder.cxx index 83f36c533b..c7ed2a056f 100644 --- a/dtool/src/interrogate/interrogateBuilder.cxx +++ b/dtool/src/interrogate/interrogateBuilder.cxx @@ -2346,6 +2346,10 @@ define_atomic_type(InterrogateType &itype, CPPSimpleType *cpptype) { itype._atomic_token = AT_void; break; + case CPPSimpleType::T_nullptr: + itype._atomic_token = AT_null; + break; + default: nout << "Type \"" << *cpptype << "\" has invalid CPPSimpleType: " << (int)cpptype->_type << "\n"; diff --git a/dtool/src/interrogate/typeManager.cxx b/dtool/src/interrogate/typeManager.cxx index db5b07f58a..995f677cc6 100644 --- a/dtool/src/interrogate/typeManager.cxx +++ b/dtool/src/interrogate/typeManager.cxx @@ -364,6 +364,27 @@ is_const_ref_to_enum(CPPType *type) { } } +/** + * Returns true if the indicated type is nullptr_t, possibly const or a + * typedef to it. + */ +bool TypeManager:: +is_nullptr(CPPType *type) { + switch (type->get_subtype()) { + case CPPDeclaration::ST_simple: + return type->as_simple_type()->_type == CPPSimpleType::T_nullptr; + + case CPPDeclaration::ST_const: + return is_nullptr(type->as_const_type()->_wrapped_around); + + case CPPDeclaration::ST_typedef: + return is_nullptr(type->as_typedef_type()->_type); + + default: + return false; + } +} + /** * Returns true if the indicated type is something that a scripting language * can handle directly as a concrete, like an int or float, either const or diff --git a/dtool/src/interrogate/typeManager.h b/dtool/src/interrogate/typeManager.h index 4e5356a24e..97b4bd8158 100644 --- a/dtool/src/interrogate/typeManager.h +++ b/dtool/src/interrogate/typeManager.h @@ -55,6 +55,7 @@ public: static bool is_enum(CPPType *type); static bool is_const_enum(CPPType *type); static bool is_const_ref_to_enum(CPPType *type); + static bool is_nullptr(CPPType *type); static bool is_simple(CPPType *type); static bool is_const_simple(CPPType *type); static bool is_const_ref_to_simple(CPPType *type); diff --git a/dtool/src/interrogatedb/interrogate_interface.h b/dtool/src/interrogatedb/interrogate_interface.h index b3003be2fe..63e385d527 100644 --- a/dtool/src/interrogatedb/interrogate_interface.h +++ b/dtool/src/interrogatedb/interrogate_interface.h @@ -82,7 +82,11 @@ enum AtomicToken { // string means whatever the native string representation is. AT_string = 7, - AT_longlong = 8 + AT_longlong = 8, + + // This is not a type that C has, but C++ and many scripting languages do; + // it indicates a null value, or the absence of any value. + AT_null = 9, }; EXPCL_INTERROGATEDB void interrogate_add_search_directory(const char *dirname); diff --git a/dtool/src/interrogatedb/py_panda.I b/dtool/src/interrogatedb/py_panda.I index 0a06358beb..3650525aba 100644 --- a/dtool/src/interrogatedb/py_panda.I +++ b/dtool/src/interrogatedb/py_panda.I @@ -59,6 +59,23 @@ DTool_CreatePyInstanceTyped(T *obj, bool memory_rules) { return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, false, obj->get_type().get_index()); } +/** + * Checks that the tuple is empty. + */ +ALWAYS_INLINE bool +Dtool_CheckNoArgs(PyObject *args) { + return PyTuple_GET_SIZE(args) == 0; +} + +/** + * Checks that the tuple is empty, and that the dict is empty or NULL. + */ +ALWAYS_INLINE bool +Dtool_CheckNoArgs(PyObject *args, PyObject *kwds) { + return PyTuple_GET_SIZE(args) == 0 && + (kwds == NULL || ((PyDictObject *)kwds)->ma_used == 0); +} + /** * The following functions wrap an arbitrary C++ value into a PyObject. */ @@ -196,6 +213,11 @@ ALWAYS_INLINE PyObject *Dtool_WrapValue(wchar_t value) { return PyUnicode_FromWideChar(&value, 1); } +ALWAYS_INLINE PyObject *Dtool_WrapValue(nullptr_t) { + Py_INCREF(Py_None); + return Py_None; +} + ALWAYS_INLINE PyObject *Dtool_WrapValue(PyObject *value) { return value; } diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index 9fe9916573..1ea11eab47 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -31,6 +31,49 @@ static RuntimeTypeMap runtime_type_map; static RuntimeTypeSet runtime_type_set; static NamedTypeMap named_type_map; +#if PY_MAJOR_VERSION < 3 +/** + * Given a long or int, returns a size_t, or raises an OverflowError if it is + * out of range. + */ +size_t PyLongOrInt_AsSize_t(PyObject *vv) { + if (PyInt_Check(vv)) { + long value = PyInt_AS_LONG(vv); + if (value < 0) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to size_t"); + return (size_t)-1; + } + return (size_t)value; + } + + if (!PyLong_Check(vv)) { + PyErr_BadInternalCall(); + return (size_t)-1; + } + + size_t bytes; + int one = 1; + int res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes, + SIZEOF_SIZE_T, (int)*(unsigned char*)&one, 0); + + if (res < 0) { + return (size_t)res; + } else { + return bytes; + } +} +#endif + +#if PY_VERSION_HEX < 0x03060000 +INLINE static PyObject *_PyObject_CallNoArg(PyObject *func) { + PyObject *args = PyTuple_New(0); + PyObject *result = PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + /** * Given a valid (non-NULL) PyObject, does a simple check to see if it might * be an instance of a Panda type. It does this using a signature that is @@ -767,12 +810,16 @@ int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2) { if (func == NULL) { PyErr_Clear(); } else { +#if PY_VERSION_HEX >= 0x03060000 + PyObject *res = _PyObject_FastCall(func, &v2, 1); +#else PyObject *res = NULL; PyObject *args = PyTuple_Pack(1, v2); if (args != NULL) { res = PyObject_Call(func, args, NULL); Py_DECREF(args); } +#endif Py_DECREF(func); PyErr_Clear(); // just in case the function threw an error // only use if the function returns an INT... hmm @@ -844,7 +891,13 @@ PyObject *DTOOL_PyObject_RichCompare(PyObject *v1, PyObject *v2, int op) { * make_copy() method. */ PyObject *copy_from_make_copy(PyObject *self, PyObject *noargs) { - return PyObject_CallMethod(self, (char *)"make_copy", (char *)"()"); + PyObject *callable = PyObject_GetAttrString(self, "make_copy"); + if (callable == NULL) { + return NULL; + } + PyObject *result = _PyObject_CallNoArg(callable); + Py_DECREF(callable); + return result; } /** @@ -852,13 +905,15 @@ PyObject *copy_from_make_copy(PyObject *self, PyObject *noargs) { * copy constructor. */ PyObject *copy_from_copy_constructor(PyObject *self, PyObject *noargs) { - PyObject *this_class = PyObject_Type(self); - if (this_class == NULL) { - return NULL; - } + PyObject *callable = (PyObject *)Py_TYPE(self); - PyObject *result = PyObject_CallFunction(this_class, (char *)"(O)", self); - Py_DECREF(this_class); +#if PY_VERSION_HEX >= 0x03060000 + PyObject *result = _PyObject_FastCall(callable, &self, 1); +#else + PyObject *args = PyTuple_Pack(1, self); + PyObject *result = PyObject_Call(callable, args, NULL); + Py_DECREF(args); +#endif return result; } @@ -868,7 +923,109 @@ PyObject *copy_from_copy_constructor(PyObject *self, PyObject *noargs) { * __copy__(). */ PyObject *map_deepcopy_to_copy(PyObject *self, PyObject *args) { - return PyObject_CallMethod(self, (char *)"__copy__", (char *)"()"); + PyObject *callable = PyObject_GetAttrString(self, "__copy__"); + if (callable == NULL) { + return NULL; + } + PyObject *result = _PyObject_CallNoArg(callable); + Py_DECREF(callable); + return result; +} + +/** + * A more efficient version of PyArg_ParseTupleAndKeywords for the special + * case where there is only a single PyObject argument. + */ +bool Dtool_ExtractArg(PyObject **result, PyObject *args, PyObject *kwds, + const char *keyword) { + + if (PyTuple_GET_SIZE(args) == 1) { + if (kwds == NULL || ((PyDictObject *)kwds)->ma_used == 0) { + *result = PyTuple_GET_ITEM(args, 0); + return true; + } + } else if (PyTuple_GET_SIZE(args) == 0) { + PyObject *key; + Py_ssize_t ppos = 0; + if (kwds != NULL && ((PyDictObject *)kwds)->ma_used == 1 && + PyDict_Next(kwds, &ppos, &key, result)) { + // We got the item, we just need to make sure that it had the right key. +#if PY_VERSION_HEX >= 0x03050000 + return PyUnicode_CheckExact(key) && _PyUnicode_EqualToASCIIString(key, keyword); +#elif PY_MAJOR_VERSION >= 3 + return PyUnicode_CheckExact(key) && PyUnicode_CompareWithASCIIString(key, keyword) == 0; +#else + return PyString_CheckExact(key) && strcmp(PyString_AS_STRING(key), keyword) == 0; +#endif + } + } + + return false; +} + +/** + * Variant of Dtool_ExtractArg that does not accept a keyword argument. + */ +bool Dtool_ExtractArg(PyObject **result, PyObject *args, PyObject *kwds) { + if (PyTuple_GET_SIZE(args) == 1 && + (kwds == NULL || ((PyDictObject *)kwds)->ma_used == 0)) { + *result = PyTuple_GET_ITEM(args, 0); + return true; + } + return false; +} + +/** + * A more efficient version of PyArg_ParseTupleAndKeywords for the special + * case where there is only a single optional PyObject argument. + * + * Returns true if valid (including if there were 0 items), false if there was + * an error, such as an invalid number of parameters. + */ +bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, PyObject *kwds, + const char *keyword) { + + if (PyTuple_GET_SIZE(args) == 1) { + if (kwds == NULL || ((PyDictObject *)kwds)->ma_used == 0) { + *result = PyTuple_GET_ITEM(args, 0); + return true; + } + } else if (PyTuple_GET_SIZE(args) == 0) { + if (kwds != NULL && ((PyDictObject *)kwds)->ma_used == 1) { + PyObject *key; + Py_ssize_t ppos = 0; + if (!PyDict_Next(kwds, &ppos, &key, result)) { + return true; + } + + // We got the item, we just need to make sure that it had the right key. +#if PY_VERSION_HEX >= 0x03050000 + return PyUnicode_CheckExact(key) && _PyUnicode_EqualToASCIIString(key, keyword); +#elif PY_MAJOR_VERSION >= 3 + return PyUnicode_CheckExact(key) && PyUnicode_CompareWithASCIIString(key, keyword) == 0; +#else + return PyString_CheckExact(key) && strcmp(PyString_AS_STRING(key), keyword) == 0; +#endif + } else { + return true; + } + } + + return false; +} + +/** + * Variant of Dtool_ExtractOptionalArg that does not accept a keyword argument. + */ +bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, PyObject *kwds) { + if (kwds != NULL && ((PyDictObject *)kwds)->ma_used != 0) { + return false; + } + if (PyTuple_GET_SIZE(args) == 1) { + *result = PyTuple_GET_ITEM(args, 0); + return true; + } + return (PyTuple_GET_SIZE(args) == 0); } /** diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index d66ee88c21..c2cc584914 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -107,11 +107,14 @@ inline PyObject* doPy_RETURN_FALSE() #define PyInt_Check PyLong_Check #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG +#define PyLongOrInt_AsSize_t PyLong_AsSize_t #else #define PyLongOrInt_Check(x) (PyInt_Check(x) || PyLong_Check(x)) // PyInt_FromSize_t automatically picks the right type. #define PyLongOrInt_AS_LONG PyInt_AsLong +EXPCL_INTERROGATEDB size_t PyLongOrInt_AsSize_t(PyObject *); + // For more portably defining hash functions. typedef long Py_hash_t; #endif @@ -469,6 +472,21 @@ struct Dtool_SequenceWrapper { EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SequenceWrapper_Type; +/** + * These functions check whether the arguments passed to a function conform to + * certain expectations. + */ +ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args); +ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args, PyObject *kwds); +EXPCL_INTERROGATEDB bool Dtool_ExtractArg(PyObject **result, PyObject *args, + PyObject *kwds, const char *keyword); +EXPCL_INTERROGATEDB bool Dtool_ExtractArg(PyObject **result, PyObject *args, + PyObject *kwds); +EXPCL_INTERROGATEDB bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, + PyObject *kwds, const char *keyword); +EXPCL_INTERROGATEDB bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, + PyObject *kwds); + /** * 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 @@ -491,6 +509,7 @@ 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(nullptr_t); ALWAYS_INLINE PyObject *Dtool_WrapValue(PyObject *value); ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::vector &value); diff --git a/dtool/src/parser-inc/stddef.h b/dtool/src/parser-inc/stddef.h index 6867ac2156..c0ff839b74 100644 --- a/dtool/src/parser-inc/stddef.h +++ b/dtool/src/parser-inc/stddef.h @@ -23,7 +23,5 @@ #define offsetof(type,member) ((size_t) &(((type*)0)->member)) -typedef decltype(nullptr) nullptr_t; - #endif diff --git a/dtool/src/parser-inc/stdtypedefs.h b/dtool/src/parser-inc/stdtypedefs.h index a14a140d2f..c1febd3955 100644 --- a/dtool/src/parser-inc/stdtypedefs.h +++ b/dtool/src/parser-inc/stdtypedefs.h @@ -41,11 +41,7 @@ inline namespace std { struct timeval; -#ifdef __cplusplus -#define NULL 0L -#else -#define NULL ((void *)0) -#endif +typedef decltype(nullptr) nullptr_t; // One day, we might extend interrogate to be able to parse this, // but we currently don't need it. diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index 1ebad938bd..d1de5fb189 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -32,6 +32,7 @@ extern "C" { EXPCL_PYSTUB int PyDict_GetItem(...); EXPCL_PYSTUB int PyDict_GetItemString(...); EXPCL_PYSTUB int PyDict_New(...); + EXPCL_PYSTUB int PyDict_Next(...); EXPCL_PYSTUB int PyDict_SetItem(...); EXPCL_PYSTUB int PyDict_SetItemString(...); EXPCL_PYSTUB int PyDict_Size(...); @@ -49,7 +50,6 @@ extern "C" { EXPCL_PYSTUB int PyErr_WarnEx(...); EXPCL_PYSTUB int PyEval_CallFunction(...); EXPCL_PYSTUB int PyEval_CallObjectWithKeywords(...); - EXPCL_PYSTUB int PyEval_InitThreads(...); EXPCL_PYSTUB int PyEval_RestoreThread(...); EXPCL_PYSTUB int PyEval_SaveThread(...); EXPCL_PYSTUB int PyFloat_AsDouble(...); @@ -163,6 +163,7 @@ extern "C" { EXPCL_PYSTUB int PyUnicode_AsUTF8AndSize(...); EXPCL_PYSTUB int PyUnicode_AsWideChar(...); EXPCL_PYSTUB int PyUnicode_AsWideCharString(...); + EXPCL_PYSTUB int PyUnicode_CompareWithASCIIString(...); EXPCL_PYSTUB int PyUnicode_FromFormat(...); EXPCL_PYSTUB int PyUnicode_FromString(...); EXPCL_PYSTUB int PyUnicode_FromStringAndSize(...); @@ -180,12 +181,16 @@ extern "C" { EXPCL_PYSTUB int _PyArg_ParseTuple_SizeT(...); EXPCL_PYSTUB int _PyArg_ParseTupleAndKeywords_SizeT(...); EXPCL_PYSTUB int _PyArg_Parse_SizeT(...); + EXPCL_PYSTUB int _PyErr_BadInternalCall(...); + EXPCL_PYSTUB int _PyLong_AsByteArray(...); EXPCL_PYSTUB int _PyObject_CallFunction_SizeT(...); EXPCL_PYSTUB int _PyObject_CallMethod_SizeT(...); EXPCL_PYSTUB int _PyObject_DebugFree(...); EXPCL_PYSTUB int _PyObject_Del(...); + EXPCL_PYSTUB int _PyObject_FastCallDict(...); EXPCL_PYSTUB int _PyUnicode_AsString(...); EXPCL_PYSTUB int _PyUnicode_AsStringAndSize(...); + EXPCL_PYSTUB int _PyUnicode_EqualToASCIIString(...); EXPCL_PYSTUB int _Py_AddToAllObjects(...); EXPCL_PYSTUB int _Py_BuildValue_SizeT(...); EXPCL_PYSTUB int _Py_Dealloc(...); @@ -198,6 +203,7 @@ extern "C" { EXPCL_PYSTUB void Py_Initialize(); EXPCL_PYSTUB int Py_IsInitialized(); + EXPCL_PYSTUB void PyEval_InitThreads(); EXPCL_PYSTUB extern void *PyExc_AssertionError; EXPCL_PYSTUB extern void *PyExc_AttributeError; @@ -208,6 +214,7 @@ extern "C" { EXPCL_PYSTUB extern void *PyExc_ImportError; EXPCL_PYSTUB extern void *PyExc_IndexError; EXPCL_PYSTUB extern void *PyExc_OSError; + EXPCL_PYSTUB extern void *PyExc_OverflowError; EXPCL_PYSTUB extern void *PyExc_RuntimeError; EXPCL_PYSTUB extern void *PyExc_StandardError; EXPCL_PYSTUB extern void *PyExc_StopIteration; @@ -241,6 +248,7 @@ int PyDict_DelItemString(...) { return 0; } int PyDict_GetItem(...) { return 0; } int PyDict_GetItemString(...) { return 0; } int PyDict_New(...) { return 0; }; +int PyDict_Next(...) { return 0; }; int PyDict_SetItem(...) { return 0; }; int PyDict_SetItemString(...) { return 0; }; int PyDict_Size(...){ return 0; } @@ -372,6 +380,7 @@ int PyUnicode_AsUTF8(...) { return 0; } int PyUnicode_AsUTF8AndSize(...) { return 0; } int PyUnicode_AsWideChar(...) { return 0; } int PyUnicode_AsWideCharString(...) { return 0; } +int PyUnicode_CompareWithASCIIString(...) { return 0; } int PyUnicode_FromFormat(...) { return 0; } int PyUnicode_FromString(...) { return 0; } int PyUnicode_FromStringAndSize(...) { return 0; } @@ -389,12 +398,16 @@ int Py_InitModule4TraceRefs_64(...) { return 0; }; int _PyArg_ParseTuple_SizeT(...) { return 0; }; int _PyArg_ParseTupleAndKeywords_SizeT(...) { return 0; }; int _PyArg_Parse_SizeT(...) { return 0; }; +int _PyErr_BadInternalCall(...) { return 0; }; +int _PyLong_AsByteArray(...) { return 0; }; int _PyObject_CallFunction_SizeT(...) { return 0; }; int _PyObject_CallMethod_SizeT(...) { return 0; }; int _PyObject_DebugFree(...) { return 0; }; int _PyObject_Del(...) { return 0; }; +int _PyObject_FastCallDict(...) { return 0; }; int _PyUnicode_AsString(...) { return 0; }; int _PyUnicode_AsStringAndSize(...) { return 0; }; +int _PyUnicode_EqualToASCIIString(...) { return 0; }; int _Py_AddToAllObjects(...) { return 0; }; int _Py_BuildValue_SizeT(...) { return 0; }; int _Py_Dealloc(...) { return 0; }; @@ -411,6 +424,8 @@ void Py_Initialize() { int Py_IsInitialized() { return 0; } +void PyEval_InitThreads() { +} void *PyExc_AssertionError = (void *)NULL; @@ -422,6 +437,7 @@ void *PyExc_FutureWarning = (void *)NULL; void *PyExc_ImportError = (void *)NULL; void *PyExc_IndexError = (void *)NULL; void *PyExc_OSError = (void *)NULL; +void *PyExc_OverflowError = (void *)NULL; void *PyExc_RuntimeError = (void *)NULL; void *PyExc_StandardError = (void *)NULL; void *PyExc_StopIteration = (void *)NULL; From 65a705217e37fc6703bc1ca0c8744b277b11264f Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 14 May 2017 23:09:48 +0200 Subject: [PATCH 107/254] Compile fixes for older Python 3 versions --- dtool/src/interrogatedb/py_panda.cxx | 6 +++--- dtool/src/pystub/pystub.cxx | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index 1ea11eab47..52525d74e6 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -48,7 +48,7 @@ size_t PyLongOrInt_AsSize_t(PyObject *vv) { } if (!PyLong_Check(vv)) { - PyErr_BadInternalCall(); + Dtool_Raise_TypeError("a long or int was expected"); return (size_t)-1; } @@ -950,7 +950,7 @@ bool Dtool_ExtractArg(PyObject **result, PyObject *args, PyObject *kwds, if (kwds != NULL && ((PyDictObject *)kwds)->ma_used == 1 && PyDict_Next(kwds, &ppos, &key, result)) { // We got the item, we just need to make sure that it had the right key. -#if PY_VERSION_HEX >= 0x03050000 +#if PY_VERSION_HEX >= 0x03060000 return PyUnicode_CheckExact(key) && _PyUnicode_EqualToASCIIString(key, keyword); #elif PY_MAJOR_VERSION >= 3 return PyUnicode_CheckExact(key) && PyUnicode_CompareWithASCIIString(key, keyword) == 0; @@ -999,7 +999,7 @@ bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, PyObject *kwds, } // We got the item, we just need to make sure that it had the right key. -#if PY_VERSION_HEX >= 0x03050000 +#if PY_VERSION_HEX >= 0x03060000 return PyUnicode_CheckExact(key) && _PyUnicode_EqualToASCIIString(key, keyword); #elif PY_MAJOR_VERSION >= 3 return PyUnicode_CheckExact(key) && PyUnicode_CompareWithASCIIString(key, keyword) == 0; diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index d1de5fb189..d94287c038 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -145,19 +145,21 @@ extern "C" { EXPCL_PYSTUB int PyType_GenericAlloc(...); EXPCL_PYSTUB int PyType_IsSubtype(...); EXPCL_PYSTUB int PyType_Ready(...); + EXPCL_PYSTUB int PyUnicodeUCS2_AsWideChar(...); + EXPCL_PYSTUB int PyUnicodeUCS2_AsWideCharString(...); + EXPCL_PYSTUB int PyUnicodeUCS2_CompareWithASCIIString(...); EXPCL_PYSTUB int PyUnicodeUCS2_FromFormat(...); EXPCL_PYSTUB int PyUnicodeUCS2_FromString(...); EXPCL_PYSTUB int PyUnicodeUCS2_FromStringAndSize(...); EXPCL_PYSTUB int PyUnicodeUCS2_FromWideChar(...); - EXPCL_PYSTUB int PyUnicodeUCS2_AsWideChar(...); - EXPCL_PYSTUB int PyUnicodeUCS2_AsWideCharString(...); EXPCL_PYSTUB int PyUnicodeUCS2_GetSize(...); + EXPCL_PYSTUB int PyUnicodeUCS4_AsWideChar(...); + EXPCL_PYSTUB int PyUnicodeUCS4_AsWideCharString(...); + EXPCL_PYSTUB int PyUnicodeUCS4_CompareWithASCIIString(...); EXPCL_PYSTUB int PyUnicodeUCS4_FromFormat(...); EXPCL_PYSTUB int PyUnicodeUCS4_FromString(...); EXPCL_PYSTUB int PyUnicodeUCS4_FromStringAndSize(...); EXPCL_PYSTUB int PyUnicodeUCS4_FromWideChar(...); - EXPCL_PYSTUB int PyUnicodeUCS4_AsWideChar(...); - EXPCL_PYSTUB int PyUnicodeUCS4_AsWideCharString(...); EXPCL_PYSTUB int PyUnicodeUCS4_GetSize(...); EXPCL_PYSTUB int PyUnicode_AsUTF8(...); EXPCL_PYSTUB int PyUnicode_AsUTF8AndSize(...); @@ -362,19 +364,21 @@ int PyTuple_Type(...) { return 0; }; int PyType_GenericAlloc(...) { return 0; }; int PyType_IsSubtype(...) { return 0; } int PyType_Ready(...) { return 0; }; +int PyUnicodeUCS2_AsWideChar(...) { return 0; } +int PyUnicodeUCS2_AsWideCharString(...) { return 0; } +int PyUnicodeUCS2_CompareWithASCIIString(...) { return 0; } int PyUnicodeUCS2_FromFormat(...) { return 0; } int PyUnicodeUCS2_FromString(...) { return 0; } int PyUnicodeUCS2_FromStringAndSize(...) { return 0; } int PyUnicodeUCS2_FromWideChar(...) { return 0; } -int PyUnicodeUCS2_AsWideChar(...) { return 0; } -int PyUnicodeUCS2_AsWideCharString(...) { return 0; } int PyUnicodeUCS2_GetSize(...) { return 0; } +int PyUnicodeUCS4_AsWideChar(...) { return 0; } +int PyUnicodeUCS4_AsWideCharString(...) { return 0; } +int PyUnicodeUCS4_CompareWithASCIIString(...) { return 0; } int PyUnicodeUCS4_FromFormat(...) { return 0; } int PyUnicodeUCS4_FromString(...) { return 0; } int PyUnicodeUCS4_FromStringAndSize(...) { return 0; } int PyUnicodeUCS4_FromWideChar(...) { return 0; } -int PyUnicodeUCS4_AsWideChar(...) { return 0; } -int PyUnicodeUCS4_AsWideCharString(...) { return 0; } int PyUnicodeUCS4_GetSize(...) { return 0; } int PyUnicode_AsUTF8(...) { return 0; } int PyUnicode_AsUTF8AndSize(...) { return 0; } From 7755a2e1c7e5bd5511ae927cd1adffd30c8a2d85 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 15 May 2017 14:50:50 +0200 Subject: [PATCH 108/254] shadows: provide dummy shadow maps for nonexistent/noncasting lights --- panda/src/display/graphicsStateGuardian.cxx | 54 +++++++++++++++++-- panda/src/display/graphicsStateGuardian.h | 1 + panda/src/glstuff/glCgShaderContext_src.cxx | 3 +- .../glstuff/glGraphicsStateGuardian_src.cxx | 38 +++++++------ .../src/glstuff/glGraphicsStateGuardian_src.h | 2 +- panda/src/glstuff/glShaderContext_src.cxx | 3 +- 6 files changed, 76 insertions(+), 25 deletions(-) diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index e8ef03ce3b..294db16e6e 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -1798,6 +1798,13 @@ fetch_specified_texture(Shader::ShaderTexSpec &spec, SamplerState &sampler, } } } + + // There is no such light assigned. Bind a dummy shadow map. + PT(Texture) tex = get_dummy_shadow_map((Texture::TextureType)spec._desired_type); + if (tex != nullptr) { + sampler = tex->get_default_sampler(); + } + return tex; } break; @@ -3152,9 +3159,14 @@ get_shadow_map(const NodePath &light_np, GraphicsOutputBase *host) { node->is_of_type(Spotlight::get_class_type()), NULL); LightLensNode *light = (LightLensNode *)node; - if (light == NULL || !light->_shadow_caster) { - // TODO: return dummy shadow map (all white). - return NULL; + if (light == nullptr || !light->_shadow_caster) { + // This light does not have a shadow caster. Return a dummy shadow map + // that is filled with a depth value of 1. + if (node->is_of_type(PointLight::get_class_type())) { + return get_dummy_shadow_map(Texture::TT_cube_map); + } else { + return get_dummy_shadow_map(Texture::TT_2d_texture); + } } // See if we already have a buffer. If not, create one. @@ -3173,6 +3185,42 @@ get_shadow_map(const NodePath &light_np, GraphicsOutputBase *host) { } } +/** + * Returns a dummy shadow map that can be used for a light of the given type + * that does not cast shadows. + */ +PT(Texture) GraphicsStateGuardian:: +get_dummy_shadow_map(Texture::TextureType texture_type) const { + if (texture_type != Texture::TT_cube_map) { + static PT(Texture) dummy_2d; + if (dummy_2d == nullptr) { + dummy_2d = new Texture("dummy-shadow-2d"); + dummy_2d->setup_2d_texture(1, 1, Texture::T_unsigned_byte, Texture::F_depth_component); + dummy_2d->set_clear_color(1); + if (get_supports_shadow_filter()) { + // If we have the ARB_shadow extension, enable shadow filtering. + dummy_2d->set_minfilter(SamplerState::FT_shadow); + dummy_2d->set_magfilter(SamplerState::FT_shadow); + } else { + dummy_2d->set_minfilter(SamplerState::FT_linear); + dummy_2d->set_magfilter(SamplerState::FT_linear); + } + } + return dummy_2d; + } else { + static PT(Texture) dummy_cube; + if (dummy_cube == nullptr) { + dummy_cube = new Texture("dummy-shadow-cube"); + dummy_cube->setup_cube_map(1, Texture::T_unsigned_byte, Texture::F_depth_component); + dummy_cube->set_clear_color(1); + // Note: cube map shadow filtering doesn't seem to work in Cg. + dummy_cube->set_minfilter(SamplerState::FT_linear); + dummy_cube->set_magfilter(SamplerState::FT_linear); + } + return dummy_cube; + } +} + /** * Creates a depth buffer for shadow mapping. This is a convenience function * for the ShaderGenerator; putting this directly in the ShaderGenerator would diff --git a/panda/src/display/graphicsStateGuardian.h b/panda/src/display/graphicsStateGuardian.h index a300771f1f..22f4f07fec 100644 --- a/panda/src/display/graphicsStateGuardian.h +++ b/panda/src/display/graphicsStateGuardian.h @@ -424,6 +424,7 @@ public: static void create_gamma_table (PN_stdfloat gamma, unsigned short *red_table, unsigned short *green_table, unsigned short *blue_table); PT(Texture) get_shadow_map(const NodePath &light_np, GraphicsOutputBase *host=NULL); + PT(Texture) get_dummy_shadow_map(Texture::TextureType texture_type) const; PT(Texture) make_shadow_buffer(const NodePath &light_np, GraphicsOutputBase *host); #ifdef DO_PSTATS diff --git a/panda/src/glstuff/glCgShaderContext_src.cxx b/panda/src/glstuff/glCgShaderContext_src.cxx index 329594eb38..d8f7231a34 100644 --- a/panda/src/glstuff/glCgShaderContext_src.cxx +++ b/panda/src/glstuff/glCgShaderContext_src.cxx @@ -1078,8 +1078,7 @@ update_shader_texture_bindings(ShaderContext *prev) { if (tex.is_null()) { // Apply a white texture in order to make it easier to use a shader that // takes a texture on a model that doesn't have a texture applied. - _glgsg->set_active_texture_stage(i); - _glgsg->apply_white_texture(); + _glgsg->apply_white_texture(i); continue; } diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index e1a250df9a..233385237e 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -10906,25 +10906,20 @@ update_standard_texture_bindings() { /** * Applies a white dummy texture. This is useful to bind to a texture slot - * when a texture is missing. + * when a texture is missing. Also binds the default sampler to the unit. */ void CLP(GraphicsStateGuardian):: -apply_white_texture() { - if (_white_texture != 0) { - glBindTexture(GL_TEXTURE_2D, _white_texture); - return; +apply_white_texture(GLuint unit) { + set_active_texture_stage(unit); + glBindTexture(GL_TEXTURE_2D, get_white_texture()); + + // Also apply the default sampler, if there's a chance we'd applied anything + // else. +#ifndef OPENGLES_1 + if (_supports_sampler_objects) { + _glBindSampler(unit, 0); } - - glGenTextures(1, &_white_texture); - glBindTexture(GL_TEXTURE_2D, _white_texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - unsigned char data[] = {0xff, 0xff, 0xff, 0xff}; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, - GL_RGBA, GL_UNSIGNED_BYTE, data); +#endif } /** @@ -10934,7 +10929,16 @@ apply_white_texture() { GLuint CLP(GraphicsStateGuardian):: get_white_texture() { if (_white_texture == 0) { - apply_white_texture(); + glGenTextures(1, &_white_texture); + glBindTexture(GL_TEXTURE_2D, _white_texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + unsigned char data[] = {0xff, 0xff, 0xff, 0xff}; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, + GL_RGBA, GL_UNSIGNED_BYTE, data); } return _white_texture; } diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.h b/panda/src/glstuff/glGraphicsStateGuardian_src.h index bf95facb90..5f7f382246 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.h +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.h @@ -567,7 +567,7 @@ protected: void update_shader_vertex_format(const GeomVertexFormat *format); #endif - void apply_white_texture(); + void apply_white_texture(GLuint unit); GLuint get_white_texture(); #ifndef NDEBUG diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 65a4a1c01c..d81d86bfff 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -2617,8 +2617,7 @@ update_shader_texture_bindings(ShaderContext *prev) { textures[i] = _glgsg->get_white_texture(); samplers[i] = 0; } else { - _glgsg->set_active_texture_stage(i); - _glgsg->apply_white_texture(); + _glgsg->apply_white_texture(i); } continue; } From a71a89acc20b4c5836bb8c11a6bca8cc7e6c72a9 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 15 May 2017 16:34:13 +0200 Subject: [PATCH 109/254] putil: make UpdateSeq a literal type --- panda/src/putil/updateSeq.I | 38 ++++++++++++++++++++++--------------- panda/src/putil/updateSeq.h | 12 ++++++++---- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/panda/src/putil/updateSeq.I b/panda/src/putil/updateSeq.I index a3f4877c7f..99703059d4 100644 --- a/panda/src/putil/updateSeq.I +++ b/panda/src/putil/updateSeq.I @@ -11,48 +11,56 @@ * @date 1999-09-30 */ +/** + * Creates an UpdateSeq in the given state. + */ +CONSTEXPR UpdateSeq:: +UpdateSeq(unsigned int seq) : _seq(seq) { +} + /** * Creates an UpdateSeq in the 'initial' state. */ -INLINE UpdateSeq:: -UpdateSeq() { - _seq = (unsigned int)SC_initial; +CONSTEXPR UpdateSeq:: +UpdateSeq() : _seq((unsigned int)SC_initial) { } /** * Returns an UpdateSeq in the 'initial' state. */ -INLINE UpdateSeq UpdateSeq:: +CONSTEXPR UpdateSeq UpdateSeq:: initial() { - return UpdateSeq(); + return UpdateSeq((unsigned int)SC_initial); } /** * Returns an UpdateSeq in the 'old' state. */ -INLINE UpdateSeq UpdateSeq:: +CONSTEXPR UpdateSeq UpdateSeq:: old() { - UpdateSeq result; - result._seq = (unsigned int)SC_old; - return result; + return UpdateSeq((unsigned int)SC_old); } /** * Returns an UpdateSeq in the 'fresh' state. */ -INLINE UpdateSeq UpdateSeq:: +CONSTEXPR UpdateSeq UpdateSeq:: fresh() { - UpdateSeq result; - result._seq = (unsigned int)SC_fresh; - return result; + return UpdateSeq((unsigned int)SC_fresh); } /** * */ INLINE UpdateSeq:: -UpdateSeq(const UpdateSeq ©) { - _seq = AtomicAdjust::get(copy._seq); +UpdateSeq(const UpdateSeq ©) : _seq(AtomicAdjust::get(copy._seq)) { +} + +/** + * + */ +CONSTEXPR UpdateSeq:: +UpdateSeq(const UpdateSeq &&from) NOEXCEPT : _seq(from._seq) { } /** diff --git a/panda/src/putil/updateSeq.h b/panda/src/putil/updateSeq.h index 4899787244..5ba9de908f 100644 --- a/panda/src/putil/updateSeq.h +++ b/panda/src/putil/updateSeq.h @@ -35,13 +35,17 @@ * sequences are numeric and are monotonically increasing. */ class EXPCL_PANDA_PUTIL UpdateSeq { +private: + CONSTEXPR UpdateSeq(unsigned int seq); + PUBLISHED: - INLINE UpdateSeq(); - INLINE static UpdateSeq initial(); - INLINE static UpdateSeq old(); - INLINE static UpdateSeq fresh(); + CONSTEXPR UpdateSeq(); + CONSTEXPR static UpdateSeq initial(); + CONSTEXPR static UpdateSeq old(); + CONSTEXPR static UpdateSeq fresh(); INLINE UpdateSeq(const UpdateSeq ©); + CONSTEXPR UpdateSeq(const UpdateSeq &&from) NOEXCEPT; INLINE UpdateSeq &operator = (const UpdateSeq ©); INLINE void clear(); From 68be3c6dfee6dcd4fc620a98cc1d766585fd1b4b Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 15 May 2017 16:58:56 +0200 Subject: [PATCH 110/254] More efficient light handling; sort lights by highest priority first --- panda/src/display/graphicsStateGuardian.cxx | 135 ++++++---------- panda/src/pgraph/lightAttrib.I | 49 ++++-- panda/src/pgraph/lightAttrib.cxx | 147 +++++++----------- panda/src/pgraph/lightAttrib.h | 24 ++- .../tinydisplay/tinyGraphicsStateGuardian.cxx | 54 +++---- 5 files changed, 179 insertions(+), 230 deletions(-) diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 294db16e6e..70dfcc80ac 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -1092,23 +1092,12 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, const LightAttrib *target_light = (const LightAttrib *) _target_rs->get_attrib_def(LightAttrib::get_class_slot()); - int num_on_lights = target_light->get_num_on_lights(); - if (num_on_lights == 0) { + if (!target_light->has_any_on_light()) { // There are no lights at all. This means, to follow the fixed- // function model, we pretend there is an all-white ambient light. t.set_row(3, LVecBase4(1, 1, 1, 1)); } else { - for (int li = 0; li < num_on_lights; li++) { - NodePath light = target_light->get_on_light(li); - nassertr(!light.is_empty(), &LMatrix4::zeros_mat()); - Light *light_obj = light.node()->as_light(); - nassertr(light_obj != (Light *)NULL, &LMatrix4::zeros_mat()); - - if (light_obj->is_ambient_light()) { - cur_ambient_light += light_obj->get_color(); - } - } - t.set_row(3, cur_ambient_light); + t.set_row(3, target_light->get_ambient_contribution()); } return &t; } @@ -1374,28 +1363,20 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, const LightAttrib *target_light; _target_rs->get_attrib_def(target_light); - // We want to ignore ambient lights. To that effect, iterate through the - // list of lights. In the future, we will improve this system, by also - // filtering down to the number of lights specified by the shader. - int i = 0; - - int num_on_lights = target_light->get_num_on_lights(); - for (int li = 0; li < num_on_lights; li++) { - NodePath light = target_light->get_on_light(li); + // We don't count ambient lights, which would be pretty silly to handle + // via this mechanism. + size_t num_lights = target_light->get_num_non_ambient_lights(); + if (index >= 0 && (size_t)index < num_lights) { + NodePath light = target_light->get_on_light((size_t)index); nassertr(!light.is_empty(), &LMatrix4::ident_mat()); Light *light_obj = light.node()->as_light(); - nassertr(light_obj != (Light *)NULL, &LMatrix4::ident_mat()); + nassertr(light_obj != nullptr, &LMatrix4::ident_mat()); - if (!light_obj->is_ambient_light()) { - if (i++ == index) { - return fetch_specified_member(light, name, t); - } - } - } + return fetch_specified_member(light, name, t); - // Apply the default OpenGL lights otherwise. - // Special exception for light 0, which defaults to white. - if (index == 0) { + } else if (index == 0) { + // Apply the default OpenGL lights otherwise. + // Special exception for light 0, which defaults to white. string basename = name->get_basename(); if (basename == "color" || basename == "diffuse") { t.set_row(3, _light_color_scale); @@ -1776,35 +1757,28 @@ fetch_specified_texture(Shader::ShaderTexSpec &spec, SamplerState &sampler, const LightAttrib *target_light; _target_rs->get_attrib_def(target_light); - // We want to ignore ambient lights. To that effect, iterate through - // the list of lights. In the future, we will improve this system, by - // also filtering down to the number of lights specified by the shader. - int i = 0; - - int num_on_lights = target_light->get_num_on_lights(); - for (int li = 0; li < num_on_lights; li++) { - NodePath light = target_light->get_on_light(li); - nassertr(!light.is_empty(), NULL); + // We don't count ambient lights, which would be pretty silly to handle + // via this mechanism. + size_t num_lights = target_light->get_num_non_ambient_lights(); + if (spec._stage >= 0 && (size_t)spec._stage < num_lights) { + NodePath light = target_light->get_on_light((size_t)spec._stage); + nassertr(!light.is_empty(), nullptr); Light *light_obj = light.node()->as_light(); - nassertr(light_obj != (Light *)NULL, NULL); + nassertr(light_obj != nullptr, nullptr); - if (!light_obj->is_ambient_light()) { - if (i++ == spec._stage) { - PT(Texture) tex = get_shadow_map(light); - if (tex != (Texture *)NULL) { - sampler = tex->get_default_sampler(); - } - return tex; - } + PT(Texture) tex = get_shadow_map(light); + if (tex != nullptr) { + sampler = tex->get_default_sampler(); } + return tex; + } else { + // There is no such light assigned. Bind a dummy shadow map. + PT(Texture) tex = get_dummy_shadow_map((Texture::TextureType)spec._desired_type); + if (tex != nullptr) { + sampler = tex->get_default_sampler(); + } + return tex; } - - // There is no such light assigned. Bind a dummy shadow map. - PT(Texture) tex = get_dummy_shadow_map((Texture::TextureType)spec._desired_type); - if (tex != nullptr) { - sampler = tex->get_default_sampler(); - } - return tex; } break; @@ -2645,7 +2619,7 @@ do_issue_light() { int i; int num_enabled = 0; - int num_on_lights = 0; + bool any_on_lights = false; const LightAttrib *target_light; _target_rs->get_attrib_def(target_light); @@ -2654,18 +2628,16 @@ do_issue_light() { display_cat.spam() << "do_issue_light: " << target_light << "\n"; } - if (target_light != (LightAttrib *)NULL) { - CPT(LightAttrib) new_light = target_light->filter_to_max(_max_lights); - if (display_cat.is_spam()) { - new_light->write(display_cat.spam(false), 2); - } - - num_on_lights = new_light->get_num_on_lights(); - for (int li = 0; li < num_on_lights; li++) { - NodePath light = new_light->get_on_light(li); + if (target_light != nullptr) { + // LightAttrib guarantees that the on lights are sorted, and that + // non-ambient lights come before ambient lights. + any_on_lights = target_light->has_any_on_light(); + size_t filtered_lights = min((size_t)_max_lights, target_light->get_num_non_ambient_lights()); + for (size_t li = 0; li < filtered_lights; ++li) { + NodePath light = target_light->get_on_light(li); nassertv(!light.is_empty()); Light *light_obj = light.node()->as_light(); - nassertv(light_obj != (Light *)NULL); + nassertv(light_obj != nullptr); // Lighting should be enabled before we apply any lights. if (!_lighting_enabled) { @@ -2673,23 +2645,16 @@ do_issue_light() { _lighting_enabled = true; } - if (light_obj->is_ambient_light()) { - // Ambient lights don't require specific light ids; simply add in the - // ambient contribution to the current total - cur_ambient_light += light_obj->get_color(); - - } else { - const LColor &color = light_obj->get_color(); - // Don't bother binding the light if it has no color to contribute. - if (color[0] != 0.0 || color[1] != 0.0 || color[2] != 0.0) { - enable_light(num_enabled, true); - if (num_enabled == 0) { - begin_bind_lights(); - } - - light_obj->bind(this, light, num_enabled); - num_enabled++; + const LColor &color = light_obj->get_color(); + // Don't bother binding the light if it has no color to contribute. + if (color[0] != 0.0 || color[1] != 0.0 || color[2] != 0.0) { + enable_light(num_enabled, true); + if (num_enabled == 0) { + begin_bind_lights(); } + + light_obj->bind(this, light, num_enabled); + num_enabled++; } } } @@ -2700,7 +2665,7 @@ do_issue_light() { _num_lights_enabled = num_enabled; // If no lights were set, disable lighting - if (num_on_lights == 0) { + if (!any_on_lights) { if (_color_scale_via_lighting && (_has_material_force_color || _light_color_scale != LVecBase4(1.0f, 1.0f, 1.0f, 1.0f))) { // Unless we need lighting anyway to apply a color or color scale. if (!_lighting_enabled) { @@ -2717,7 +2682,7 @@ do_issue_light() { } } else { - set_ambient_light(cur_ambient_light); + set_ambient_light(target_light->get_ambient_contribution()); } if (num_enabled != 0) { diff --git a/panda/src/pgraph/lightAttrib.I b/panda/src/pgraph/lightAttrib.I index 5281acc1a3..e876055642 100644 --- a/panda/src/pgraph/lightAttrib.I +++ b/panda/src/pgraph/lightAttrib.I @@ -15,8 +15,7 @@ * Use LightAttrib::make() to construct a new LightAttrib object. */ INLINE LightAttrib:: -LightAttrib() { - _off_all_lights = false; +LightAttrib() : _off_all_lights(false), _num_non_ambient_lights(0) { } /** @@ -27,25 +26,37 @@ INLINE LightAttrib:: LightAttrib(const LightAttrib ©) : _on_lights(copy._on_lights), _off_lights(copy._off_lights), - _off_all_lights(copy._off_all_lights) + _off_all_lights(copy._off_all_lights), + _sort_seq(UpdateSeq::old()) { } /** * Returns the number of lights that are turned on by the attribute. */ -INLINE int LightAttrib:: +INLINE size_t LightAttrib:: get_num_on_lights() const { - return _on_lights.size(); + check_sorted(); + return _sorted_on_lights.size(); +} + +/** + * Returns the number of non-ambient lights that are turned on by this + * attribute. + */ +INLINE size_t LightAttrib:: +get_num_non_ambient_lights() const { + check_sorted(); + return _num_non_ambient_lights; } /** * Returns the nth light turned on by the attribute, sorted in render order. */ INLINE NodePath LightAttrib:: -get_on_light(int n) const { - nassertr(n >= 0 && n < (int)_on_lights.size(), NodePath::fail()); - return _on_lights[n]; +get_on_light(size_t n) const { + nassertr(n < _sorted_on_lights.size(), NodePath::fail()); + return _sorted_on_lights[n]; } /** @@ -57,10 +68,18 @@ has_on_light(const NodePath &light) const { return _on_lights.find(light) != _on_lights.end(); } +/** + * Returns true if any light is turned on by the attrib, false otherwise. + */ +INLINE bool LightAttrib:: +has_any_on_light() const { + return !_on_lights.empty(); +} + /** * Returns the number of lights that are turned off by the attribute. */ -INLINE int LightAttrib:: +INLINE size_t LightAttrib:: get_num_off_lights() const { return _off_lights.size(); } @@ -70,8 +89,8 @@ get_num_off_lights() const { * (pointer) order. */ INLINE NodePath LightAttrib:: -get_off_light(int n) const { - nassertr(n >= 0 && n < (int)_off_lights.size(), NodePath::fail()); +get_off_light(size_t n) const { + nassertr(n < _off_lights.size(), NodePath::fail()); return _off_lights[n]; } @@ -104,13 +123,11 @@ is_identity() const { } /** - * Confirms whether the _filtered table is still valid. It may become invalid - * if someone calls Light::set_priority(). - * - * If the table is invalid, transparently empties it before returning. + * Makes sure that the on lights are still sorted by priority. It may become + * invalid if someone calls Light::set_priority(). */ INLINE void LightAttrib:: -check_filtered() const { +check_sorted() const { if (_sort_seq != Light::get_sort_seq()) { ((LightAttrib *)this)->sort_on_lights(); } diff --git a/panda/src/pgraph/lightAttrib.cxx b/panda/src/pgraph/lightAttrib.cxx index b80eb3b428..8bb66bcec2 100644 --- a/panda/src/pgraph/lightAttrib.cxx +++ b/panda/src/pgraph/lightAttrib.cxx @@ -29,7 +29,7 @@ int LightAttrib::_attrib_slot; CPT(RenderAttrib) LightAttrib::_all_off_attrib; TypeHandle LightAttrib::_type_handle; -// This STL Function object is used in filter_to_max(), below, to sort a list +// This STL Function object is used in sort_on_lights(), below, to sort a list // of Lights in reverse order by priority. In the case of two lights with // equal priority, the class priority is compared. class CompareLightPriorities { @@ -430,80 +430,6 @@ remove_off_light(const NodePath &light) const { return return_new(attrib); } -/** - * Returns a new LightAttrib, very much like this one, but with the number of - * on_lights reduced to be no more than max_lights. The number of off_lights - * in the new LightAttrib is undefined. - * - * The number of AmbientLights is not included in the count. All - * AmbientLights in the original attrib are always included in the result, - * regardless of the value of max_lights. - */ -CPT(LightAttrib) LightAttrib:: -filter_to_max(int max_lights) const { - if (max_lights < 0 || (int)_on_lights.size() <= max_lights) { - // Trivial case: this LightAttrib qualifies. - return this; - } - - // Since check_filtered() will clear the _filtered list if we are out of - // date, we should call it first. - check_filtered(); - - Filtered::const_iterator fi; - fi = _filtered.find(max_lights); - if (fi != _filtered.end()) { - // Easy case: we have already computed this for this particular - // LightAttrib. - return (*fi).second; - } - - // Harder case: we have to compute it now. We must choose the n lights with - // the highest priority in our list of lights. - Lights priority_lights, ambient_lights; - - // Separate the list of lights into ambient lights and other lights. - Lights::const_iterator li; - for (li = _on_lights.begin(); li != _on_lights.end(); ++li) { - const NodePath &np = (*li); - nassertr(!np.is_empty() && np.node()->as_light() != (Light *)NULL, this); - if (np.node()->is_ambient_light()) { - ambient_lights.push_back(np); - } else { - priority_lights.push_back(np); - } - } - - // This sort function uses the STL function object defined above. - sort(priority_lights.begin(), priority_lights.end(), - CompareLightPriorities()); - - // Now lop off all of the lights after the first max_lights. - if ((int)priority_lights.size() > max_lights) { - priority_lights.erase(priority_lights.begin() + max_lights, - priority_lights.end()); - } - - // Put the ambient lights back into the list. - for (li = ambient_lights.begin(); li != ambient_lights.end(); ++li) { - priority_lights.push_back(*li); - } - - // And re-sort the ov_set into its proper order. - priority_lights.sort(); - - // Now create a new attrib reflecting these lights. - PT(LightAttrib) attrib = new LightAttrib; - attrib->_on_lights.swap(priority_lights); - - CPT(RenderAttrib) new_attrib = return_new(attrib); - - // Finally, record this newly-created attrib in the map for next time. - CPT(LightAttrib) light_attrib = (const LightAttrib *)new_attrib.p(); - ((LightAttrib *)this)->_filtered[max_lights] = light_attrib; - return light_attrib; -} - /** * Returns the most important light (that is, the light with the highest * priority) in the LightAttrib, excluding any ambient lights. Returns an @@ -511,22 +437,35 @@ filter_to_max(int max_lights) const { */ NodePath LightAttrib:: get_most_important_light() const { - NodePath best; + check_sorted(); - CompareLightPriorities compare; + if (_num_non_ambient_lights > 0) { + return _sorted_on_lights[0]; + } else { + return NodePath(); + } +} + +/** + * Returns the total contribution of all the ambient lights. + */ +LColor LightAttrib:: +get_ambient_contribution() const { + check_sorted(); + + LVecBase4 total(0); Lights::const_iterator li; - for (li = _on_lights.begin(); li != _on_lights.end(); ++li) { + li = _sorted_on_lights.begin() + _num_non_ambient_lights; + for (; li != _sorted_on_lights.end(); ++li) { const NodePath &np = (*li); - nassertr(!np.is_empty() && np.node()->as_light() != (Light *)NULL, NodePath()); - if (!np.node()->is_ambient_light()) { - if (best.is_empty() || compare(np, best)) { - best = np; - } - } + Light *light = np.node()->as_light(); + nassertd(light != nullptr && light->is_ambient_light()) continue; + + total += light->get_color(); } - return best; + return total; } /** @@ -869,13 +808,42 @@ get_auto_shader_attrib_impl(const RenderState *state) const { } /** - * This is patterned after TextureAttrib::sort_on_stages(), but since lights - * don't actually require sorting, this only empties the _filtered map. + * Makes sure the lights are sorted in order of priority. Also counts the + * number of non-ambient lights. */ void LightAttrib:: sort_on_lights() { _sort_seq = Light::get_sort_seq(); - _filtered.clear(); + + // Separate the list of lights into ambient lights and other lights. + _sorted_on_lights.clear(); + OrderedLights ambient_lights; + + Lights::const_iterator li; + for (li = _on_lights.begin(); li != _on_lights.end(); ++li) { + const NodePath &np = (*li); + nassertd(!np.is_empty() && np.node()->as_light() != nullptr) continue; + + if (!np.node()->is_ambient_light()) { + _sorted_on_lights.push_back(np); + } else { + ambient_lights.push_back(np); + } + } + + // Remember how many lights were non-ambient lights, which makes it easier + // to traverse through the list of non-ambient lights. + _num_non_ambient_lights = _sorted_on_lights.size(); + + // This sort function uses the STL function object defined above. + sort(_sorted_on_lights.begin(), _sorted_on_lights.end(), + CompareLightPriorities()); + + // Now insert the ambient lights back at the end. We don't really care + // about their relative priorities, because their contribution will simply + // be summed up in the end anyway. + _sorted_on_lights.insert(_sorted_on_lights.end(), + ambient_lights.begin(), ambient_lights.end()); } /** @@ -1085,4 +1053,7 @@ fillin(DatagramIterator &scan, BamReader *manager) { aux->_num_on_lights = scan.get_uint16(); manager->read_pointers(scan, aux->_num_on_lights); } + + _sorted_on_lights.clear(); + _sort_seq = UpdateSeq::old(); } diff --git a/panda/src/pgraph/lightAttrib.h b/panda/src/pgraph/lightAttrib.h index 1053dac3fe..1158531bc0 100644 --- a/panda/src/pgraph/lightAttrib.h +++ b/panda/src/pgraph/lightAttrib.h @@ -67,13 +67,15 @@ PUBLISHED: static CPT(RenderAttrib) make(); static CPT(RenderAttrib) make_all_off(); - INLINE int get_num_on_lights() const; - INLINE NodePath get_on_light(int n) const; + INLINE size_t get_num_on_lights() const; + INLINE size_t get_num_non_ambient_lights() const; + INLINE NodePath get_on_light(size_t n) const; MAKE_SEQ(get_on_lights, get_num_on_lights, get_on_light); INLINE bool has_on_light(const NodePath &light) const; + INLINE bool has_any_on_light() const; - INLINE int get_num_off_lights() const; - INLINE NodePath get_off_light(int n) const; + INLINE size_t get_num_off_lights() const; + INLINE NodePath get_off_light(size_t n) const; MAKE_SEQ(get_off_lights, get_num_off_lights, get_off_light); INLINE bool has_off_light(const NodePath &light) const; INLINE bool has_all_off() const; @@ -85,8 +87,11 @@ PUBLISHED: CPT(RenderAttrib) add_off_light(const NodePath &light) const; CPT(RenderAttrib) remove_off_light(const NodePath &light) const; - CPT(LightAttrib) filter_to_max(int max_lights) const; NodePath get_most_important_light() const; + LColor get_ambient_contribution() const; + + MAKE_SEQ_PROPERTY(on_lights, get_num_on_lights, get_on_light); + MAKE_SEQ_PROPERTY(off_lights, get_num_off_lights, get_off_light); public: virtual void output(ostream &out) const; @@ -100,7 +105,7 @@ protected: virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: - INLINE void check_filtered() const; + INLINE void check_sorted() const; void sort_on_lights(); private: @@ -108,8 +113,11 @@ private: Lights _on_lights, _off_lights; bool _off_all_lights; - typedef pmap< int, CPT(LightAttrib) > Filtered; - Filtered _filtered; + // These are sorted in descending order of priority, with the ambient lights + // sorted last. + typedef pvector OrderedLights; + OrderedLights _sorted_on_lights; + size_t _num_non_ambient_lights; UpdateSeq _sort_seq; diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx index db600e14de..f757b35a22 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx @@ -1734,11 +1734,7 @@ release_texture(TextureContext *tc) { */ void TinyGraphicsStateGuardian:: do_issue_light() { - // Initialize the current ambient light total and newly enabled light list - LColor cur_ambient_light(0.0f, 0.0f, 0.0f, 0.0f); - int num_enabled = 0; - int num_on_lights = 0; const LightAttrib *target_light = DCAST(LightAttrib, _target_rs->get_attrib_def(LightAttrib::get_class_slot())); if (display_cat.is_spam()) { @@ -1750,43 +1746,35 @@ do_issue_light() { clear_light_state(); // Now, assign new lights. - if (target_light != (LightAttrib *)NULL) { - CPT(LightAttrib) new_light = target_light->filter_to_max(_max_lights); - if (display_cat.is_spam()) { - new_light->write(display_cat.spam(false), 2); - } - - num_on_lights = new_light->get_num_on_lights(); - for (int li = 0; li < num_on_lights; li++) { - NodePath light = new_light->get_on_light(li); - nassertv(!light.is_empty()); - Light *light_obj = light.node()->as_light(); - nassertv(light_obj != (Light *)NULL); - + if (target_light != nullptr) { + if (target_light->has_any_on_light()) { _lighting_enabled = true; _c->lighting_enabled = true; + } - if (light_obj->get_type() == AmbientLight::get_class_type()) { - // Accumulate all of the ambient lights together into one. - cur_ambient_light += light_obj->get_color(); + size_t filtered_lights = min((size_t)_max_lights, target_light->get_num_non_ambient_lights()); + for (size_t li = 0; li < filtered_lights; ++li) { + NodePath light = target_light->get_on_light(li); + nassertv(!light.is_empty()); + Light *light_obj = light.node()->as_light(); + nassertv(light_obj != nullptr); - } else { - // Other kinds of lights each get their own GLLight object. - light_obj->bind(this, light, num_enabled); - num_enabled++; + // Other kinds of lights each get their own GLLight object. + light_obj->bind(this, light, num_enabled); + num_enabled++; - // Handle the diffuse color here, since all lights have this property. - GLLight *gl_light = _c->first_light; - nassertv(gl_light != NULL); - const LColor &diffuse = light_obj->get_color(); - gl_light->diffuse.v[0] = diffuse[0]; - gl_light->diffuse.v[1] = diffuse[1]; - gl_light->diffuse.v[2] = diffuse[2]; - gl_light->diffuse.v[3] = diffuse[3]; - } + // Handle the diffuse color here, since all lights have this property. + GLLight *gl_light = _c->first_light; + nassertv(gl_light != NULL); + const LColor &diffuse = light_obj->get_color(); + gl_light->diffuse.v[0] = diffuse[0]; + gl_light->diffuse.v[1] = diffuse[1]; + gl_light->diffuse.v[2] = diffuse[2]; + gl_light->diffuse.v[3] = diffuse[3]; } } + LColor cur_ambient_light = target_light->get_ambient_contribution(); _c->ambient_light_model.v[0] = cur_ambient_light[0]; _c->ambient_light_model.v[1] = cur_ambient_light[1]; _c->ambient_light_model.v[2] = cur_ambient_light[2]; From c52bab180521494842e92800d084a3dc5adef324 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 24 May 2017 13:16:50 +0200 Subject: [PATCH 111/254] stb_image: update to v2.15, support 16-bit PNGs Also removes SSE2 runtime detection, which was causing compilation issues on Fedora Also now supports HDR images with #?RGBE header --- .../src/pnmimagetypes/pnmFileTypeStbImage.cxx | 146 +- panda/src/pnmimagetypes/stb_image.h | 1405 +++++++++++------ 2 files changed, 1000 insertions(+), 551 deletions(-) diff --git a/panda/src/pnmimagetypes/pnmFileTypeStbImage.cxx b/panda/src/pnmimagetypes/pnmFileTypeStbImage.cxx index 9a96d64fc4..a87aae11f6 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeStbImage.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeStbImage.cxx @@ -240,12 +240,28 @@ StbImageReader(PNMFileType *type, istream *file, bool owns_file, string magic_nu _context.img_buffer_end = _buffer + length; _context.img_buffer_original_end = _context.img_buffer_end; +#ifndef STBI_NO_PNG + stbi__png png; + png.s = &_context; +#endif + // Invoke stbi_info to read the image size and channel count. - if (strncmp(magic_number.c_str(), "#?", 2) == 0 && + if (magic_number[0] == '#' && magic_number[1] == '?' && stbi__hdr_info(&_context, &_x_size, &_y_size, &_num_channels)) { _is_valid = true; _is_float = true; +#ifndef STBI_NO_PNG + } else if (magic_number[0] == '\x89' && magic_number[1] == 'P' && + stbi__png_info_raw(&png, &_x_size, &_y_size, &_num_channels)) { + // Detect the case of using PNGs so that we can determine whether to do a + // 16-bit load instead. + if (png.depth == 16) { + _maxval = 65535; + } + _is_valid = true; +#endif + } else if (stbi__info_main(&_context, &_x_size, &_y_size, &_num_channels)) { _is_valid = true; @@ -254,8 +270,6 @@ StbImageReader(PNMFileType *type, istream *file, bool owns_file, string magic_nu pnmimage_cat.error() << "stb_info failure: " << stbi_failure_reason() << "\n"; } - - _maxval = 255; } /** @@ -307,11 +321,13 @@ read_pfm(PfmFile &pfm) { int len; unsigned char count, value; int i, j, k, c1, c2, z; + const char *headerToken; // Check identifier - if (strcmp(stbi__hdr_gettoken(&_context, buffer), "#?RADIANCE") != 0) { + headerToken = stbi__hdr_gettoken(&_context, buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) { pnmimage_cat.error() - << "Missing #?RADIANCE header.\n"; + << "Missing #?RADIANCE or #?RGBE header.\n"; return false; } @@ -387,27 +403,43 @@ main_decode_loop: len <<= 8; len |= stbi__get8(&_context); if (len != width) { - STBI_FREE(scanline); pnmimage_cat.error() << "Corrupt HDR: invalid decoded scanline length.\n"; + STBI_FREE(scanline); return false; } - if (scanline == NULL) { - scanline = (stbi_uc *) stbi__malloc(width * 4); + if (scanline == nullptr) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + pnmimage_cat.error() << "Out of memory while reading HDR file.\n"; + STBI_FREE(hdr_data); + return false; + } } for (k = 0; k < 4; ++k) { + int nleft; i = 0; - while (i < width) { + while ((nleft = width - i) > 0) { count = stbi__get8(&_context); if (count > 128) { // Run value = stbi__get8(&_context); count -= 128; + if (count > nleft) { + pnmimage_cat.error() << "Bad RLE data in HDR file.\n"; + STBI_FREE(scanline); + return false; + } for (z = 0; z < count; ++z) { scanline[i++ * 4 + k] = value; } } else { // Dump + if (count > nleft) { + pnmimage_cat.error() << "Bad RLE data in HDR file.\n"; + STBI_FREE(scanline); + return false; + } for (z = 0; z < count; ++z) { scanline[i++ * 4 + k] = stbi__get8(&_context); } @@ -418,7 +450,9 @@ main_decode_loop: stbi__hdr_convert(hdr_data+(j*width + i)*3, scanline + i*4, 3); } } - STBI_FREE(scanline); + if (scanline) { + STBI_FREE(scanline); + } } pfm.swap_table(table); @@ -460,9 +494,14 @@ read_data(xel *array, xelval *alpha) { int cols = 0; int rows = 0; int comp = _num_channels; - stbi_uc *data = stbi__load_main(&_context, &cols, &rows, &comp, _num_channels); + void *data; + if (_maxval != 65535) { + data = stbi__load_and_postprocess_8bit(&_context, &cols, &rows, &comp, _num_channels); + } else { + data = stbi__load_and_postprocess_16bit(&_context, &cols, &rows, &comp, _num_channels); + } - if (data == NULL) { + if (data == nullptr) { pnmimage_cat.error() << "stbi_load failure: " << stbi_failure_reason() << "\n"; return 0; @@ -472,36 +511,67 @@ read_data(xel *array, xelval *alpha) { nassertr(comp == _num_channels, 0); size_t pixels = (size_t)_x_size * (size_t)rows; - stbi_uc *ptr = data; - switch (_num_channels) { - case 1: - for (size_t i = 0; i < pixels; ++i) { - PPM_ASSIGN(array[i], ptr[i], ptr[i], ptr[i]); - } - break; + if (_maxval != 65535) { + uint8_t *ptr = (uint8_t *)data; + switch (_num_channels) { + case 1: + for (size_t i = 0; i < pixels; ++i) { + PPM_ASSIGN(array[i], ptr[i], ptr[i], ptr[i]); + } + break; - case 2: - for (size_t i = 0; i < pixels; ++i) { - PPM_ASSIGN(array[i], ptr[0], ptr[0], ptr[0]); - alpha[i] = ptr[1]; - ptr += 2; - } - break; + case 2: + for (size_t i = 0; i < pixels; ++i) { + PPM_ASSIGN(array[i], ptr[0], ptr[0], ptr[0]); + alpha[i] = ptr[1]; + ptr += 2; + } + break; - case 3: - for (size_t i = 0; i < pixels; ++i) { - PPM_ASSIGN(array[i], ptr[0], ptr[1], ptr[2]); - ptr += 3; - } - break; + case 3: + for (size_t i = 0; i < pixels; ++i) { + PPM_ASSIGN(array[i], ptr[0], ptr[1], ptr[2]); + ptr += 3; + } + break; - case 4: - for (size_t i = 0; i < pixels; ++i) { - PPM_ASSIGN(array[i], ptr[0], ptr[1], ptr[2]); - alpha[i] = ptr[3]; - ptr += 4; + case 4: + for (size_t i = 0; i < pixels; ++i) { + PPM_ASSIGN(array[i], ptr[0], ptr[1], ptr[2]); + alpha[i] = ptr[3]; + ptr += 4; + } + break; + } + } else { + uint16_t *ptr = (uint16_t *)data; + switch (_num_channels) { + case 1: + for (size_t i = 0; i < pixels; ++i) { + PPM_ASSIGN(array[i], ptr[i], ptr[i], ptr[i]); + } + break; + + case 2: + for (size_t i = 0; i < pixels; ++i) { + PPM_ASSIGN(array[i], ptr[0], ptr[0], ptr[0]); + alpha[i] = ptr[1]; + ptr += 2; + } + break; + + case 3: + memcpy(array, ptr, pixels * sizeof(uint16_t) * 3); + break; + + case 4: + for (size_t i = 0; i < pixels; ++i) { + PPM_ASSIGN(array[i], ptr[0], ptr[1], ptr[2]); + alpha[i] = ptr[3]; + ptr += 4; + } + break; } - break; } stbi_image_free(data); diff --git a/panda/src/pnmimagetypes/stb_image.h b/panda/src/pnmimagetypes/stb_image.h index a3c1129932..8773da408d 100644 --- a/panda/src/pnmimagetypes/stb_image.h +++ b/panda/src/pnmimagetypes/stb_image.h @@ -1,4 +1,4 @@ -/* stb_image - v2.12 - public domain image loader - http://nothings.org/stb_image.h +/* stb_image - v2.15 - public domain image loader - http://nothings.org/stb_image.h no warranty implied; use at your own risk Do this: @@ -21,7 +21,7 @@ avoid problematic images and only need the trivial interface JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) - PNG 1/2/4/8-bit-per-channel (16 bpc not supported) + PNG 1/2/4/8/16-bit-per-channel TGA (not sure what subset, if a subset) BMP non-1bpp, non-RLE @@ -42,114 +42,19 @@ Full documentation under "DOCUMENTATION" below. - Revision 2.00 release notes: +LICENSE - - Progressive JPEG is now supported. + See end of file for license information. - - PPM and PGM binary formats are now supported, thanks to Ken Miller. +RECENT REVISION HISTORY: - - x86 platforms now make use of SSE2 SIMD instructions for - JPEG decoding, and ARM platforms can use NEON SIMD if requested. - This work was done by Fabian "ryg" Giesen. SSE2 is used by - default, but NEON must be enabled explicitly; see docs. - - With other JPEG optimizations included in this version, we see - 2x speedup on a JPEG on an x86 machine, and a 1.5x speedup - on a JPEG on an ARM machine, relative to previous versions of this - library. The same results will not obtain for all JPGs and for all - x86/ARM machines. (Note that progressive JPEGs are significantly - slower to decode than regular JPEGs.) This doesn't mean that this - is the fastest JPEG decoder in the land; rather, it brings it - closer to parity with standard libraries. If you want the fastest - decode, look elsewhere. (See "Philosophy" section of docs below.) - - See final bullet items below for more info on SIMD. - - - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing - the memory allocator. Unlike other STBI libraries, these macros don't - support a context parameter, so if you need to pass a context in to - the allocator, you'll have to store it in a global or a thread-local - variable. - - - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and - STBI_NO_LINEAR. - STBI_NO_HDR: suppress implementation of .hdr reader format - STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API - - - You can suppress implementation of any of the decoders to reduce - your code footprint by #defining one or more of the following - symbols before creating the implementation. - - STBI_NO_JPEG - STBI_NO_PNG - STBI_NO_BMP - STBI_NO_PSD - STBI_NO_TGA - STBI_NO_GIF - STBI_NO_HDR - STBI_NO_PIC - STBI_NO_PNM (.ppm and .pgm) - - - You can request *only* certain decoders and suppress all other ones - (this will be more forward-compatible, as addition of new decoders - doesn't require you to disable them explicitly): - - STBI_ONLY_JPEG - STBI_ONLY_PNG - STBI_ONLY_BMP - STBI_ONLY_PSD - STBI_ONLY_TGA - STBI_ONLY_GIF - STBI_ONLY_HDR - STBI_ONLY_PIC - STBI_ONLY_PNM (.ppm and .pgm) - - Note that you can define multiples of these, and you will get all - of them ("only x" and "only y" is interpreted to mean "only x&y"). - - - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still - want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB - - - Compilation of all SIMD code can be suppressed with - #define STBI_NO_SIMD - It should not be necessary to disable SIMD unless you have issues - compiling (e.g. using an x86 compiler which doesn't support SSE - intrinsics or that doesn't support the method used to detect - SSE2 support at run-time), and even those can be reported as - bugs so I can refine the built-in compile-time checking to be - smarter. - - - The old STBI_SIMD system which allowed installing a user-defined - IDCT etc. has been removed. If you need this, don't upgrade. My - assumption is that almost nobody was doing this, and those who - were will find the built-in SIMD more satisfactory anyway. - - - RGB values computed for JPEG images are slightly different from - previous versions of stb_image. (This is due to using less - integer precision in SIMD.) The C code has been adjusted so - that the same RGB values will be computed regardless of whether - SIMD support is available, so your app should always produce - consistent results. But these results are slightly different from - previous versions. (Specifically, about 3% of available YCbCr values - will compute different RGB results from pre-1.49 versions by +-1; - most of the deviating values are one smaller in the G channel.) - - - If you must produce consistent results with previous versions of - stb_image, #define STBI_JPEG_OLD and you will get the same results - you used to; however, you will not get the SIMD speedups for - the YCbCr-to-RGB conversion step (although you should still see - significant JPEG speedup from the other changes). - - Please note that STBI_JPEG_OLD is a temporary feature; it will be - removed in future versions of the library. It is only intended for - near-term back-compatibility use. - - - Latest revision history: + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 RGB-format JPEG; remove white matting in PSD; - allocate large structures on the stack; + allocate large structures on the stack; correct channel count for PNG & BMP 2.10 (2016-01-22) avoid warning introduced in 2.09 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED @@ -157,21 +62,6 @@ 2.07 (2015-09-13) partial animated GIF support limited 16-bit PSD support minor bugs, code cleanup, and compiler warnings - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) additional corruption checking - stbi_set_flip_vertically_on_load - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD - progressive JPEG - PGM/PPM support - STBI_MALLOC,STBI_REALLOC,STBI_FREE - STBI_NO_*, STBI_ONLY_* - GIF bugfix See end of file for full revision history. @@ -186,33 +76,28 @@ Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) - urraka@github (animated gif) Junggon Kim (PNM comments) + github:urraka (animated gif) Junggon Kim (PNM comments) Daniel Gibson (16-bit TGA) - + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) Optimizations & bugfixes Fabian "ryg" Giesen Arseny Kapoulkine Bug & warning fixes Marc LeBlanc David Woo Guillaume George Martins Mozeiko - Christpher Lloyd Martin Golini Jerry Jansson Joseph Thomson - Dave Moore Roy Eltham Hayaki Saito Phil Jordan - Won Chun Luke Graham Johan Duparc Nathan Reed - the Horde3D community Thomas Ruf Ronny Chevalier Nick Verigakis - Janez Zemva John Bartholomew Michal Cichon svdijk@github - Jonathan Blow Ken Hamada Tero Hanninen Baldur Karlsson - Laurent Gomila Cort Stratton Sergio Gonzalez romigrou@github - Aruelien Pocheville Thibault Reuille Cass Everitt Matthew Gregan - Ryamond Barbiero Paul Du Bois Engin Manap snagar@github - Michaelangel007@github Oriol Ferrer Mesia socks-the-fox - Blazej Dariusz Roszkowski - - -LICENSE - -This software is dual-licensed to the public domain and under the following -license: you are granted a perpetual, irrevocable license to copy, modify, -publish, and distribute this file as you see fit. + Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan + Dave Moore Roy Eltham Hayaki Saito Nathan Reed + Won Chun Luke Graham Johan Duparc Nick Verigakis + the Horde3D community Thomas Ruf Ronny Chevalier Baldur Karlsson + Janez Zemva John Bartholomew Michal Cichon github:rlyeh + Jonathan Blow Ken Hamada Tero Hanninen github:romigrou + Laurent Gomila Cort Stratton Sergio Gonzalez github:svdijk + Aruelien Pocheville Thibault Reuille Cass Everitt github:snagar + Ryamond Barbiero Paul Du Bois Engin Manap github:Zelex + Michaelangel007@github Philipp Wiesemann Dale Weiler github:grim210 + Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:sammyhw + Blazej Dariusz Roszkowski Gregory Mullen github:phprus */ @@ -238,10 +123,10 @@ publish, and distribute this file as you see fit. // stbi_image_free(data) // // Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *comp -- outputs # of image components in image file -// int req_comp -- if non-zero, # of image components requested in result +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result // // The return value from an image loader is an 'unsigned char *' which points // to the pixel data, or NULL on an allocation failure or if the image is @@ -287,13 +172,13 @@ publish, and distribute this file as you see fit. // and for best performance I may provide less-easy-to-use APIs that give higher // performance, in addition to the easy to use ones. Nevertheless, it's important // to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all. +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. // // Some secondary priorities arise directly from the first two, some of which // make more explicit reasons why performance can't be emphasized. // // - Portable ("ease of use") -// - Small footprint ("easy to maintain") +// - Small source code footprint ("easy to maintain") // - No dependencies ("ease of use") // // =========================================================================== @@ -325,13 +210,6 @@ publish, and distribute this file as you see fit. // (at least this is true for iOS and Android). Therefore, the NEON support is // toggled by a build flag: define STBI_NEON to get NEON loops. // -// The output of the JPEG decoder is slightly different from versions where -// SIMD support was introduced (that is, for versions before 1.49). The -// difference is only +-1 in the 8-bit RGB channels, and only on a small -// fraction of pixels. You can force the pre-1.49 behavior by defining -// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path -// and hence cost some performance. -// // If for some reason you do not want to use any of SIMD code, or if // you have issues compiling it, you can disable it entirely by // defining STBI_NO_SIMD. @@ -387,6 +265,41 @@ publish, and distribute this file as you see fit. // says there's premultiplied data (currently only happens in iPhone images, // and only if iPhone convert-to-rgb processing is on). // +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// #ifndef STBI_NO_STDIO @@ -406,6 +319,7 @@ enum }; typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; #ifdef __cplusplus extern "C" { @@ -433,22 +347,42 @@ typedef struct int (*eof) (void *user); // returns nonzero if we are at end of file/data } stbi_io_callbacks; -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); -STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp); -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp); +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); #ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); // for stbi_load_from_file, file pointer is left pointing immediately after image #endif +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif +// @TODO the other variants + +//////////////////////////////////// +// +// float-per-channel interface +// #ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); #endif #endif @@ -566,6 +500,7 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch #include // ptrdiff_t on osx #include #include +#include #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) #include // ldexp @@ -649,12 +584,14 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define STBI__X86_TARGET #endif -#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// NOTE: not clear do we actually need this for the 64-bit path? +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) // gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// (but compiling with -msse2 allows the compiler to use SSE2 everywhere; -// this is just broken and gcc are jerks for not fixing it properly -// http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. #define STBI_NO_SIMD #endif @@ -712,14 +649,10 @@ static int stbi__sse2_available() static int stbi__sse2_available() { -#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later - // GCC 4.8+ has a nice way to do this - return __builtin_cpu_supports("sse2"); -#else - // portable way to do this, preferably without using GCC inline ASM? - // just bail for now. - return 0; -#endif + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; } #endif #endif @@ -827,57 +760,70 @@ static void stbi__rewind(stbi__context *s) s->img_buffer_end = s->img_buffer_original_end; } +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + #ifndef STBI_NO_JPEG static int stbi__jpeg_test(stbi__context *s); -static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PNG static int stbi__png_test(stbi__context *s); -static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_BMP static int stbi__bmp_test(stbi__context *s); -static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_TGA static int stbi__tga_test(stbi__context *s); -static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PSD static int stbi__psd_test(stbi__context *s); -static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_HDR static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PIC static int stbi__pic_test(stbi__context *s); -static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_GIF static int stbi__gif_test(stbi__context *s); -static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); #endif #ifndef STBI_NO_PNM static int stbi__pnm_test(stbi__context *s); -static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); #endif @@ -900,6 +846,77 @@ static void *stbi__malloc(size_t size) return STBI_MALLOC(size); } +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} + +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} + // stbi__err - error // stbi__errpf - error returning pointer to float // stbi__errpuc - error returning pointer to unsigned char @@ -935,33 +952,38 @@ STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) stbi__vertically_flip_on_load = flag_true_if_should_flip; } -static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) { + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp); + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp); + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp); + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp); + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp); + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); #endif #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp); + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp); + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); #endif #ifndef STBI_NO_HDR if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp); + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); } #endif @@ -969,35 +991,117 @@ static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *com #ifndef STBI_NO_TGA // test tga last because it's a crappy test! if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp); + return stbi__tga_load(s,x,y,comp,req_comp, ri); #endif return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); } -static unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) { - unsigned char *result = stbi__load_main(s, x, y, comp, req_comp); + int i; + int img_len = w * h * channels; + stbi_uc *reduced; - if (stbi__vertically_flip_on_load && result != NULL) { + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 8) { + STBI_ASSERT(ri.bits_per_channel == 16); + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { int w = *x, h = *y; - int depth = req_comp ? req_comp : *comp; + int channels = req_comp ? req_comp : *comp; int row,col,z; - stbi_uc temp; + stbi_uc *image = (stbi_uc *) result; // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once for (row = 0; row < (h>>1); row++) { for (col = 0; col < w; col++) { - for (z = 0; z < depth; z++) { - temp = result[(row * w + col) * depth + z]; - result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; - result[((h - row - 1) * w + col) * depth + z] = temp; + for (z = 0; z < channels; z++) { + stbi_uc temp = image[(row * w + col) * channels + z]; + image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z]; + image[((h - row - 1) * w + col) * channels + z] = temp; } } } } - return result; + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + if (ri.bits_per_channel != 16) { + STBI_ASSERT(ri.bits_per_channel == 8); + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int w = *x, h = *y; + int channels = req_comp ? req_comp : *comp; + int row,col,z; + stbi__uint16 *image = (stbi__uint16 *) result; + + // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once + for (row = 0; row < (h>>1); row++) { + for (col = 0; col < w; col++) { + for (z = 0; z < channels; z++) { + stbi__uint16 temp = image[(row * w + col) * channels + z]; + image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z]; + image[((h - row - 1) * w + col) * channels + z] = temp; + } + } + } + } + + return (stbi__uint16 *) result; } #ifndef STBI_NO_HDR @@ -1053,27 +1157,52 @@ STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req unsigned char *result; stbi__context s; stbi__start_file(&s,f); - result = stbi__load_flip(&s,x,y,comp,req_comp); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); if (result) { // need to 'unget' all the characters in the IO buffer fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); } return result; } + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + #endif //!STBI_NO_STDIO STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_mem(&s,buffer,len); - return stbi__load_flip(&s,x,y,comp,req_comp); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); } STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_flip(&s,x,y,comp,req_comp); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); } #ifndef STBI_NO_LINEAR @@ -1082,13 +1211,14 @@ static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int unsigned char *data; #ifndef STBI_NO_HDR if (stbi__hdr_test(s)) { - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp); + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); if (hdr_data) stbi__float_postprocess(hdr_data,x,y,comp,req_comp); return hdr_data; } #endif - data = stbi__load_flip(s, x, y, comp, req_comp); + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); if (data) return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); @@ -1346,7 +1476,7 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r if (req_comp == img_n) return data; STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - good = (unsigned char *) stbi__malloc(req_comp * x * y); + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); if (good == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); @@ -1356,26 +1486,75 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r unsigned char *src = data + j * x * img_n ; unsigned char *dest = good + j * x * req_comp; - #define COMBO(a,b) ((a)*8+(b)) - #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) // convert source image with img_n components to one with req_comp components; // avoid switch per pixel, so use switch per scanline and massive macros - switch (COMBO(img_n, req_comp)) { - CASE(1,2) dest[0]=src[0], dest[1]=255; break; - CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; - CASE(2,1) dest[0]=src[0]; break; - CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; - CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; - CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; - CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break; - CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; - CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; - CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; default: STBI_ASSERT(0); } - #undef CASE + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE } STBI_FREE(data); @@ -1386,7 +1565,9 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) { int i,k,n; - float *output = (float *) stbi__malloc(x * y * comp * sizeof(float)); + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; @@ -1406,7 +1587,9 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) { int i,k,n; - stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp); + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; @@ -1471,7 +1654,7 @@ typedef struct stbi__context *s; stbi__huffman huff_dc[4]; stbi__huffman huff_ac[4]; - stbi_uc dequant[4][64]; + stbi__uint16 dequant[4][64]; stbi__int16 fast_ac[4][1 << FAST_BITS]; // sizes for components, interleaved MCUs @@ -1507,6 +1690,8 @@ typedef struct int succ_high; int succ_low; int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag int rgb; int scan_n, order[4]; @@ -1577,7 +1762,7 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) // magnitude code followed by receive_extend code int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); int m = 1 << (magbits - 1); - if (k < m) k += (-1 << magbits) + 1; + if (k < m) k += (~0U << magbits) + 1; // if the result is small enough, we can fit it in fast_ac table if (k >= -128 && k <= 127) fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); @@ -1592,6 +1777,7 @@ static void stbi__grow_buffer_unsafe(stbi__jpeg *j) int b = j->nomore ? 0 : stbi__get8(j->s); if (b == 0xff) { int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes if (c != 0) { j->marker = (unsigned char) c; j->nomore = 1; @@ -1716,7 +1902,7 @@ static stbi_uc stbi__jpeg_dezigzag[64+15] = }; // decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant) +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) { int diff,dc,k; int t; @@ -2425,7 +2611,7 @@ static stbi_uc stbi__get_marker(stbi__jpeg *j) x = stbi__get8(j->s); if (x != 0xff) return STBI__MARKER_none; while (x == 0xff) - x = stbi__get8(j->s); + x = stbi__get8(j->s); // consume repeated 0xff fill bytes return x; } @@ -2440,7 +2626,7 @@ static void stbi__jpeg_reset(stbi__jpeg *j) j->code_bits = 0; j->code_buffer = 0; j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; j->marker = STBI__MARKER_none; j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; j->eob_run = 0; @@ -2572,7 +2758,7 @@ static int stbi__parse_entropy_coded_data(stbi__jpeg *z) } } -static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant) +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) { int i; for (i=0; i < 64; ++i) @@ -2614,13 +2800,14 @@ static int stbi__process_marker(stbi__jpeg *z, int m) L = stbi__get16be(z->s)-2; while (L > 0) { int q = stbi__get8(z->s); - int p = q >> 4; + int p = q >> 4, sixteen = (p != 0); int t = q & 15,i; - if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG"); + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s); - L -= 65; + z->dequant[t][stbi__jpeg_dezigzag[i]] = sixteen ? stbi__get16be(z->s) : stbi__get8(z->s); + L -= (sixteen ? 129 : 65); } return L==0; @@ -2653,12 +2840,50 @@ static int stbi__process_marker(stbi__jpeg *z, int m) } return L==0; } + // check for comment block or APP blocks if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - stbi__skip(z->s, stbi__get16be(z->s)-2); + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); return 1; } - return 0; + + return stbi__err("unknown marker","Corrupt JPEG"); } // after we see SOS @@ -2701,6 +2926,28 @@ static int stbi__process_scan_header(stbi__jpeg *z) return 1; } +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + static int stbi__process_frame_header(stbi__jpeg *z, int scan) { stbi__context *s = z->s; @@ -2710,7 +2957,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires c = stbi__get8(s); - if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); s->img_n = c; for (i=0; i < c; ++i) { z->img_comp[i].data = NULL; @@ -2723,13 +2970,8 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) for (i=0; i < s->img_n; ++i) { static unsigned char rgb[3] = { 'R', 'G', 'B' }; z->img_comp[i].id = stbi__get8(s); - if (z->img_comp[i].id != i+1) // JFIF requires - if (z->img_comp[i].id != i) { // some version of jpegtran outputs non-JFIF-compliant files! - // somethings output this (see http://fileformats.archiveteam.org/wiki/JPEG#Color_format) - if (z->img_comp[i].id != rgb[i]) - return stbi__err("bad component ID","Corrupt JPEG"); - ++z->rgb; - } + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; q = stbi__get8(s); z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); @@ -2738,7 +2980,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) if (scan != STBI__SCAN_load) return 1; - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); for (i=0; i < s->img_n; ++i) { if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; @@ -2750,6 +2992,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_v_max = v_max; z->img_mcu_w = h_max * 8; z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; @@ -2761,28 +3004,27 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) // the bogus oversized data from using interleaved MCUs and their // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); - - if (z->img_comp[i].raw_data == NULL) { - for(--i; i >= 0; --i) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].raw_data = NULL; - } - return stbi__err("outofmem", "Out of memory"); - } + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); // align blocks for idct using mmx/sse z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - z->img_comp[i].linebuf = NULL; if (z->progressive) { - z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3; - z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3; - z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15); + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } else { - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; } } @@ -2801,6 +3043,8 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) { int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 z->marker = STBI__MARKER_none; // initialize cached marker to empty m = stbi__get_marker(z); if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); @@ -2842,12 +3086,15 @@ static int stbi__decode_jpeg_image(stbi__jpeg *j) if (x == 255) { j->marker = stbi__get8(j->s); break; - } else if (x != 0) { - return stbi__err("junk before marker", "Corrupt JPEG"); } } // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) stbi__err("bad DNL height", "Corrupt JPEG"); } else { if (!stbi__process_marker(j, m)) return 0; } @@ -3066,38 +3313,9 @@ static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_ return out; } -#ifdef STBI_JPEG_OLD -// this is the same YCbCr-to-RGB calculation that stb_image has used -// historically before the algorithm changes in 1.49 -#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 16) + 32768; // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr*float2fixed(1.40200f); - g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); - b = y_fixed + cb*float2fixed(1.77200f); - r >>= 16; - g >>= 16; - b >>= 16; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#else // this is a reduced-precision calculation of YCbCr-to-RGB introduced // to make sure the code produces the same results in both SIMD and scalar -#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) { int i; @@ -3106,9 +3324,9 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc int r,g,b; int cr = pcr[i] - 128; int cb = pcb[i] - 128; - r = y_fixed + cr* float2fixed(1.40200f); - g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* float2fixed(1.77200f); + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); r >>= 20; g >>= 20; b >>= 20; @@ -3122,7 +3340,6 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc out += step; } } -#endif #if defined(STBI_SSE2) || defined(STBI_NEON) static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) @@ -3241,9 +3458,9 @@ static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc cons int r,g,b; int cr = pcr[i] - 128; int cb = pcb[i] - 128; - r = y_fixed + cr* float2fixed(1.40200f); - g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* float2fixed(1.77200f); + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); r >>= 20; g >>= 20; b >>= 20; @@ -3269,18 +3486,14 @@ static void stbi__setup_jpeg(stbi__jpeg *j) #ifdef STBI_SSE2 if (stbi__sse2_available()) { j->idct_block_kernel = stbi__idct_simd; - #ifndef STBI_JPEG_OLD j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - #endif j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; } #endif #ifdef STBI_NEON j->idct_block_kernel = stbi__idct_simd; - #ifndef STBI_JPEG_OLD j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - #endif j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; #endif } @@ -3288,23 +3501,7 @@ static void stbi__setup_jpeg(stbi__jpeg *j) // clean up the temporary component buffers static void stbi__cleanup_jpeg(stbi__jpeg *j) { - int i; - for (i=0; i < j->s->img_n; ++i) { - if (j->img_comp[i].raw_data) { - STBI_FREE(j->img_comp[i].raw_data); - j->img_comp[i].raw_data = NULL; - j->img_comp[i].data = NULL; - } - if (j->img_comp[i].raw_coeff) { - STBI_FREE(j->img_comp[i].raw_coeff); - j->img_comp[i].raw_coeff = 0; - j->img_comp[i].coeff = 0; - } - if (j->img_comp[i].linebuf) { - STBI_FREE(j->img_comp[i].linebuf); - j->img_comp[i].linebuf = NULL; - } - } + stbi__free_jpeg_components(j, j->s->img_n, 0); } typedef struct @@ -3317,9 +3514,16 @@ typedef struct int ypos; // which pre-expansion row we're on } stbi__resample; +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) { - int n, decode_n; + int n, decode_n, is_rgb; z->s->img_n = 0; // make stbi__cleanup_jpeg safe // validate req_comp @@ -3329,9 +3533,11 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n; + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; - if (z->s->img_n == 3 && n < 3) + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) decode_n = 1; else decode_n = z->s->img_n; @@ -3368,7 +3574,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp } // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1); + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } // now go ahead and resample @@ -3391,7 +3597,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (n >= 3) { stbi_uc *y = coutput[0]; if (z->s->img_n == 3) { - if (z->rgb == 3) { + if (is_rgb) { for (i=0; i < z->s->img_x; ++i) { out[0] = y[i]; out[1] = coutput[1][i]; @@ -3402,6 +3608,28 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp } else { z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc k = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], k); + out[1] = stbi__blinn_8x8(coutput[1][i], k); + out[2] = stbi__blinn_8x8(coutput[2][i], k); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc k = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], k); + out[1] = stbi__blinn_8x8(255 - out[1], k); + out[2] = stbi__blinn_8x8(255 - out[2], k); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } } else for (i=0; i < z->s->img_x; ++i) { out[0] = out[1] = out[2] = y[i]; @@ -3409,25 +3637,54 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp out += n; } } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc k = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], k); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], k); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], k); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } } } stbi__cleanup_jpeg(z); *out_x = z->s->img_x; *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n; // report original components, not output + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output return output; } } -static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { unsigned char* result; stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); j->s = s; stbi__setup_jpeg(j); result = load_jpeg_image(j, x,y,comp,req_comp); @@ -3438,11 +3695,12 @@ static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *com static int stbi__jpeg_test(stbi__context *s) { int r; - stbi__jpeg j; - j.s = s; - stbi__setup_jpeg(&j); - r = stbi__decode_jpeg_header(&j, STBI__SCAN_type); + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); stbi__rewind(s); + STBI_FREE(j); return r; } @@ -3454,7 +3712,7 @@ static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) } if (x) *x = j->s->img_x; if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; return 1; } @@ -3511,7 +3769,7 @@ stbi_inline static int stbi__bit_reverse(int v, int bits) return stbi__bitreverse16(v) >> (16-bits); } -static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) { int i,k=0; int code, next_code[16], sizes[17]; @@ -3721,6 +3979,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) int hlit = stbi__zreceive(a,5) + 257; int hdist = stbi__zreceive(a,5) + 1; int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; memset(codelength_sizes, 0, sizeof(codelength_sizes)); for (i=0; i < hclen; ++i) { @@ -3730,27 +3989,29 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; n = 0; - while (n < hlit + hdist) { + while (n < ntot) { int c = stbi__zhuffman_decode(a, &z_codelength); if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); if (c < 16) lencodes[n++] = (stbi_uc) c; - else if (c == 16) { - c = stbi__zreceive(a,2)+3; - memset(lencodes+n, lencodes[n-1], c); - n += c; - } else if (c == 17) { - c = stbi__zreceive(a,3)+3; - memset(lencodes+n, 0, c); - n += c; - } else { - STBI_ASSERT(c == 18); - c = stbi__zreceive(a,7)+11; - memset(lencodes+n, 0, c); + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = stbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); n += c; } } - if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG"); + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; return 1; @@ -3798,9 +4059,24 @@ static int stbi__parse_zlib_header(stbi__zbuf *a) return 1; } -// @TODO: should statically initialize these for optimal thread safety -static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32]; -static void stbi__init_zdefaults(void) +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: { int i; // use <= to match clearly with spec for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; @@ -3810,6 +4086,7 @@ static void stbi__init_zdefaults(void) for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; } +*/ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) { @@ -3828,7 +4105,6 @@ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) } else { if (type == 1) { // use fixed code lengths - if (!stbi__zdefault_distance[31]) stbi__init_zdefaults(); if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; } else { @@ -4016,7 +4292,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r int width = x; STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc(x * y * output_bytes); // extra bytes to write off the end into + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into if (!a->out) return stbi__err("outofmem", "Out of memory"); img_width_bytes = (((img_n * x * depth) + 7) >> 3); @@ -4029,7 +4305,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r for (j=0; j < y; ++j) { stbi_uc *cur = a->out + stride*j; - stbi_uc *prior = cur - stride; + stbi_uc *prior; int filter = *raw++; if (filter > 4) @@ -4041,6 +4317,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r filter_bytes = 1; width = img_width_bytes; } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above // if first row, use special filter that doesn't sample previous row if (j == 0) filter = first_row_filter[filter]; @@ -4081,37 +4358,37 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r // this is a little gross, so that we don't switch per-pixel or per-component if (depth < 8 || img_n == out_n) { int nk = (width - 1)*filter_bytes; - #define CASE(f) \ + #define STBI__CASE(f) \ case f: \ for (k=0; k < nk; ++k) switch (filter) { // "none" filter turns into a memcpy here; make that explicit. case STBI__F_none: memcpy(cur, raw, nk); break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break; - CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break; - CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break; - CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break; - CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; } - #undef CASE + #undef STBI__CASE raw += nk; } else { STBI_ASSERT(img_n+1 == out_n); - #define CASE(f) \ + #define STBI__CASE(f) \ case f: \ for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ for (k=0; k < filter_bytes; ++k) switch (filter) { - CASE(STBI__F_none) cur[k] = raw[k]; break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); break; - CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); break; - CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); break; - CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); break; - CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); break; + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; } - #undef CASE + #undef STBI__CASE // the loop above sets the high byte of the pixels' alpha, but for // 16 bit png files we also need the low byte set. we'll do that here. @@ -4214,13 +4491,15 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) { + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; stbi_uc *final; int p; if (!interlaced) return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); // de-interlacing - final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n); + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); for (p=0; p < 7; ++p) { int xorig[] = { 0,4,0,2,0,1,0 }; int yorig[] = { 0,0,4,0,2,0,1 }; @@ -4240,8 +4519,8 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint3 for (i=0; i < x; ++i) { int out_y = j*yspc[p]+yorig[p]; int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n, - a->out + (j*x+i)*out_n, out_n); + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); } } STBI_FREE(a->out); @@ -4309,7 +4588,7 @@ static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; stbi_uc *p, *temp_out, *orig = a->out; - p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n); + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); if (p == NULL) return stbi__err("outofmem", "Out of memory"); // between here and free(out) below, exitting would leak @@ -4341,26 +4620,6 @@ static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int return 1; } -static int stbi__reduce_png(stbi__png *p) -{ - int i; - int img_len = p->s->img_x * p->s->img_y * p->s->img_out_n; - stbi_uc *reduced; - stbi__uint16 *orig = (stbi__uint16*)p->out; - - if (p->depth != 16) return 1; // don't need to do anything if not 16-bit data - - reduced = (stbi_uc *)stbi__malloc(img_len); - if (p == NULL) return stbi__err("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is a decent approx of 16->8 bit scaling - - p->out = reduced; - STBI_FREE(orig); - - return 1; -} - static int stbi__unpremultiply_on_load = 0; static int stbi__de_iphone_flag = 0; @@ -4451,7 +4710,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); @@ -4500,7 +4759,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); has_trans = 1; if (z->depth == 16) { - for (k = 0; k < s->img_n; ++k) tc16[k] = stbi__get16be(s); // copy the values as-is + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is } else { for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger } @@ -4587,20 +4846,22 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) } } -static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp) +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) { - unsigned char *result=NULL; + void *result=NULL; if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { - if (p->depth == 16) { - if (!stbi__reduce_png(p)) { - return result; - } - } + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; result = p->out; p->out = NULL; if (req_comp && req_comp != p->s->img_out_n) { - result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); p->s->img_out_n = req_comp; if (result == NULL) return result; } @@ -4615,11 +4876,11 @@ static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req return result; } -static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi__png p; p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp); + return stbi__do_png(&p, x,y,comp,req_comp, ri); } static int stbi__png_test(stbi__context *s) @@ -4732,7 +4993,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) info->offset = stbi__get32le(s); info->hsz = hsz = stbi__get32le(s); info->mr = info->mg = info->mb = info->ma = 0; - + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); if (hsz == 12) { s->img_x = stbi__get16le(s); @@ -4807,7 +5068,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) } -static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi_uc *out; unsigned int mr=0,mg=0,mb=0,ma=0, all_a; @@ -4815,8 +5076,9 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int int psize=0,i,j,width; int flip_vertically, pad, target; stbi__bmp_data info; + STBI_NOTUSED(ri); - info.all_a = 255; + info.all_a = 255; if (stbi__bmp_parse_header(s, &info) == NULL) return NULL; // error code already set @@ -4843,7 +5105,11 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int else target = s->img_n; // if they want monochrome, we'll post-convert - out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y); + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); if (!out) return stbi__errpuc("outofmem", "Out of memory"); if (info.bpp < 16) { int z=0; @@ -4931,7 +5197,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int stbi__skip(s, pad); } } - + // if alpha channel is all 0s, replace with all 255s if (target == 4 && all_a == 0) for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) @@ -5077,18 +5343,18 @@ errorEnd: } // read 16bit value and convert to 24bit RGB -void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) { - stbi__uint16 px = stbi__get16le(s); + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); stbi__uint16 fiveBitMask = 31; // we have 3 channels with 5bits each int r = (px >> 10) & fiveBitMask; int g = (px >> 5) & fiveBitMask; int b = px & fiveBitMask; // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later - out[0] = (r * 255)/31; - out[1] = (g * 255)/31; - out[2] = (b * 255)/31; + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); // some people claim that the most significant bit might be used for alpha // (possibly if an alpha-bit is set in the "image descriptor byte") @@ -5096,7 +5362,7 @@ void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) // so let's treat all 15 and 16bit TGAs as RGB with no alpha. } -static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { // read in the TGA header stuff int tga_offset = stbi__get8(s); @@ -5118,10 +5384,11 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int unsigned char *tga_data; unsigned char *tga_palette = NULL; int i, j; - unsigned char raw_data[4]; + unsigned char raw_data[4] = {0}; int RLE_count = 0; int RLE_repeating = 0; int read_next_pixel = 1; + STBI_NOTUSED(ri); // do a tiny bit of precessing if ( tga_image_type >= 8 ) @@ -5143,7 +5410,10 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int *y = tga_height; if (comp) *comp = tga_comp; - tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp ); + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); // skip to the data's starting position (offset usually = 0) @@ -5162,7 +5432,7 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // any data to skip? (offset usually = 0) stbi__skip(s, tga_palette_start ); // load the palette - tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_comp ); + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); if (!tga_palette) { STBI_FREE(tga_data); return stbi__errpuc("outofmem", "Out of memory"); @@ -5298,14 +5568,53 @@ static int stbi__psd_test(stbi__context *s) return r; } -static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) { - int pixelCount; + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; int channelCount, compression; - int channel, i, count, len; + int channel, i; int bitdepth; int w,h; stbi_uc *out; + STBI_NOTUSED(ri); // Check identifier if (stbi__get32be(s) != 0x38425053) // "8BPS" @@ -5362,8 +5671,18 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int if (compression > 1) return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + // Create the destination image. - out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); pixelCount = w*h; @@ -5395,82 +5714,86 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int *p = (channel == 3 ? 255 : 0); } else { // Read the RLE data. - count = 0; - while (count < pixelCount) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len ^= 0x0FF; - len += 2; - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); } } } } else { // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit value for each pixel in the image. + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. // Read the data by channel. for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out + channel; if (channel >= channelCount) { // Fill this channel with default data. - stbi_uc val = channel == 3 ? 255 : 0; - for (i = 0; i < pixelCount; i++, p += 4) - *p = val; - } else { - // Read the data. - if (bitdepth == 16) { - for (i = 0; i < pixelCount; i++, p += 4) - *p = (stbi_uc) (stbi__get16be(s) >> 8); + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } } } } } + // remove weird white matte from PSD if (channelCount >= 4) { - for (i=0; i < w*h; ++i) { - unsigned char *pixel = out + 4*i; - if (pixel[3] != 0 && pixel[3] != 255) { - // remove weird white matte from PSD - float a = pixel[3] / 255.0f; - float ra = 1.0f / a; - float inv_a = 255.0f * (1 - ra); - pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); - pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); - pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } } } } + // convert to desired output format if (req_comp && req_comp != 4) { - out = stbi__convert_format(out, 4, req_comp, w, h); + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); if (out == NULL) return out; // stbi__convert_format frees input on failure } @@ -5654,10 +5977,13 @@ static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *c return result; } -static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp) +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) { stbi_uc *result; - int i, x,y; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; for (i=0; i<92; ++i) stbi__get8(s); @@ -5665,14 +5991,14 @@ static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int re x = stbi__get16be(s); y = stbi__get16be(s); if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); stbi__get32be(s); //skip `ratio' stbi__get16be(s); //skip `fields' stbi__get16be(s); //skip `pad' // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc(x*y*4); + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); memset(result, 0xff, x*y*4); if (!stbi__pic_load_core(s,x,y,comp, result)) { @@ -5931,8 +6257,11 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i if (g->out == 0 && !stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(g->w, g->h, 4, 0)) + return stbi__errpuc("too large", "GIF too large"); + prev_out = g->out; - g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + g->out = (stbi_uc *) stbi__malloc_mad3(4, g->w, g->h, 0); if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); switch ((g->eflags & 0x1C) >> 2) { @@ -6039,11 +6368,12 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i STBI_NOTUSED(req_comp); } -static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi_uc *u = 0; stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); memset(g, 0, sizeof(*g)); + STBI_NOTUSED(ri); u = stbi__gif_load_next(s, g, comp, req_comp); if (u == (stbi_uc *) s) u = 0; // end of animated gif marker @@ -6069,20 +6399,24 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) // Radiance RGBE HDR loader // originally by Nicolas Schulz #ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s) +static int stbi__hdr_test_core(stbi__context *s, const char *signature) { - const char *signature = "#?RADIANCE\n"; int i; for (i=0; signature[i]; ++i) if (stbi__get8(s) != signature[i]) - return 0; + return 0; + stbi__rewind(s); return 1; } static int stbi__hdr_test(stbi__context* s) { - int r = stbi__hdr_test_core(s); + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } return r; } @@ -6136,7 +6470,7 @@ static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) } } -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { char buffer[STBI__HDR_BUFLEN]; char *token; @@ -6147,10 +6481,12 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re int len; unsigned char count, value; int i, j, k, c1,c2, z; - + const char *headerToken; + STBI_NOTUSED(ri); // Check identifier - if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) return stbi__errpf("not HDR", "Corrupt HDR image"); // Parse header @@ -6179,8 +6515,13 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re if (comp) *comp = 3; if (req_comp == 0) req_comp = 3; + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + // Read data - hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float)); + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); // Load image data // image data is stored as some number of sca @@ -6219,20 +6560,29 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re len <<= 8; len |= stbi__get8(s); if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4); + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } for (k = 0; k < 4; ++k) { + int nleft; i = 0; - while (i < width) { + while ((nleft = width - i) > 0) { count = stbi__get8(s); if (count > 128) { // Run value = stbi__get8(s); count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = value; } else { // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = stbi__get8(s); } @@ -6241,7 +6591,8 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re for (i=0; i < width; ++i) stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); } - STBI_FREE(scanline); + if (scanline) + STBI_FREE(scanline); } return hdr_data; @@ -6252,6 +6603,11 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) char buffer[STBI__HDR_BUFLEN]; char *token; int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; if (stbi__hdr_test(s) == 0) { stbi__rewind( s ); @@ -6293,14 +6649,14 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) void *p; stbi__bmp_data info; - info.all_a = 255; + info.all_a = 255; p = stbi__bmp_parse_header(s, &info); stbi__rewind( s ); if (p == NULL) return 0; - *x = s->img_x; - *y = s->img_y; - *comp = info.ma ? 4 : 3; + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) *comp = info.ma ? 4 : 3; return 1; } #endif @@ -6308,7 +6664,10 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) #ifndef STBI_NO_PSD static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) { - int channelCount; + int channelCount, dummy; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; if (stbi__get32be(s) != 0x38425053) { stbi__rewind( s ); return 0; @@ -6341,9 +6700,13 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) #ifndef STBI_NO_PIC static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) { - int act_comp=0,num_packets=0,chained; + int act_comp=0,num_packets=0,chained,dummy; stbi__pic_packet packets[10]; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { stbi__rewind(s); return 0; @@ -6419,16 +6782,22 @@ static int stbi__pnm_test(stbi__context *s) return 1; } -static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) { stbi_uc *out; + STBI_NOTUSED(ri); + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) return 0; + *x = s->img_x; *y = s->img_y; - *comp = s->img_n; + if (comp) *comp = s->img_n; - out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y); + if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); if (!out) return stbi__errpuc("outofmem", "Out of memory"); stbi__getn(s, out, s->img_n * s->img_x * s->img_y); @@ -6477,16 +6846,20 @@ static int stbi__pnm_getinteger(stbi__context *s, char *c) static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) { - int maxv; + int maxv, dummy; char c, p, t; - stbi__rewind( s ); + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); // Get identifier p = (char) stbi__get8(s); t = (char) stbi__get8(s); if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); + stbi__rewind(s); return 0; } @@ -6593,6 +6966,12 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int /* revision history: + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes 2.11 (2016-04-02) allocate large structures on the stack remove white matting for transparent PSD From d576c6b638db9f38adcf81aa3f016d5263a42cbc Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 24 May 2017 13:29:40 +0200 Subject: [PATCH 112/254] Improvements to generated API docs, especially in direct tree. Also add an entry point for pfreeze. --- direct/src/actor/__init__.py | 7 + direct/src/controls/__init__.py | 4 + direct/src/directbase/DirectStart.py | 17 +- direct/src/directbase/__init__.py | 12 ++ .../src/directdevices/DirectDeviceManager.py | 83 +++++---- direct/src/directdevices/DirectRadamec.py | 2 +- direct/src/directdevices/__init__.py | 5 + direct/src/directnotify/__init__.py | 3 + direct/src/directtools/__init__.py | 8 + direct/src/directutil/__init__.py | 3 + .../src/distributed/DistributedSmoothNode.py | 14 +- direct/src/distributed/__init__.py | 5 + direct/src/extensions_native/__init__.py | 5 +- direct/src/filter/__init__.py | 11 ++ direct/src/fsm/ClassicFSM.py | 12 +- direct/src/fsm/FSM.py | 2 +- direct/src/fsm/FourState.py | 6 +- direct/src/fsm/FourStateAI.py | 6 +- direct/src/fsm/__init__.py | 6 + direct/src/gui/DirectButton.py | 2 +- direct/src/gui/DirectCheckButton.py | 4 +- direct/src/gui/DirectDialog.py | 2 +- direct/src/gui/DirectEntry.py | 3 +- direct/src/gui/DirectFrame.py | 23 ++- direct/src/gui/DirectGuiBase.py | 49 +++--- direct/src/gui/DirectGuiGlobals.py | 8 +- direct/src/gui/DirectLabel.py | 2 +- direct/src/gui/DirectOptionMenu.py | 2 +- direct/src/gui/DirectRadioButton.py | 5 +- direct/src/gui/DirectScrollBar.py | 2 +- direct/src/gui/DirectScrolledFrame.py | 2 +- direct/src/gui/DirectScrolledList.py | 2 +- direct/src/gui/DirectSlider.py | 2 +- direct/src/gui/DirectWaitBar.py | 2 +- direct/src/gui/__init__.py | 12 ++ direct/src/interval/IntervalGlobal.py | 5 +- direct/src/interval/IntervalManager.py | 6 +- direct/src/interval/MetaInterval.py | 5 +- direct/src/interval/ParticleInterval.py | 6 +- direct/src/interval/TestInterval.py | 8 +- direct/src/interval/__init__.py | 12 ++ direct/src/motiontrail/__init__.py | 3 + direct/src/p3d/AppRunner.py | 7 +- direct/src/p3d/__init__.py | 4 + direct/src/particles/__init__.py | 7 + direct/src/showbase/AppRunnerGlobal.py | 2 + direct/src/showbase/Audio3DManager.py | 2 +- direct/src/showbase/BufferViewer.py | 4 +- direct/src/showbase/BulletinBoard.py | 2 +- direct/src/showbase/BulletinBoardWatcher.py | 2 +- direct/src/showbase/DirectObject.py | 3 +- direct/src/showbase/EventGroup.py | 2 +- direct/src/showbase/EventManager.py | 3 +- direct/src/showbase/EventManagerGlobal.py | 3 +- direct/src/showbase/Factory.py | 2 +- direct/src/showbase/FindCtaPaths.py | 6 +- direct/src/showbase/Finder.py | 2 +- direct/src/showbase/GarbageReport.py | 2 +- direct/src/showbase/Messenger.py | 3 +- direct/src/showbase/MirrorDemo.py | 6 +- direct/src/showbase/ObjectPool.py | 2 +- direct/src/showbase/ObjectReport.py | 22 ++- direct/src/showbase/OnScreenDebug.py | 2 +- direct/src/showbase/Pool.py | 17 +- direct/src/showbase/SfxPlayer.py | 6 +- direct/src/showbase/ShadowDemo.py | 7 +- direct/src/showbase/ShadowPlacer.py | 6 +- direct/src/showbase/TaskThreaded.py | 5 +- direct/src/showbase/ThreeUpShow.py | 3 +- direct/src/showbase/Transitions.py | 4 +- direct/src/showbase/VerboseImport.py | 5 +- direct/src/showutil/pfreeze.py | 165 +++++++++--------- direct/src/stdpy/__init__.py | 5 + direct/src/task/TaskManagerGlobal.py | 1 + direct/src/task/TaskTester.py | 7 +- direct/src/task/Timer.py | 2 +- direct/src/task/__init__.py | 8 + direct/src/tkpanels/NotifyPanel.py | 2 +- direct/src/tkwidgets/SceneGraphExplorer.py | 5 +- direct/src/tkwidgets/Tree.py | 2 +- .../src/tkwidgets/WidgetPropertiesDialog.py | 2 +- dtool/src/dtoolbase/typedObject.h | 2 + dtool/src/interrogate/interrogateBuilder.cxx | 4 + makepanda/makewheel.py | 1 + panda/src/pgraph/lightRampAttrib.cxx | 43 +++-- panda/src/physics/linearUserDefinedForce.h | 7 +- 86 files changed, 490 insertions(+), 285 deletions(-) diff --git a/direct/src/actor/__init__.py b/direct/src/actor/__init__.py index e69de29bb2..8a080475bb 100644 --- a/direct/src/actor/__init__.py +++ b/direct/src/actor/__init__.py @@ -0,0 +1,7 @@ +""" +This package contains the :class:`.Actor` class as well as a +distributed variant thereof. Actor is a high-level interface around +the lower-level :class:`panda3d.core.Character` implementation. +It loads and controls an animated character and manages the animations +playing on it. +""" diff --git a/direct/src/controls/__init__.py b/direct/src/controls/__init__.py index e69de29bb2..811657484c 100644 --- a/direct/src/controls/__init__.py +++ b/direct/src/controls/__init__.py @@ -0,0 +1,4 @@ +""" +This package contains various types of character controllers, handling basic +control mechanics and setting up collisions for them. +""" diff --git a/direct/src/directbase/DirectStart.py b/direct/src/directbase/DirectStart.py index 031dc85323..8b6b5b9539 100644 --- a/direct/src/directbase/DirectStart.py +++ b/direct/src/directbase/DirectStart.py @@ -1,4 +1,19 @@ -""" This is a deprecated module that creates a global instance of ShowBase. """ +""" +This is a shortcut that instantiates ShowBase automatically on import, +opening a graphical window and setting up the scene graph. +This example demonstrates its use: + + import direct.directbase.DirectStart + run() + +While it may be considered useful for quick prototyping in the interactive +Python shell, using it in applications is not considered good style. +As such, it has been deprecated starting with Panda3D 1.9. It is equivalent +to and may be replaced by the following code: + + from direct.showbase.ShowBase import ShowBase + base = ShowBase() +""" __all__ = [] diff --git a/direct/src/directbase/__init__.py b/direct/src/directbase/__init__.py index e69de29bb2..0d7c008a72 100644 --- a/direct/src/directbase/__init__.py +++ b/direct/src/directbase/__init__.py @@ -0,0 +1,12 @@ +""" +This package contains modules to quickly set up a Panda environment for +quick prototyping in the interactive Python shell. Merely importing +one of these modules will create a :class:`.ShowBase` instance, opening +a graphical window and setting up the scene graph. + +The most commonly used module from this package is :mod:`.DirectStart`, +importing which executes the following code:: + + from direct.showbase.ShowBase import ShowBase + base = ShowBase() +""" diff --git a/direct/src/directdevices/DirectDeviceManager.py b/direct/src/directdevices/DirectDeviceManager.py index 78c8615bdf..76206f6c40 100644 --- a/direct/src/directdevices/DirectDeviceManager.py +++ b/direct/src/directdevices/DirectDeviceManager.py @@ -9,10 +9,6 @@ ANALOG_MAX = 0.95 ANALOG_DEADBAND = 0.125 ANALOG_CENTER = 0.0 -try: - myBase = base -except: - myBase = simbase class DirectDeviceManager(VrpnClient, DirectObject): def __init__(self, server = None): @@ -52,8 +48,13 @@ class DirectButtons(ButtonNode, DirectObject): ButtonNode.__init__(self, vrpnClient, device) # Create a unique name for this button object self.name = 'DirectButtons-' + repr(DirectButtons.buttonCount) + # Attach node to data graph - self.nodePath = myBase.dataRoot.attachNewNode(self) + try: + self._base = base + except: + self._base = simbase + self.nodePath = self._base.dataRoot.attachNewNode(self) def __getitem__(self, index): if (index < 0) or (index >= self.getNumButtons()): @@ -64,10 +65,10 @@ class DirectButtons(ButtonNode, DirectObject): return self.getNumButtons() def enable(self): - self.nodePath.reparentTo(myBase.dataRoot) + self.nodePath.reparentTo(self._base.dataRoot) def disable(self): - self.nodePath.reparentTo(myBase.dataUnused) + self.nodePath.reparentTo(self._base.dataUnused) def getName(self): return self.name @@ -83,6 +84,12 @@ class DirectButtons(ButtonNode, DirectObject): class DirectAnalogs(AnalogNode, DirectObject): analogCount = 0 + + _analogDeadband = ConfigVariableDouble('vrpn-analog-deadband', ANALOG_DEADBAND) + _analogMin = ConfigVariableDouble('vrpn-analog-min', ANALOG_MIN) + _analogMax = ConfigVariableDouble('vrpn-analog-max', ANALOG_MAX) + _analogCenter = ConfigVariableDouble('vrpn-analog-center', ANALOG_CENTER) + def __init__(self, vrpnClient, device): # Keep track of number of analogs created DirectAnalogs.analogCount += 1 @@ -90,19 +97,20 @@ class DirectAnalogs(AnalogNode, DirectObject): AnalogNode.__init__(self, vrpnClient, device) # Create a unique name for this analog object self.name = 'DirectAnalogs-' + repr(DirectAnalogs.analogCount) - # Attach node to data graph - self.nodePath = myBase.dataRoot.attachNewNode(self) - # See if any of the general analog parameters are dconfig'd - self.analogDeadband = myBase.config.GetFloat('vrpn-analog-deadband', - ANALOG_DEADBAND) - self.analogMin = myBase.config.GetFloat('vrpn-analog-min', - ANALOG_MIN) - self.analogMax = myBase.config.GetFloat('vrpn-analog-max', - ANALOG_MAX) - self.analogCenter = myBase.config.GetFloat('vrpn-analog-center', - ANALOG_CENTER) - self.analogRange = self.analogMax - self.analogMin + # Attach node to data graph + try: + self._base = base + except: + self._base = simbase + self.nodePath = self._base.dataRoot.attachNewNode(self) + + # See if any of the general analog parameters are dconfig'd + self.analogDeadband = self._analogDeadband.getValue() + self.analogMin = self._analogMin.getValue() + self.analogMax = self._analogMax.getValue() + self.analogCenter = self._analogCenter.getValue() + self.analogRange = self.analogMax - self.analogMin def __getitem__(self, index): if (index < 0) or (index >= self.getNumControls()): @@ -113,10 +121,10 @@ class DirectAnalogs(AnalogNode, DirectObject): return self.getNumControls() def enable(self): - self.nodePath.reparentTo(myBase.dataRoot) + self.nodePath.reparentTo(self._base.dataRoot) def disable(self): - self.nodePath.reparentTo(myBase.dataUnused) + self.nodePath.reparentTo(self._base.dataUnused) def normalizeWithoutCentering(self, val, minVal = -1, maxVal = 1): # @@ -186,14 +194,19 @@ class DirectTracker(TrackerNode, DirectObject): TrackerNode.__init__(self, vrpnClient, device) # Create a unique name for this tracker object self.name = 'DirectTracker-' + repr(DirectTracker.trackerCount) + # Attach node to data graph - self.nodePath = myBase.dataRoot.attachNewNode(self) + try: + self._base = base + except: + self._base = simbase + self.nodePath = self._base.dataRoot.attachNewNode(self) def enable(self): - self.nodePath.reparentTo(myBase.dataRoot) + self.nodePath.reparentTo(self._base.dataRoot) def disable(self): - self.nodePath.reparentTo(myBase.dataUnused) + self.nodePath.reparentTo(self._base.dataUnused) def getName(self): return self.name @@ -213,8 +226,13 @@ class DirectDials(DialNode, DirectObject): DialNode.__init__(self, vrpnClient, device) # Create a unique name for this dial object self.name = 'DirectDials-' + repr(DirectDials.dialCount) + # Attach node to data graph - self.nodePath = myBase.dataRoot.attachNewNode(self) + try: + self._base = base + except: + self._base = simbase + self.nodePath = self._base.dataRoot.attachNewNode(self) def __getitem__(self, index): """ @@ -227,10 +245,10 @@ class DirectDials(DialNode, DirectObject): return self.getNumDials() def enable(self): - self.nodePath.reparentTo(myBase.dataRoot) + self.nodePath.reparentTo(self._base.dataRoot) def disable(self): - self.nodePath.reparentTo(myBase.dataUnused) + self.nodePath.reparentTo(self._base.dataUnused) def getName(self): return self.name @@ -259,14 +277,19 @@ class DirectTimecodeReader(AnalogNode, DirectObject): self.seconds = 0 self.minutes = 0 self.hours = 0 + # Attach node to data graph - self.nodePath = myBase.dataRoot.attachNewNode(self) + try: + self._base = base + except: + self._base = simbase + self.nodePath = self._base.dataRoot.attachNewNode(self) def enable(self): - self.nodePath.reparentTo(myBase.dataRoot) + self.nodePath.reparentTo(self._base.dataRoot) def disable(self): - self.nodePath.reparentTo(myBase.dataUnused) + self.nodePath.reparentTo(self._base.dataUnused) def getName(self): return self.name diff --git a/direct/src/directdevices/DirectRadamec.py b/direct/src/directdevices/DirectRadamec.py index 2aa7b1933c..3f74162b9b 100644 --- a/direct/src/directdevices/DirectRadamec.py +++ b/direct/src/directdevices/DirectRadamec.py @@ -21,7 +21,7 @@ class DirectRadamec(DirectObject): radamecCount = 0 notify = DirectNotifyGlobal.directNotify.newCategory('DirectRadamec') - def __init__(self, device = 'Analog0', nodePath = base.direct.camera): + def __init__(self, device = 'Analog0', nodePath = None): # See if device manager has been initialized if base.direct.deviceManager == None: base.direct.deviceManager = DirectDeviceManager() diff --git a/direct/src/directdevices/__init__.py b/direct/src/directdevices/__init__.py index e69de29bb2..46728797fa 100644 --- a/direct/src/directdevices/__init__.py +++ b/direct/src/directdevices/__init__.py @@ -0,0 +1,5 @@ +""" +This package contains a high-level interface for VRPN devices. + +Also see the :mod:`panda3d.vprn` module. +""" diff --git a/direct/src/directnotify/__init__.py b/direct/src/directnotify/__init__.py index e69de29bb2..96706bb8ad 100644 --- a/direct/src/directnotify/__init__.py +++ b/direct/src/directnotify/__init__.py @@ -0,0 +1,3 @@ +""" +This package contains notification and logging utilities for Python code. +""" diff --git a/direct/src/directtools/__init__.py b/direct/src/directtools/__init__.py index e69de29bb2..14c68c31bf 100644 --- a/direct/src/directtools/__init__.py +++ b/direct/src/directtools/__init__.py @@ -0,0 +1,8 @@ +""" +This package contains the DIRECT tools, a set of tkinter tools for exploring +and manipulating the Panda3D scene graph. By default, these are disabled, +but they can be explicitly enabled using the following PRC configuration:: + + want-directtools true + want-tk true +""" diff --git a/direct/src/directutil/__init__.py b/direct/src/directutil/__init__.py index e69de29bb2..b242b7639e 100644 --- a/direct/src/directutil/__init__.py +++ b/direct/src/directutil/__init__.py @@ -0,0 +1,3 @@ +""" +This package contains assorted utility classes. +""" diff --git a/direct/src/distributed/DistributedSmoothNode.py b/direct/src/distributed/DistributedSmoothNode.py index 1d6aef43fb..9bc75c1da1 100644 --- a/direct/src/distributed/DistributedSmoothNode.py +++ b/direct/src/distributed/DistributedSmoothNode.py @@ -7,19 +7,21 @@ from . import DistributedNode from . import DistributedSmoothNodeBase from direct.task.Task import cont +config = get_config_showbase() + # This number defines our tolerance for out-of-sync telemetry packets. # If a packet appears to have originated from more than MaxFuture # seconds in the future, assume we're out of sync with the other # avatar and suggest a resync for both. -MaxFuture = base.config.GetFloat("smooth-max-future", 0.2) +MaxFuture = config.GetFloat("smooth-max-future", 0.2) # How frequently can we suggest a resynchronize with another client? -MinSuggestResync = base.config.GetFloat("smooth-min-suggest-resync", 15) +MinSuggestResync = config.GetFloat("smooth-min-suggest-resync", 15) # These flags indicate whether global smoothing and/or prediction is # allowed or disallowed. -EnableSmoothing = base.config.GetBool("smooth-enable-smoothing", 1) -EnablePrediction = base.config.GetBool("smooth-enable-prediction", 1) +EnableSmoothing = config.GetBool("smooth-enable-smoothing", 1) +EnablePrediction = config.GetBool("smooth-enable-prediction", 1) # These values represent the amount of time, in seconds, to delay the # apparent position of other avatars, when non-predictive and @@ -27,8 +29,8 @@ EnablePrediction = base.config.GetBool("smooth-enable-prediction", 1) # addition to the automatic delay of the observed average latency from # each avatar, which is intended to compensate for relative clock # skew. -Lag = base.config.GetDouble("smooth-lag", 0.2) -PredictionLag = base.config.GetDouble("smooth-prediction-lag", 0.0) +Lag = config.GetDouble("smooth-lag", 0.2) +PredictionLag = config.GetDouble("smooth-prediction-lag", 0.0) GlobalSmoothing = 0 diff --git a/direct/src/distributed/__init__.py b/direct/src/distributed/__init__.py index e69de29bb2..cf5b4bc502 100644 --- a/direct/src/distributed/__init__.py +++ b/direct/src/distributed/__init__.py @@ -0,0 +1,5 @@ +""" +This package contains an implementation of the Distributed Networking +API, a high-level networking system that automatically propagates +changes made on distributed objects to interested clients. +""" diff --git a/direct/src/extensions_native/__init__.py b/direct/src/extensions_native/__init__.py index 8b13789179..093c05df15 100644 --- a/direct/src/extensions_native/__init__.py +++ b/direct/src/extensions_native/__init__.py @@ -1 +1,4 @@ - +""" +This package contains various Python methods that extend some of Panda's +underlying C++ classes. +""" diff --git a/direct/src/filter/__init__.py b/direct/src/filter/__init__.py index e69de29bb2..4acb30b438 100644 --- a/direct/src/filter/__init__.py +++ b/direct/src/filter/__init__.py @@ -0,0 +1,11 @@ +""" +This package contains functionality for applying post-processing +filters to the result of rendering a 3-D scene. This is done by +rendering the scene to an off-screen buffer, and then applying this to +a full-screen card that has a shader applied which manipulates the +texture values as desired. + +The :class:`.CommonFilters` class contains various filters that are +provided out of the box, whereas the :class:`.FilterManager` class +is a lower-level class that allows you to set up your own filters. +""" diff --git a/direct/src/fsm/ClassicFSM.py b/direct/src/fsm/ClassicFSM.py index 847cf290db..c954718e4d 100644 --- a/direct/src/fsm/ClassicFSM.py +++ b/direct/src/fsm/ClassicFSM.py @@ -1,13 +1,13 @@ -"""Undocumented Module""" - -__all__ = ['ClassicFSM'] - """Finite State Machine module: contains the ClassicFSM class. -This module and class exist only for backward compatibility with -existing code. New code should use the FSM module instead. +.. note:: + + This module and class exist only for backward compatibility with + existing code. New code should use the :mod:`.FSM` module instead. """ +__all__ = ['ClassicFSM'] + from direct.directnotify.DirectNotifyGlobal import directNotify from direct.showbase.DirectObject import DirectObject import weakref diff --git a/direct/src/fsm/FSM.py b/direct/src/fsm/FSM.py index 3aa583f007..6af064e3d7 100644 --- a/direct/src/fsm/FSM.py +++ b/direct/src/fsm/FSM.py @@ -1,5 +1,5 @@ """The new Finite State Machine module. This replaces the module -previously called FSM.py (now called ClassicFSM.py). +previously called FSM (now called :mod:`.ClassicFSM`). """ __all__ = ['FSMException', 'FSM'] diff --git a/direct/src/fsm/FourState.py b/direct/src/fsm/FourState.py index af7b7d650c..5188284baf 100755 --- a/direct/src/fsm/FourState.py +++ b/direct/src/fsm/FourState.py @@ -1,9 +1,7 @@ -"""Undocumented Module""" +"""Contains the FourState class.""" __all__ = ['FourState'] - - from direct.directnotify import DirectNotifyGlobal #import DistributedObject from . import ClassicFSM @@ -20,7 +18,7 @@ class FourState: Inherit from FourStateFSM and pass in your states. Two of the states should be oposites of each other and the other two should be the transition states between the first two. - E.g. + E.g:: +--------+ -->| closed | -- diff --git a/direct/src/fsm/FourStateAI.py b/direct/src/fsm/FourStateAI.py index eee4b43a76..a17b9e4c62 100755 --- a/direct/src/fsm/FourStateAI.py +++ b/direct/src/fsm/FourStateAI.py @@ -1,9 +1,7 @@ -"""Undocumented Module""" +"""Contains the FourStateAI class. See also :mod:`.FourState`.""" __all__ = ['FourStateAI'] - - from direct.directnotify import DirectNotifyGlobal #import DistributedObjectAI from . import ClassicFSM @@ -21,7 +19,7 @@ class FourStateAI: Inherit from FourStateFSM and pass in your states. Two of the states should be oposites of each other and the other two should be the transition states between the first two. - E.g. + E.g:: +--------+ -->| closed | -- diff --git a/direct/src/fsm/__init__.py b/direct/src/fsm/__init__.py index e69de29bb2..365e539c4e 100644 --- a/direct/src/fsm/__init__.py +++ b/direct/src/fsm/__init__.py @@ -0,0 +1,6 @@ +""" +This package contains implementations of a Finite State Machine, an +abstract construct that holds a particular state and can transition +between several defined states. These are useful for a range of logic +programming tasks. +""" diff --git a/direct/src/gui/DirectButton.py b/direct/src/gui/DirectButton.py index 87077d20a0..e6111af710 100644 --- a/direct/src/gui/DirectButton.py +++ b/direct/src/gui/DirectButton.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""This module contains the DirectButton class.""" __all__ = ['DirectButton'] diff --git a/direct/src/gui/DirectCheckButton.py b/direct/src/gui/DirectCheckButton.py index 3df28a0730..f353f3d989 100644 --- a/direct/src/gui/DirectCheckButton.py +++ b/direct/src/gui/DirectCheckButton.py @@ -1,4 +1,6 @@ -"""Undocumented Module""" +"""A DirectCheckButton is a type of button that toggles between two states +when clicked. It also has a separate indicator that can be modified +separately.""" __all__ = ['DirectCheckButton'] diff --git a/direct/src/gui/DirectDialog.py b/direct/src/gui/DirectDialog.py index 039092c511..33852dc504 100644 --- a/direct/src/gui/DirectDialog.py +++ b/direct/src/gui/DirectDialog.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""This module defines various dialog windows for the DirectGUI system.""" __all__ = ['findDialog', 'cleanupDialog', 'DirectDialog', 'OkDialog', 'OkCancelDialog', 'YesNoDialog', 'YesNoCancelDialog', 'RetryCancelDialog'] diff --git a/direct/src/gui/DirectEntry.py b/direct/src/gui/DirectEntry.py index 45733b7c35..2eb7607400 100644 --- a/direct/src/gui/DirectEntry.py +++ b/direct/src/gui/DirectEntry.py @@ -1,4 +1,5 @@ -"""Undocumented Module""" +"""Contains the DirectEntry class, a type of DirectGUI widget that accepts +text entered using the keyboard.""" __all__ = ['DirectEntry'] diff --git a/direct/src/gui/DirectFrame.py b/direct/src/gui/DirectFrame.py index 9c164038b9..e078b28021 100644 --- a/direct/src/gui/DirectFrame.py +++ b/direct/src/gui/DirectFrame.py @@ -1,4 +1,17 @@ -"""Undocumented Module""" +"""A DirectFrame is a basic DirectGUI component that acts as the base +class for various other components, and can also serve as a basic +container to hold other DirectGUI components. + +A DirectFrame can have: + +* A background texture (pass in path to image, or Texture Card) +* A midground geometry item (pass in geometry) +* A foreground text Node (pass in text string or OnscreenText) + +Each of these has 1 or more states. The same object can be used for +all states or each state can have a different text/geom/image (for +radio button and check button indicators, for example). +""" __all__ = ['DirectFrame'] @@ -19,14 +32,6 @@ class DirectFrame(DirectGuiWidget): DefDynGroups = ('text', 'geom', 'image') def __init__(self, parent = None, **kw): # Inherits from DirectGuiWidget - # A Direct Frame can have: - # - A background texture (pass in path to image, or Texture Card) - # - A midground geometry item (pass in geometry) - # - A foreground text Node (pass in text string or Onscreen Text) - # Each of these has 1 or more states - # The same object can be used for all states or each - # state can have a different text/geom/image (for radio button - # and check button indicators, for example). optiondefs = ( # Define type of DirectGuiWidget ('pgFunc', PGItem, None), diff --git a/direct/src/gui/DirectGuiBase.py b/direct/src/gui/DirectGuiBase.py index 833bf8ebcb..6836f7465f 100644 --- a/direct/src/gui/DirectGuiBase.py +++ b/direct/src/gui/DirectGuiBase.py @@ -1,32 +1,7 @@ -"""Undocumented Module""" - -__all__ = ['DirectGuiBase', 'DirectGuiWidget'] - - -from panda3d.core import * -from panda3d.direct import get_config_showbase -from . import DirectGuiGlobals as DGG -from .OnscreenText import * -from .OnscreenGeom import * -from .OnscreenImage import * -from direct.directtools.DirectUtil import ROUND_TO -from direct.showbase import DirectObject -from direct.task import Task -import sys - -if sys.version_info >= (3, 0): - stringType = str -else: - stringType = basestring - -guiObjectCollector = PStatCollector("Client::GuiObjects") - """ Base class for all Direct Gui items. Handles composite widgets and command line argument parsing. -""" -""" Code Overview: 1 Each widget defines a set of options (optiondefs) as a list of tuples @@ -101,7 +76,31 @@ Code Overview: are left unused. If so, an error is raised. """ +__all__ = ['DirectGuiBase', 'DirectGuiWidget'] + + +from panda3d.core import * +from panda3d.direct import get_config_showbase +from . import DirectGuiGlobals as DGG +from .OnscreenText import * +from .OnscreenGeom import * +from .OnscreenImage import * +from direct.directtools.DirectUtil import ROUND_TO +from direct.showbase import DirectObject +from direct.task import Task +import sys + +if sys.version_info >= (3, 0): + stringType = str +else: + stringType = basestring + +guiObjectCollector = PStatCollector("Client::GuiObjects") + + class DirectGuiBase(DirectObject.DirectObject): + """Base class of all DirectGUI widgets.""" + def __init__(self): # Default id of all gui object, subclasses should override this self.guiId = 'guiObject' diff --git a/direct/src/gui/DirectGuiGlobals.py b/direct/src/gui/DirectGuiGlobals.py index d71c97593d..96519fd9fc 100644 --- a/direct/src/gui/DirectGuiGlobals.py +++ b/direct/src/gui/DirectGuiGlobals.py @@ -1,12 +1,10 @@ -"""Undocumented Module""" - -__all__ = [] - - """ Global definitions used by Direct Gui Classes and handy constants that can be used during widget construction """ + +__all__ = [] + from panda3d.core import * defaultFont = None diff --git a/direct/src/gui/DirectLabel.py b/direct/src/gui/DirectLabel.py index 5cb2932900..bc1328ded7 100644 --- a/direct/src/gui/DirectLabel.py +++ b/direct/src/gui/DirectLabel.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the DirectLabel class.""" __all__ = ['DirectLabel'] diff --git a/direct/src/gui/DirectOptionMenu.py b/direct/src/gui/DirectOptionMenu.py index e2432a5512..40d48f7672 100644 --- a/direct/src/gui/DirectOptionMenu.py +++ b/direct/src/gui/DirectOptionMenu.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Implements a pop-up menu containing multiple clickable options.""" __all__ = ['DirectOptionMenu'] diff --git a/direct/src/gui/DirectRadioButton.py b/direct/src/gui/DirectRadioButton.py index 8044e81295..f6543d1e8f 100755 --- a/direct/src/gui/DirectRadioButton.py +++ b/direct/src/gui/DirectRadioButton.py @@ -1,4 +1,7 @@ -"""Undocumented Module""" +"""A DirectRadioButton is a type of button that, similar to a +DirectCheckButton, has a separate indicator and can be toggled between +two states. However, only one DirectRadioButton in a group can be enabled +at a particular time.""" __all__ = ['DirectRadioButton'] diff --git a/direct/src/gui/DirectScrollBar.py b/direct/src/gui/DirectScrollBar.py index 8493547e0d..d56385163b 100644 --- a/direct/src/gui/DirectScrollBar.py +++ b/direct/src/gui/DirectScrollBar.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Defines the DirectScrollBar class.""" __all__ = ['DirectScrollBar'] diff --git a/direct/src/gui/DirectScrolledFrame.py b/direct/src/gui/DirectScrolledFrame.py index 6a7be7cabf..c44bc7a0fb 100644 --- a/direct/src/gui/DirectScrolledFrame.py +++ b/direct/src/gui/DirectScrolledFrame.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the DirectScrolledFrame class.""" __all__ = ['DirectScrolledFrame'] diff --git a/direct/src/gui/DirectScrolledList.py b/direct/src/gui/DirectScrolledList.py index d17023d545..a89b691576 100644 --- a/direct/src/gui/DirectScrolledList.py +++ b/direct/src/gui/DirectScrolledList.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the DirectScrolledList class.""" __all__ = ['DirectScrolledListItem', 'DirectScrolledList'] diff --git a/direct/src/gui/DirectSlider.py b/direct/src/gui/DirectSlider.py index 73f5410e49..507c13b5a8 100644 --- a/direct/src/gui/DirectSlider.py +++ b/direct/src/gui/DirectSlider.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Defines the DirectSlider class.""" __all__ = ['DirectSlider'] diff --git a/direct/src/gui/DirectWaitBar.py b/direct/src/gui/DirectWaitBar.py index a8eb9a56cc..ff3f554fee 100644 --- a/direct/src/gui/DirectWaitBar.py +++ b/direct/src/gui/DirectWaitBar.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the DirectWaitBar class, a progress bar widget.""" __all__ = ['DirectWaitBar'] diff --git a/direct/src/gui/__init__.py b/direct/src/gui/__init__.py index e69de29bb2..5cc1895b62 100644 --- a/direct/src/gui/__init__.py +++ b/direct/src/gui/__init__.py @@ -0,0 +1,12 @@ +""" +This package contains the DirectGui system, a set of classes +responsible for drawing graphical widgets to the 2-D scene graph. + +It is based on the lower-level PGui system, which is implemented in +C++. + +For convenience, all of the DirectGui widgets may be imported from a +single module as follows:: + + from direct.gui.DirectGui import * +""" diff --git a/direct/src/interval/IntervalGlobal.py b/direct/src/interval/IntervalGlobal.py index 903f92d14f..41ee6444f7 100644 --- a/direct/src/interval/IntervalGlobal.py +++ b/direct/src/interval/IntervalGlobal.py @@ -1,4 +1,7 @@ -"""IntervalGlobal module""" +""" +This module imports all of the other interval modules, to provide a +single convenient module from which all interval types can be imported. +""" # In this unusual case, I'm not going to declare __all__, # since the purpose of this module is to add up the contributions diff --git a/direct/src/interval/IntervalManager.py b/direct/src/interval/IntervalManager.py index 0e909ceeb8..a9a44a3bf0 100644 --- a/direct/src/interval/IntervalManager.py +++ b/direct/src/interval/IntervalManager.py @@ -1,4 +1,5 @@ -"""Undocumented Module""" +"""Defines the IntervalManager class as well as the global instance of +this class, ivalMgr.""" __all__ = ['IntervalManager', 'ivalMgr'] @@ -136,6 +137,5 @@ class IntervalManager(CIntervalManager): assert self.ivals[index] == None or self.ivals[index] == interval self.ivals[index] = interval -# The global IntervalManager object. +#: The global IntervalManager object. ivalMgr = IntervalManager(1) - diff --git a/direct/src/interval/MetaInterval.py b/direct/src/interval/MetaInterval.py index dc83f3587c..fd379280a7 100644 --- a/direct/src/interval/MetaInterval.py +++ b/direct/src/interval/MetaInterval.py @@ -1,4 +1,7 @@ -"""Undocumented Module""" +""" +This module defines the various "meta intervals", which execute other +intervals either in parallel or in a specified sequential order. +""" __all__ = ['MetaInterval', 'Sequence', 'Parallel', 'ParallelEndTogether', 'Track'] diff --git a/direct/src/interval/ParticleInterval.py b/direct/src/interval/ParticleInterval.py index c373af7542..b5a3b09b73 100644 --- a/direct/src/interval/ParticleInterval.py +++ b/direct/src/interval/ParticleInterval.py @@ -1,11 +1,9 @@ -"""Undocumented Module""" - -__all__ = ['ParticleInterval'] - """ Contains the ParticleInterval class """ +__all__ = ['ParticleInterval'] + from panda3d.core import * from panda3d.direct import * from direct.directnotify.DirectNotifyGlobal import directNotify diff --git a/direct/src/interval/TestInterval.py b/direct/src/interval/TestInterval.py index 82a04b604e..6a13cce4f2 100755 --- a/direct/src/interval/TestInterval.py +++ b/direct/src/interval/TestInterval.py @@ -1,11 +1,9 @@ -"""Undocumented Module""" +""" +Contains the TestInterval class +""" __all__ = ['TestInterval'] -""" -Contains the ParticleInterval class -""" - from panda3d.core import * from panda3d.direct import * from direct.directnotify.DirectNotifyGlobal import directNotify diff --git a/direct/src/interval/__init__.py b/direct/src/interval/__init__.py index e69de29bb2..5f3e8e4332 100644 --- a/direct/src/interval/__init__.py +++ b/direct/src/interval/__init__.py @@ -0,0 +1,12 @@ +""" +This package contains the Python implementation of the interval system, +which is a mechanism for playing back scripted actions. A range of +interval types has been defined to automate motion, animation, sounds, +color, function calls, as well as other intervals and arbitrary +properties. + +All interval types can be conveniently imported from the +:mod:`.IntervalGlobal` module:: + + from direct.interval.IntervalGlobal import * +""" diff --git a/direct/src/motiontrail/__init__.py b/direct/src/motiontrail/__init__.py index e69de29bb2..d50bc43be3 100644 --- a/direct/src/motiontrail/__init__.py +++ b/direct/src/motiontrail/__init__.py @@ -0,0 +1,3 @@ +""" +This package contains only the :class:`.MotionTrail` class. +""" diff --git a/direct/src/p3d/AppRunner.py b/direct/src/p3d/AppRunner.py index 4a59e20de6..aae03754e6 100644 --- a/direct/src/p3d/AppRunner.py +++ b/direct/src/p3d/AppRunner.py @@ -1,12 +1,15 @@ - """ - This module is intended to be compiled into the Panda3D runtime distributable, to execute a packaged p3d application, but it can also be run directly via the Python interpreter (if the current Panda3D and Python versions match the version expected by the application). See runp3d.py for a command-line tool to invoke this module. +The global AppRunner instance may be imported as follows:: + + from direct.showbase.AppRunnerGlobal import appRunner + +This will be None if Panda was not run from the runtime environment. """ __all__ = ["AppRunner", "dummyAppRunner", "ArgumentError"] diff --git a/direct/src/p3d/__init__.py b/direct/src/p3d/__init__.py index e69de29bb2..e6ab93b09d 100644 --- a/direct/src/p3d/__init__.py +++ b/direct/src/p3d/__init__.py @@ -0,0 +1,4 @@ +""" +This package provides the Python interface to functionality relating to +the Panda3D Runtime environment. +""" diff --git a/direct/src/particles/__init__.py b/direct/src/particles/__init__.py index e69de29bb2..d3525ee464 100644 --- a/direct/src/particles/__init__.py +++ b/direct/src/particles/__init__.py @@ -0,0 +1,7 @@ +""" +This package contains the high-level Python interface to the particle +system. + +Also see the :mod:`panda3d.physics` module, which contains the C++ +implementation of the particle system. +""" diff --git a/direct/src/showbase/AppRunnerGlobal.py b/direct/src/showbase/AppRunnerGlobal.py index 9e4b083f25..2ab5c0ccf9 100644 --- a/direct/src/showbase/AppRunnerGlobal.py +++ b/direct/src/showbase/AppRunnerGlobal.py @@ -6,4 +6,6 @@ This is needed for apps that start themselves by importing DirectStart; it provides a place for these apps to look for the AppRunner at startup. """ +#: Contains the global AppRunner instance, or None if this application +#: was not run from the runtime environment. appRunner = None diff --git a/direct/src/showbase/Audio3DManager.py b/direct/src/showbase/Audio3DManager.py index e9cdb59eb8..07407c822b 100644 --- a/direct/src/showbase/Audio3DManager.py +++ b/direct/src/showbase/Audio3DManager.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the Audio3DManager class.""" __all__ = ['Audio3DManager'] diff --git a/direct/src/showbase/BufferViewer.py b/direct/src/showbase/BufferViewer.py index c2a7f86049..48dff3a1ea 100644 --- a/direct/src/showbase/BufferViewer.py +++ b/direct/src/showbase/BufferViewer.py @@ -1,4 +1,6 @@ -"""Undocumented Module""" +"""Contains the BufferViewer class, which is used as a debugging aid +when debugging render-to-texture effects. It shows different views at +the bottom of the screen showing the various render targets.""" __all__ = ['BufferViewer'] diff --git a/direct/src/showbase/BulletinBoard.py b/direct/src/showbase/BulletinBoard.py index c46eb0ff0e..5b1cdd71a0 100755 --- a/direct/src/showbase/BulletinBoard.py +++ b/direct/src/showbase/BulletinBoard.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the BulletinBoard class.""" __all__ = ['BulletinBoard'] diff --git a/direct/src/showbase/BulletinBoardWatcher.py b/direct/src/showbase/BulletinBoardWatcher.py index da2cb8dd63..efc75b43ac 100755 --- a/direct/src/showbase/BulletinBoardWatcher.py +++ b/direct/src/showbase/BulletinBoardWatcher.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the BulletinBoardWatcher class.""" __all__ = ['BulletinBoardWatcher'] diff --git a/direct/src/showbase/DirectObject.py b/direct/src/showbase/DirectObject.py index 22d846bc3e..9106637134 100644 --- a/direct/src/showbase/DirectObject.py +++ b/direct/src/showbase/DirectObject.py @@ -1,4 +1,5 @@ -"""Undocumented Module""" +"""Defines the DirectObject class, a convenient class to inherit from if the +object needs to be able to respond to events.""" __all__ = ['DirectObject'] diff --git a/direct/src/showbase/EventGroup.py b/direct/src/showbase/EventGroup.py index baf26193f4..6385761ca4 100755 --- a/direct/src/showbase/EventGroup.py +++ b/direct/src/showbase/EventGroup.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""This module defines the EventGroup class.""" __all__ = ['EventGroup'] diff --git a/direct/src/showbase/EventManager.py b/direct/src/showbase/EventManager.py index 35616f6002..af8bd1c91a 100644 --- a/direct/src/showbase/EventManager.py +++ b/direct/src/showbase/EventManager.py @@ -1,4 +1,5 @@ -"""Undocumented Module""" +"""Contains the EventManager class. See :mod:`.EventManagerGlobal` for the +global eventMgr instance.""" __all__ = ['EventManager'] diff --git a/direct/src/showbase/EventManagerGlobal.py b/direct/src/showbase/EventManagerGlobal.py index 9e7000ed51..73a35b8ba5 100644 --- a/direct/src/showbase/EventManagerGlobal.py +++ b/direct/src/showbase/EventManagerGlobal.py @@ -1,7 +1,8 @@ -"""Undocumented Module""" +"""Contains the global :class:`.EventManager` instance.""" __all__ = ['eventMgr'] from . import EventManager +#: The global event manager. eventMgr = EventManager.EventManager() diff --git a/direct/src/showbase/Factory.py b/direct/src/showbase/Factory.py index bff33dd931..0abd217c07 100755 --- a/direct/src/showbase/Factory.py +++ b/direct/src/showbase/Factory.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the Factory class.""" __all__ = ['Factory'] diff --git a/direct/src/showbase/FindCtaPaths.py b/direct/src/showbase/FindCtaPaths.py index a530778715..4832400b46 100755 --- a/direct/src/showbase/FindCtaPaths.py +++ b/direct/src/showbase/FindCtaPaths.py @@ -1,7 +1,3 @@ -"""Undocumented Module""" - -__all__ = ['deCygwinify', 'getPaths'] - """This module is used only by the VR Studio programmers who are using the ctattach tools. It is imported before any other package, and its job is to figure out the correct paths to each of the packages. @@ -10,6 +6,8 @@ This module is not needed if you are not using ctattach; in this case all of the Panda packages will be collected under a common directory, which you will presumably have already on your PYTHONPATH. """ +__all__ = ['deCygwinify', 'getPaths'] + import os import sys diff --git a/direct/src/showbase/Finder.py b/direct/src/showbase/Finder.py index f7c619da91..129bcb4dc6 100644 --- a/direct/src/showbase/Finder.py +++ b/direct/src/showbase/Finder.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains various utility functions.""" __all__ = ['findClass', 'rebindClass', 'copyFuncs', 'replaceMessengerFunc', 'replaceTaskMgrFunc', 'replaceStateFunc', 'replaceCRFunc', 'replaceAIRFunc', 'replaceIvalFunc'] diff --git a/direct/src/showbase/GarbageReport.py b/direct/src/showbase/GarbageReport.py index db91df0c47..7d268bf450 100755 --- a/direct/src/showbase/GarbageReport.py +++ b/direct/src/showbase/GarbageReport.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains utility classes for debugging memory leaks.""" __all__ = ['FakeObject', '_createGarbage', 'GarbageReport', 'GarbageLogger'] diff --git a/direct/src/showbase/Messenger.py b/direct/src/showbase/Messenger.py index 92d2014503..09ceb9cd0a 100644 --- a/direct/src/showbase/Messenger.py +++ b/direct/src/showbase/Messenger.py @@ -1,4 +1,5 @@ -"""Undocumented Module""" +"""This defines the Messenger class, which is responsible for most of the +event handling that happens on the Python side.""" __all__ = ['Messenger'] diff --git a/direct/src/showbase/MirrorDemo.py b/direct/src/showbase/MirrorDemo.py index e2a77dbf82..b44106db47 100755 --- a/direct/src/showbase/MirrorDemo.py +++ b/direct/src/showbase/MirrorDemo.py @@ -1,7 +1,3 @@ -"""Undocumented Module""" - -__all__ = ['setupMirror', 'showFrustum'] - """This file demonstrates one way to create a mirror effect in Panda. Call setupMirror() to create a mirror in the world that reflects everything in front of it. @@ -23,6 +19,8 @@ surface are possible, like a funhouse mirror. However, the reflection itself is always basically planar; for more accurate convex reflections, you will need to use a sphere map or a cube map.""" +__all__ = ['setupMirror', 'showFrustum'] + from panda3d.core import * from direct.task import Task diff --git a/direct/src/showbase/ObjectPool.py b/direct/src/showbase/ObjectPool.py index 4b0c0a0731..e5970803ab 100755 --- a/direct/src/showbase/ObjectPool.py +++ b/direct/src/showbase/ObjectPool.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the ObjectPool utility class.""" __all__ = ['Diff', 'ObjectPool'] diff --git a/direct/src/showbase/ObjectReport.py b/direct/src/showbase/ObjectReport.py index b860932d2d..a0fcce7168 100755 --- a/direct/src/showbase/ObjectReport.py +++ b/direct/src/showbase/ObjectReport.py @@ -1,4 +1,13 @@ -"""Undocumented Module""" +""" +>>> from direct.showbase import ObjectReport + +>>> o=ObjectReport.ObjectReport('baseline') +>>> run() +... + +>>> o2=ObjectReport.ObjectReport('') +>>> o.diff(o2) +""" __all__ = ['ExclusiveObjectPool', 'ObjectReport'] @@ -13,17 +22,6 @@ if sys.version_info >= (3, 0): else: import __builtin__ as builtins -""" ->>> from direct.showbase import ObjectReport - ->>> o=ObjectReport.ObjectReport('baseline') ->>> run() -... - ->>> o2=ObjectReport.ObjectReport('') ->>> o.diff(o2) -""" - class ExclusiveObjectPool(DirectObject.DirectObject): # ObjectPool specialization that excludes particular objects # IDs of objects to globally exclude from reporting diff --git a/direct/src/showbase/OnScreenDebug.py b/direct/src/showbase/OnScreenDebug.py index ba24b0637a..1a5756c078 100755 --- a/direct/src/showbase/OnScreenDebug.py +++ b/direct/src/showbase/OnScreenDebug.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the OnScreenDebug class.""" __all__ = ['OnScreenDebug'] diff --git a/direct/src/showbase/Pool.py b/direct/src/showbase/Pool.py index ddcc80a32d..5c1782d629 100755 --- a/direct/src/showbase/Pool.py +++ b/direct/src/showbase/Pool.py @@ -1,9 +1,4 @@ -"""Undocumented Module""" - -__all__ = ['Pool'] - """ - Pool is a collection of python objects that you can checkin and checkout. This is useful for a cache of objects that are expensive to load and can be reused over and over, like splashes on cannonballs, or @@ -12,12 +7,16 @@ or be the same type. Internally the pool is implemented with 2 lists, free items and used items. -p = Pool([1, 2, 3, 4, 5]) -x = p.checkout() -p.checkin(x) +Example:: + + p = Pool([1, 2, 3, 4, 5]) + x = p.checkout() + p.checkin(x) """ +__all__ = ['Pool'] + from direct.directnotify import DirectNotifyGlobal @@ -116,5 +115,3 @@ class Pool: def __repr__(self): return "free = %s\nused = %s" % (self.__free, self.__used) - - diff --git a/direct/src/showbase/SfxPlayer.py b/direct/src/showbase/SfxPlayer.py index 2fb97eae32..4f139a89c9 100644 --- a/direct/src/showbase/SfxPlayer.py +++ b/direct/src/showbase/SfxPlayer.py @@ -1,4 +1,5 @@ -"""Undocumented Module""" +"""Contains the SfxPlayer class, a thin utility class for playing sounds at +a particular location.""" __all__ = ['SfxPlayer'] @@ -95,6 +96,3 @@ class SfxPlayer: if node is not None: finalVolume *= node.getNetAudioVolume() sfx.setVolume(finalVolume) - - - diff --git a/direct/src/showbase/ShadowDemo.py b/direct/src/showbase/ShadowDemo.py index 78f9d33dd0..daadd58c11 100755 --- a/direct/src/showbase/ShadowDemo.py +++ b/direct/src/showbase/ShadowDemo.py @@ -1,8 +1,3 @@ -"""Undocumented Module""" - -__all__ = ['ShadowCaster', 'avatarShadow', 'piratesAvatarShadow', 'arbitraryShadow'] - - """Create a cheesy shadow effect by rendering the view of an object (e.g. the local avatar) from a special camera as seen from above (as if from the sun), using a solid gray foreground and a @@ -14,6 +9,8 @@ multitexture rendering techniques. It's not a particularly great way to do shadows. """ +__all__ = ['ShadowCaster', 'avatarShadow', 'piratesAvatarShadow', 'arbitraryShadow'] + from panda3d.core import * from direct.task import Task diff --git a/direct/src/showbase/ShadowPlacer.py b/direct/src/showbase/ShadowPlacer.py index 80826926f7..845bb5e66e 100755 --- a/direct/src/showbase/ShadowPlacer.py +++ b/direct/src/showbase/ShadowPlacer.py @@ -1,7 +1,3 @@ -"""Undocumented Module""" - -__all__ = ['ShadowPlacer'] - """ ShadowPlacer.py places a shadow. @@ -10,6 +6,8 @@ Or it may do that later, right now it puts a node on the surface under the its parent node. """ +__all__ = ['ShadowPlacer'] + from direct.controls.ControlManager import CollisionHandlerRayStart from direct.directnotify import DirectNotifyGlobal from panda3d.core import * diff --git a/direct/src/showbase/TaskThreaded.py b/direct/src/showbase/TaskThreaded.py index b320e84453..a6634cd751 100755 --- a/direct/src/showbase/TaskThreaded.py +++ b/direct/src/showbase/TaskThreaded.py @@ -1,10 +1,13 @@ -"""Undocumented Module""" +"""Contains the TaskThreaded and TaskThread classes.""" __all__ = ['TaskThreaded', 'TaskThread'] from direct.directnotify.DirectNotifyGlobal import directNotify from direct.task import Task +from .PythonUtil import SerialNumGen + + class TaskThreaded: """ derive from this if you need to do a bunch of CPU-intensive processing and you don't want to hang up the show. Lets you break diff --git a/direct/src/showbase/ThreeUpShow.py b/direct/src/showbase/ThreeUpShow.py index 6449033c50..7e042c7f39 100644 --- a/direct/src/showbase/ThreeUpShow.py +++ b/direct/src/showbase/ThreeUpShow.py @@ -1,4 +1,5 @@ -"""Undocumented Module""" +"""ThreeUpShow is a variant of ShowBase that defines three cameras covering +different parts of the window.""" __all__ = ['ThreeUpShow'] diff --git a/direct/src/showbase/Transitions.py b/direct/src/showbase/Transitions.py index c60ac8c09e..9e34756404 100644 --- a/direct/src/showbase/Transitions.py +++ b/direct/src/showbase/Transitions.py @@ -1,4 +1,6 @@ -"""Undocumented Module""" +"""This module defines various transition effects that can be used to +graphically transition between two scenes, such as by fading the screen to +a particular color.""" __all__ = ['Transitions'] diff --git a/direct/src/showbase/VerboseImport.py b/direct/src/showbase/VerboseImport.py index 56efc33b23..9c61783ea5 100644 --- a/direct/src/showbase/VerboseImport.py +++ b/direct/src/showbase/VerboseImport.py @@ -1,4 +1,7 @@ -"""Undocumented Module""" +""" +This module hooks into Python's import mechanism to print out all imports to +the standard output as they happen. +""" __all__ = [] diff --git a/direct/src/showutil/pfreeze.py b/direct/src/showutil/pfreeze.py index 04397d31d9..2c2827e051 100755 --- a/direct/src/showutil/pfreeze.py +++ b/direct/src/showutil/pfreeze.py @@ -13,11 +13,11 @@ Python code into a standalone executable. It also uses Python's built-in modulefinder module, which it uses to find all of the modules imported directly or indirectly by the original startfile.py. -Usage: +Usage:: pfreeze.py [opts] [startfile] -Options: +Options:: -o output Specifies the name of the resulting executable file to produce. @@ -67,88 +67,95 @@ def usage(code, msg = ''): sys.stderr.write(str(msg) + '\n') sys.exit(code) -# We're not protecting the next part under a __name__ == __main__ -# check, just so we can import this file directly in ppython.cxx. -freezer = FreezeTool.Freezer() +def main(args=None): + if args is None: + args = sys.argv[1:] -basename = None -addStartupModules = False + freezer = FreezeTool.Freezer() -try: - opts, args = getopt.getopt(sys.argv[1:], 'o:i:x:p:P:slkh') -except getopt.error as msg: - usage(1, msg) + basename = None + addStartupModules = False -for opt, arg in opts: - if opt == '-o': - basename = arg - elif opt == '-i': - for module in arg.split(','): - freezer.addModule(module) - elif opt == '-x': - for module in arg.split(','): - freezer.excludeModule(module) - elif opt == '-p': - for module in arg.split(','): - freezer.handleCustomPath(module) - elif opt == '-P': - sys.path.append(arg) - elif opt == '-s': - addStartupModules = True - elif opt == '-l': - freezer.linkExtensionModules = True - elif opt == '-k': - freezer.keepTemporaryFiles = True - elif opt == '-h': - usage(0) + try: + opts, args = getopt.getopt(args, 'o:i:x:p:P:slkh') + except getopt.error as msg: + usage(1, msg) + + for opt, arg in opts: + if opt == '-o': + basename = arg + elif opt == '-i': + for module in arg.split(','): + freezer.addModule(module) + elif opt == '-x': + for module in arg.split(','): + freezer.excludeModule(module) + elif opt == '-p': + for module in arg.split(','): + freezer.handleCustomPath(module) + elif opt == '-P': + sys.path.append(arg) + elif opt == '-s': + addStartupModules = True + elif opt == '-l': + freezer.linkExtensionModules = True + elif opt == '-k': + freezer.keepTemporaryFiles = True + elif opt == '-h': + usage(0) + else: + print('illegal option: ' + flag) + sys.exit(1) + + if not basename: + usage(1, 'You did not specify an output file.') + + if len(args) > 1: + usage(1, 'Only one main file may be specified.') + + outputType = 'exe' + bl = basename.lower() + if bl.endswith('.mf'): + outputType = 'mf' + elif bl.endswith('.c'): + outputType = 'c' + elif bl.endswith('.dll') or bl.endswith('.pyd') or bl.endswith('.so'): + basename = os.path.splitext(basename)[0] + outputType = 'dll' + elif bl.endswith('.exe'): + basename = os.path.splitext(basename)[0] + + compileToExe = False + if args: + startfile = args[0] + startmod = startfile + if startfile.endswith('.py') or startfile.endswith('.pyw') or \ + startfile.endswith('.pyc') or startfile.endswith('.pyo'): + startmod = os.path.splitext(startfile)[0] + + if outputType == 'dll' or outputType == 'c': + freezer.addModule(startmod, filename = startfile) + else: + freezer.addModule('__main__', filename = startfile) + compileToExe = True + addStartupModules = True + + elif outputType == 'exe': + # We must have a main module when making an executable. + usage(1, 'A main file needs to be specified when creating an executable.') + + freezer.done(addStartupModules = addStartupModules) + + if outputType == 'mf': + freezer.writeMultifile(basename) + elif outputType == 'c': + freezer.writeCode(basename) else: - print('illegal option: ' + flag) - sys.exit(1) + freezer.generateCode(basename, compileToExe = compileToExe) -if not basename: - usage(1, 'You did not specify an output file.') + return 0 -if len(args) > 1: - usage(1, 'Only one main file may be specified.') - -outputType = 'exe' -bl = basename.lower() -if bl.endswith('.mf'): - outputType = 'mf' -elif bl.endswith('.c'): - outputType = 'c' -elif bl.endswith('.dll') or bl.endswith('.pyd') or bl.endswith('.so'): - basename = os.path.splitext(basename)[0] - outputType = 'dll' -elif bl.endswith('.exe'): - basename = os.path.splitext(basename)[0] - -compileToExe = False -if args: - startfile = args[0] - startmod = startfile - if startfile.endswith('.py') or startfile.endswith('.pyw') or \ - startfile.endswith('.pyc') or startfile.endswith('.pyo'): - startmod = os.path.splitext(startfile)[0] - - if outputType == 'dll' or outputType == 'c': - freezer.addModule(startmod, filename = startfile) - else: - freezer.addModule('__main__', filename = startfile) - compileToExe = True - addStartupModules = True - -elif outputType == 'exe': - # We must have a main module when making an executable. - usage(1, 'A main file needs to be specified when creating an executable.') - -freezer.done(addStartupModules = addStartupModules) - -if outputType == 'mf': - freezer.writeMultifile(basename) -elif outputType == 'c': - freezer.writeCode(basename) -else: - freezer.generateCode(basename, compileToExe = compileToExe) +if __name__ == '__main__': + sys.exit(main()) diff --git a/direct/src/stdpy/__init__.py b/direct/src/stdpy/__init__.py index e69de29bb2..9e4739449c 100644 --- a/direct/src/stdpy/__init__.py +++ b/direct/src/stdpy/__init__.py @@ -0,0 +1,5 @@ +""" +This package contains various modules that provide a drop-in substitute +for some of the built-in Python modules. These substitutes make better +use of Panda3D's virtual file system and threading system. +""" diff --git a/direct/src/task/TaskManagerGlobal.py b/direct/src/task/TaskManagerGlobal.py index 60587d7a4f..792938cfc4 100644 --- a/direct/src/task/TaskManagerGlobal.py +++ b/direct/src/task/TaskManagerGlobal.py @@ -4,4 +4,5 @@ __all__ = ['taskMgr'] from . import Task +#: The global task manager. taskMgr = Task.TaskManager() diff --git a/direct/src/task/TaskTester.py b/direct/src/task/TaskTester.py index 25437f9b6b..cbe8cd0bd7 100755 --- a/direct/src/task/TaskTester.py +++ b/direct/src/task/TaskTester.py @@ -24,7 +24,8 @@ def taskCallback(task): spawnNewTask() return Task.done -taskMgr.removeTasksMatching("taskTester*") +if __name__ == '__main__': + taskMgr.removeTasksMatching("taskTester*") -for i in range(numTasks): - spawnNewTask() + for i in range(numTasks): + spawnNewTask() diff --git a/direct/src/task/Timer.py b/direct/src/task/Timer.py index be7957183c..47d5041de9 100644 --- a/direct/src/task/Timer.py +++ b/direct/src/task/Timer.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the Timer class.""" __all__ = ['Timer'] diff --git a/direct/src/task/__init__.py b/direct/src/task/__init__.py index e69de29bb2..40a5246131 100644 --- a/direct/src/task/__init__.py +++ b/direct/src/task/__init__.py @@ -0,0 +1,8 @@ +""" +This package contains the Python interface to the task system, which +manages scheduled functions that are executed at designated intervals. + +The global task manager object can be imported as a singleton:: + + from direct.task.TaskManagerGlobal import taskMgr +""" diff --git a/direct/src/tkpanels/NotifyPanel.py b/direct/src/tkpanels/NotifyPanel.py index 9712903f7a..f13e7d92c6 100644 --- a/direct/src/tkpanels/NotifyPanel.py +++ b/direct/src/tkpanels/NotifyPanel.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the NotifyPanel class.""" __all__ = ['NotifyPanel'] diff --git a/direct/src/tkwidgets/SceneGraphExplorer.py b/direct/src/tkwidgets/SceneGraphExplorer.py index 7e39dbeac1..256f226f46 100644 --- a/direct/src/tkwidgets/SceneGraphExplorer.py +++ b/direct/src/tkwidgets/SceneGraphExplorer.py @@ -1,4 +1,7 @@ -"""Undocumented Module""" +"""This module defines a widget used to display a graphical overview of the +scene graph using the tkinter GUI system. + +Requires Pmw.""" __all__ = ['SceneGraphExplorer', 'SceneGraphExplorerItem', 'explore'] diff --git a/direct/src/tkwidgets/Tree.py b/direct/src/tkwidgets/Tree.py index e3e49b925f..ff8a273965 100644 --- a/direct/src/tkwidgets/Tree.py +++ b/direct/src/tkwidgets/Tree.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Defines tree widgets for the tkinter GUI system.""" __all__ = ['TreeNode', 'TreeItem'] diff --git a/direct/src/tkwidgets/WidgetPropertiesDialog.py b/direct/src/tkwidgets/WidgetPropertiesDialog.py index 0693a885d1..584e45620c 100644 --- a/direct/src/tkwidgets/WidgetPropertiesDialog.py +++ b/direct/src/tkwidgets/WidgetPropertiesDialog.py @@ -1,4 +1,4 @@ -"""Undocumented Module""" +"""Contains the WidgetPropertiesDialog class.""" __all__ = ['WidgetPropertiesDialog'] diff --git a/dtool/src/dtoolbase/typedObject.h b/dtool/src/dtoolbase/typedObject.h index 789e47110c..cc963b0fac 100644 --- a/dtool/src/dtoolbase/typedObject.h +++ b/dtool/src/dtoolbase/typedObject.h @@ -97,6 +97,8 @@ PUBLISHED: // Derived classes should override this function to return get_class_type(). virtual TypeHandle get_type() const=0; + + // Returns the TypeHandle representing this object's type. MAKE_PROPERTY(type, get_type); INLINE int get_type_index() const; diff --git a/dtool/src/interrogate/interrogateBuilder.cxx b/dtool/src/interrogate/interrogateBuilder.cxx index c7ed2a056f..a36b370942 100644 --- a/dtool/src/interrogate/interrogateBuilder.cxx +++ b/dtool/src/interrogate/interrogateBuilder.cxx @@ -1966,6 +1966,10 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP // See if there happens to be a comment before the MAKE_PROPERTY macro. if (make_property->_leading_comment != (CPPCommentBlock *)NULL) { iproperty._comment = trim_blanks(make_property->_leading_comment->_comment); + + } else if (getter->_leading_comment != (CPPCommentBlock *)NULL) { + // Take the comment from the getter. + iproperty._comment = trim_blanks(getter->_leading_comment->_comment); } // Now look for setters. diff --git a/makepanda/makewheel.py b/makepanda/makewheel.py index 56fb43133e..71ec67a269 100644 --- a/makepanda/makewheel.py +++ b/makepanda/makewheel.py @@ -551,6 +551,7 @@ def makewheel(version, output_dir, platform=default_platform): # Add a panda3d-tools directory containing the executables. entry_points = '[console_scripts]\n' entry_points += 'eggcacher = direct.directscripts.eggcacher:main\n' + entry_points += 'pfreeze = direct.showutil.pfreeze:main\n' tools_init = '' for file in os.listdir(bin_dir): basename = os.path.splitext(file)[0] diff --git a/panda/src/pgraph/lightRampAttrib.cxx b/panda/src/pgraph/lightRampAttrib.cxx index 78ba5aaef1..38ed81affe 100644 --- a/panda/src/pgraph/lightRampAttrib.cxx +++ b/panda/src/pgraph/lightRampAttrib.cxx @@ -51,8 +51,14 @@ make_identity() { /** * Constructs a new LightRampAttrib object. This causes the luminance of the * diffuse lighting contribution to be quantized using a single threshold: - * @code if (original_luminance > threshold0) { luminance = level0; } else { - * luminance = 0.0; } @endcode + * + * @code + * if (original_luminance > threshold0) { + * luminance = level0; + * } else { + * luminance = 0.0; + * } + * @endcode */ CPT(RenderAttrib) LightRampAttrib:: make_single_threshold(PN_stdfloat thresh0, PN_stdfloat val0) { @@ -65,10 +71,17 @@ make_single_threshold(PN_stdfloat thresh0, PN_stdfloat val0) { /** * Constructs a new LightRampAttrib object. This causes the luminance of the - * diffuse lighting contribution to be quantized using two thresholds: @code - * if (original_luminance > threshold1) { luminance = level1; } else if - * (original_luminance > threshold0) { luminance = level0; } else { luminance - * = 0.0; } @endcode + * diffuse lighting contribution to be quantized using two thresholds: + * + * @code + * if (original_luminance > threshold1) { + * luminance = level1; + * } else if (original_luminance > threshold0) { + * luminance = level0; + * } else { + * luminance = 0.0; + * } + * @endcode */ CPT(RenderAttrib) LightRampAttrib:: make_double_threshold(PN_stdfloat thresh0, PN_stdfloat val0, PN_stdfloat thresh1, PN_stdfloat val1) { @@ -94,8 +107,11 @@ make_double_threshold(PN_stdfloat thresh0, PN_stdfloat val0, PN_stdfloat thresh1 * However, the monitor has finite contrast. Normally, all of that contrast * is used to represent brightnesses in the range 0-1. The HDR0 tone mapping * operator 'steals' one quarter of that contrast to represent brightnesses in - * the range 1-infinity. @code FINAL_RGB = (RGB^3 + RGB^2 + RGB) / (RGB^3 + - * RGB^2 + RGB + 1) @endcode + * the range 1-infinity. + * + * @code + * FINAL_RGB = (RGB^3 + RGB^2 + RGB) / (RGB^3 + RGB^2 + RGB + 1) + * @endcode */ CPT(RenderAttrib) LightRampAttrib:: make_hdr0() { @@ -117,7 +133,10 @@ make_hdr0() { * However, the monitor has finite contrast. Normally, all of that contrast * is used to represent brightnesses in the range 0-1. The HDR1 tone mapping * operator 'steals' one third of that contrast to represent brightnesses in - * the range 1-infinity. @code FINAL_RGB = (RGB^2 + RGB) / (RGB^2 + RGB + 1) + * the range 1-infinity. + * + * @code + * FINAL_RGB = (RGB^2 + RGB) / (RGB^2 + RGB + 1) * @endcode */ CPT(RenderAttrib) LightRampAttrib:: @@ -140,7 +159,11 @@ make_hdr1() { * However, the monitor has finite contrast. Normally, all of that contrast * is used to represent brightnesses in the range 0-1. The HDR2 tone mapping * operator 'steals' one half of that contrast to represent brightnesses in - * the range 1-infinity. @code FINAL_RGB = (RGB) / (RGB + 1) @endcode + * the range 1-infinity. + * + * @code + * FINAL_RGB = (RGB) / (RGB + 1) + * @endcode */ CPT(RenderAttrib) LightRampAttrib:: make_hdr2() { diff --git a/panda/src/physics/linearUserDefinedForce.h b/panda/src/physics/linearUserDefinedForce.h index 1edc850828..fea6612de8 100644 --- a/panda/src/physics/linearUserDefinedForce.h +++ b/panda/src/physics/linearUserDefinedForce.h @@ -17,12 +17,7 @@ #include "linearForce.h" /** - * a programmable force that takes an evaluator fn. - * - * NOTE : AS OF Interrogate => Squeak, this class does NOT get FFI'd due to - * the function pointer bug, and is currently NOT getting interrogated. - * Change this in the makefile when the time is right or this class becomes - * needed... + * A programmable force that takes an evaluator function. */ class EXPCL_PANDAPHYSICS LinearUserDefinedForce : public LinearForce { PUBLISHED: From 53794e8e360b703e1cf91f092127c666b5b06928 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 24 May 2017 13:36:01 +0200 Subject: [PATCH 113/254] Get rid of unnecessary DisplayRegionBase class --- makepanda/makepanda.vcproj | 3 -- panda/src/display/displayRegion.I | 6 +++ panda/src/display/displayRegion.h | 10 ++-- panda/src/gsgbase/config_gsgbase.cxx | 2 - panda/src/gsgbase/displayRegionBase.I | 25 ---------- panda/src/gsgbase/displayRegionBase.cxx | 24 --------- panda/src/gsgbase/displayRegionBase.h | 57 ---------------------- panda/src/gsgbase/p3gsgbase_composite1.cxx | 1 - panda/src/pgraph/camera.I | 8 +-- panda/src/pgraph/camera.cxx | 4 +- panda/src/pgraph/camera.h | 13 ++--- 11 files changed, 25 insertions(+), 128 deletions(-) delete mode 100644 panda/src/gsgbase/displayRegionBase.I delete mode 100644 panda/src/gsgbase/displayRegionBase.cxx delete mode 100644 panda/src/gsgbase/displayRegionBase.h diff --git a/makepanda/makepanda.vcproj b/makepanda/makepanda.vcproj index f533c17448..a787653e1e 100755 --- a/makepanda/makepanda.vcproj +++ b/makepanda/makepanda.vcproj @@ -2371,12 +2371,9 @@ - - - diff --git a/panda/src/display/displayRegion.I b/panda/src/display/displayRegion.I index 6004791d31..8982461879 100644 --- a/panda/src/display/displayRegion.I +++ b/panda/src/display/displayRegion.I @@ -883,3 +883,9 @@ INLINE int DisplayRegionPipelineReader:: get_pixel_height(int i) const { return _cdata->_regions[i]._pixels[3] - _cdata->_regions[i]._pixels[2]; } + +INLINE ostream & +operator << (ostream &out, const DisplayRegion &dr) { + dr.output(out); + return out; +} diff --git a/panda/src/display/displayRegion.h b/panda/src/display/displayRegion.h index 742cf22bd4..091f17e13f 100644 --- a/panda/src/display/displayRegion.h +++ b/panda/src/display/displayRegion.h @@ -16,7 +16,7 @@ #include "pandabase.h" -#include "displayRegionBase.h" +#include "typedReferenceCount.h" #include "drawableRegion.h" #include "referenceCount.h" #include "nodePath.h" @@ -54,7 +54,7 @@ class CullTraverser; * DisplayRegions like panes of glass, usually for layering 2-d interfaces on * top of a 3-d scene. */ -class EXPCL_PANDA_DISPLAY DisplayRegion : public DisplayRegionBase, public DrawableRegion { +class EXPCL_PANDA_DISPLAY DisplayRegion : public TypedReferenceCount, public DrawableRegion { protected: DisplayRegion(GraphicsOutput *window, const LVecBase4 &dimensions); @@ -285,9 +285,9 @@ public: return _type_handle; } static void init_type() { - DisplayRegionBase::init_type(); + TypedReferenceCount::init_type(); register_type(_type_handle, "DisplayRegion", - DisplayRegionBase::get_class_type()); + TypedReferenceCount::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); @@ -374,6 +374,8 @@ private: static TypeHandle _type_handle; }; +INLINE ostream &operator << (ostream &out, const DisplayRegion &dr); + #include "displayRegion.I" #endif /* DISPLAYREGION_H */ diff --git a/panda/src/gsgbase/config_gsgbase.cxx b/panda/src/gsgbase/config_gsgbase.cxx index b4d6dc90c1..2e5ce60aa9 100644 --- a/panda/src/gsgbase/config_gsgbase.cxx +++ b/panda/src/gsgbase/config_gsgbase.cxx @@ -12,7 +12,6 @@ */ #include "config_gsgbase.h" -#include "displayRegionBase.h" #include "graphicsOutputBase.h" #include "graphicsStateGuardianBase.h" @@ -21,7 +20,6 @@ Configure(config_gsgbase); ConfigureFn(config_gsgbase) { - DisplayRegionBase::init_type(); GraphicsOutputBase::init_type(); GraphicsStateGuardianBase::init_type(); } diff --git a/panda/src/gsgbase/displayRegionBase.I b/panda/src/gsgbase/displayRegionBase.I deleted file mode 100644 index a945da7eb3..0000000000 --- a/panda/src/gsgbase/displayRegionBase.I +++ /dev/null @@ -1,25 +0,0 @@ -/** - * 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 displayRegionBase.I - * @author drose - * @date 2009-02-20 - */ - -/** - * - */ -INLINE DisplayRegionBase:: -DisplayRegionBase() { -} - -INLINE ostream & -operator << (ostream &out, const DisplayRegionBase &dr) { - dr.output(out); - return out; -} diff --git a/panda/src/gsgbase/displayRegionBase.cxx b/panda/src/gsgbase/displayRegionBase.cxx deleted file mode 100644 index b3573b9e68..0000000000 --- a/panda/src/gsgbase/displayRegionBase.cxx +++ /dev/null @@ -1,24 +0,0 @@ -/** - * 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 displayRegionBase.cxx - * @author drose - * @date 2009-02-20 - */ - -#include "displayRegionBase.h" - -TypeHandle DisplayRegionBase::_type_handle; - - -/** - * - */ -DisplayRegionBase:: -~DisplayRegionBase() { -} diff --git a/panda/src/gsgbase/displayRegionBase.h b/panda/src/gsgbase/displayRegionBase.h deleted file mode 100644 index 71302281f8..0000000000 --- a/panda/src/gsgbase/displayRegionBase.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * 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 displayRegionBase.h - * @author drose - * @date 2009-02-20 - */ - -#ifndef DISPLAYREGIONBASE_H -#define DISPLAYREGIONBASE_H - -#include "pandabase.h" - -#include "typedReferenceCount.h" - -/** - * An abstract base class for DisplayRegion, mainly so we can store - * DisplayRegion pointers in a Camera. - */ -class EXPCL_PANDA_GSGBASE DisplayRegionBase : public TypedReferenceCount { -protected: - INLINE DisplayRegionBase(); - -public: - virtual ~DisplayRegionBase(); - -PUBLISHED: - virtual void output(ostream &out) const=0; - -public: - static TypeHandle get_class_type() { - return _type_handle; - } - static void init_type() { - TypedReferenceCount::init_type(); - register_type(_type_handle, "DisplayRegionBase", - TypedReferenceCount::get_class_type()); - } - virtual TypeHandle get_type() const { - return get_class_type(); - } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} - -private: - static TypeHandle _type_handle; -}; - -INLINE ostream &operator << (ostream &out, const DisplayRegionBase &dr); - -#include "displayRegionBase.I" - -#endif diff --git a/panda/src/gsgbase/p3gsgbase_composite1.cxx b/panda/src/gsgbase/p3gsgbase_composite1.cxx index 5a6cec2b95..b7bcd1368e 100644 --- a/panda/src/gsgbase/p3gsgbase_composite1.cxx +++ b/panda/src/gsgbase/p3gsgbase_composite1.cxx @@ -1,6 +1,5 @@ #include "config_gsgbase.cxx" -#include "displayRegionBase.cxx" #include "graphicsOutputBase.cxx" #include "graphicsStateGuardianBase.cxx" diff --git a/panda/src/pgraph/camera.I b/panda/src/pgraph/camera.I index 7da5a9d4c9..0cfcd6277d 100644 --- a/panda/src/pgraph/camera.I +++ b/panda/src/pgraph/camera.I @@ -54,7 +54,7 @@ get_scene() const { /** * Returns the number of display regions associated with the camera. */ -INLINE int Camera:: +INLINE size_t Camera:: get_num_display_regions() const { return _display_regions.size(); } @@ -62,9 +62,9 @@ get_num_display_regions() const { /** * Returns the nth display region associated with the camera. */ -INLINE DisplayRegionBase *Camera:: -get_display_region(int n) const { - nassertr(n >= 0 && n < (int)_display_regions.size(), (DisplayRegionBase *)NULL); +INLINE DisplayRegion *Camera:: +get_display_region(size_t n) const { + nassertr(n < (int)_display_regions.size(), nullptr); return _display_regions[n]; } diff --git a/panda/src/pgraph/camera.cxx b/panda/src/pgraph/camera.cxx index d15e9a2bf3..aabf56eda2 100644 --- a/panda/src/pgraph/camera.cxx +++ b/panda/src/pgraph/camera.cxx @@ -236,7 +236,7 @@ cleanup_aux_scene_data(Thread *current_thread) { * camera. This is only intended to be called from the DisplayRegion. */ void Camera:: -add_display_region(DisplayRegionBase *display_region) { +add_display_region(DisplayRegion *display_region) { _display_regions.push_back(display_region); } @@ -245,7 +245,7 @@ add_display_region(DisplayRegionBase *display_region) { * by the camera. This is only intended to be called from the DisplayRegion. */ void Camera:: -remove_display_region(DisplayRegionBase *display_region) { +remove_display_region(DisplayRegion *display_region) { DisplayRegions::iterator dri = find(_display_regions.begin(), _display_regions.end(), display_region); if (dri != _display_regions.end()) { diff --git a/panda/src/pgraph/camera.h b/panda/src/pgraph/camera.h index 826000fbae..f983773846 100644 --- a/panda/src/pgraph/camera.h +++ b/panda/src/pgraph/camera.h @@ -25,7 +25,8 @@ #include "pointerTo.h" #include "pmap.h" #include "auxSceneData.h" -#include "displayRegionBase.h" + +class DisplayRegion; /** * A node that can be positioned around in the scene graph to represent a @@ -52,8 +53,8 @@ PUBLISHED: INLINE const NodePath &get_scene() const; MAKE_PROPERTY(scene, get_scene, set_scene); - INLINE int get_num_display_regions() const; - INLINE DisplayRegionBase *get_display_region(int n) const; + INLINE size_t get_num_display_regions() const; + INLINE DisplayRegion *get_display_region(size_t n) const; MAKE_SEQ(get_display_regions, get_num_display_regions, get_display_region); MAKE_SEQ_PROPERTY(display_regions, get_num_display_regions, get_display_region); @@ -98,8 +99,8 @@ PUBLISHED: int cleanup_aux_scene_data(Thread *current_thread = Thread::get_current_thread()); private: - void add_display_region(DisplayRegionBase *display_region); - void remove_display_region(DisplayRegionBase *display_region); + void add_display_region(DisplayRegion *display_region); + void remove_display_region(DisplayRegion *display_region); bool _active; NodePath _scene; @@ -110,7 +111,7 @@ private: DrawMask _camera_mask; PN_stdfloat _lod_scale; - typedef pvector DisplayRegions; + typedef pvector DisplayRegions; DisplayRegions _display_regions; CPT(RenderState) _initial_state; From 904209b277c7e69f332fba86466d4ee11ea82b25 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 24 May 2017 13:44:52 +0200 Subject: [PATCH 114/254] Split out interrogate jobs for dtool directories from express --- dtool/src/dtoolbase/dtool_platform.h | 4 +- dtool/src/dtoolbase/typeHandle.N | 1 + .../src/dtoolbase}/typeHandle_ext.cxx | 0 .../src/dtoolbase}/typeHandle_ext.h | 0 dtool/src/dtoolutil/config_dtoolutil.N | 9 +++ dtool/src/dtoolutil/config_dtoolutil.h | 3 + .../src/dtoolutil}/filename_ext.cxx | 0 .../src/dtoolutil}/filename_ext.h | 0 .../src/dtoolutil}/globPattern_ext.cxx | 0 .../src/dtoolutil}/globPattern_ext.h | 0 .../dtoolutil/p3dtoolutil_ext_composite.cxx | 2 + dtool/src/dtoolutil/pfstream.h | 4 +- dtool/src/prc/p3prc_ext_composite.cxx | 2 + .../src/prc}/streamReader_ext.cxx | 0 .../src/prc}/streamReader_ext.h | 0 .../src/prc}/streamWriter_ext.cxx | 0 .../src/prc}/streamWriter_ext.h | 0 makepanda/makepanda.py | 64 +++++++++++++++++++ makepanda/makepandacore.py | 7 ++ panda/src/express/config_express.N | 56 ---------------- panda/src/express/p3express_ext_composite.cxx | 5 -- 21 files changed, 91 insertions(+), 66 deletions(-) create mode 100644 dtool/src/dtoolbase/typeHandle.N rename {panda/src/express => dtool/src/dtoolbase}/typeHandle_ext.cxx (100%) rename {panda/src/express => dtool/src/dtoolbase}/typeHandle_ext.h (100%) create mode 100644 dtool/src/dtoolutil/config_dtoolutil.N rename {panda/src/express => dtool/src/dtoolutil}/filename_ext.cxx (100%) rename {panda/src/express => dtool/src/dtoolutil}/filename_ext.h (100%) rename {panda/src/express => dtool/src/dtoolutil}/globPattern_ext.cxx (100%) rename {panda/src/express => dtool/src/dtoolutil}/globPattern_ext.h (100%) create mode 100644 dtool/src/dtoolutil/p3dtoolutil_ext_composite.cxx create mode 100644 dtool/src/prc/p3prc_ext_composite.cxx rename {panda/src/express => dtool/src/prc}/streamReader_ext.cxx (100%) rename {panda/src/express => dtool/src/prc}/streamReader_ext.h (100%) rename {panda/src/express => dtool/src/prc}/streamWriter_ext.cxx (100%) rename {panda/src/express => dtool/src/prc}/streamWriter_ext.h (100%) diff --git a/dtool/src/dtoolbase/dtool_platform.h b/dtool/src/dtoolbase/dtool_platform.h index 7955c7a941..4cb25abc3a 100644 --- a/dtool/src/dtoolbase/dtool_platform.h +++ b/dtool/src/dtoolbase/dtool_platform.h @@ -72,10 +72,8 @@ #define DTOOL_PLATFORM "linux_ppc" #endif -#ifndef DTOOL_PLATFORM +#if !defined(DTOOL_PLATFORM) && !defined(CPPPARSER) #error "Can't determine platform; please define DTOOL_PLATFORM in Config.pp file." #endif - - #endif diff --git a/dtool/src/dtoolbase/typeHandle.N b/dtool/src/dtoolbase/typeHandle.N new file mode 100644 index 0000000000..9cd1d579b0 --- /dev/null +++ b/dtool/src/dtoolbase/typeHandle.N @@ -0,0 +1 @@ +defconstruct TypeHandle TypeHandle(TypeHandle::none()) diff --git a/panda/src/express/typeHandle_ext.cxx b/dtool/src/dtoolbase/typeHandle_ext.cxx similarity index 100% rename from panda/src/express/typeHandle_ext.cxx rename to dtool/src/dtoolbase/typeHandle_ext.cxx diff --git a/panda/src/express/typeHandle_ext.h b/dtool/src/dtoolbase/typeHandle_ext.h similarity index 100% rename from panda/src/express/typeHandle_ext.h rename to dtool/src/dtoolbase/typeHandle_ext.h diff --git a/dtool/src/dtoolutil/config_dtoolutil.N b/dtool/src/dtoolutil/config_dtoolutil.N new file mode 100644 index 0000000000..2577aa3b24 --- /dev/null +++ b/dtool/src/dtoolutil/config_dtoolutil.N @@ -0,0 +1,9 @@ +forcetype ofstream +forcetype ifstream +forcetype fstream + +forcetype ios_base +forcetype ios +forcetype istream +forcetype ostream +forcetype iostream diff --git a/dtool/src/dtoolutil/config_dtoolutil.h b/dtool/src/dtoolutil/config_dtoolutil.h index 1563b0250f..20e9784c55 100644 --- a/dtool/src/dtoolutil/config_dtoolutil.h +++ b/dtool/src/dtoolutil/config_dtoolutil.h @@ -16,4 +16,7 @@ #include "dtoolbase.h" +// Include this so interrogate can find it. +#include + #endif diff --git a/panda/src/express/filename_ext.cxx b/dtool/src/dtoolutil/filename_ext.cxx similarity index 100% rename from panda/src/express/filename_ext.cxx rename to dtool/src/dtoolutil/filename_ext.cxx diff --git a/panda/src/express/filename_ext.h b/dtool/src/dtoolutil/filename_ext.h similarity index 100% rename from panda/src/express/filename_ext.h rename to dtool/src/dtoolutil/filename_ext.h diff --git a/panda/src/express/globPattern_ext.cxx b/dtool/src/dtoolutil/globPattern_ext.cxx similarity index 100% rename from panda/src/express/globPattern_ext.cxx rename to dtool/src/dtoolutil/globPattern_ext.cxx diff --git a/panda/src/express/globPattern_ext.h b/dtool/src/dtoolutil/globPattern_ext.h similarity index 100% rename from panda/src/express/globPattern_ext.h rename to dtool/src/dtoolutil/globPattern_ext.h diff --git a/dtool/src/dtoolutil/p3dtoolutil_ext_composite.cxx b/dtool/src/dtoolutil/p3dtoolutil_ext_composite.cxx new file mode 100644 index 0000000000..89a0ebcc30 --- /dev/null +++ b/dtool/src/dtoolutil/p3dtoolutil_ext_composite.cxx @@ -0,0 +1,2 @@ +#include "filename_ext.cxx" +#include "globPattern_ext.cxx" diff --git a/dtool/src/dtoolutil/pfstream.h b/dtool/src/dtoolutil/pfstream.h index b7565c1c64..c26456bbe6 100644 --- a/dtool/src/dtoolutil/pfstream.h +++ b/dtool/src/dtoolutil/pfstream.h @@ -17,7 +17,7 @@ #include "pfstreamBuf.h" class EXPCL_DTOOL IPipeStream : public istream { -PUBLISHED: +public: INLINE IPipeStream(const std::string); #if _MSC_VER >= 1800 @@ -33,7 +33,7 @@ private: }; class EXPCL_DTOOL OPipeStream : public ostream { -PUBLISHED: +public: INLINE OPipeStream(const std::string); #if _MSC_VER >= 1800 diff --git a/dtool/src/prc/p3prc_ext_composite.cxx b/dtool/src/prc/p3prc_ext_composite.cxx new file mode 100644 index 0000000000..223ef504cd --- /dev/null +++ b/dtool/src/prc/p3prc_ext_composite.cxx @@ -0,0 +1,2 @@ +#include "streamReader_ext.cxx" +#include "streamWriter_ext.cxx" diff --git a/panda/src/express/streamReader_ext.cxx b/dtool/src/prc/streamReader_ext.cxx similarity index 100% rename from panda/src/express/streamReader_ext.cxx rename to dtool/src/prc/streamReader_ext.cxx diff --git a/panda/src/express/streamReader_ext.h b/dtool/src/prc/streamReader_ext.h similarity index 100% rename from panda/src/express/streamReader_ext.h rename to dtool/src/prc/streamReader_ext.h diff --git a/panda/src/express/streamWriter_ext.cxx b/dtool/src/prc/streamWriter_ext.cxx similarity index 100% rename from panda/src/express/streamWriter_ext.cxx rename to dtool/src/prc/streamWriter_ext.cxx diff --git a/panda/src/express/streamWriter_ext.h b/dtool/src/prc/streamWriter_ext.h similarity index 100% rename from panda/src/express/streamWriter_ext.h rename to dtool/src/prc/streamWriter_ext.h diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 69b4265801..d2a8127fc4 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -3407,6 +3407,59 @@ if (not RTDIST and not RUNTIME): TargetAdd('test_interrogate.exe', input='libp3pystub.lib') TargetAdd('test_interrogate.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER']) +# +# DIRECTORY: dtool/src/dtoolbase/ +# + +OPTS=['DIR:dtool/src/dtoolbase', 'PYTHON'] +IGATEFILES=GetDirectoryContents('dtool/src/dtoolbase', ["*_composite*.cxx"]) +IGATEFILES += [ + "typeHandle.h", + "typeHandle_ext.h", + "typeRegistry.h", + "typedObject.h", + "neverFreeMemory.h", +] +TargetAdd('libp3dtoolbase.in', opts=OPTS, input=IGATEFILES) +TargetAdd('libp3dtoolbase.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dtoolbase', 'SRCDIR:dtool/src/dtoolbase']) +TargetAdd('libp3dtoolbase_igate.obj', input='libp3dtoolbase.in', opts=["DEPENDENCYONLY"]) +TargetAdd('p3dtoolbase_typeHandle_ext.obj', opts=OPTS, input='typeHandle_ext.cxx') + +# +# DIRECTORY: dtool/src/dtoolutil/ +# + +OPTS=['DIR:dtool/src/dtoolutil', 'PYTHON'] +IGATEFILES=GetDirectoryContents('dtool/src/dtoolutil', ["*_composite*.cxx"]) +IGATEFILES += [ + "config_dtoolutil.h", + "pandaSystem.h", + "dSearchPath.h", + "executionEnvironment.h", + "textEncoder.h", + "filename.h", + "filename_ext.h", + "globPattern.h", + "globPattern_ext.h", + "pandaFileStream.h", + "lineStream.h", +] +TargetAdd('libp3dtoolutil.in', opts=OPTS, input=IGATEFILES) +TargetAdd('libp3dtoolutil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dtoolutil', 'SRCDIR:dtool/src/dtoolutil']) +TargetAdd('libp3dtoolutil_igate.obj', input='libp3dtoolutil.in', opts=["DEPENDENCYONLY"]) +TargetAdd('p3dtoolutil_ext_composite.obj', opts=OPTS, input='p3dtoolutil_ext_composite.cxx') + +# +# DIRECTORY: dtool/src/prc/ +# + +OPTS=['DIR:dtool/src/prc', 'PYTHON'] +IGATEFILES=GetDirectoryContents('dtool/src/prc', ["*.h", "*_composite*.cxx"]) +TargetAdd('libp3prc.in', opts=OPTS, input=IGATEFILES) +TargetAdd('libp3prc.in', opts=['IMOD:panda3d.core', 'ILIB:libp3prc', 'SRCDIR:dtool/src/prc']) +TargetAdd('libp3prc_igate.obj', input='libp3prc.in', opts=["DEPENDENCYONLY"]) +TargetAdd('p3prc_ext_composite.obj', opts=OPTS, input='p3prc_ext_composite.cxx') + # # DIRECTORY: panda/src/pandabase/ # @@ -4041,6 +4094,10 @@ if (not RUNTIME): TargetAdd('libpanda.dll', dep='dtool_have_freetype.dat') TargetAdd('libpanda.dll', opts=OPTS) + TargetAdd('core_module.obj', input='libp3dtoolbase.in') + TargetAdd('core_module.obj', input='libp3dtoolutil.in') + TargetAdd('core_module.obj', input='libp3prc.in') + TargetAdd('core_module.obj', input='libp3downloader.in') TargetAdd('core_module.obj', input='libp3express.in') @@ -4080,6 +4137,13 @@ if (not RUNTIME): TargetAdd('core_module.obj', opts=['PYTHON']) TargetAdd('core_module.obj', opts=['IMOD:panda3d.core', 'ILIB:core']) + TargetAdd('core.pyd', input='libp3dtoolbase_igate.obj') + TargetAdd('core.pyd', input='p3dtoolbase_typeHandle_ext.obj') + TargetAdd('core.pyd', input='libp3dtoolutil_igate.obj') + TargetAdd('core.pyd', input='p3dtoolutil_ext_composite.obj') + TargetAdd('core.pyd', input='libp3prc_igate.obj') + TargetAdd('core.pyd', input='p3prc_ext_composite.obj') + TargetAdd('core.pyd', input='libp3downloader_igate.obj') TargetAdd('core.pyd', input='p3downloader_stringStream_ext.obj') TargetAdd('core.pyd', input='p3express_ext_composite.obj') diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index feab23e98a..7d86accc07 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -3163,6 +3163,13 @@ def TargetAdd(target, dummy=0, opts=[], input=[], dep=[], ipath=None, winrc=None woutc = GetOutputDir()+"/tmp/"+outbase+"_igate.cxx" t.deps[woutc] = 1 + if target.endswith(".in"): + # Add any .N files. + base, ext = os.path.splitext(fullinput) + fulln = base + ".N" + if os.path.isfile(fulln): + t.deps[fulln] = 1 + for x in dep: fulldep = FindLocation(x, ipath) t.deps[fulldep] = 1 diff --git a/panda/src/express/config_express.N b/panda/src/express/config_express.N index 454c630ed2..e68b43fbfd 100644 --- a/panda/src/express/config_express.N +++ b/panda/src/express/config_express.N @@ -1,60 +1,4 @@ -defconstruct TypeHandle TypeHandle(TypeHandle::none()) - -forcetype PandaSystem -forcetype DSearchPath -forcetype DSearchPath::Results -forcetype ExecutionEnvironment -forcetype TextEncoder -forcetype Filename -forcetype GlobPattern -forcetype Notify -forcetype NotifyCategory -forcetype NotifySeverity -forcetype TypedObject -forcetype TypeHandle -forcetype TypeRegistry -forcetype StreamReader -forcetype StreamWriter -forcetype NeverFreeMemory -forcetype IFileStream -forcetype OFileStream -forcetype FileStream -forcetype IDecryptStream -forcetype OEncryptStream -forcetype LineStream - -forcetype ofstream -forcetype ifstream -forcetype fstream - forcetype DConfig -forcetype ConfigFlags -forcetype ConfigPage -forcetype ConfigPageManager -forcetype ConfigDeclaration -forcetype ConfigVariableCore -forcetype ConfigVariable -forcetype ConfigVariableBase -forcetype ConfigVariableBool -forcetype ConfigVariableDouble -forcetype ConfigVariableFilename -forcetype ConfigVariableInt -forcetype ConfigVariableInt64 -forcetype ConfigVariableList -forcetype ConfigVariableManager -forcetype ConfigVariableSearchPath -forcetype ConfigVariableString - -forcetype ios_base -forcetype ios -forcetype istream -forcetype ostream -forcetype iostream - -forcetype StreamWrapperBase -forcetype IStreamWrapper -forcetype OStreamWrapper -forcetype StreamWrapper forcetype PTA_uchar forcetype CPTA_uchar diff --git a/panda/src/express/p3express_ext_composite.cxx b/panda/src/express/p3express_ext_composite.cxx index e034261ae3..ee104077cb 100644 --- a/panda/src/express/p3express_ext_composite.cxx +++ b/panda/src/express/p3express_ext_composite.cxx @@ -1,9 +1,4 @@ -#include "filename_ext.cxx" -#include "globPattern_ext.cxx" #include "memoryUsagePointers_ext.cxx" #include "ramfile_ext.cxx" -#include "streamReader_ext.cxx" -#include "streamWriter_ext.cxx" -#include "typeHandle_ext.cxx" #include "virtualFileSystem_ext.cxx" #include "virtualFile_ext.cxx" From 257311cc0cf5496e8d4552df69388fab563393d9 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 24 May 2017 20:21:48 +0200 Subject: [PATCH 115/254] physics: fix crash in edge case when PhysicalNode dies before Physical Also add more assertion checks --- panda/src/physics/physical.cxx | 13 +++++++------ panda/src/physics/physicalNode.I | 5 +++++ panda/src/physics/physicalNode.cxx | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/panda/src/physics/physical.cxx b/panda/src/physics/physical.cxx index d67b957595..f7e64e0507 100644 --- a/panda/src/physics/physical.cxx +++ b/panda/src/physics/physical.cxx @@ -30,10 +30,10 @@ TypeHandle Physical::_type_handle; * the speed-vs-overhead deal. */ Physical:: -Physical(int total_objects, bool pre_alloc) { - _viscosity=0.0; - _physical_node = (PhysicalNode *) NULL; - _physics_manager = (PhysicsManager *) NULL; +Physical(int total_objects, bool pre_alloc) : + _viscosity(0.0), + _physics_manager(nullptr), + _physical_node(nullptr) { if (total_objects == 1) { _phys_body = new PhysicsObject; @@ -55,8 +55,9 @@ Physical(int total_objects, bool pre_alloc) { * to its template's physicsmanager. */ Physical:: -Physical(const Physical& copy) { - _physics_manager = (PhysicsManager *) NULL; +Physical(const Physical& copy) : + _physics_manager(nullptr), + _physical_node(nullptr) { // copy the forces. LinearForceVector::const_iterator lf_cur; diff --git a/panda/src/physics/physicalNode.I b/panda/src/physics/physicalNode.I index 92e5961ae8..700511b1e6 100644 --- a/panda/src/physics/physicalNode.I +++ b/panda/src/physics/physicalNode.I @@ -16,6 +16,11 @@ */ INLINE void PhysicalNode:: clear() { + PhysicalsVector::iterator it; + for (it = _physicals.begin(); it != _physicals.end(); ++it) { + nassertd((*it)->_physical_node == this) continue; + (*it)->_physical_node = nullptr; + } _physicals.erase(_physicals.begin(), _physicals.end()); } diff --git a/panda/src/physics/physicalNode.cxx b/panda/src/physics/physicalNode.cxx index 381ceeff4f..6e81e65285 100644 --- a/panda/src/physics/physicalNode.cxx +++ b/panda/src/physics/physicalNode.cxx @@ -38,6 +38,15 @@ PhysicalNode(const PhysicalNode ©) : */ PhysicalNode:: ~PhysicalNode() { + PhysicalsVector::iterator it; + for (it = _physicals.begin(); it != _physicals.end(); ++it) { + Physical *physical = *it; + nassertd(physical->_physical_node == this) continue; + physical->_physical_node = nullptr; + if (physical->_physics_manager != nullptr) { + physical->_physics_manager->remove_physical(physical); + } + } } /** @@ -83,9 +92,13 @@ remove_physical(Physical *physical) { pvector< PT(Physical) >::iterator found; PT(Physical) ptp = physical; found = find(_physicals.begin(), _physicals.end(), ptp); - if (found == _physicals.end()) + if (found == _physicals.end()) { return; + } _physicals.erase(found); + + nassertv(ptp->_physical_node == this); + ptp->_physical_node = nullptr; } /** From 828f1c10cadc6e54bad5cac56bf60b71d11f2c47 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 24 May 2017 22:19:56 +0200 Subject: [PATCH 116/254] Support loading Opus audio files via libopusfile. --- dtool/src/parser-inc/opus/opus.h | 6 + dtool/src/parser-inc/opus/opus_types.h | 19 ++ dtool/src/parser-inc/opus/opusfile.h | 8 + makepanda/makepanda.py | 22 ++- panda/src/movies/config_movies.cxx | 16 ++ panda/src/movies/config_movies.h | 2 + panda/src/movies/opusAudio.I | 12 ++ panda/src/movies/opusAudio.cxx | 68 +++++++ panda/src/movies/opusAudio.h | 61 ++++++ panda/src/movies/opusAudioCursor.I | 12 ++ panda/src/movies/opusAudioCursor.cxx | 224 +++++++++++++++++++++++ panda/src/movies/opusAudioCursor.h | 78 ++++++++ panda/src/movies/p3movies_composite1.cxx | 2 + 13 files changed, 524 insertions(+), 6 deletions(-) create mode 100644 dtool/src/parser-inc/opus/opus.h create mode 100644 dtool/src/parser-inc/opus/opus_types.h create mode 100644 dtool/src/parser-inc/opus/opusfile.h create mode 100644 panda/src/movies/opusAudio.I create mode 100644 panda/src/movies/opusAudio.cxx create mode 100644 panda/src/movies/opusAudio.h create mode 100644 panda/src/movies/opusAudioCursor.I create mode 100644 panda/src/movies/opusAudioCursor.cxx create mode 100644 panda/src/movies/opusAudioCursor.h diff --git a/dtool/src/parser-inc/opus/opus.h b/dtool/src/parser-inc/opus/opus.h new file mode 100644 index 0000000000..8b5341cae7 --- /dev/null +++ b/dtool/src/parser-inc/opus/opus.h @@ -0,0 +1,6 @@ +#ifndef OPUS_H +#define OPUS_H + +#include "opus_types.h" + +#endif diff --git a/dtool/src/parser-inc/opus/opus_types.h b/dtool/src/parser-inc/opus/opus_types.h new file mode 100644 index 0000000000..ca01109eb7 --- /dev/null +++ b/dtool/src/parser-inc/opus/opus_types.h @@ -0,0 +1,19 @@ +#ifndef OPUS_TYPES_H +#define OPUS_TYPES_H + +#include + +typedef int16_t opus_int16; +typedef uint16_t opus_uint16; +typedef int32_t opus_int32; +typedef uint32_t opus_uint32; + +#define opus_int int +#define opus_int64 long long +#define opus_int8 signed char + +#define opus_uint unsigned int +#define opus_uint64 unsigned long long +#define opus_uint8 unsigned char + +#endif diff --git a/dtool/src/parser-inc/opus/opusfile.h b/dtool/src/parser-inc/opus/opusfile.h new file mode 100644 index 0000000000..1d9b656a05 --- /dev/null +++ b/dtool/src/parser-inc/opus/opusfile.h @@ -0,0 +1,8 @@ +#include "opus.h" + +typedef struct OpusHead OpusHead; +typedef struct OpusTags OpusTags; +typedef struct OpusPictureTag OpusPictureTag; +typedef struct OpusServerInfo OpusServerInfo; +typedef struct OpusFileCallbacks OpusFileCallbacks; +typedef struct OggOpusFile OggOpusFile; diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index d2a8127fc4..b5044b1761 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -77,7 +77,7 @@ PkgListSet(["PYTHON", "DIRECT", # Python support "EGL", # OpenGL (ES) integration "EIGEN", # Linear algebra acceleration "OPENAL", "FMODEX", # Audio playback - "VORBIS", "FFMPEG", "SWSCALE", "SWRESAMPLE", # Audio decoding + "VORBIS", "OPUS", "FFMPEG", "SWSCALE", "SWRESAMPLE", # Audio decoding "ODE", "PHYSX", "BULLET", "PANDAPHYSICS", # Physics "SPEEDTREE", # SpeedTree "ZLIB", "PNG", "JPEG", "TIFF", "OPENEXR", "SQUISH", # 2D Formats support @@ -700,6 +700,10 @@ if (COMPILER == "MSVC"): LibName("VORBIS", GetThirdpartyDir() + "vorbis/lib/libogg_static.lib") LibName("VORBIS", GetThirdpartyDir() + "vorbis/lib/libvorbis_static.lib") LibName("VORBIS", GetThirdpartyDir() + "vorbis/lib/libvorbisfile_static.lib") + if (PkgSkip("OPUS")==0): + LibName("OPUS", GetThirdpartyDir() + "opus/lib/libogg_static.lib") + LibName("OPUS", GetThirdpartyDir() + "opus/lib/libopus_static.lib") + LibName("OPUS", GetThirdpartyDir() + "opus/lib/libopusfile_static.lib") for pkg in MAYAVERSIONS: if (PkgSkip(pkg)==0): LibName(pkg, '"' + SDK[pkg] + '/lib/Foundation.lib"') @@ -819,6 +823,7 @@ if (COMPILER=="GCC"): SmartPkgEnable("VRPN", "", ("vrpn", "quat"), ("vrpn", "quat.h", "vrpn/vrpn_Types.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("OPUS", "opusfile", ("opusfile", "opus", "ogg"), ("ogg/ogg.h", "opus/opusfile.h")) SmartPkgEnable("JPEG", "", ("jpeg"), "jpeglib.h") SmartPkgEnable("PNG", "libpng", ("png"), "png.h", tool = "libpng-config") @@ -2236,6 +2241,7 @@ DTOOL_CONFIG=[ ("HAVE_PNM", '1', '1'), ("HAVE_STB_IMAGE", '1', '1'), ("HAVE_VORBIS", 'UNDEF', 'UNDEF'), + ("HAVE_OPUS", 'UNDEF', 'UNDEF'), ("HAVE_FREETYPE", 'UNDEF', 'UNDEF'), ("HAVE_FFTW", 'UNDEF', 'UNDEF'), ("HAVE_OPENSSL", 'UNDEF', 'UNDEF'), @@ -3880,10 +3886,10 @@ if (not RUNTIME): # if (not RUNTIME): - OPTS=['DIR:panda/src/movies', 'BUILDING:PANDA', 'VORBIS'] + OPTS=['DIR:panda/src/movies', 'BUILDING:PANDA', 'VORBIS', 'OPUS'] TargetAdd('p3movies_composite1.obj', opts=OPTS, input='p3movies_composite1.cxx') - OPTS=['DIR:panda/src/movies', 'VORBIS', 'PYTHON'] + OPTS=['DIR:panda/src/movies', 'VORBIS', 'OPUS', 'PYTHON'] IGATEFILES=GetDirectoryContents('panda/src/movies', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3movies.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3movies.in', opts=['IMOD:panda3d.core', 'ILIB:libp3movies', 'SRCDIR:panda/src/movies']) @@ -4017,7 +4023,7 @@ if (not RUNTIME): if (not RUNTIME): OPTS=['DIR:panda/metalibs/panda', 'BUILDING:PANDA', 'JPEG', 'PNG', 'HARFBUZZ', 'TIFF', 'OPENEXR', 'ZLIB', 'OPENSSL', 'FREETYPE', 'FFTW', 'ADVAPI', 'WINSOCK2', - 'SQUISH', 'NVIDIACG', 'VORBIS', 'WINUSER', 'WINMM', 'WINGDI', 'IPHLPAPI'] + 'SQUISH', 'NVIDIACG', 'VORBIS', 'OPUS', 'WINUSER', 'WINMM', 'WINGDI', 'IPHLPAPI'] TargetAdd('panda_panda.obj', opts=OPTS, input='panda.cxx') @@ -7226,10 +7232,14 @@ def MakeInstallerOSX(): if not PkgSkip("FFMPEG"): dist.write(' \n') - else: + elif PkgSkip("VORBIS"): + dist.write(' It is not required for loading .wav or .opus files, which Panda3D can read out of the box.">\n') + elif PkgSkip("OPUS"): dist.write(' It is not required for loading .wav or .ogg files, which Panda3D can read out of the box.">\n') + else: + dist.write(' It is not required for loading .wav, .ogg or .opus files, which Panda3D can read out of the box.">\n') dist.write(' \n') dist.write(' \n') diff --git a/panda/src/movies/config_movies.cxx b/panda/src/movies/config_movies.cxx index fbd80e275d..4884c15f5b 100644 --- a/panda/src/movies/config_movies.cxx +++ b/panda/src/movies/config_movies.cxx @@ -23,6 +23,8 @@ #include "movieTypeRegistry.h" #include "movieVideo.h" #include "movieVideoCursor.h" +#include "opusAudio.h" +#include "opusAudioCursor.h" #include "userDataAudio.h" #include "userDataAudioCursor.h" #include "vorbisAudio.h" @@ -51,6 +53,11 @@ ConfigVariableList load_video_type "either the name of a module, or a space-separate list of filename " "extensions, followed by the name of the module.")); +ConfigVariableBool opus_enable_seek +("opus-enable-seek", true, + PRC_DESC("Set this to false if you're having trouble with seeking while " + "using the Opus decoder.")); + ConfigVariableBool vorbis_enable_seek ("vorbis-enable-seek", true, PRC_DESC("Set this to false if you're having trouble with seeking while " @@ -91,6 +98,11 @@ init_libmovies() { WavAudio::init_type(); WavAudioCursor::init_type(); +#ifdef HAVE_OPUS + OpusAudio::init_type(); + OpusAudioCursor::init_type(); +#endif + #ifdef HAVE_VORBIS VorbisAudio::init_type(); VorbisAudioCursor::init_type(); @@ -100,6 +112,10 @@ init_libmovies() { reg->register_audio_type(&FlacAudio::make, "flac"); reg->register_audio_type(&WavAudio::make, "wav wave"); +#ifdef HAVE_OPUS + reg->register_audio_type(&OpusAudio::make, "opus"); +#endif + #ifdef HAVE_VORBIS reg->register_audio_type(&VorbisAudio::make, "ogg oga"); #endif diff --git a/panda/src/movies/config_movies.h b/panda/src/movies/config_movies.h index cbfd09a440..1d8d6ae93e 100644 --- a/panda/src/movies/config_movies.h +++ b/panda/src/movies/config_movies.h @@ -27,6 +27,8 @@ NotifyCategoryDecl(movies, EXPCL_PANDA_MOVIES, EXPTP_PANDA_MOVIES); extern ConfigVariableList load_audio_type; extern ConfigVariableList load_video_type; +extern ConfigVariableBool opus_enable_seek; + extern ConfigVariableBool vorbis_enable_seek; extern ConfigVariableBool vorbis_seek_lap; diff --git a/panda/src/movies/opusAudio.I b/panda/src/movies/opusAudio.I new file mode 100644 index 0000000000..23f144fe3a --- /dev/null +++ b/panda/src/movies/opusAudio.I @@ -0,0 +1,12 @@ +/** + * 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 opusAudio.I + * @author rdb + * @date 2017-05-24 + */ diff --git a/panda/src/movies/opusAudio.cxx b/panda/src/movies/opusAudio.cxx new file mode 100644 index 0000000000..024560156a --- /dev/null +++ b/panda/src/movies/opusAudio.cxx @@ -0,0 +1,68 @@ +/** + * 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 opusAudio.cxx + * @author rdb + * @date 2017-05-24 + */ + +#include "opusAudio.h" +#include "opusAudioCursor.h" +#include "virtualFileSystem.h" +#include "dcast.h" + +#ifdef HAVE_OPUS + +TypeHandle OpusAudio::_type_handle; + +/** + * xxx + */ +OpusAudio:: +OpusAudio(const Filename &name) : + MovieAudio(name) +{ + _filename = name; +} + +/** + * xxx + */ +OpusAudio:: +~OpusAudio() { +} + +/** + * Open this audio, returning a MovieAudioCursor + */ +PT(MovieAudioCursor) OpusAudio:: +open() { + VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr(); + istream *stream = vfs->open_read_file(_filename, true); + + if (stream == nullptr) { + return nullptr; + } else { + PT(OpusAudioCursor) cursor = new OpusAudioCursor(this, stream); + if (cursor == nullptr || !cursor->_is_valid) { + return nullptr; + } else { + return DCAST(MovieAudioCursor, cursor); + } + } +} + +/** + * Obtains a MovieAudio that references a file. + */ +PT(MovieAudio) OpusAudio:: +make(const Filename &name) { + return DCAST(MovieAudio, new OpusAudio(name)); +} + +#endif // HAVE_OPUS diff --git a/panda/src/movies/opusAudio.h b/panda/src/movies/opusAudio.h new file mode 100644 index 0000000000..813a4dbd58 --- /dev/null +++ b/panda/src/movies/opusAudio.h @@ -0,0 +1,61 @@ +/** + * 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 opusAudio.h + * @author rdb + * @date 2017-05-24 + */ + +#ifndef OPUSAUDIO_H +#define OPUSAUDIO_H + +#include "pandabase.h" +#include "movieAudio.h" + +#ifdef HAVE_OPUS + +class OpusAudioCursor; + +/** + * Interfaces with the libopusfile library to implement decoding of Opus + * audio files. + */ +class EXPCL_PANDA_MOVIES OpusAudio : public MovieAudio { +PUBLISHED: + OpusAudio(const Filename &name); + virtual ~OpusAudio(); + virtual PT(MovieAudioCursor) open(); + + static PT(MovieAudio) make(const Filename &name); + +private: + friend class OpusAudioCursor; + +public: + static TypeHandle get_class_type() { + return _type_handle; + } + static void init_type() { + TypedWritableReferenceCount::init_type(); + register_type(_type_handle, "OpusAudio", + MovieAudio::get_class_type()); + } + virtual TypeHandle get_type() const { + return get_class_type(); + } + virtual TypeHandle force_init_type() {init_type(); return get_class_type();} + +private: + static TypeHandle _type_handle; +}; + +#include "opusAudio.I" + +#endif // HAVE_OPUS + +#endif // OPUSAUDIO_H diff --git a/panda/src/movies/opusAudioCursor.I b/panda/src/movies/opusAudioCursor.I new file mode 100644 index 0000000000..1e923c3a80 --- /dev/null +++ b/panda/src/movies/opusAudioCursor.I @@ -0,0 +1,12 @@ +/** + * 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 opusAudioCursor.I + * @author rdb + * @date 2017-05-24 + */ diff --git a/panda/src/movies/opusAudioCursor.cxx b/panda/src/movies/opusAudioCursor.cxx new file mode 100644 index 0000000000..698648c5cb --- /dev/null +++ b/panda/src/movies/opusAudioCursor.cxx @@ -0,0 +1,224 @@ +/** + * 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 opusAudioCursor.cxx + * @author rdb + * @date 2017-05-24 + */ + +#include "opusAudioCursor.h" +#include "virtualFileSystem.h" + +#ifdef HAVE_OPUS + +#include + +/** + * Callbacks passed to libopusfile to implement file I/O via the + * VirtualFileSystem. + */ +int cb_read(void *stream, unsigned char *ptr, int nbytes) { + istream *in = (istream *)stream; + nassertr(in != nullptr, -1); + + in->read((char *)ptr, nbytes); + + if (in->eof()) { + // Gracefully handle EOF. + in->clear(); + } + + return in->gcount(); +} + +int cb_seek(void *stream, opus_int64 offset, int whence) { + if (!opus_enable_seek) { + return -1; + } + + istream *in = (istream *)stream; + nassertr(in != nullptr, -1); + + switch (whence) { + case SEEK_SET: + in->seekg(offset, ios::beg); + break; + + case SEEK_CUR: + in->seekg(offset, ios::cur); + break; + + case SEEK_END: + in->seekg(offset, ios::end); + break; + + default: + movies_cat.error() + << "Illegal parameter to seek in cb_seek\n"; + return -1; + } + + if (in->fail()) { + movies_cat.error() + << "Failure to seek to byte " << offset; + + switch (whence) { + case SEEK_CUR: + movies_cat.error(false) + << " from current location!\n"; + break; + + case SEEK_END: + movies_cat.error(false) + << " from end of file!\n"; + break; + + default: + movies_cat.error(false) << "!\n"; + } + + return -1; + } + + return 0; +} + +opus_int64 cb_tell(void *stream) { + istream *in = (istream *)stream; + nassertr(in != nullptr, -1); + + return in->tellg(); +} + +int cb_close(void *stream) { + istream *in = (istream *)stream; + nassertr(in != nullptr, EOF); + + VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr(); + vfs->close_read_file(in); + return 0; +} + +static const OpusFileCallbacks callbacks = {cb_read, cb_seek, cb_tell, cb_close}; + +TypeHandle OpusAudioCursor::_type_handle; + +/** + * Reads the .wav header from the indicated stream. This leaves the read + * pointer positioned at the start of the data. + */ +OpusAudioCursor:: +OpusAudioCursor(OpusAudio *src, istream *stream) : + MovieAudioCursor(src), + _is_valid(false), + _link(0) +{ + nassertv(stream != nullptr); + nassertv(stream->good()); + + int error = 0; + _op = op_open_callbacks((void *)stream, &callbacks, nullptr, 0, &error); + if (_op == nullptr) { + movies_cat.error() + << "Failed to read Opus file (error code " << error << ").\n"; + return; + } + + ogg_int64_t samples = op_pcm_total(_op, -1); + if (samples != OP_EINVAL) { + // Opus timestamps are fixed at 48 kHz. + _length = (double)samples / 48000.0; + } + + _audio_channels = op_channel_count(_op, -1); + _audio_rate = 48000; + + _can_seek = opus_enable_seek && op_seekable(_op); + _can_seek_fast = _can_seek; + + _is_valid = true; +} + +/** + * xxx + */ +OpusAudioCursor:: +~OpusAudioCursor() { + if (_op != nullptr) { + op_free(_op); + _op = nullptr; + } +} + +/** + * Seeks to a target location. Afterward, the packet_time is guaranteed to be + * less than or equal to the specified time. + */ +void OpusAudioCursor:: +seek(double t) { + if (!opus_enable_seek) { + return; + } + + t = max(t, 0.0); + + // Use op_time_seek_lap if cross-lapping is enabled. + int error = op_pcm_seek(_op, (ogg_int64_t)(t * 48000.0)); + if (error != 0) { + movies_cat.error() + << "Seek failed (error " << error << "). Opus stream may not be seekable.\n"; + return; + } + + _last_seek = op_pcm_tell(_op) / 48000.0; + _samples_read = 0; +} + +/** + * Read audio samples from the stream. N is the number of samples you wish to + * read. Your buffer must be equal in size to N * channels. Multiple-channel + * audio will be interleaved. + */ +void OpusAudioCursor:: +read_samples(int n, int16_t *data) { + int16_t *end = data + (n * _audio_channels); + + while (data < end) { + // op_read gives it to us in the exact format we need. Nifty! + int link; + int read_samples = op_read(_op, data, end - data, &link); + if (read_samples > 0) { + data += read_samples * _audio_channels; + _samples_read += read_samples; + } else { + break; + } + + if (_link != link) { + // It is technically possible for it to change parameters from one link + // to the next. However, we don't offer this flexibility. + int channels = op_channel_count(_op, link); + if (channels != _audio_channels) { + movies_cat.error() + << "Opus file has inconsistent channel count!\n"; + + // We'll change it anyway. Not sure what happens next. + _audio_channels = channels; + } + + _link = link; + } + } + + // Fill the rest of the buffer with silence. + if (data < end) { + memset(data, 0, (unsigned char *)end - (unsigned char *)data); + } +} + +#endif // HAVE_OPUS diff --git a/panda/src/movies/opusAudioCursor.h b/panda/src/movies/opusAudioCursor.h new file mode 100644 index 0000000000..55a717afcf --- /dev/null +++ b/panda/src/movies/opusAudioCursor.h @@ -0,0 +1,78 @@ +/** + * 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 opusAudioCursor.h + * @author rdb + * @date 2017-05-24 + */ + +#ifndef OPUSAUDIOCURSOR_H +#define OPUSAUDIOCURSOR_H + +#include "pandabase.h" +#include "movieAudioCursor.h" + +#ifdef HAVE_OPUS + +#include + +typedef struct OggOpusFile OggOpusFile; + +class OpusAudio; + +/** + * Interfaces with the libopusfile library to implement decoding of Opus + * audio files. + */ +class EXPCL_PANDA_MOVIES OpusAudioCursor : public MovieAudioCursor { +PUBLISHED: + OpusAudioCursor(OpusAudio *src, istream *stream); + virtual ~OpusAudioCursor(); + virtual void seek(double offset); + +public: + virtual void read_samples(int n, int16_t *data); + + bool _is_valid; + +protected: + OggOpusFile *_op; + + int _link; + double _byte_rate; + int _block_align; + int _bytes_per_sample; + bool _is_float; + + streampos _data_start; + streampos _data_pos; + size_t _data_size; + +public: + static TypeHandle get_class_type() { + return _type_handle; + } + static void init_type() { + MovieAudioCursor::init_type(); + register_type(_type_handle, "OpusAudioCursor", + MovieAudioCursor::get_class_type()); + } + virtual TypeHandle get_type() const { + return get_class_type(); + } + virtual TypeHandle force_init_type() {init_type(); return get_class_type();} + +private: + static TypeHandle _type_handle; +}; + +#include "opusAudioCursor.I" + +#endif // HAVE_OPUS + +#endif // OPUSAUDIOCURSOR_H diff --git a/panda/src/movies/p3movies_composite1.cxx b/panda/src/movies/p3movies_composite1.cxx index ea526c30b1..61954c669e 100644 --- a/panda/src/movies/p3movies_composite1.cxx +++ b/panda/src/movies/p3movies_composite1.cxx @@ -10,6 +10,8 @@ #include "movieTypeRegistry.cxx" #include "movieVideo.cxx" #include "movieVideoCursor.cxx" +#include "opusAudio.cxx" +#include "opusAudioCursor.cxx" #include "userDataAudio.cxx" #include "userDataAudioCursor.cxx" #include "vorbisAudio.cxx" From d6657baf299ec0b5dff29bf31f920cb98ee88c27 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 25 May 2017 13:20:11 +0200 Subject: [PATCH 117/254] cppparser: fix scope bug in constructor inits This also fixes the Android build. --- dtool/src/cppparser/cppBison.cxx.prebuilt | 7747 +++++++++++---------- dtool/src/cppparser/cppBison.yxx | 13 +- 2 files changed, 3896 insertions(+), 3864 deletions(-) diff --git a/dtool/src/cppparser/cppBison.cxx.prebuilt b/dtool/src/cppparser/cppBison.cxx.prebuilt index f0cefb3526..692194fa8a 100644 --- a/dtool/src/cppparser/cppBison.cxx.prebuilt +++ b/dtool/src/cppparser/cppBison.cxx.prebuilt @@ -857,16 +857,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 104 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 6907 +#define YYLAST 6950 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 170 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 108 +#define YYNNTS 109 /* YYNRULES -- Number of rules. */ -#define YYNRULES 755 +#define YYNRULES 756 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 1537 +#define YYNSTATES 1538 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ @@ -933,76 +933,76 @@ static const yytype_uint16 yyrline[] = 613, 630, 658, 695, 717, 750, 772, 783, 797, 796, 811, 815, 820, 824, 835, 839, 843, 847, 851, 855, 859, 863, 867, 871, 875, 879, 884, 888, 895, 896, - 900, 901, 902, 907, 906, 922, 931, 939, 947, 955, - 966, 982, 981, 996, 1011, 1020, 1035, 1034, 1059, 1058, - 1086, 1085, 1116, 1115, 1134, 1133, 1154, 1153, 1185, 1184, - 1210, 1223, 1227, 1231, 1235, 1248, 1252, 1256, 1260, 1264, - 1269, 1274, 1278, 1282, 1286, 1293, 1297, 1301, 1305, 1309, - 1313, 1317, 1321, 1325, 1329, 1333, 1337, 1341, 1345, 1349, - 1353, 1357, 1361, 1365, 1369, 1373, 1377, 1381, 1385, 1389, - 1393, 1397, 1401, 1405, 1409, 1413, 1417, 1421, 1425, 1429, - 1433, 1437, 1441, 1445, 1452, 1453, 1454, 1458, 1460, 1459, - 1467, 1468, 1472, 1473, 1477, 1483, 1492, 1493, 1497, 1501, - 1505, 1509, 1515, 1521, 1527, 1534, 1539, 1548, 1552, 1557, - 1565, 1577, 1581, 1595, 1610, 1615, 1620, 1625, 1630, 1635, - 1640, 1645, 1651, 1650, 1681, 1691, 1701, 1705, 1709, 1718, - 1722, 1727, 1731, 1736, 1744, 1749, 1757, 1761, 1766, 1770, - 1775, 1783, 1788, 1796, 1800, 1807, 1811, 1818, 1822, 1826, - 1830, 1834, 1841, 1845, 1849, 1853, 1857, 1861, 1868, 1869, - 1870, 1874, 1877, 1878, 1879, 1883, 1888, 1894, 1900, 1905, - 1911, 1917, 1921, 1932, 1936, 1946, 1950, 1954, 1959, 1964, - 1969, 1974, 1979, 1984, 1992, 1996, 2000, 2005, 2010, 2015, - 2020, 2025, 2030, 2035, 2041, 2049, 2054, 2059, 2064, 2069, - 2074, 2079, 2084, 2089, 2094, 2100, 2108, 2112, 2117, 2122, - 2127, 2132, 2137, 2142, 2147, 2152, 2160, 2164, 2169, 2174, - 2179, 2184, 2189, 2194, 2199, 2204, 2209, 2215, 2222, 2229, - 2239, 2243, 2251, 2255, 2259, 2263, 2267, 2283, 2299, 2308, - 2312, 2322, 2329, 2340, 2344, 2352, 2356, 2360, 2364, 2368, - 2384, 2400, 2418, 2427, 2431, 2441, 2448, 2452, 2460, 2464, - 2480, 2496, 2505, 2515, 2522, 2526, 2534, 2538, 2543, 2547, - 2555, 2556, 2557, 2558, 2563, 2562, 2587, 2586, 2616, 2617, - 2624, 2625, 2629, 2630, 2634, 2638, 2642, 2646, 2650, 2654, - 2658, 2662, 2666, 2670, 2677, 2685, 2689, 2693, 2698, 2706, - 2710, 2717, 2718, 2723, 2730, 2731, 2736, 2744, 2748, 2752, - 2759, 2763, 2767, 2775, 2774, 2797, 2796, 2819, 2820, 2824, - 2830, 2837, 2846, 2847, 2848, 2852, 2856, 2860, 2864, 2868, - 2872, 2877, 2882, 2887, 2892, 2896, 2901, 2910, 2915, 2923, - 2927, 2931, 2939, 2949, 2949, 2959, 2960, 2964, 2965, 2966, - 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2975, - 2975, 2976, 2976, 2976, 2976, 2977, 2977, 2977, 2977, 2977, - 2978, 2978, 2978, 2979, 2979, 2979, 2979, 2979, 2980, 2980, - 2980, 2980, 2980, 2981, 2981, 2982, 2982, 2982, 2982, 2982, - 2983, 2983, 2983, 2983, 2983, 2984, 2984, 2984, 2984, 2985, - 2985, 2985, 2985, 2985, 2986, 2986, 2986, 2986, 2986, 2987, - 2987, 2987, 2987, 2987, 2987, 2988, 2988, 2988, 2988, 2988, - 2989, 2989, 2989, 2989, 2990, 2990, 2990, 2990, 2991, 2991, - 2991, 2991, 2991, 2992, 2992, 2992, 2992, 2993, 2993, 2993, - 2993, 2993, 2994, 2994, 2994, 2994, 2995, 2995, 2995, 2995, - 2995, 2996, 2996, 2999, 2999, 2999, 2999, 2999, 2999, 2999, - 2999, 2999, 2999, 2999, 3000, 3000, 3000, 3000, 3000, 3000, - 3000, 3000, 3000, 3000, 3001, 3001, 3005, 3009, 3016, 3020, - 3027, 3031, 3038, 3042, 3046, 3050, 3054, 3058, 3062, 3066, - 3078, 3082, 3086, 3090, 3094, 3098, 3102, 3106, 3110, 3114, - 3118, 3122, 3126, 3130, 3134, 3138, 3142, 3146, 3150, 3154, - 3158, 3162, 3166, 3170, 3174, 3178, 3182, 3186, 3190, 3194, - 3198, 3206, 3210, 3214, 3218, 3222, 3226, 3230, 3240, 3250, - 3256, 3262, 3268, 3274, 3280, 3286, 3293, 3300, 3307, 3314, - 3320, 3326, 3330, 3342, 3346, 3350, 3354, 3358, 3369, 3380, - 3384, 3388, 3392, 3396, 3400, 3404, 3408, 3412, 3416, 3420, - 3424, 3428, 3432, 3436, 3440, 3444, 3448, 3452, 3456, 3460, - 3464, 3468, 3472, 3476, 3480, 3484, 3488, 3492, 3496, 3500, - 3507, 3511, 3515, 3519, 3523, 3527, 3531, 3535, 3539, 3545, - 3551, 3555, 3561, 3568, 3572, 3576, 3580, 3584, 3588, 3592, - 3596, 3600, 3604, 3608, 3612, 3616, 3620, 3624, 3628, 3632, - 3646, 3650, 3654, 3658, 3662, 3666, 3670, 3674, 3686, 3690, - 3694, 3698, 3702, 3713, 3724, 3728, 3732, 3736, 3740, 3744, - 3748, 3752, 3756, 3760, 3764, 3768, 3772, 3776, 3780, 3784, - 3788, 3792, 3796, 3800, 3804, 3808, 3812, 3816, 3820, 3824, - 3828, 3832, 3836, 3840, 3847, 3851, 3855, 3859, 3863, 3867, - 3871, 3875, 3879, 3885, 3891, 3899, 3903, 3907, 3911, 3918, - 3928, 3934, 3940, 3950, 3962, 3970, 3974, 4004, 4008, 4012, - 4016, 4020, 4024, 4030, 4034, 4038, 4042, 4053, 4057, 4061, - 4065, 4073, 4077, 4081, 4087, 4098 + 900, 901, 902, 907, 906, 922, 932, 931, 948, 956, + 964, 975, 991, 990, 1005, 1020, 1029, 1044, 1043, 1068, + 1067, 1095, 1094, 1125, 1124, 1143, 1142, 1163, 1162, 1194, + 1193, 1219, 1232, 1236, 1240, 1244, 1257, 1261, 1265, 1269, + 1273, 1278, 1283, 1287, 1291, 1295, 1302, 1306, 1310, 1314, + 1318, 1322, 1326, 1330, 1334, 1338, 1342, 1346, 1350, 1354, + 1358, 1362, 1366, 1370, 1374, 1378, 1382, 1386, 1390, 1394, + 1398, 1402, 1406, 1410, 1414, 1418, 1422, 1426, 1430, 1434, + 1438, 1442, 1446, 1450, 1454, 1461, 1462, 1463, 1467, 1469, + 1468, 1476, 1477, 1481, 1482, 1486, 1492, 1501, 1502, 1506, + 1510, 1514, 1518, 1524, 1530, 1536, 1543, 1548, 1557, 1561, + 1566, 1574, 1586, 1590, 1604, 1619, 1624, 1629, 1634, 1639, + 1644, 1649, 1654, 1660, 1659, 1690, 1700, 1710, 1714, 1718, + 1727, 1731, 1736, 1740, 1745, 1753, 1758, 1766, 1770, 1775, + 1779, 1784, 1792, 1797, 1805, 1809, 1816, 1820, 1827, 1831, + 1835, 1839, 1843, 1850, 1854, 1858, 1862, 1866, 1870, 1877, + 1878, 1879, 1883, 1886, 1887, 1888, 1892, 1897, 1903, 1909, + 1914, 1920, 1926, 1930, 1941, 1945, 1955, 1959, 1963, 1968, + 1973, 1978, 1983, 1988, 1993, 2001, 2005, 2009, 2014, 2019, + 2024, 2029, 2034, 2039, 2044, 2050, 2058, 2063, 2068, 2073, + 2078, 2083, 2088, 2093, 2098, 2103, 2109, 2117, 2121, 2126, + 2131, 2136, 2141, 2146, 2151, 2156, 2161, 2169, 2173, 2178, + 2183, 2188, 2193, 2198, 2203, 2208, 2213, 2218, 2224, 2231, + 2238, 2248, 2252, 2260, 2264, 2268, 2272, 2276, 2292, 2308, + 2317, 2321, 2331, 2338, 2349, 2353, 2361, 2365, 2369, 2373, + 2377, 2393, 2409, 2427, 2436, 2440, 2450, 2457, 2461, 2469, + 2473, 2489, 2505, 2514, 2524, 2531, 2535, 2543, 2547, 2552, + 2556, 2564, 2565, 2566, 2567, 2572, 2571, 2596, 2595, 2625, + 2626, 2633, 2634, 2638, 2639, 2643, 2647, 2651, 2655, 2659, + 2663, 2667, 2671, 2675, 2679, 2686, 2694, 2698, 2702, 2707, + 2715, 2719, 2726, 2727, 2732, 2739, 2740, 2745, 2753, 2757, + 2761, 2768, 2772, 2776, 2784, 2783, 2806, 2805, 2828, 2829, + 2833, 2839, 2846, 2855, 2856, 2857, 2861, 2865, 2869, 2873, + 2877, 2881, 2886, 2891, 2896, 2901, 2905, 2910, 2919, 2924, + 2932, 2936, 2940, 2948, 2958, 2958, 2968, 2969, 2973, 2974, + 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, + 2984, 2984, 2985, 2985, 2985, 2985, 2986, 2986, 2986, 2986, + 2986, 2987, 2987, 2987, 2988, 2988, 2988, 2988, 2988, 2989, + 2989, 2989, 2989, 2989, 2990, 2990, 2991, 2991, 2991, 2991, + 2991, 2992, 2992, 2992, 2992, 2992, 2993, 2993, 2993, 2993, + 2994, 2994, 2994, 2994, 2994, 2995, 2995, 2995, 2995, 2995, + 2996, 2996, 2996, 2996, 2996, 2996, 2997, 2997, 2997, 2997, + 2997, 2998, 2998, 2998, 2998, 2999, 2999, 2999, 2999, 3000, + 3000, 3000, 3000, 3000, 3001, 3001, 3001, 3001, 3002, 3002, + 3002, 3002, 3002, 3003, 3003, 3003, 3003, 3004, 3004, 3004, + 3004, 3004, 3005, 3005, 3008, 3008, 3008, 3008, 3008, 3008, + 3008, 3008, 3008, 3008, 3008, 3009, 3009, 3009, 3009, 3009, + 3009, 3009, 3009, 3009, 3009, 3010, 3010, 3014, 3018, 3025, + 3029, 3036, 3040, 3047, 3051, 3055, 3059, 3063, 3067, 3071, + 3075, 3087, 3091, 3095, 3099, 3103, 3107, 3111, 3115, 3119, + 3123, 3127, 3131, 3135, 3139, 3143, 3147, 3151, 3155, 3159, + 3163, 3167, 3171, 3175, 3179, 3183, 3187, 3191, 3195, 3199, + 3203, 3207, 3215, 3219, 3223, 3227, 3231, 3235, 3239, 3249, + 3259, 3265, 3271, 3277, 3283, 3289, 3295, 3302, 3309, 3316, + 3323, 3329, 3335, 3339, 3351, 3355, 3359, 3363, 3367, 3378, + 3389, 3393, 3397, 3401, 3405, 3409, 3413, 3417, 3421, 3425, + 3429, 3433, 3437, 3441, 3445, 3449, 3453, 3457, 3461, 3465, + 3469, 3473, 3477, 3481, 3485, 3489, 3493, 3497, 3501, 3505, + 3509, 3516, 3520, 3524, 3528, 3532, 3536, 3540, 3544, 3548, + 3554, 3560, 3564, 3570, 3577, 3581, 3585, 3589, 3593, 3597, + 3601, 3605, 3609, 3613, 3617, 3621, 3625, 3629, 3633, 3637, + 3641, 3655, 3659, 3663, 3667, 3671, 3675, 3679, 3683, 3695, + 3699, 3703, 3707, 3711, 3722, 3733, 3737, 3741, 3745, 3749, + 3753, 3757, 3761, 3765, 3769, 3773, 3777, 3781, 3785, 3789, + 3793, 3797, 3801, 3805, 3809, 3813, 3817, 3821, 3825, 3829, + 3833, 3837, 3841, 3845, 3849, 3856, 3860, 3864, 3868, 3872, + 3876, 3880, 3884, 3888, 3894, 3900, 3908, 3912, 3916, 3920, + 3927, 3937, 3943, 3949, 3959, 3971, 3979, 3983, 4013, 4017, + 4021, 4025, 4029, 4033, 4039, 4043, 4047, 4051, 4062, 4066, + 4070, 4074, 4082, 4086, 4090, 4096, 4107 }; #endif @@ -1048,14 +1048,14 @@ static const char *const yytname[] = "constructor_inits", "constructor_init", "extern_c", "$@1", "declaration", "friend_declaration", "$@2", "storage_class", "attribute_specifiers", "attribute_specifier", "type_like_declaration", - "$@3", "multiple_instance_identifiers", "typedef_declaration", "$@4", - "typedef_instance_identifiers", "constructor_prototype", "$@5", "$@6", - "function_prototype", "$@7", "$@8", "$@9", "$@10", "$@11", + "$@3", "$@4", "multiple_instance_identifiers", "typedef_declaration", + "$@5", "typedef_instance_identifiers", "constructor_prototype", "$@6", + "$@7", "function_prototype", "$@8", "$@9", "$@10", "$@11", "$@12", "function_post", "function_operator", "more_template_declaration", - "template_declaration", "$@12", "template_formal_parameters", + "template_declaration", "$@13", "template_formal_parameters", "template_nonempty_formal_parameters", "typename_keyword", "template_formal_parameter", "template_formal_parameter_type", - "instance_identifier", "$@13", + "instance_identifier", "$@14", "instance_identifier_and_maybe_trailing_return_type", "maybe_trailing_return_type", "function_parameter_list", "function_parameters", "formal_parameter_list", "formal_parameters", @@ -1067,12 +1067,12 @@ static const char *const yytname[] = "parameter_pack_identifier", "not_paren_empty_instance_identifier", "empty_instance_identifier", "type", "type_pack", "type_decl", "predefined_type", "var_type_decl", "full_type", "struct_attributes", - "anonymous_struct", "$@14", "named_struct", "$@15", "maybe_final", + "anonymous_struct", "$@15", "named_struct", "$@16", "maybe_final", "maybe_class_derivation", "class_derivation", "base_specification", "enum", "enum_decl", "enum_element_type", "enum_body_trailing_comma", "enum_body", "enum_keyword", "struct_keyword", "namespace_declaration", - "$@16", "$@17", "using_declaration", "simple_type", "simple_int_type", - "simple_float_type", "simple_void_type", "code", "$@18", "code_block", + "$@17", "$@18", "using_declaration", "simple_type", "simple_int_type", + "simple_float_type", "simple_void_type", "code", "$@19", "code_block", "element", "optional_const_expr", "optional_const_expr_comma", "const_expr_comma", "no_angle_bracket_const_expr", "const_expr", "const_operand", "formal_const_expr", "formal_const_operand", @@ -1106,12 +1106,12 @@ static const yytype_uint16 yytoknum[] = }; # endif -#define YYPACT_NINF -922 +#define YYPACT_NINF -913 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-922))) + (!!((Yystate) == (-913))) -#define YYTABLE_NINF -751 +#define YYTABLE_NINF -752 #define yytable_value_is_error(Yytable_value) \ 0 @@ -1120,160 +1120,160 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 135, -922, 3702, 5708, 37, 4828, -922, -922, -922, -922, - -922, -922, -922, -922, -125, -122, -95, -89, -85, -71, - -59, -41, -50, -922, -922, -38, 12, 28, 42, 55, - 75, 78, 130, 156, 185, 194, 203, 217, 224, 252, - 287, 294, 296, 303, 6019, -922, -922, -37, 307, 311, - 14, -20, -922, 313, 326, 332, 3702, 3702, 3702, 3702, - 3702, 1776, 1058, 3702, 4709, -922, 77, -922, -922, -922, - -922, -922, -922, -922, -922, 5818, 336, -922, -23, -922, - -922, 4057, 4449, 4449, -922, 3303, 344, -922, 4449, -922, - -922, 59, 59, -922, -922, -922, -922, 20, 48, -922, - -922, -922, -922, -922, -922, 468, 345, -922, 6767, 6767, - 6767, -922, 6767, 5186, 6767, 39, -922, 6758, 347, 348, - 352, 354, 6767, 1630, 52, 100, 186, 6767, 6767, 359, - 6638, 6767, 6767, 5704, 6767, 6767, -922, -922, -922, -922, - 4196, -922, -922, -922, -922, -922, 3702, 3702, 5708, 3702, - 3702, 3702, 3702, 5708, 3702, 5708, 3702, 5708, 3702, 5708, - 5708, 5708, 5708, 5708, 5708, 5708, 5708, 5708, 5708, 5708, - 5708, 5708, 5708, 5708, 3702, -922, -922, 362, 3303, 370, - 373, 3303, -922, -922, 5708, 3702, 3702, 374, 5304, 5708, - 1776, 3702, 3702, 51, 51, 51, 51, 51, -125, -95, - -89, -85, -71, -41, -38, 28, 4337, 4997, 5357, 5612, - 332, 87, -103, 4709, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, 3303, 3303, -98, 191, -922, - -922, 51, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, - 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, - 3702, 3702, 3702, 2764, 3702, -922, -922, 59, 59, 2898, - -922, -922, -922, 4449, -922, -922, -922, -922, 5708, -922, - 262, 257, 162, 59, 59, 162, 162, 4941, 188, -922, - 367, -922, -922, -922, -922, -922, -922, 4431, 278, 5129, - -922, 3303, 491, 395, 379, 2486, 5213, 6767, -922, -922, - -922, -922, 6767, -922, -922, -922, -922, 6730, 2901, -922, - 3303, 3303, 3303, 3303, -922, -922, 402, -922, -922, -922, - -922, -922, 3702, -922, 4289, -922, 397, -922, 4375, -922, - 3303, 216, -922, -922, 385, 387, -922, 392, 5904, 3303, - 407, -922, 3303, -21, 324, 425, -922, -922, -922, -922, - 1115, -922, -922, 408, 427, -922, 412, 418, 428, 429, - 432, 433, 423, 434, 437, 441, 443, 444, 449, 456, - 462, -69, 482, 464, 467, 469, 470, 472, 473, 479, - 481, 483, 485, 492, 3702, -922, 5708, 3702, -922, 5260, - 501, 493, 494, 3303, 508, 509, 528, 520, 4060, 522, - 523, 3702, 3702, -922, 633, -922, 1031, 532, 3702, -922, - -922, 4026, 4994, 507, 507, 569, 569, 405, 405, -922, - 3054, 1798, 1271, 1600, 569, 569, 683, 683, 51, 51, - 51, -922, -922, -46, 2253, -922, -922, 533, 4444, 534, - 162, 536, 545, 3303, 162, 162, 162, 162, 162, 541, - -922, 188, -922, 188, -922, 541, 541, -922, 162, 468, - 5794, 5679, 162, 162, 543, 7, -922, 442, 396, -922, - 3702, 3303, 546, -922, -922, -922, -922, 4431, -12, -8, - 10, 468, 548, 71, -922, -922, -922, 561, 6767, 468, - 1917, -125, 549, 4501, -922, -922, -922, 578, 588, 590, - 591, 598, 6134, -922, 3855, 5453, 353, 582, 324, -922, - -922, 577, -922, 5708, -922, 21, 3032, 6043, 1099, -922, - 5708, -922, 583, -922, -922, 3303, 66, -922, -922, -922, - 2625, -922, -922, 413, -922, 599, 5129, -922, -922, -922, - -922, -922, -922, -922, 585, -922, 602, -922, -922, -922, - -922, 5708, -922, 5708, -922, 5708, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, 4522, 611, 612, - -922, 606, -922, -922, 614, -922, -922, 618, -922, -922, - -922, -922, 51, 4709, -922, 3303, 191, 5559, 1592, -922, - 4709, 3702, -922, -922, -922, -922, -922, 541, 162, -922, - 541, 541, 541, 541, 541, 3702, 63, 706, 5818, 442, - 396, -922, 98, 120, -922, -922, 5588, 625, 442, 442, - 442, 442, 442, 442, -70, -922, -922, 627, 3303, 396, - 396, 396, 396, 396, 396, -33, 623, 4709, -922, -58, - -922, 641, 747, 2486, -922, 720, 468, -922, -922, -922, - -922, -922, -922, -922, -922, 635, 647, 650, -922, -922, - 6019, -922, -922, 651, 38, 654, -922, 646, 3702, 3702, - 3702, 3702, 1776, 3702, 645, 25, -922, -922, 4763, -922, - 77, -922, 6767, 6767, 6206, -922, 803, 805, 806, 818, - -922, -922, 376, 682, -922, -922, -922, -922, 5521, -922, - 676, 688, 3169, -922, 1035, -922, -922, 21, -922, 413, - -922, 690, 5559, 680, 413, 5559, 679, 4540, 1099, 692, - 1099, 1099, 1099, 1099, 1099, 167, -922, -922, 686, 6278, - -922, 689, -922, 290, -922, -113, 701, 705, 691, 707, - 711, 3166, 3322, 708, 413, 413, 4129, 413, 413, 413, - 413, -922, 61, 411, -922, 4431, -922, 3702, 3702, 699, - 702, 703, -922, -922, -922, 3702, -922, 3702, -922, 709, - -922, 5933, 468, -922, -922, -922, -922, -922, -922, 712, - -922, -922, 725, -922, 4709, 541, 704, 715, 5679, 442, - 396, -70, -33, 729, 732, 1592, -922, -922, 442, 740, - 740, 740, 740, 740, 298, 3702, -922, 396, -922, 742, - 742, 742, 742, 742, 321, 3702, -922, 743, -922, 3702, - -922, 731, 4558, 6350, -922, 760, -922, -922, 5708, 5708, - 5708, 746, 5708, 749, 5333, 5708, 1776, 51, 51, 51, - 51, 750, -26, 51, -922, -922, 3836, 3702, 3702, 3702, - 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, - 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3300, 3702, - -922, -922, -922, -922, -14, 768, 771, 772, 6422, 17, - -922, 1035, 6647, 5453, 3303, 767, 763, 1035, 1035, 1035, - 1035, 1035, 1035, 85, 742, -922, 411, -922, 757, 413, - 209, 758, -922, -922, 329, 1099, 775, 775, 775, 775, - 775, -922, 3702, -922, -922, 5559, -922, 2319, -922, -922, - 3303, 3702, 3702, -922, -922, -922, -922, -922, 3166, 761, - 789, 4709, -922, -922, 413, 341, 341, 927, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, 776, 774, -922, -922, 341, 341, - 341, 267, 937, -922, 3702, -922, 2625, 797, -922, 641, - 58, 89, -922, -922, -922, 93, 94, -922, 6019, 59, - 898, 132, -922, -922, 5559, -922, -70, -33, -922, -922, - 5559, 5559, -922, 740, 783, 802, 742, 808, 804, 3590, - -922, -922, -922, 3919, 828, 829, -922, 812, 826, 831, - 3702, 832, 3303, 823, 825, 836, 827, 4595, 3702, -922, - -922, -922, 4026, 4994, 507, 507, 569, 569, 405, 405, - -922, 4613, 1798, 1271, 1600, 569, 569, 683, 683, 51, - 51, 51, -922, -922, 96, 2505, 6494, 984, 847, 987, - 990, 992, -922, 856, 85, 742, -922, -922, -922, -922, - -922, -922, 5708, 1035, 3975, -922, -922, 860, -922, -922, - 276, 844, -922, -922, 775, 5559, 843, 848, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, -922, -922, - -922, -922, -922, -922, -922, -922, -922, -922, 846, -922, - 850, 849, 851, -922, 3434, 341, -922, -922, -922, -922, - -922, 1917, 855, 3322, 413, -922, -922, -922, -922, 1592, - 59, -922, -922, -922, 2, 858, 861, -922, -922, 865, - 866, 5559, -922, 5559, -922, -922, 5778, 6003, 6052, 3303, - 368, -922, -922, 1011, -922, 3919, -922, 869, 872, 871, - 876, 878, -922, -922, 887, -922, -922, 51, 3702, -922, - -922, -922, 99, -922, 104, 895, 145, -922, -922, -922, - 899, 919, 920, 921, 40, 923, 3975, 3975, 3975, 3975, - 3975, 1776, 3975, 4211, -922, 413, 2679, 915, -922, 2679, - 5559, 914, -922, -922, 2094, -922, -922, 1066, -922, 3166, - 4709, 917, -922, -922, 938, -922, 926, -922, -922, -922, - -922, -922, 932, 933, 4191, -922, 4191, -922, 4191, -922, - -922, 4191, 4191, 4191, -922, 6566, -922, 3702, 3702, -922, - 3702, -922, 3702, 4709, 1075, 939, 1076, 941, 953, 1092, - 955, 5708, 5708, 5708, 5708, 940, 5424, 5708, 67, 67, - 67, 67, 67, 947, 149, 67, 3975, 3975, 3975, 3975, - 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, - 3975, 3975, 3975, 3975, 3975, 3568, 3702, -922, -922, 5559, - 948, -922, 2679, -922, -922, 954, -922, -922, -922, 1592, - 1592, 1592, -922, -922, -922, -922, -922, -922, -922, -922, - -922, 153, 171, 177, 181, 949, -922, 958, -922, -922, - 189, -922, 957, 950, 964, 972, 3303, 970, 971, 982, - 3975, -922, 4820, 5010, 1350, 1350, 604, 604, 662, 662, - -922, 1203, 5026, 5050, 5066, 770, 770, 67, 67, 67, - -922, -922, 193, 2782, 5559, 973, -922, 2679, -922, 2679, - 974, -922, -922, -922, 2679, 2679, -922, -922, -922, -922, - 994, 1130, 1135, 1000, -922, 985, 986, 988, 989, -922, - -922, 993, 67, 3975, -922, -922, 995, -922, 2679, -922, - -922, 996, 998, -922, 3702, 3702, 3702, -922, 3702, 4211, - -922, 1592, 1006, 1008, 205, 210, 214, 263, 1592, -922, - -922, -922, -922, -922, -922, -922, -922 + 152, -913, 3620, 5734, 47, 4886, -913, -913, -913, -913, + -913, -913, -913, -913, 85, -45, -38, 3, 36, 41, + -72, 45, 71, -913, -913, 58, 99, 122, 125, 127, + 134, 144, 169, 178, 187, 189, 195, 200, 204, 207, + 214, 218, 221, 223, 5219, -913, -913, 93, 225, 240, + 30, 244, -913, 243, 253, 255, 3620, 3620, 3620, 3620, + 3620, 1760, 474, 3620, 4671, -913, 150, -913, -913, -913, + -913, -913, -913, -913, -913, 5844, 262, -913, 27, -913, + -913, 4115, 4506, 4506, -913, 3087, 266, -913, 4506, -913, + -913, 403, 403, -913, -913, -913, -913, 123, 105, -913, + -913, -913, -913, -913, -913, 4249, 268, -913, 6810, 6810, + 6810, -913, 6810, 5208, 6810, -40, -913, 6801, 310, 316, + 323, 327, 6810, 1955, 347, 349, 350, 6810, 6810, 336, + 6637, 6810, 6810, 1562, 6810, 6810, -913, -913, -913, -913, + 4254, -913, -913, -913, -913, -913, 3620, 3620, 5734, 3620, + 3620, 3620, 3620, 5734, 3620, 5734, 3620, 5734, 3620, 5734, + 5734, 5734, 5734, 5734, 5734, 5734, 5734, 5734, 5734, 5734, + 5734, 5734, 5734, 5734, 3620, -913, -913, 337, 3087, 339, + 341, 3087, -913, -913, 5734, 3620, 3620, 342, 5330, 5734, + 1760, 3620, 3620, 80, 80, 80, 80, 80, 85, -38, + 3, 36, 41, 45, 58, 122, 6587, 5383, 5831, 5990, + 255, 163, -81, 4671, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, 3087, 3087, -92, 363, -913, + -913, 80, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, + 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, + 3620, 3620, 3620, 2682, 3620, -913, -913, 403, 403, 2816, + -913, -913, -913, 4506, -913, -913, -913, -913, 5734, -913, + 355, 1016, 343, 403, 403, 343, 343, 4999, 351, -913, + 353, -913, -913, -913, -913, -913, -913, 1292, 359, 5187, + -913, 3087, 467, 372, 364, 2409, 5245, 6810, -913, -913, + -913, -913, 6810, -913, -913, -913, -913, 6729, 2685, -913, + 3087, 3087, 3087, 3087, -913, -913, 376, -913, -913, -913, + -913, -913, 3620, -913, 4347, -913, 368, -913, 4433, -913, + 3087, 135, -913, -913, -10, 366, -913, 369, 5930, 3087, + 370, -913, 3087, -913, 180, 379, -913, -913, -913, -913, + 1828, -913, -913, 375, 388, -913, 378, 380, 381, 382, + 386, 387, 402, 394, 405, 398, 399, 400, 407, 421, + 408, -73, 422, 410, 411, 412, 413, 418, 419, 424, + 425, 429, 433, 435, 3620, -913, 5734, 3620, -913, 5730, + 415, 436, 440, 3087, 441, 444, 455, 456, 4118, 457, + 459, 3620, 3620, -913, 530, -913, 1232, 465, 3620, -913, + -913, 1430, 1843, 960, 960, 878, 878, 277, 277, -913, + 2972, 4083, 4884, 2005, 878, 878, 142, 142, 80, 80, + 80, -913, -913, -59, 1639, -913, -913, 466, 4502, 468, + 343, 470, 462, 3087, 343, 343, 343, 343, 343, 471, + -913, 351, -913, 351, -913, 471, 471, -913, 343, 4249, + 5820, 5705, 343, 343, 472, 18, -913, 1096, 416, -913, + 3620, 3087, 477, -913, -913, -913, -913, 1292, -46, -44, + -28, 4249, 473, -12, -913, -913, -913, 496, 6810, 4249, + 3754, 85, 480, 4559, -913, -913, -913, 503, 504, 505, + 506, 509, 6122, -913, 3773, 5479, 188, 486, 180, -913, + -913, 511, -913, 5734, -913, 15, 2950, 6045, 662, -913, + 5734, -913, 493, 175, -913, -913, 2548, -913, -913, 1043, + -913, 512, 5187, -913, -913, -913, -913, -913, -913, -913, + 507, -913, 513, -913, -913, -913, -913, 5734, -913, 5734, + -913, 5734, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, 4580, 494, 501, -913, 514, -913, -913, + 516, -913, -913, 519, -913, -913, -913, -913, 80, 4671, + -913, 3087, 363, 5585, 4402, -913, 4671, 3620, -913, -913, + -913, -913, -913, 471, 343, -913, 471, 471, 471, 471, + 471, 3620, 174, 621, 5844, 1096, 416, -913, 210, 226, + -913, -913, 5614, 525, 1096, 1096, 1096, 1096, 1096, 1096, + -68, -913, -913, 526, 3087, 416, 416, 416, 416, 416, + 416, -66, 518, 4671, -913, 19, -913, 543, 642, 2409, + -913, 615, 4249, -913, -913, -913, -913, -913, -913, -913, + -913, 533, 546, 548, -913, -913, 5219, -913, -913, 549, + 34, 551, -913, 534, 3620, 3620, 3620, 3620, 1760, 3620, + 542, 29, -913, -913, 4767, -913, 150, -913, 6810, 6810, + 6194, -913, 702, 714, 715, 717, -913, -913, 162, 580, + -913, -913, -913, -913, 5547, -913, 573, 587, 2953, -913, + 1270, -913, -913, 15, -913, 1043, -913, 589, 5585, 579, + 1043, 5585, 574, 4598, 662, 583, 662, 662, 662, 662, + 662, -34, -913, -913, 577, 6266, -913, -913, -913, 3087, + 357, -913, 572, -913, 596, 597, 3084, 3240, 591, 1043, + 1043, 4187, 1043, 1043, 1043, 1043, -913, 54, 233, -913, + 1292, -913, 3620, 3620, 582, 598, 599, -913, -913, -913, + 3620, -913, 3620, -913, 603, -913, 5959, 4249, -913, -913, + -913, -913, -913, -913, 593, -913, -913, 609, -913, 4671, + 471, 601, 607, 5705, 1096, 416, -68, -66, 612, 613, + 4402, -913, -913, 1096, 608, 608, 608, 608, 608, 288, + 3620, -913, 416, -913, 614, 614, 614, 614, 614, 299, + 3620, -913, 617, -913, 3620, -913, 618, 4616, 6338, -913, + 629, -913, -913, 5734, 5734, 5734, 623, 5734, 624, 5359, + 5734, 1760, 80, 80, 80, 80, 625, -58, 80, -913, + -913, 3894, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, + 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, + 3620, 3620, 3620, 3218, 3620, -913, -913, -913, -913, -55, + 646, 649, 651, 6410, 35, -913, 1270, 6689, 5479, 3087, + 650, 647, 1270, 1270, 1270, 1270, 1270, 1270, -30, 614, + -913, 233, -913, 635, 1043, 236, 639, -913, -913, 303, + 662, 643, 643, 643, 643, 643, -913, 3620, -913, -913, + 5585, 640, 331, -913, 116, 663, 664, -913, 2242, -913, + -913, -913, 3084, 648, 667, 4671, -913, -913, 1043, 329, + 329, 807, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, 673, 675, + -913, -913, 329, 329, 329, 286, 838, -913, 3620, -913, + 2548, 704, -913, 543, -41, -37, -913, -913, -913, -33, + -25, -913, 5219, 403, 802, 84, -913, -913, 5585, -913, + -68, -66, -913, -913, 5585, 5585, -913, 608, 688, 690, + 614, 696, 692, 3508, -913, -913, -913, 3955, 718, 716, + -913, 700, 712, 713, 3620, 720, 3087, 705, 706, 721, + 707, 4653, 3620, -913, -913, -913, 1430, 1843, 960, 960, + 878, 878, 277, 277, -913, 3828, 4083, 4884, 2005, 878, + 878, 142, 142, 80, 80, 80, -913, -913, -24, 1890, + 6482, 860, 730, 870, 881, 882, -913, 746, -30, 614, + -913, -913, -913, -913, -913, -913, 5734, 1270, 4033, -913, + -913, 748, -913, -913, 294, 732, -913, -913, 643, 5585, + 729, 736, -913, -913, 3087, 3620, 3620, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, + -913, -913, -913, -913, -913, -913, -913, -913, -913, 737, + -913, 3352, 329, -913, -913, -913, -913, -913, 3754, 739, + 3240, 1043, -913, -913, -913, -913, 4402, 403, -913, -913, + -913, 20, 743, 749, -913, -913, 750, 751, 5585, -913, + 5585, -913, -913, 5069, 5804, 6029, 3087, 358, -913, -913, + 888, -913, 3955, -913, 754, 755, 756, 759, 758, -913, + -913, 762, -913, -913, 80, 3620, -913, -913, -913, -23, + -913, -3, 761, 66, -913, -913, -913, 765, 757, 775, + 776, 43, 777, 4033, 4033, 4033, 4033, 4033, 1760, 4033, + 4821, -913, 1043, 734, 770, -913, 734, 5585, 797, -913, + -913, 798, -913, 800, 803, 2075, -913, 3084, 4671, 805, + -913, -913, 818, -913, 806, -913, -913, -913, -913, -913, + 809, 810, 4428, -913, 4428, -913, 4428, -913, -913, 4428, + 4428, 4428, -913, 6554, -913, 3620, 3620, -913, 3620, -913, + 3620, 4671, 958, 825, 975, 843, 848, 976, 853, 5734, + 5734, 5734, 5734, 830, 5450, 5734, 114, 114, 114, 114, + 114, 836, 67, 114, 4033, 4033, 4033, 4033, 4033, 4033, + 4033, 4033, 4033, 4033, 4033, 4033, 4033, 4033, 4033, 4033, + 4033, 4033, 4033, 3486, 3620, -913, -913, 5585, 842, -913, + 734, -913, -913, 997, -913, 847, -913, -913, -913, 4402, + 4402, 4402, -913, -913, -913, -913, -913, -913, -913, -913, + -913, 69, 76, 89, 100, 854, -913, 866, -913, -913, + 104, -913, 855, 868, 873, 874, 3087, 856, 865, 876, + 4033, -913, 2700, 5052, 1489, 1489, 1366, 1366, 1320, 1320, + -913, 4269, 5068, 5084, 1341, 846, 846, 114, 114, 114, + -913, -913, 143, 2428, 5585, 867, -913, 734, -913, -913, + 734, 877, -913, -913, -913, 734, 734, -913, -913, -913, + -913, 886, 1030, 1035, 898, -913, 884, 885, 893, 892, + -913, -913, 897, 114, 4033, -913, -913, 899, -913, 734, + -913, -913, 904, 905, -913, 3620, 3620, 3620, -913, 3620, + 4821, -913, 4402, 902, 915, 147, 153, 165, 171, 4402, + -913, -913, -913, -913, -913, -913, -913, -913 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1281,192 +1281,192 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 0, 755, 0, 0, 0, 755, 5, 644, 640, 643, - 751, 752, 646, 647, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 642, 648, 0, 0, 0, 0, 0, + 0, 756, 0, 0, 0, 756, 5, 645, 641, 644, + 752, 753, 647, 648, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 643, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 650, 649, 0, 0, 0, - 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 755, 0, 3, 581, 645, 291, 302, 301, - 385, 386, 388, 389, 370, 0, 0, 400, 367, 399, - 394, 391, 390, 393, 371, 0, 0, 372, 392, 402, - 387, 755, 755, 4, 293, 294, 295, 0, 356, 755, - 290, 382, 383, 384, 1, 0, 0, 21, 755, 755, - 755, 22, 755, 755, 755, 0, 38, 755, 0, 0, - 0, 0, 755, 0, 0, 0, 0, 755, 755, 0, - 755, 755, 755, 0, 755, 755, 6, 17, 7, 19, - 0, 15, 16, 18, 68, 40, 755, 755, 0, 755, - 755, 755, 755, 0, 755, 0, 755, 0, 755, 0, + 0, 0, 0, 0, 0, 651, 650, 0, 0, 0, + 0, 0, 642, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 756, 0, 3, 582, 646, 292, 303, 302, + 386, 387, 389, 390, 371, 0, 0, 401, 368, 400, + 395, 392, 391, 394, 372, 0, 0, 373, 393, 403, + 388, 756, 756, 4, 294, 295, 296, 0, 357, 756, + 291, 383, 384, 385, 1, 0, 0, 21, 756, 756, + 756, 22, 756, 756, 756, 0, 38, 756, 0, 0, + 0, 0, 756, 0, 0, 0, 0, 756, 756, 0, + 756, 756, 756, 0, 756, 756, 6, 17, 7, 19, + 0, 15, 16, 18, 69, 40, 756, 756, 0, 756, + 756, 756, 756, 0, 756, 0, 756, 0, 756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 755, 317, 323, 0, 0, 0, - 605, 0, 755, 316, 0, 755, 755, 0, 0, 0, - 0, 755, 755, 614, 612, 611, 613, 610, 291, 385, - 386, 388, 389, 400, 399, 394, 391, 390, 393, 392, - 387, 0, 0, 540, 737, 738, 739, 740, 743, 741, - 745, 744, 742, 746, 726, 727, 0, 0, 755, 732, - 725, 609, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 756, 318, 324, 0, 0, 0, + 606, 0, 756, 317, 0, 756, 756, 0, 0, 0, + 0, 756, 756, 615, 613, 612, 614, 611, 292, 386, + 387, 389, 390, 401, 400, 395, 392, 391, 394, 393, + 388, 0, 0, 541, 738, 739, 740, 741, 744, 742, + 746, 745, 743, 747, 727, 728, 0, 0, 756, 733, + 726, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 753, 754, 755, 755, 0, - 368, 369, 401, 391, 396, 395, 398, 292, 0, 397, - 0, 277, 755, 755, 755, 755, 755, 755, 0, 326, - 276, 328, 755, 747, 748, 749, 750, 0, 358, 0, - 330, 0, 0, 58, 60, 0, 755, 755, 52, 41, - 51, 53, 755, 42, 147, 47, 23, 755, 0, 45, - 0, 0, 0, 0, 50, 755, 0, 26, 25, 24, - 48, 44, 0, 151, 0, 150, 0, 54, 0, 20, - 0, 0, 46, 49, 325, 304, 315, 0, 0, 0, - 0, 13, 0, 0, 0, 324, 63, 306, 307, 308, - 356, 755, 303, 0, 539, 538, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 754, 755, 756, 756, 0, + 369, 370, 402, 392, 397, 396, 399, 293, 0, 398, + 0, 278, 756, 756, 756, 756, 756, 756, 0, 327, + 277, 329, 756, 748, 749, 750, 751, 0, 359, 0, + 331, 0, 0, 58, 60, 0, 756, 756, 52, 41, + 51, 53, 756, 42, 148, 47, 23, 756, 0, 45, + 0, 0, 0, 0, 50, 756, 0, 26, 25, 24, + 48, 44, 0, 152, 0, 151, 0, 54, 0, 20, + 0, 0, 46, 49, 326, 305, 316, 0, 0, 0, + 0, 13, 0, 66, 0, 325, 63, 307, 308, 309, + 357, 756, 304, 0, 540, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 318, 0, 755, 320, 0, + 0, 0, 0, 0, 0, 319, 0, 756, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 639, 730, 733, 0, 755, 0, 728, - 205, 623, 624, 625, 626, 627, 628, 631, 632, 638, - 0, 620, 621, 622, 629, 630, 618, 619, 615, 616, - 617, 637, 636, 0, 0, 327, 329, 0, 0, 0, - 755, 278, 0, 267, 755, 755, 755, 755, 755, 283, - 266, 0, 279, 0, 280, 282, 281, 190, 755, 0, - 0, 0, 755, 755, 0, 191, 194, 755, 0, 189, - 755, 364, 0, 361, 360, 355, 359, 0, 737, 738, - 739, 0, 0, 741, 334, 296, 336, 0, 755, 0, - 755, 304, 0, 0, 43, 39, 755, 0, 0, 0, - 0, 0, 755, 373, 0, 755, 325, 304, 0, 324, - 71, 0, 379, 0, 76, 78, 0, 0, 755, 305, - 0, 755, 0, 403, 207, 0, 0, 66, 403, 212, - 0, 67, 65, 0, 311, 358, 0, 588, 587, 604, - 594, 590, 592, 593, 0, 600, 0, 599, 653, 589, - 654, 0, 656, 0, 657, 0, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 596, 0, 0, 0, - 319, 0, 595, 598, 0, 602, 601, 0, 607, 608, - 597, 591, 582, 541, 731, 0, 755, 755, 755, 91, - 206, 0, 635, 634, 299, 298, 300, 284, 755, 268, - 273, 269, 270, 272, 271, 755, 0, 0, 0, 755, - 0, 231, 0, 0, 755, 193, 0, 0, 755, 755, - 755, 755, 755, 755, 755, 245, 244, 0, 255, 0, - 0, 0, 0, 0, 0, 755, 0, 537, 536, 365, - 354, 297, 0, 0, 755, 755, 0, 55, 59, 718, - 714, 717, 720, 721, 197, 0, 0, 0, 716, 722, - 0, 724, 723, 0, 0, 0, 715, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 233, 201, 234, 670, - 719, 196, 755, 755, 755, 375, 0, 0, 0, 0, - 377, 755, 0, 0, 168, 169, 170, 156, 0, 157, - 0, 153, 158, 154, 755, 167, 152, 0, 73, 0, - 381, 0, 755, 0, 0, 755, 0, 0, 755, 0, - 755, 755, 755, 755, 755, 0, 236, 235, 0, 755, - 80, 0, 755, 0, 8, 0, 0, 0, 0, 0, - 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 755, 755, 171, 0, 309, 0, 0, 0, - 0, 0, 321, 322, 606, 0, 603, 0, 729, 0, - 98, 0, 0, 92, 100, 95, 99, 94, 96, 0, - 93, 97, 0, 186, 633, 274, 0, 0, 0, 755, - 0, 755, 755, 0, 0, 755, 192, 195, 755, 250, - 246, 247, 249, 248, 0, 755, 225, 0, 256, 261, - 257, 258, 260, 259, 0, 755, 228, 285, 362, 0, - 331, 0, 0, 755, 339, 755, 338, 62, 0, 0, - 0, 680, 0, 0, 0, 0, 0, 688, 687, 686, - 685, 0, 0, 684, 61, 200, 0, 0, 0, 0, + 0, 0, 0, 640, 731, 734, 0, 756, 0, 729, + 206, 624, 625, 626, 627, 628, 629, 632, 633, 639, + 0, 621, 622, 623, 630, 631, 619, 620, 616, 617, + 618, 638, 637, 0, 0, 328, 330, 0, 0, 0, + 756, 279, 0, 268, 756, 756, 756, 756, 756, 284, + 267, 0, 280, 0, 281, 283, 282, 191, 756, 0, + 0, 0, 756, 756, 0, 192, 195, 756, 0, 190, + 756, 365, 0, 362, 361, 356, 360, 0, 738, 739, + 740, 0, 0, 742, 335, 297, 337, 0, 756, 0, + 756, 305, 0, 0, 43, 39, 756, 0, 0, 0, + 0, 0, 756, 374, 0, 756, 326, 305, 0, 325, + 72, 0, 380, 0, 77, 79, 0, 0, 756, 306, + 0, 756, 0, 0, 404, 213, 0, 68, 65, 0, + 312, 359, 0, 589, 588, 605, 595, 591, 593, 594, + 0, 601, 0, 600, 654, 590, 655, 0, 657, 0, + 658, 0, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 597, 0, 0, 0, 320, 0, 596, 599, + 0, 603, 602, 0, 608, 609, 598, 592, 583, 542, + 732, 0, 756, 756, 756, 92, 207, 0, 636, 635, + 300, 299, 301, 285, 756, 269, 274, 270, 271, 273, + 272, 756, 0, 0, 0, 756, 0, 232, 0, 0, + 756, 194, 0, 0, 756, 756, 756, 756, 756, 756, + 756, 246, 245, 0, 256, 0, 0, 0, 0, 0, + 0, 756, 0, 538, 537, 366, 355, 298, 0, 0, + 756, 756, 0, 55, 59, 719, 715, 718, 721, 722, + 198, 0, 0, 0, 717, 723, 0, 725, 724, 0, + 0, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 199, 234, 202, 235, 671, 720, 197, 756, 756, + 756, 376, 0, 0, 0, 0, 378, 756, 0, 0, + 169, 170, 171, 157, 0, 158, 0, 154, 159, 155, + 756, 168, 153, 0, 74, 0, 382, 0, 756, 0, + 0, 756, 0, 0, 756, 0, 756, 756, 756, 756, + 756, 0, 237, 236, 0, 756, 81, 404, 208, 0, + 0, 67, 0, 756, 0, 0, 756, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 64, 756, 756, 172, + 0, 310, 0, 0, 0, 0, 0, 322, 323, 607, + 0, 604, 0, 730, 0, 99, 0, 0, 93, 101, + 96, 100, 95, 97, 0, 94, 98, 0, 187, 634, + 275, 0, 0, 0, 756, 0, 756, 756, 0, 0, + 756, 193, 196, 756, 251, 247, 248, 250, 249, 0, + 756, 226, 0, 257, 262, 258, 259, 261, 260, 0, + 756, 229, 286, 363, 0, 332, 0, 0, 756, 340, + 756, 339, 62, 0, 0, 0, 681, 0, 0, 0, + 0, 0, 689, 688, 687, 686, 0, 0, 685, 61, + 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 57, 56, 378, 755, 0, 0, 0, 0, 755, 0, - 37, 755, 755, 0, 161, 159, 0, 755, 755, 755, - 755, 755, 755, 755, 165, 72, 755, 380, 0, 0, - 0, 0, 313, 312, 0, 755, 241, 237, 238, 240, - 239, 86, 755, 314, 14, 755, 208, 404, 405, 403, - 0, 755, 755, 210, 211, 213, 215, 216, 755, 0, - 219, 221, 218, 214, 0, 178, 174, 0, 115, 116, - 117, 118, 119, 120, 123, 124, 139, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 143, - 142, 126, 125, 112, 114, 113, 121, 122, 110, 111, - 107, 108, 109, 106, 0, 0, 105, 172, 175, 177, - 176, 0, 0, 182, 755, 184, 0, 0, 69, 310, - 0, 0, 655, 658, 659, 0, 0, 755, 0, 755, - 0, 0, 403, 275, 755, 232, 755, 755, 226, 229, - 755, 755, 286, 251, 254, 0, 262, 265, 0, 366, - 333, 332, 335, 0, 0, 341, 340, 0, 0, 0, - 755, 0, 0, 0, 0, 0, 0, 0, 0, 713, - 199, 202, 697, 698, 699, 700, 701, 702, 705, 706, - 712, 0, 694, 695, 696, 703, 704, 692, 693, 689, - 690, 691, 711, 710, 0, 0, 755, 0, 0, 0, - 0, 0, 374, 0, 755, 166, 146, 144, 149, 145, - 155, 162, 0, 755, 0, 163, 203, 0, 74, 755, - 0, 0, 755, 88, 242, 755, 0, 0, 407, 408, - 412, 409, 417, 410, 411, 413, 414, 415, 416, 418, + 0, 0, 0, 0, 0, 57, 56, 379, 756, 0, + 0, 0, 0, 756, 0, 37, 756, 756, 0, 162, + 160, 0, 756, 756, 756, 756, 756, 756, 756, 166, + 73, 756, 381, 0, 0, 0, 0, 314, 313, 0, + 756, 242, 238, 239, 241, 240, 87, 756, 315, 14, + 756, 0, 0, 8, 0, 0, 0, 214, 405, 406, + 216, 217, 756, 0, 220, 222, 219, 215, 0, 179, + 175, 0, 116, 117, 118, 119, 120, 121, 124, 125, + 140, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 144, 143, 127, 126, 113, 115, 114, + 122, 123, 111, 112, 108, 109, 110, 107, 0, 0, + 106, 173, 176, 178, 177, 0, 0, 183, 756, 185, + 0, 0, 70, 311, 0, 0, 656, 659, 660, 0, + 0, 756, 0, 756, 0, 0, 404, 276, 756, 233, + 756, 756, 227, 230, 756, 756, 287, 252, 255, 0, + 263, 266, 0, 367, 334, 333, 336, 0, 0, 342, + 341, 0, 0, 0, 756, 0, 0, 0, 0, 0, + 0, 0, 0, 714, 200, 203, 698, 699, 700, 701, + 702, 703, 706, 707, 713, 0, 695, 696, 697, 704, + 705, 693, 694, 690, 691, 692, 712, 711, 0, 0, + 756, 0, 0, 0, 0, 0, 375, 0, 756, 167, + 147, 145, 150, 146, 156, 163, 0, 756, 0, 164, + 204, 0, 75, 756, 0, 0, 756, 89, 243, 756, + 0, 0, 209, 404, 0, 756, 756, 211, 212, 408, + 409, 413, 410, 418, 411, 412, 414, 415, 416, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 485, 466, 467, + 459, 460, 461, 462, 463, 464, 465, 466, 486, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 486, 487, 488, + 478, 479, 480, 481, 482, 483, 484, 485, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 511, 512, 755, 529, 530, 531, 522, 534, - 518, 519, 517, 524, 525, 513, 514, 515, 516, 523, - 521, 528, 526, 532, 527, 520, 533, 406, 0, 9, - 0, 0, 0, 217, 220, 179, 173, 141, 140, 181, - 185, 755, 0, 206, 0, 585, 584, 586, 583, 755, - 755, 187, 104, 101, 0, 0, 0, 227, 230, 0, - 0, 755, 252, 755, 263, 363, 745, 0, 744, 0, - 0, 342, 344, 734, 755, 0, 679, 0, 0, 0, - 0, 0, 677, 676, 0, 682, 683, 671, 0, 709, - 708, 376, 0, 27, 0, 0, 0, 36, 164, 160, + 509, 510, 511, 512, 513, 756, 530, 531, 532, 523, + 535, 519, 520, 518, 525, 526, 514, 515, 516, 517, + 524, 522, 529, 527, 533, 528, 521, 534, 407, 0, + 218, 221, 180, 174, 142, 141, 182, 186, 756, 0, + 207, 0, 586, 585, 587, 584, 756, 756, 188, 105, + 102, 0, 0, 0, 228, 231, 0, 0, 756, 253, + 756, 264, 364, 746, 0, 745, 0, 0, 343, 345, + 735, 756, 0, 680, 0, 0, 0, 0, 0, 678, + 677, 0, 683, 684, 672, 0, 710, 709, 377, 0, + 27, 0, 0, 0, 36, 165, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 204, 542, 0, 77, 0, 82, 79, - 755, 0, 243, 755, 0, 209, 12, 10, 222, 755, - 223, 0, 180, 70, 0, 188, 0, 102, 651, 755, - 755, 755, 0, 0, 0, 347, 0, 346, 0, 345, - 735, 0, 0, 0, 736, 755, 343, 0, 0, 681, - 0, 678, 0, 707, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 557, 555, - 554, 556, 553, 0, 0, 552, 0, 0, 0, 0, + 205, 543, 0, 78, 0, 83, 80, 756, 0, 244, + 756, 0, 9, 0, 0, 0, 223, 756, 224, 0, + 181, 71, 0, 189, 0, 103, 652, 756, 756, 756, + 0, 0, 0, 348, 0, 347, 0, 346, 736, 0, + 0, 0, 737, 756, 344, 0, 0, 682, 0, 679, + 0, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 558, 556, 555, 557, + 554, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 75, 84, 755, - 0, 755, 81, 535, 11, 0, 755, 403, 103, 755, - 755, 755, 755, 755, 353, 352, 351, 350, 349, 348, - 337, 0, 0, 0, 0, 0, 28, 0, 33, 35, + 0, 0, 0, 0, 0, 76, 85, 756, 0, 756, + 82, 210, 12, 10, 536, 0, 756, 404, 104, 756, + 756, 756, 756, 756, 354, 353, 352, 351, 350, 349, + 338, 0, 0, 0, 0, 0, 28, 0, 33, 35, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 580, 566, 567, 568, 569, 570, 571, 572, 573, - 579, 0, 563, 564, 565, 561, 562, 558, 559, 560, - 578, 577, 0, 0, 755, 0, 755, 87, 224, 183, - 0, 289, 288, 287, 253, 264, 674, 673, 675, 672, - 0, 0, 0, 0, 551, 0, 0, 0, 0, 549, - 548, 0, 543, 0, 576, 575, 0, 755, 89, 652, - 29, 0, 0, 31, 0, 0, 0, 550, 0, 574, - 755, 755, 0, 0, 0, 0, 0, 0, 755, 83, - 34, 32, 546, 545, 547, 544, 85 + 0, 581, 567, 568, 569, 570, 571, 572, 573, 574, + 580, 0, 564, 565, 566, 562, 563, 559, 560, 561, + 579, 578, 0, 0, 756, 0, 756, 88, 11, 225, + 184, 0, 290, 289, 288, 254, 265, 675, 674, 676, + 673, 0, 0, 0, 0, 552, 0, 0, 0, 0, + 550, 549, 0, 544, 0, 577, 576, 0, 756, 90, + 653, 29, 0, 0, 31, 0, 0, 0, 551, 0, + 575, 756, 756, 0, 0, 0, 0, 0, 0, 756, + 84, 34, 32, 547, 546, 548, 545, 86 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -922, -922, -284, -922, 238, -922, -922, 853, -127, -922, - 195, -424, 519, -126, -922, -78, -922, -922, -148, -922, - -922, -922, 840, -922, -922, -922, -922, -922, -582, -922, - -922, -111, -922, -922, -922, -922, 286, 474, -641, -922, - -691, -728, -576, -922, -64, -922, 108, -558, -922, -492, - -921, -922, -434, 337, -608, 241, 389, 609, -87, 24, - 86, -287, -647, 859, 230, -162, -130, -922, -128, -922, - -922, -922, -922, -91, -121, -922, -471, -922, -922, -18, - 18, -922, -922, -922, -922, -29, 81, -922, -922, -514, - -922, -16, -922, -567, -104, -60, 288, 716, 90, -922, - -922, -922, 787, -367, 1319, -68, -481, -1 + -913, -913, -313, -913, -42, -913, -913, 767, -123, -913, + 235, -421, 437, -121, -913, -913, -177, -913, -913, -237, + -913, -913, -913, 752, -913, -913, -913, -913, -913, -350, + -913, -913, -110, -913, -913, -913, -913, 203, 383, -664, + -913, -700, -725, -549, -913, -155, -913, 16, -519, -913, + -483, -912, -913, -448, 245, -647, -221, 389, -35, -86, + 137, 64, -266, -638, 763, 665, -162, -113, -913, -103, + -913, -913, -913, -913, -182, -100, -913, -451, -913, -913, + -36, -8, -913, -913, -913, -913, -13, -29, -913, -913, + -703, -913, -109, -913, -590, -135, -60, 328, 703, 309, + -913, -913, -913, 691, -88, 199, 861, -486, -1 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 4, 5, 733, 734, 137, 521, 138, 139, 307, - 140, 292, 293, 141, 533, 751, 329, 709, 895, 343, - 712, 715, 344, 915, 1409, 1474, 1095, 1320, 588, 977, - 1078, 142, 326, 700, 701, 702, 703, 704, 752, 1241, - 753, 782, 464, 465, 674, 675, 1085, 409, 527, 531, - 929, 930, 466, 677, 725, 799, 809, 278, 279, 91, - 92, 345, 180, 346, 93, 289, 94, 644, 95, 645, - 825, 1024, 1025, 1271, 96, 97, 475, 471, 472, 98, - 99, 143, 691, 873, 144, 100, 101, 102, 103, 731, - 732, 917, 1227, 636, 353, 354, 1313, 213, 65, 678, - 679, 227, 228, 1272, 1273, 625, 66, 145 + -1, 4, 5, 912, 913, 137, 521, 138, 139, 307, + 140, 292, 293, 141, 529, 523, 746, 329, 705, 890, + 343, 708, 711, 344, 910, 1407, 1474, 1089, 1317, 584, + 971, 1072, 142, 326, 696, 697, 698, 699, 700, 747, + 1238, 748, 777, 464, 465, 670, 671, 1079, 409, 731, + 527, 923, 924, 466, 673, 721, 794, 804, 278, 279, + 91, 92, 345, 180, 346, 93, 289, 94, 640, 95, + 641, 820, 1018, 1019, 1268, 96, 97, 475, 471, 472, + 98, 99, 143, 687, 868, 144, 100, 101, 102, 103, + 732, 733, 918, 1228, 632, 353, 354, 1310, 213, 65, + 674, 675, 227, 228, 1269, 1270, 621, 66, 145 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1474,342 +1474,307 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 6, 212, 304, 323, 325, 281, 641, 1232, 492, 680, - 347, 769, 348, 831, 738, 183, 708, 1336, 896, 349, - 389, 146, 615, 255, 985, 256, 181, 611, 768, 187, - 288, 502, 795, 921, 713, 607, 260, 104, 786, 147, - 845, 509, 148, 356, 402, 358, 359, 360, 361, 406, - 363, 922, 365, 833, 367, 1375, 676, 642, 283, 284, - 285, 230, 182, 403, -747, 648, 806, 1012, -748, 149, - 383, 407, 270, 900, 271, 150, 272, 816, 553, 151, - 408, 391, 392, 255, 240, 256, -749, 399, 400, 818, - 280, 280, 819, 152, 771, 805, 153, 554, 290, 257, - 1394, 402, 261, 935, 936, 155, 978, 979, 980, 981, - 904, 352, 906, 907, 908, 909, 910, 408, 184, 273, - 592, 402, 350, 154, 999, 523, 156, 524, 525, 526, - 736, 737, 815, 1067, -747, 189, 898, -747, -748, 901, - 1039, -748, 214, 215, 216, 355, 355, -750, 355, 355, - 355, 355, 1068, 355, 616, 355, -749, 355, 351, -749, - 286, 258, 264, 265, 266, 347, 282, 348, 1337, 269, - 435, 436, 846, 355, 349, 442, 157, 443, 188, 444, - 714, 290, 797, 1073, 355, 355, 452, 454, 306, 536, - 355, 355, 158, 433, 347, 987, 348, 287, 347, 274, - 348, 317, 834, 349, 1376, 402, 159, 349, 217, 218, - 982, 879, 684, 275, 252, 253, 254, -750, 276, 160, - -750, 486, 445, 277, 1245, 983, 984, 410, 605, 787, - 1404, 1405, 1406, 1008, 1009, 1084, 402, 729, 1015, 161, - 402, 402, 162, 402, 219, 220, 1364, 221, 1018, 318, - 805, 1366, 222, 401, 223, 1246, 280, 280, 1090, 1247, - 1248, 988, 1289, 605, 793, 1365, 352, 214, 215, 216, - 1367, 450, 280, 280, 450, 450, 469, 350, 1, 2, - 3, 473, 535, 569, 989, 605, 794, 264, 265, 266, - 269, 211, 1369, 1235, 163, 352, 402, 1094, 1253, 352, - 402, 467, 446, 298, 299, 300, 350, 301, 303, 305, - 350, 1370, 309, 351, 6, 1451, 447, 314, 402, 1486, - 164, 448, 320, 321, 402, 324, 327, 328, 402, 332, - 333, 911, 912, 217, 218, 319, 1492, 1487, 1087, 1097, - 402, 408, 351, 1488, 264, 1096, 351, 1489, 1000, 165, - 290, 1250, 402, 470, 1005, 1493, 821, 402, 166, 1504, - 823, 402, 518, 468, 512, 680, 513, 167, 476, 219, - 220, 1532, 221, 983, 984, 1091, 1533, 222, 357, 223, - 1534, 168, 10, 362, 11, 364, 355, 366, 169, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 1088, 1228, 589, 878, 1415, 627, - 402, 628, 676, 629, 390, 1249, 170, 1242, 395, 396, - 397, 440, -267, 283, 284, 285, 743, 477, 1256, 1535, - 744, 983, 984, 1239, 1259, 1260, 919, 920, 240, 450, - 983, 984, 1317, 450, 450, 450, 450, 450, 1257, 1258, - 726, 171, 283, 284, 285, 617, 630, 450, 172, 618, - 173, 450, 450, 805, 1014, 754, 626, 174, 486, 638, - 528, 185, 529, 745, 530, 186, 705, 190, 214, 215, - 216, 1351, 1352, 1353, 609, 467, 815, 1017, 1255, 681, - 191, 303, 309, 1093, 912, 6, 192, 494, 439, -90, - 259, -90, 619, -90, 706, 983, 984, 1316, 268, 295, - 1319, 310, 311, 347, 467, 348, 312, 727, 313, 1321, - 6, 1334, 349, 322, 746, 286, 384, 236, 237, 238, - 239, -90, -266, -90, 386, -90, 631, 387, 393, 488, - 240, 718, 489, 490, 217, 218, 610, 468, 503, 514, - 632, 515, 505, 747, 286, 633, 516, 528, 476, 529, - 634, 986, 247, 248, 249, 250, 251, 748, 252, 253, - 254, 520, 749, 532, 402, 537, 468, 750, 538, 544, - 219, 220, 620, 221, 539, 410, 469, 783, 222, 1066, - 223, 238, 239, 546, 540, 541, 621, 450, 542, 543, - 545, 622, 240, 551, 638, 291, 623, 547, 626, 548, - 549, 467, 842, 589, 352, 550, 568, 626, 626, 626, - 626, 626, 626, 410, 896, 350, 1392, 1393, 552, 555, - 556, 183, 789, 557, 410, 558, 559, 1394, 560, 561, - 467, 754, 181, 6, 826, 562, 754, 563, 584, 564, - 726, 565, 726, 726, 726, 726, 726, 571, 566, 572, - 573, 351, 245, 246, 247, 248, 249, 250, 251, 705, - 252, 253, 254, 468, 575, 576, 754, 754, 182, 754, - 754, 754, 754, 647, 577, 1342, 578, 1343, 580, 581, - 6, 1481, 1482, 1483, 790, 1394, 587, 990, 991, 594, - 596, -268, 468, 626, 598, 995, 605, 996, 624, 614, - 646, 469, 643, 640, 469, 682, 240, 727, 64, 727, - 727, 727, 727, 727, 685, 710, 247, 248, 249, 250, - 251, 918, 252, 253, 254, 686, 467, 687, 688, 467, - 932, 1412, 183, 711, 1410, 689, 707, 730, 755, 757, - 728, 783, 410, 181, 788, 1076, 1077, 1419, 1420, 1421, - 680, 1399, 1400, 1401, 1402, 1403, 758, 1404, 1405, 1406, - 765, 1079, 193, 194, 195, 196, 197, 763, 764, 231, - 766, 759, 767, 760, 798, 761, 807, -357, 626, 182, - 410, 410, 817, 1529, 783, 820, 824, 626, 468, 828, - 1536, 468, 829, 1394, 638, 830, 832, 676, 1064, 835, - 836, 844, 467, 874, 638, 875, 876, 1230, 1231, 1399, - 1400, 1401, 1402, 1403, 1026, 1404, 1405, 1406, 877, 1477, - 880, 754, 882, 1475, 1479, 883, 476, 726, 897, 899, - 1484, 1485, 249, 250, 251, 902, 252, 253, 254, 923, - 791, 905, 913, 924, 705, 926, 916, 635, 925, 927, - 800, 801, 802, 803, 804, 992, 754, 934, 993, 994, - 467, 1002, 6, 1003, 468, 997, 1001, 870, 871, 1004, - 626, 449, 451, 453, 455, 456, 626, 626, 626, 626, - 626, 626, 1086, 1010, 1508, 410, 1011, 1020, 1506, 1345, - 1347, 1349, 841, 1480, 727, 805, 398, 815, -275, 1023, - 1030, 638, 1251, 1032, 469, 1069, 1038, 1082, 1070, 1071, - 355, 355, 1083, 1089, 1092, 1521, 1279, 932, 1233, 1401, - 1402, 1403, 468, 1404, 1405, 1406, 1234, 1236, 1528, 467, - 912, 1240, 1237, 1238, 1244, 893, 1252, 1261, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, 183, - 434, 1262, 1263, 1264, 1274, 438, 1275, 1424, 1276, 1425, - 181, 1426, 1277, 638, 1427, 1428, 1429, 1278, 1280, 1282, - 1355, 1283, 1284, 1285, 1292, 1293, 589, 1294, 280, 792, - 1295, 468, 1296, 469, 1297, 410, 410, 1315, 1318, 469, - 469, 493, 1322, 1325, 1323, 1327, 182, 1326, 1328, 810, - 811, 812, 813, 814, 1332, 1338, 1354, 1339, 467, 355, - 1006, 1340, 1341, 1357, 467, 467, 1358, 1359, 504, 1013, - 1360, 214, 215, 216, 1361, 283, 284, 285, 886, 597, - 628, 1362, 887, 600, 601, 602, 603, 604, 1027, 1028, - 1029, 1368, 1031, 1371, 1034, 1035, 1036, 606, 214, 215, - 216, 612, 613, 1086, 1372, 1373, 1374, 324, 1377, 1408, - 1411, 1414, 626, 1416, 1417, 1435, 1437, 1436, 589, 1438, - 468, 589, 1418, 894, 469, 888, 468, 468, 1422, 1423, - 567, 1439, 1440, 1441, 1446, 1491, 1495, 217, 218, 283, - 284, 285, 719, 1450, 1476, 1490, 720, 582, 583, 467, - 1496, 1478, 1074, 1494, 590, 478, 479, 480, 1497, 800, - 801, 802, 803, 804, 217, 218, 1499, 1500, 1501, 1507, - 1511, 1509, 1510, 219, 220, 1512, 221, 286, 1513, 1514, - 1515, 222, 1516, 223, 1530, 1517, 1531, 1518, 1229, 721, - 495, 1520, 1522, 1335, 1523, 827, 1333, 1407, 508, 1080, - 219, 220, 881, 221, 1314, 889, 754, 1331, 222, 1007, - 223, 468, 1298, 1041, 1356, 585, 637, 510, 1324, 890, - 226, 217, 218, 586, 891, 0, 1016, 0, 0, 892, - 0, 0, 0, 918, 0, 0, 0, 785, 224, 0, - 0, 286, 225, 0, 0, 0, 0, 226, 0, 1386, - 1387, 1388, 1389, 1390, 1391, 1392, 1393, 483, 220, 0, - 221, 0, 717, 0, 0, 222, 1394, 223, 0, 722, - 681, 0, 0, 0, 0, 0, 742, 754, 783, 280, - 0, 1384, 0, 723, 0, 0, 0, 0, 724, 0, - 469, 0, 469, 0, 287, 467, 0, 0, 0, 0, - 1075, 0, 0, 6, 0, 0, 0, 810, 811, 812, - 813, 814, 0, 0, 0, 467, 0, 467, 0, 234, - 235, 236, 237, 238, 239, 0, 0, 1431, 1432, 0, - 1433, 0, 1434, 0, 240, 0, 0, 784, 0, 0, - 0, 0, 1299, 0, 0, 0, 0, 0, 0, 469, - 0, 637, 589, 0, 1013, 0, 0, 468, 932, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 589, 589, - 589, 0, 0, 0, 467, 1472, 0, 468, 0, 468, - 0, 0, 1503, 0, 1395, 1396, 1397, 1398, 0, 822, - 1399, 1400, 1401, 1402, 1403, 0, 1404, 1405, 1406, 0, - 1390, 1391, 1392, 1393, 0, 0, 0, 0, 0, 0, - 0, 229, 0, 1394, 837, 838, 839, 840, 0, 843, - 0, 0, 0, 0, 0, 0, 1314, 1314, 1314, 1314, - 1314, 0, 1314, 0, 267, 0, 468, 0, 469, 0, - 589, 0, 0, 0, 0, 589, 0, 0, 783, 783, - 783, 589, 589, 0, 294, 244, 245, 246, 247, 248, - 249, 250, 251, 467, 252, 253, 254, 0, 0, 0, - 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 331, 0, 1524, 1525, 1526, 931, 1527, 0, + 6, 212, 502, 304, 676, 891, 281, 323, 181, 325, + 1229, 781, 356, 607, 358, 359, 360, 361, 826, 363, + 389, 365, 979, 367, 911, 704, 637, 347, 709, 492, + -748, 183, -749, 611, 764, 1334, 182, 348, 603, 383, + 349, 255, 672, 256, 840, 187, 895, 104, -750, 828, + 391, 392, 264, 265, 266, 406, 399, 400, 1373, 269, + 638, 230, 509, 763, -751, 1006, 402, 899, 644, 901, + 902, 903, 904, 905, 549, 929, 930, 407, 972, 973, + 974, 975, 408, 153, 408, 403, 260, 766, 402, 402, + 280, 280, 1061, 550, 214, 215, 216, 800, 290, 810, + -748, 801, -749, -748, 350, -749, 402, 588, 1033, 306, + 402, 1062, 811, 240, 402, 283, 284, 285, -750, 148, + 1078, -750, 402, 402, 1362, 1242, 149, 352, 993, 1243, + 906, 907, 351, 1244, -751, 800, -91, -751, -91, 258, + -91, 1245, 1286, 1363, 1364, 355, 355, 1392, 355, 355, + 355, 355, 261, 355, 514, 355, 255, 355, 256, 893, + 217, 218, 896, 1365, 792, 612, 813, 150, 10, 814, + 11, 435, 436, 355, 710, 240, 841, 264, 265, 266, + 269, 290, 347, 680, 355, 355, 1335, 452, 454, 532, + 355, 355, 348, 433, 188, 349, 219, 220, 829, 221, + 151, 1067, 874, 976, 222, 152, 223, 1374, 725, 154, + 1009, 347, 257, 1367, 402, 347, 402, 286, 977, 978, + 1012, 348, 156, 402, 349, 348, 155, 410, 349, 981, + 1084, 146, 1368, 1451, 264, 1487, 402, 449, 451, 453, + 455, 456, 1488, 252, 253, 254, 620, 402, 184, 147, + 1250, 1493, 565, 1088, 287, 1489, 280, 280, 476, 350, + 790, 229, 1095, 157, 1232, 982, 1490, 1002, 1003, 282, + 1494, 450, 280, 280, 450, 450, 469, 1402, 1403, 1404, + 1096, 473, 352, 512, 267, 513, 158, 351, 350, 159, + 402, 160, 350, 1252, 402, 1, 2, 3, 161, 983, + 402, 249, 250, 251, 294, 252, 253, 254, 162, 1505, + 240, 352, 402, 1533, 6, 352, 351, 1090, 402, 1534, + 351, 727, 316, 728, 729, 730, 524, 818, 525, 401, + 526, 1535, 331, 163, -91, 999, -91, 1536, -91, 601, + 782, 468, 164, 298, 299, 300, 994, 301, 303, 305, + 290, 165, 309, 166, 1247, 676, 442, 314, 443, 167, + 444, 1091, 320, 321, 168, 324, 327, 328, 169, 332, + 333, 170, 1081, 816, 873, 601, 788, 385, 171, 524, + 388, 525, 172, 980, 786, 173, 355, 174, 1239, 185, + 1321, 601, 789, 672, 795, 796, 797, 798, 799, 189, + 977, 978, 1085, 445, 186, 593, 585, 190, 1082, 596, + 597, 598, 599, 600, 467, 1415, 270, 191, 271, 192, + 272, 915, 916, 602, 404, 405, 259, 608, 609, 623, + 268, 624, 295, 625, 247, 248, 249, 250, 251, 450, + 252, 253, 254, 450, 450, 450, 450, 450, 476, 1253, + 977, 978, 1236, 800, 1008, 1256, 1257, 450, 977, 978, + 1314, 450, 450, 273, 810, 1011, 622, 1087, 907, 634, + 441, 1349, 1350, 1351, 310, 518, 626, 1093, 1094, 888, + 311, 1254, 1255, 446, 214, 215, 216, 312, 485, 677, + 487, 313, 701, 977, 978, 6, 317, 447, 318, 319, + 322, 384, 448, 386, 702, 387, 393, 497, 477, 498, + 499, 500, 501, 408, 440, 488, 470, 723, -267, 489, + 6, 1332, 503, 505, 606, 468, 347, 528, 490, 511, + 515, 303, 309, 516, 520, 402, 348, 494, 519, 349, + 1318, 522, 533, 274, 534, 580, 535, 536, 537, 530, + 217, 218, 538, 539, 468, 1060, 627, 275, 540, 780, + 541, 542, 276, 1000, 543, 544, 545, 277, 547, 551, + 628, 567, 1007, 546, 548, 629, 552, 553, 554, 555, + 630, 410, 469, 778, 556, 557, 219, 220, 566, 221, + 558, 559, 570, 450, 222, 560, 223, 605, 467, 561, + 634, 562, 568, 350, 622, 229, 569, 571, 837, 585, + 572, 573, 891, 622, 622, 622, 622, 622, 622, 410, + 181, 594, 574, 576, 224, 577, 352, 467, 225, 583, + 410, 351, 590, 226, 592, -269, 601, 639, 610, 6, + 821, 1246, 595, 183, 636, 642, 678, 468, 182, 681, + 703, 682, 683, 684, 714, 1068, 685, 726, 294, 706, + 758, 750, 795, 796, 797, 798, 799, 759, 785, 783, + 635, 752, 283, 284, 285, 715, 468, 753, 760, 716, + 294, 701, 761, 762, 793, 802, 6, 812, 294, -358, + 815, 819, 984, 985, 1482, 1483, 1484, 823, 831, 622, + 989, 824, 990, 825, 827, 64, 830, 469, 839, 1340, + 469, 1341, 869, 723, 1481, 723, 723, 723, 723, 723, + 467, 476, 717, 643, 870, 871, 211, 872, 875, 877, + 181, 751, 919, 1313, 878, 926, 1316, 892, 894, 917, + 897, 784, 900, 908, 920, 921, 778, 410, 986, 467, + 928, 765, 676, 183, 1070, 996, 1071, 995, 182, 193, + 194, 195, 196, 197, 987, 988, 231, 1073, 1408, 991, + 997, 998, 468, 800, 286, 468, 1004, 1005, 1017, 810, + 404, 767, -276, 622, 1014, 410, 410, 1024, 1026, 778, + 672, 1032, 622, 1063, 768, 769, 1064, 1530, 1065, 634, + 1076, 1083, 718, 1058, 1537, 1086, 1077, 1092, 907, 634, + 770, 1097, 1098, 357, 1231, 1230, 719, 1233, 362, 1020, + 364, 720, 366, 803, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 1234, + 771, 294, 1237, 772, 1235, 467, 773, 468, 467, 390, + 1249, 1241, 1258, 395, 396, 397, 1007, 631, 1475, 1259, + 1260, 1261, 774, 1272, 1271, 701, 1273, 6, 1274, 1275, + 1289, 1279, 1280, 1282, 775, 622, 1277, 1281, 1290, 1392, + 1291, 622, 622, 622, 622, 622, 622, 1080, 776, 1276, + 410, 1292, 1293, 398, 1294, 1312, 1315, 880, 1319, 723, + 238, 239, 1320, 1352, 1326, 468, 634, 1248, 1330, 469, + 1336, 240, 1370, 865, 866, 1337, 1338, 1339, 1355, 1356, + 467, 926, 1357, 1358, 1359, 1507, 1360, 1366, 914, 1369, + 1371, 1372, 1375, 439, 1406, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 181, 434, 1353, 288, + 1323, 1324, 438, 1409, 1417, 1411, 294, 1412, 1435, 1413, + 1410, 1416, 1418, 1436, 468, 1422, 1423, 634, 467, 183, + 236, 237, 238, 239, 182, 1437, 1440, 1419, 1420, 1421, + 585, 1438, 280, 240, 1446, 787, 1439, 469, 493, 410, + 410, 1441, 1450, 469, 469, 1399, 1400, 1401, 1476, 1402, + 1403, 1404, 1478, 1492, 1479, 805, 806, 807, 808, 809, + 1491, 1495, 1500, 355, 1496, 504, 214, 215, 216, 1497, + 1498, 1501, 1502, 1508, 1511, 247, 248, 249, 250, 251, + 1512, 252, 253, 254, 1510, 1513, 1514, 467, 1515, 1516, + 1531, 564, 1322, 283, 284, 285, 738, 1517, 1518, 1477, + 739, 1519, 468, 1532, 1331, 1521, 1480, 1080, 468, 468, + 1523, 1524, 1485, 1486, 495, 1405, 622, 876, 1075, 822, + 508, 1074, 585, 1329, 1295, 585, 1035, 563, 469, 889, + 1354, 510, 217, 218, 355, 355, 1325, 582, 0, 0, + 0, 0, 0, 740, 578, 579, 283, 284, 285, 613, + 0, 586, 324, 614, 0, 245, 246, 247, 248, 249, + 250, 251, 0, 252, 253, 254, 1509, 0, 219, 220, + 0, 221, 0, 0, 0, 467, 222, 0, 223, 0, + 0, 467, 467, 0, 0, 0, 0, 0, 0, 0, + 486, 0, 0, 468, 741, 286, 615, 0, 1522, 0, + 0, 1333, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1529, 0, 633, 1001, 1343, 1345, 1347, 707, 0, + 0, -268, 0, 742, 0, 724, 0, 0, 0, 0, + 0, 1010, 0, 0, 1251, 0, 0, 743, 0, 0, + 0, 0, 744, 0, 919, 0, 0, 745, 286, 0, + 0, 531, 754, 0, 755, 0, 756, 0, 0, 713, + 0, 0, 0, 0, 0, 1278, 467, 0, 0, 737, + 0, 0, 0, 0, 0, 0, 616, 677, 0, 0, + 0, 0, 214, 215, 216, 778, 280, 0, 1382, 0, + 617, 0, 0, 0, 1424, 618, 1425, 469, 1426, 469, + 619, 1427, 1428, 1429, 0, 1069, 0, 0, 0, 0, + 6, 0, 805, 806, 807, 808, 809, 0, 0, 0, + 283, 284, 285, 881, 0, 624, 0, 882, 0, 0, + 779, 0, 0, 914, 0, 1431, 1432, 0, 1433, 0, + 1434, 0, 468, 474, 633, 0, 0, 0, 217, 218, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 585, + 0, 0, 468, 0, 468, 0, 926, 0, 0, 0, + 883, 0, 0, 836, 0, 0, 585, 585, 585, 0, + 0, 0, 817, 1472, 219, 220, 70, 221, 71, 72, + 73, 0, 222, 1392, 223, 0, 0, 0, 0, 1386, + 1387, 1388, 1389, 1390, 1391, 0, 0, 832, 833, 834, + 835, 0, 838, 0, 1392, 467, 80, 0, 0, 722, + 0, 468, 286, 0, 0, 0, 581, 1311, 1390, 1391, + 749, 226, 263, 486, 0, 467, 0, 467, 0, 1392, + 0, 0, 0, 0, 0, 0, 469, 0, 585, 0, + 884, 82, 83, 0, 0, 585, 0, 0, 778, 778, + 778, 585, 585, 0, 885, 0, 0, 0, 88, 886, + 0, 0, 0, 90, 887, 0, 0, 0, 0, 925, + 0, 0, 0, 0, 0, 0, 0, 233, 234, 235, + 236, 237, 238, 239, 467, 1525, 1526, 1527, 0, 1528, + 0, 0, 0, 240, 0, 1348, 1010, 0, 0, 0, + 0, 468, 0, 469, 0, 585, 0, 1397, 1398, 1399, + 1400, 1401, 0, 1402, 1403, 1404, 0, 0, 1021, 1022, + 1023, 0, 1025, 0, 1028, 1029, 1030, 0, 1397, 1398, + 1399, 1400, 1401, 633, 1402, 1403, 1404, 585, 0, 1388, + 1389, 1390, 1391, 633, 0, 0, 0, 1013, 0, 0, + 585, 778, 1392, 1397, 1398, 1399, 1400, 1401, 778, 1402, + 1403, 1404, 0, 0, 1031, 0, 0, 0, 468, 0, + 0, 0, 0, 0, 467, 1036, 1037, 1038, 1039, 1040, + 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, + 1051, 1052, 1053, 1054, 1055, 1056, 749, 1059, 0, 0, + 0, 749, 214, 215, 216, 722, 0, 722, 722, 722, + 722, 722, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 0, 252, 253, 254, 0, 0, 0, 0, + 749, 749, 0, 749, 749, 749, 749, 0, 0, 0, + 633, 467, 1311, 1311, 1311, 1311, 1311, 0, 1311, 0, + 0, 0, 0, 0, 0, 925, 0, 0, 0, 0, + 0, 1376, 1377, 1378, 1379, 1380, 0, 1383, 217, 218, + 0, 0, 0, 0, 0, 1499, 1397, 1398, 1399, 1400, + 1401, 0, 1402, 1403, 1404, 232, 233, 234, 235, 236, + 237, 238, 239, 0, 0, 0, 0, 0, 0, 330, + 0, 0, 240, 0, 219, 220, 0, 221, 0, 0, + 0, 633, 222, 1240, 223, 0, 0, 0, 0, 0, + 0, 0, 0, 1311, 1311, 1311, 1311, 1311, 1311, 1311, + 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, + 1311, 1311, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, + 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, + 1470, 0, 0, 0, 0, 1284, 0, 0, 0, 0, + 0, 1296, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 749, 0, 0, 0, 1311, + 0, 722, 0, 7, 8, 9, 10, 0, 11, 12, + 13, 198, 68, 0, 0, 0, 0, 0, 1503, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 749, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 0, 252, 253, 254, 0, 0, 0, 589, 0, + 15, 69, 0, 1311, 199, 0, 200, 201, 202, 74, + 75, 0, 20, 76, 0, 0, 203, 22, 0, 0, + 78, 0, 1520, 0, 0, 23, 24, 204, 478, 479, + 480, 26, 0, 0, 205, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 206, 234, 235, 236, 237, 238, 239, 0, 44, 0, + 45, 0, 46, 0, 0, 0, 240, 47, 0, 207, + 208, 50, 0, 0, 51, 84, 0, 0, 0, 52, + 0, 0, 53, 85, 86, 87, 209, 0, 0, 89, + 0, 210, 0, 0, 217, 218, 232, 233, 234, 235, + 236, 237, 238, 239, 56, 0, 0, 57, 58, 59, + 0, 0, 60, 240, 61, 62, 0, 0, 63, 0, + 0, 0, 0, 0, 1328, 0, 0, 0, 0, 0, + 483, 220, 0, 221, 0, 0, 0, 0, 222, 0, + 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 214, 215, 216, 0, 0, + 0, 0, 0, 1381, 0, 0, 0, 287, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1361, 0, + 0, 0, 0, 0, 0, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1016, 469, 0, 589, 1314, 1314, 1314, 1314, - 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, - 1314, 1314, 1314, 1314, 1314, 468, 0, 385, 467, 0, - 388, 0, 0, 0, 0, 0, 589, 1399, 1400, 1401, - 1402, 1403, 0, 1404, 1405, 1406, 0, 0, 0, 589, - 783, 637, 0, 0, 0, 0, 0, 783, 0, 0, - 0, 637, 0, 0, 0, 1019, 0, 0, 0, 0, - 1314, 1383, 0, 0, 404, 405, 0, 0, 0, 0, - 0, 0, 1037, 0, 0, 0, 0, 0, 0, 0, - 468, 0, 0, 1042, 1043, 1044, 1045, 1046, 1047, 1048, - 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, - 1059, 1060, 1061, 1062, 0, 1065, 0, 0, 0, 0, - 441, 0, 0, 1314, 1378, 1379, 1380, 1381, 1382, 0, - 1385, 1442, 1443, 1444, 1445, 0, 1448, 1449, 485, 770, - 487, 0, 0, 0, 0, 0, 0, 0, 234, 235, - 236, 237, 238, 239, 0, 771, 0, 497, 637, 498, - 499, 500, 501, 240, 0, 0, 0, 0, 0, 772, - 214, 215, 216, 0, 931, 0, 0, 0, 0, 511, - 0, 0, 773, 774, 0, 0, 0, 0, 519, 0, - 0, 522, 0, 0, 0, 0, 0, 0, 775, 534, - 0, 0, 0, 0, 1452, 1453, 1454, 1455, 1456, 1457, - 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, - 1468, 1469, 1470, 0, 0, 0, 0, 0, 776, 0, - 637, 777, 1243, 0, 778, 0, 217, 218, 570, 0, - 0, 0, 574, 0, 0, 0, 0, 0, 0, 0, - 779, 0, 0, 0, 0, 229, 0, 0, 0, 0, - 0, 0, 780, 0, 0, 0, 0, 0, 1502, 0, - 0, 0, 219, 220, 0, 221, 781, 0, 0, 0, - 222, 0, 223, 0, 1287, 245, 246, 247, 248, 249, - 250, 251, 599, 252, 253, 254, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 315, 0, 294, 7, - 8, 9, 10, 0, 11, 12, 13, 198, 68, 0, - 639, 1519, 0, 0, 0, 0, 0, 0, 0, 0, - 294, 0, 0, 0, 0, 0, 0, 0, 294, 0, - 0, 0, 0, 0, 0, 0, 234, 235, 236, 237, - 238, 239, 0, 0, 0, 0, 15, 69, 0, 0, - 199, 240, 200, 201, 202, 74, 75, 0, 20, 76, - 0, 0, 203, 22, 735, 0, 78, 0, 0, 0, - 0, 23, 24, 204, 0, 756, 0, 26, 0, 0, - 205, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 206, 0, 0, 0, - 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, - 0, 0, 0, 47, 0, 207, 208, 50, 0, 0, - 51, 84, 0, 0, 404, 52, 0, 0, 53, 85, - 86, 87, 209, 0, 0, 89, 0, 210, 0, 0, - 649, 650, 651, 10, 0, 11, 652, 653, 67, 68, - 56, 0, 654, 57, 58, 59, 0, 0, 60, 0, - 61, 62, 0, 0, 63, 0, 0, 808, 0, 0, - 1330, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 0, 252, 253, 254, 459, 294, 0, 655, 69, 0, - 0, 70, 0, 71, 72, 73, 74, 460, 0, 656, - 76, 0, 0, 77, 657, 0, 0, 78, 0, 0, - 0, 0, 658, 659, 79, 0, 0, 0, 0, 0, - 0, 80, 0, 0, 1363, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 885, 0, 0, 0, 660, 0, 661, 0, 662, - 0, 0, 0, 461, 663, 0, 82, 83, 664, 0, - 0, 665, 84, 0, 0, 931, 666, 0, 0, 667, - 85, 86, 87, 88, 0, 0, 89, 0, 90, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 668, 0, 0, 669, 670, 0, 0, 0, 671, - 0, 672, 0, 0, 0, 673, 0, 0, 0, 0, - 0, 294, 0, 0, 0, 0, 0, 1098, 1099, 1100, - 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 0, 1109, + 0, 0, 0, 234, 235, 236, 237, 238, 239, 0, + 925, 217, 218, 0, 1442, 1443, 1444, 1445, 240, 1448, + 1449, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 0, 252, 253, 254, 0, 0, 0, 1287, + 0, 0, 0, 0, 0, 0, 0, 219, 220, 0, + 221, 0, 0, 0, 0, 222, 0, 223, 1099, 1100, + 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 0, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, - 0, 0, 1473, 0, 0, 0, 0, 1120, 1121, 1122, + 1120, 315, 749, 0, 0, 0, 0, 1473, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, - 1133, 1134, 1135, 1136, 1137, 1138, 0, 0, 1139, 1140, + 1133, 1134, 1135, 1136, 1137, 1138, 1139, 0, 0, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, - 1151, 1152, 1153, 0, 1154, 0, 1155, 1156, 1157, 1158, - 1159, 1160, 1161, 1162, 1163, 0, 1164, 1165, 1166, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1167, 0, 0, 0, 0, 0, - 1168, 1169, 1170, 1081, 1171, 1172, 1173, 1174, 1175, 1176, + 1151, 1152, 1153, 1154, 0, 1155, 0, 1156, 1157, 1158, + 1159, 1160, 1161, 1162, 1163, 1164, 0, 1165, 1166, 1167, + 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, + 254, 0, 0, 749, 0, 1168, 0, 0, 0, 0, + 0, 1169, 1170, 1171, 0, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, - 1197, 1198, 1199, 1200, 1201, 1202, 1203, 0, 0, 735, - 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 0, 0, + 0, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, - 1224, 1413, 1225, 1226, 0, 0, 0, 0, 0, 232, - 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, + 1224, 1225, 1414, 1226, 1227, 1099, 1100, 1101, 1102, 1103, + 1104, 1105, 1106, 1107, 1108, 1109, 0, 1110, 1111, 1112, + 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 0, 0, + 0, 0, 0, 0, 0, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, + 1136, 1137, 1138, 1139, 0, 0, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1154, 0, 1155, 0, 1156, 1157, 1158, 1159, 1160, 1161, + 1162, 1163, 1164, 0, 1165, 1166, 1167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1168, 0, 0, 0, 0, 0, 1169, 1170, + 1171, 0, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, + 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, + 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, + 1200, 1201, 1202, 1203, 1204, 0, 0, 0, 1205, 1206, + 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, + 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 0, + 1226, 1227, 7, 8, 9, 10, 0, 11, 12, 13, + 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1254, 0, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, - 1106, 1107, 1108, 0, 1109, 1110, 1111, 1112, 1113, 1114, - 1115, 1116, 1117, 1118, 1119, 0, 0, 0, 0, 0, - 0, 1281, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, - 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, - 1138, 0, 0, 1139, 1140, 1141, 1142, 1143, 1144, 1145, - 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 0, 1154, - 0, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, - 0, 1164, 1165, 1166, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 1167, - 0, 0, 593, 0, 0, 1168, 1169, 1170, 0, 1171, - 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, - 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, - 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, - 1202, 1203, 0, 0, 0, 1204, 1205, 1206, 1207, 1208, - 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, - 1219, 1220, 1221, 1222, 1223, 1224, 0, 1225, 1226, 7, - 8, 9, 10, 0, 11, 12, 13, 491, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, - 0, 0, 0, 0, 0, 0, 15, 336, 240, 0, - 199, 0, 200, 201, 202, 74, 0, 0, 20, 337, - 0, 0, 203, 22, 0, 0, 78, 0, 0, 0, - 0, 23, 24, 204, 0, 0, 0, 26, 0, 0, - 205, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 206, 0, 1350, 0, - 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, - 0, 0, 0, 47, 0, 207, 208, 50, 0, 0, - 51, 84, 0, 0, 0, 52, 0, 0, 53, 339, - 340, 87, 209, 0, 0, 89, 0, 210, 7, 8, - 9, 10, 0, 11, 12, 13, 14, 0, 0, 0, - 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, - 61, 62, 0, 0, 63, 0, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, - 254, 0, 0, 0, 1290, 15, 0, 0, 0, 16, - 0, 17, 18, 19, 0, 0, 0, 20, 0, 739, - 740, 21, 22, 0, 0, 0, 770, 0, 0, 0, - 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 772, 0, 0, 0, - 0, 0, 0, 44, 0, 45, 0, 46, 0, 773, - 774, 0, 47, 0, 48, 49, 50, 0, 0, 51, - 0, 0, 0, 0, 52, 775, 0, 53, 0, 0, - 0, 54, 0, 0, 0, 1498, 55, 7, 8, 9, - 10, 741, 11, 12, 13, 14, 0, 0, 0, 56, - 0, 0, 57, 58, 59, 776, 0, 60, 777, 61, - 62, 778, 0, 63, 0, 0, 0, 0, 232, 233, - 234, 235, 236, 237, 238, 239, 0, 779, 0, 0, - 0, 0, 0, 0, 15, 240, 0, 0, 16, 780, - 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, - 21, 22, 0, 781, 0, 0, 0, 0, 0, 23, - 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, - 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, - 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, - 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, - 0, 214, 215, 216, 0, 0, 0, 0, 56, 0, - 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, - 432, 0, 63, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 0, 252, 253, 254, 15, 437, - 0, 1505, 16, 0, 17, 18, 19, 0, 0, 0, - 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 23, 24, 25, 0, 217, 218, 26, + 0, 0, 0, 0, 232, 233, 234, 235, 236, 237, + 238, 239, 0, 0, 0, 0, 0, 0, 0, 15, + 336, 240, 0, 199, 0, 200, 201, 202, 74, 0, + 0, 20, 337, 0, 0, 203, 22, 0, 0, 78, + 0, 0, 0, 0, 23, 24, 204, 0, 0, 0, + 26, 0, 0, 205, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 206, + 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, + 0, 46, 0, 0, 0, 0, 47, 0, 207, 208, + 50, 0, 0, 51, 84, 0, 0, 0, 52, 0, + 0, 53, 339, 340, 87, 209, 0, 0, 89, 0, + 210, 7, 8, 9, 10, 0, 11, 12, 13, 14, + 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, + 0, 60, 0, 61, 62, 0, 0, 63, 0, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 0, 252, 253, 254, 0, 0, 0, 1506, 15, 0, + 0, 0, 16, 0, 17, 18, 19, 0, 0, 0, + 20, 0, 734, 735, 21, 22, 0, 0, 0, 0, + 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, - 46, 0, 0, 219, 220, 47, 221, 48, 49, 50, - 0, 222, 51, 223, 0, 0, 0, 52, 0, 0, + 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, + 0, 0, 51, 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, - 11, 12, 13, 14, 0, 0, 0, 496, 0, 0, + 11, 12, 13, 14, 736, 214, 215, 216, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, - 60, 0, 61, 62, 0, 0, 63, 0, 0, 0, - 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, - 0, 0, 15, 716, 0, 0, 16, 240, 17, 18, + 60, 0, 61, 62, 0, 0, 63, 1385, 1386, 1387, + 1388, 1389, 1390, 1391, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 1392, 0, 0, 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, - 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, + 0, 217, 218, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, - 44, 0, 45, 0, 46, 0, 0, 0, 0, 47, - 0, 48, 49, 50, 0, 0, 51, 0, 0, 0, + 44, 0, 45, 0, 46, 0, 0, 219, 220, 47, + 221, 48, 49, 50, 0, 222, 51, 223, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, - 8, 9, 10, 55, 11, 12, 13, 14, 0, 214, - 215, 216, 0, 0, 884, 0, 56, 0, 0, 57, - 58, 59, 0, 0, 60, 0, 61, 62, 0, 0, - 63, 0, 0, 591, 0, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 15, 252, 253, 254, + 8, 9, 10, 55, 11, 12, 13, 14, 0, 0, + 0, 496, 0, 0, 0, 0, 56, 0, 0, 57, + 58, 59, 0, 0, 60, 0, 61, 62, 432, 0, + 63, 0, 1394, 1395, 1396, 0, 0, 1397, 1398, 1399, + 1400, 1401, 0, 1402, 1403, 1404, 15, 437, 0, 0, 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, - 0, 23, 24, 25, 0, 217, 218, 26, 0, 0, + 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, - 0, 219, 220, 47, 221, 48, 49, 50, 0, 222, - 51, 223, 0, 0, 0, 52, 0, 0, 53, 0, + 0, 0, 0, 47, 0, 48, 49, 50, 0, 0, + 51, 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, - 13, 14, 928, 214, 215, 216, 0, 0, 0, 0, + 13, 14, 0, 214, 215, 216, 0, 0, 879, 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, 0, 0, 63, 0, 0, 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, - 15, 0, 0, 0, 16, 240, 17, 18, 19, 0, + 15, 712, 0, 0, 16, 240, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, 217, 218, 26, 0, 0, 27, 28, 29, 30, 31, 32, @@ -1818,21 +1783,21 @@ static const yytype_int16 yytable[] = 45, 0, 46, 0, 0, 219, 220, 47, 221, 48, 49, 50, 0, 222, 51, 223, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, - 10, 55, 11, 12, 13, 14, 0, 0, 0, 0, + 10, 55, 11, 12, 13, 14, 0, 214, 215, 216, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, - 0, 0, 60, 0, 61, 62, 1063, 0, 63, 0, - 933, 0, 0, 241, 242, 243, 244, 245, 246, 247, + 0, 0, 60, 0, 61, 62, 0, 0, 63, 0, + 0, 587, 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 15, 252, 253, 254, 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, - 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, + 24, 25, 0, 217, 218, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, - 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, + 0, 0, 44, 0, 45, 0, 46, 0, 0, 219, + 220, 47, 221, 48, 49, 50, 0, 222, 51, 223, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, - 1329, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 922, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, 0, 0, 63, 0, 0, 0, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, 15, 0, @@ -1847,7 +1812,7 @@ static const yytype_int16 yytable[] = 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, - 60, 0, 61, 62, 1471, 0, 63, 1265, 0, 0, + 60, 0, 61, 62, 1057, 0, 63, 0, 927, 0, 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 15, 252, 253, 254, 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, @@ -1857,282 +1822,287 @@ static const yytype_int16 yytable[] = 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, 0, - 0, 52, 0, 0, 53, 0, 0, 0, 54, 649, - 650, 651, 10, 55, 11, 652, 653, 67, 68, 0, - 0, 1040, 0, 0, 0, 0, 56, 0, 0, 57, + 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, + 8, 9, 10, 55, 11, 12, 13, 14, 1327, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, 0, 0, - 63, 232, 233, 234, 235, 236, 237, 238, 239, 0, - 0, 0, 0, 459, 0, 0, 655, 69, 240, 0, - 70, 0, 71, 72, 73, 74, 460, 0, 656, 76, - 0, 0, 77, 657, 0, 0, 78, 0, 0, 0, - 0, 658, 659, 79, 0, 0, 0, 0, 0, 0, - 80, 0, 0, 0, 0, 0, 0, 0, 0, 214, - 215, 216, 0, 0, 0, 0, 81, 0, 0, 0, - 0, 0, 0, 0, 660, 0, 661, 0, 662, 0, - 0, 0, 461, 663, 0, 82, 83, 664, 0, 0, - 665, 84, 0, 0, 0, 666, 0, 0, 667, 85, - 86, 87, 88, 0, 0, 89, 0, 90, 7, 8, - 9, 10, 0, 11, 12, 13, 0, 0, 0, 0, - 668, 0, 0, 669, 670, 217, 218, 0, 671, 0, - 672, 0, 692, 0, 673, 0, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, - 254, 693, 0, 0, 0, 1300, 0, 0, 0, 0, - 0, 219, 1266, 1267, 1268, 0, 0, 1301, 0, 222, - 0, 223, 1302, 233, 234, 235, 236, 237, 238, 239, - 23, 24, 1269, 0, 0, 0, 26, 1270, 0, 240, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 0, 232, 233, 234, 235, - 236, 237, 238, 239, 0, 45, 0, 46, 0, 0, - 0, 0, 1303, 240, 0, 0, 1304, 0, 0, 1305, - 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, - 0, 70, 0, 71, 72, 73, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 0, 0, 0, 0, 1306, - 0, 0, 1307, 1308, 1309, 937, 0, 1310, 0, 1311, - 62, 80, 0, 1312, 0, 938, 939, 940, 941, 942, - 943, 944, 945, 0, 0, 0, 0, 263, 0, 0, - 0, 0, 946, 0, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 82, 83, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 0, 252, - 253, 254, 0, 88, 959, 0, 0, 0, 90, 0, - 0, 214, 215, 216, 0, 0, 334, 335, 0, 0, - 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 0, 252, 253, 254, 579, 1386, 1387, 1388, - 1389, 1390, 1391, 1392, 1393, 0, 0, 960, 0, 0, - 0, 0, 0, 0, 1394, 0, 0, 336, 0, 0, - 70, 0, 71, 72, 73, 74, 0, 0, 0, 337, - 0, 0, 77, 0, 0, 0, 78, 217, 218, 0, - 0, 0, 0, 79, 0, 0, 961, 0, 0, 962, - 80, 963, 964, 965, 966, 967, 968, 969, 970, 971, - 972, 973, 0, 974, 975, 0, 81, 976, 0, 334, - 335, 0, 0, 219, 220, 0, 221, 338, 0, 0, - 0, 222, 0, 223, 0, 82, 83, 0, 0, 0, - 0, 84, 0, 0, 1269, 0, 0, 0, 0, 339, - 340, 87, 88, 0, 0, 89, 0, 90, 0, 0, - 336, 0, 341, 70, 0, 71, 72, 73, 74, 0, - 0, 0, 337, 0, 0, 77, 0, 0, 342, 78, - 0, 0, 1395, 1396, 1397, 1398, 79, 0, 1399, 1400, - 1401, 1402, 1403, 80, 1404, 1405, 1406, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 507, 0, 0, 81, - 0, 70, 0, 71, 72, 73, 0, 0, 0, 0, - 338, 0, 0, 262, 0, 0, 0, 0, 82, 83, - 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, - 0, 80, 339, 340, 87, 88, 336, 0, 89, 70, - 90, 71, 72, 73, 74, 0, 0, 263, 337, 0, - 0, 77, 474, 0, 0, 78, 0, 0, 0, 0, - 0, 342, 79, 0, 0, 0, 82, 83, 0, 80, - 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, - 0, 0, 0, 88, 0, 81, 0, 240, 90, 0, - 0, 0, 0, 0, 0, 70, 338, 71, 72, 73, - 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, - 84, 174, 0, 70, 0, 71, 72, 73, 339, 340, - 87, 88, 0, 0, 89, 80, 90, 232, 233, 234, - 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, - 0, 263, 0, 80, 240, 0, 0, 342, 232, 233, - 234, 235, 236, 237, 238, 239, 0, 0, 0, 263, - 82, 83, 0, 0, 0, 240, 232, 233, 234, 235, - 236, 237, 238, 239, 0, 0, 0, 88, 82, 83, - 0, 0, 90, 240, 232, 233, 234, 235, 236, 237, - 238, 239, 0, 0, 0, 88, 0, 0, 0, 0, - 90, 240, 0, 0, 0, 241, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 0, 252, 253, 254, - 595, 232, 233, 234, 235, 236, 237, 238, 239, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 232, - 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, - 0, 0, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 0, 252, 253, 254, 683, 0, 0, - 0, 0, 0, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 0, 252, 253, 254, 762, 0, - 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 0, 252, 253, 254, 903, 0, 0, 241, + 63, 0, 0, 0, 232, 233, 234, 235, 236, 237, + 238, 239, 0, 0, 0, 0, 15, 0, 0, 0, + 16, 240, 17, 18, 19, 0, 0, 0, 20, 0, + 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, + 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, + 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, + 0, 0, 0, 47, 0, 48, 49, 50, 0, 0, + 51, 0, 0, 0, 0, 52, 0, 0, 53, 0, + 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, + 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, + 61, 62, 1471, 0, 63, 1262, 0, 0, 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 0, 252, 253, 254, 1021, 232, 233, 234, 235, 236, + 15, 252, 253, 254, 16, 0, 17, 18, 19, 0, + 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, + 0, 0, 0, 0, 0, 23, 24, 25, 0, 0, + 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, + 45, 0, 46, 0, 0, 0, 0, 47, 0, 48, + 49, 50, 0, 0, 51, 0, 0, 0, 0, 52, + 0, 0, 53, 0, 0, 0, 54, 645, 646, 647, + 10, 55, 11, 648, 649, 67, 68, 0, 0, 650, + 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, + 0, 0, 60, 0, 61, 62, 0, 0, 63, 232, + 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, + 0, 459, 0, 0, 651, 69, 240, 0, 70, 0, + 71, 72, 73, 74, 460, 0, 652, 76, 0, 0, + 77, 653, 0, 0, 78, 0, 0, 0, 0, 654, + 655, 79, 0, 0, 0, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 232, 233, 234, 235, 236, 237, + 238, 239, 0, 0, 81, 0, 0, 0, 0, 0, + 0, 240, 656, 0, 657, 0, 658, 0, 0, 0, + 461, 659, 0, 82, 83, 660, 0, 0, 661, 84, + 0, 0, 0, 662, 0, 0, 663, 85, 86, 87, + 88, 0, 0, 89, 0, 90, 0, 645, 646, 647, + 10, 0, 11, 648, 649, 67, 68, 0, 664, 1034, + 0, 665, 666, 0, 0, 0, 667, 0, 668, 0, + 688, 0, 669, 0, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 689, + 0, 459, 0, 0, 651, 69, 0, 0, 70, 0, + 71, 72, 73, 74, 460, 0, 652, 76, 0, 0, + 77, 653, 0, 0, 78, 214, 215, 216, 0, 654, + 655, 79, 0, 0, 0, 0, 0, 1285, 80, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 0, 252, 253, 254, 81, 0, 0, 0, 0, 0, + 0, 0, 656, 0, 657, 0, 658, 0, 0, 0, + 461, 659, 0, 82, 83, 660, 0, 0, 661, 84, + 0, 0, 0, 662, 0, 0, 663, 85, 86, 87, + 88, 217, 218, 89, 0, 90, 7, 8, 9, 10, + 0, 11, 12, 13, 0, 0, 0, 0, 664, 0, + 0, 665, 666, 0, 0, 0, 667, 0, 668, 0, + 0, 0, 669, 0, 0, 0, 0, 219, 1263, 1264, + 1265, 0, 0, 0, 0, 222, 0, 223, 0, 0, + 0, 0, 0, 1297, 0, 0, 0, 0, 1266, 0, + 0, 0, 0, 1267, 0, 1298, 0, 0, 0, 0, + 1299, 234, 235, 236, 237, 238, 239, 0, 23, 24, + 0, 0, 0, 0, 26, 0, 240, 0, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 0, 232, 233, 234, 235, 236, 237, + 238, 239, 0, 45, 0, 46, 0, 0, 0, 0, + 1300, 240, 0, 0, 1301, 0, 0, 1302, 0, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 70, + 0, 71, 72, 73, 0, 0, 0, 0, 0, 0, + 0, 262, 0, 0, 0, 0, 0, 1303, 0, 0, + 1304, 1305, 1306, 931, 0, 1307, 0, 1308, 62, 80, + 0, 1309, 0, 932, 933, 934, 935, 936, 937, 938, + 939, 0, 0, 0, 0, 263, 0, 0, 0, 0, + 940, 0, 941, 942, 943, 944, 945, 946, 947, 948, + 949, 950, 951, 952, 82, 83, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 0, + 0, 88, 953, 0, 0, 0, 90, 0, 0, 214, + 215, 216, 0, 0, 334, 335, 0, 0, 0, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 0, 252, 253, 254, 575, 1384, 1385, 1386, 1387, 1388, + 1389, 1390, 1391, 0, 0, 954, 0, 0, 0, 0, + 0, 0, 1392, 0, 0, 336, 0, 0, 70, 0, + 71, 72, 73, 74, 0, 0, 0, 337, 0, 0, + 77, 0, 0, 0, 78, 217, 218, 0, 0, 0, + 0, 79, 0, 0, 955, 0, 0, 956, 80, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 0, 968, 969, 0, 81, 970, 0, 334, 335, 0, + 0, 219, 220, 0, 221, 338, 0, 0, 0, 222, + 0, 223, 0, 82, 83, 0, 0, 0, 0, 84, + 0, 0, 0, 0, 0, 0, 291, 339, 340, 87, + 88, 0, 0, 89, 0, 90, 0, 0, 336, 0, + 341, 70, 0, 71, 72, 73, 74, 0, 0, 0, + 337, 0, 0, 77, 0, 0, 342, 78, 1504, 765, + 1393, 1394, 1395, 1396, 79, 0, 1397, 1398, 1399, 1400, + 1401, 80, 1402, 1403, 1404, 766, 0, 0, 214, 215, + 216, 0, 0, 506, 507, 0, 0, 81, 0, 767, + 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, + 0, 0, 768, 769, 0, 0, 82, 83, 0, 0, + 0, 0, 84, 0, 0, 0, 0, 0, 770, 0, + 339, 340, 87, 88, 336, 0, 89, 70, 90, 71, + 72, 73, 74, 0, 0, 0, 337, 0, 0, 77, + 0, 0, 0, 78, 217, 218, 0, 0, 771, 342, + 79, 772, 0, 0, 773, 0, 0, 80, 232, 233, + 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, + 774, 0, 0, 81, 0, 240, 0, 0, 0, 0, + 219, 220, 775, 221, 338, 0, 0, 0, 222, 0, + 223, 0, 82, 83, 0, 0, 776, 0, 84, 0, + 70, 1266, 71, 72, 73, 0, 339, 340, 87, 88, + 0, 0, 89, 0, 90, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 240, 0, 0, 0, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, - 254, 1286, 1288, 0, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 847, - 848, 849, 850, 851, 852, 853, 854, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 855, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 1387, 1388, 1389, - 1390, 1391, 1392, 1393, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1394, 0, 0, 0, 0, 0, 0, + 80, 0, 240, 0, 0, 342, 232, 233, 234, 235, + 236, 237, 238, 239, 0, 0, 263, 0, 0, 0, + 0, 0, 0, 240, 232, 233, 234, 235, 236, 237, + 238, 239, 0, 0, 0, 82, 83, 0, 0, 0, + 0, 240, 232, 233, 234, 235, 236, 237, 238, 239, + 0, 0, 88, 0, 0, 0, 0, 90, 0, 240, + 0, 0, 0, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 0, 252, 253, 254, 591, 232, + 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 232, 233, 234, + 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 0, 252, 253, 254, 105, 0, 106, 0, 0, - 107, 108, 0, 0, 0, 0, 0, 0, 109, 110, - 0, 0, 0, 0, 0, 0, 0, 111, 0, 112, - 113, 114, 115, 0, 0, 0, 116, 0, 0, 0, - 0, 117, 0, 0, 856, 857, 858, 859, 860, 861, - 862, 863, 864, 865, 866, 0, 867, 868, 869, 0, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 126, 127, 0, 0, 0, 0, 0, - 128, 129, 67, 68, 130, 131, 457, 0, 458, 132, - 0, 0, 0, 0, 0, 133, 134, 0, 135, 0, - 0, 0, 1396, 1397, 1398, 0, 136, 1399, 1400, 1401, - 1402, 1403, 0, 1404, 1405, 1406, 0, 0, 459, 0, - 0, 0, 69, 0, 0, 70, 0, 71, 72, 73, - 74, 460, 0, 0, 76, 0, 0, 77, 0, 0, - 0, 78, 234, 235, 236, 237, 238, 239, 79, 0, - 0, 0, 0, 0, 0, 80, 0, 240, 1388, 1389, - 1390, 1391, 1392, 1393, 0, 0, 0, 0, 0, 0, - 0, 81, 0, 1394, 1388, 1389, 1390, 1391, 1392, 1393, - 0, 70, 0, 71, 72, 73, 0, 461, 0, 1394, - 82, 83, 0, 0, 0, 0, 84, 0, 1388, 1389, - 1390, 1391, 1392, 1393, 85, 86, 87, 88, 0, 0, - 89, 80, 90, 1394, 1388, 1389, 1390, 1391, 1392, 1393, - 0, 0, 0, 0, 0, 462, 0, 263, 0, 1394, - 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 83, 0, 0, + 251, 0, 252, 253, 254, 679, 0, 0, 0, 0, + 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 0, 252, 253, 254, 757, 0, 0, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 0, 252, 253, 254, 898, 0, 0, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 0, 252, + 253, 254, 1015, 842, 843, 844, 845, 846, 847, 848, + 849, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 850, 0, 0, 0, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 0, 252, 253, 254, 1283, + 0, 0, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 0, 252, 253, 254, 1384, 1385, 1386, + 1387, 1388, 1389, 1390, 1391, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 0, 0, 0, 0, 90, 478, - 479, 480, 0, 0, 0, 0, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 0, 252, 253, 254, - 0, 185, 1396, 1397, 1398, 0, 0, 1399, 1400, 1401, - 1402, 1403, 0, 1404, 1405, 1406, 481, 0, 482, 1397, - 1398, 0, 0, 1399, 1400, 1401, 1402, 1403, 0, 1404, - 1405, 1406, 302, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1398, 217, 218, 1399, 1400, 1401, - 1402, 1403, 0, 1404, 1405, 1406, 0, 0, 0, 302, - 0, 0, 0, 1399, 1400, 1401, 1402, 1403, 0, 1404, - 1405, 1406, 0, 105, 0, 106, 0, 0, 0, 108, - 0, 483, 220, 0, 221, 0, 109, 110, 0, 222, - 0, 223, 0, 0, 0, 0, 0, 112, 113, 114, - 105, 0, 106, 0, 0, 0, 108, 0, 0, 297, - 214, 215, 216, 109, 110, 484, 0, 0, 0, 0, - 0, 0, 0, 0, 112, 296, 114, 0, 0, 0, - 0, 0, 122, 0, 0, 0, 297, 0, 0, 0, - 0, 0, 127, 0, 0, 0, 0, 481, 128, 482, - 0, 0, 130, 131, 394, 67, 68, 0, 0, 122, - 0, 0, 0, 0, 134, 0, 135, 0, 0, 127, - 0, 0, 0, 0, 0, 128, 217, 218, 0, 0, - 131, 0, 0, 1033, 67, 68, 0, 0, 0, 0, - 0, 134, 0, 135, 0, 69, 0, 0, 70, 0, - 71, 72, 73, 74, 75, 0, 0, 76, 0, 0, - 77, 0, 219, 220, 78, 221, 0, 0, 0, 0, - 222, 79, 223, 0, 69, 0, 0, 70, 80, 71, - 72, 73, 74, 75, 0, 0, 76, 0, 0, 77, - 0, 0, 0, 78, 81, 0, 0, 0, 0, 0, - 79, 70, 0, 71, 72, 73, 0, 80, 0, 0, - 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, - 0, 0, 0, 81, 1447, 67, 68, 85, 86, 87, - 88, 80, 0, 89, 0, 90, 0, 0, 0, 0, - 0, 0, 82, 83, 0, 0, 0, 263, 84, 0, - 0, 0, 0, 694, 695, 696, 85, 86, 87, 88, - 0, 0, 89, 0, 90, 69, 82, 83, 70, 0, - 71, 72, 73, 74, 75, 0, 0, 76, 0, 0, - 77, 0, 0, 88, 78, 0, 0, 0, 90, 0, - 0, 79, 0, 0, 0, 0, 0, 70, 80, 71, - 72, 73, 697, 698, 0, 0, 0, 0, 0, 77, - 0, 186, 0, 0, 81, 0, 0, 0, 0, 0, - 79, 694, 695, 696, 0, 0, 0, 80, 0, 0, - 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, - 0, 0, 0, 81, 0, 0, 0, 85, 86, 87, - 88, 0, 0, 89, 0, 90, 0, 0, 0, 0, - 67, 68, 82, 83, 457, 70, 0, 71, 72, 73, - 0, 0, 0, 0, 0, 0, 699, 77, 0, 88, - 0, 0, 89, 0, 90, 0, 0, 0, 79, 67, - 68, 0, 0, 796, 0, 80, 459, 0, 0, 0, - 69, 0, 0, 70, 0, 71, 72, 73, 74, 460, - 0, 81, 76, 0, 0, 77, 0, 0, 0, 78, - 0, 0, 0, 0, 0, 459, 79, 0, 0, 69, - 82, 83, 70, 80, 71, 72, 73, 74, 460, 0, - 0, 76, 0, 0, 77, 0, 0, 88, 78, 81, - 89, 0, 90, 0, 0, 79, 70, 0, 71, 72, - 73, 0, 80, 0, 0, 461, 0, 0, 82, 83, - 0, 0, 0, 0, 84, 0, 0, 0, 81, 0, - 67, 68, 85, 86, 87, 88, 80, 0, 89, 0, - 90, 0, 0, 0, 461, 0, 0, 82, 83, 0, - 0, 0, 263, 84, 214, 215, 216, 0, 0, 67, - 68, 85, 86, 87, 88, 0, 459, 89, 0, 90, - 69, 82, 83, 70, 0, 71, 72, 73, 74, 460, - 0, 0, 76, 0, 0, 77, 0, 0, 88, 78, - 0, 0, 0, 90, 0, 0, 79, 0, 0, 69, - 0, 0, 70, 80, 71, 72, 73, 74, 75, 0, - 0, 76, 0, 0, 77, 0, 191, 0, 78, 81, - 217, 218, 0, 0, 0, 79, 0, 0, 214, 215, - 216, 0, 80, 0, 0, 461, 0, 0, 82, 83, - 0, 0, 0, 0, 84, 67, 68, 0, 81, 0, - 0, 330, 85, 86, 87, 88, 219, 220, 89, 221, - 90, 0, 0, 0, 222, 0, 223, 82, 83, 67, - 68, 0, 0, 84, 0, 0, 0, 0, 0, 0, - 0, 85, 86, 87, 88, 69, 0, 89, 70, 90, - 71, 72, 73, 74, 217, 218, 0, 76, 0, 0, - 77, 0, 0, 0, 78, 0, 0, 0, 0, 69, - 0, 79, 70, 0, 71, 72, 73, 74, 80, 0, - 0, 76, 0, 0, 77, 0, 0, 0, 78, 0, - 219, 220, 0, 221, 81, 79, 0, 0, 222, 0, - 223, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 608, 1269, 0, 82, 83, 67, 1344, 0, 81, 84, - 0, 0, 0, 0, 0, 0, 0, 85, 86, 87, - 88, 0, 0, 89, 0, 90, 0, 82, 83, 0, - 0, 0, 0, 84, 175, 0, 0, 0, 0, 0, - 0, 85, 86, 87, 88, 69, 0, 89, 70, 90, - 71, 72, 73, 74, 517, 0, 0, 76, 0, 0, - 77, 0, 0, 0, 78, 0, 0, 0, 0, 0, - 0, 79, 0, 0, 176, 0, 0, 70, 80, 71, - 72, 73, 74, 998, 0, 0, 177, 0, 0, 77, - 0, 0, 0, 78, 81, 0, 0, 0, 0, 0, - 79, 0, 0, 214, 215, 216, 0, 80, 0, 0, - 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, - 175, 0, 0, 81, 0, 0, 0, 85, 86, 87, - 88, 0, 0, 89, 0, 90, 0, 0, 0, 0, - 0, 0, 82, 83, 67, 0, 0, 0, 84, 0, - 0, 0, 214, 215, 216, 0, 178, 179, 87, 88, - 176, 0, 89, 70, 90, 71, 72, 73, 74, 217, - 218, 0, 177, 0, 0, 77, 0, 0, 0, 78, - 0, 0, 0, 0, 69, 0, 79, 70, 0, 71, - 72, 73, 74, 80, 0, 0, 76, 0, 0, 77, - 0, 0, 0, 78, 0, 219, 220, 0, 221, 81, - 79, 0, 0, 222, 0, 223, 0, 80, 217, 218, - 0, 0, 0, 0, 0, 0, 1269, 0, 82, 83, - 0, 1346, 0, 81, 84, 0, 0, 0, 0, 0, - 0, 0, 178, 179, 87, 88, 0, 0, 89, 0, - 90, 0, 82, 83, 219, 220, 0, 221, 84, 0, - 0, 0, 222, 0, 223, 0, 85, 86, 87, 88, - 0, 105, 89, 106, 90, 1269, 107, 108, 0, 0, - 1348, 0, 0, 0, 109, 110, 0, 0, 0, 0, - 0, 0, 0, 111, 0, 112, 113, 114, 115, 0, - 0, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, - 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, - 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, - 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, - 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, + 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 690, 0, 0, 0, 0, 0, 0, 118, 119, + 0, 0, 234, 235, 236, 237, 238, 239, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 0, + 862, 863, 864, 105, 0, 106, 0, 0, 107, 108, + 0, 0, 0, 0, 0, 0, 109, 110, 0, 0, + 0, 0, 0, 0, 0, 111, 0, 112, 113, 114, + 115, 0, 0, 0, 116, 0, 0, 0, 0, 117, + 0, 0, 1393, 1394, 1395, 1396, 0, 0, 1397, 1398, + 1399, 1400, 1401, 0, 1402, 1403, 1404, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, - 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, - 0, 0, 0, 133, 134, 0, 135, 111, 0, 112, - 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 872, 0, 0, 0, 0, 0, 0, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, - 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, - 109, 110, 0, 0, 0, 133, 134, 0, 135, 111, - 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, - 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 914, 0, 0, 0, 0, - 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, - 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, - 0, 132, 109, 110, 0, 0, 0, 133, 134, 0, - 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, + 125, 126, 127, 0, 0, 0, 0, 0, 128, 129, + 67, 68, 130, 131, 457, 0, 458, 132, 0, 0, + 0, 0, 0, 133, 134, 0, 135, 0, 0, 0, + 0, 0, 0, 0, 136, 0, 0, 0, 244, 245, + 246, 247, 248, 249, 250, 251, 459, 252, 253, 254, + 69, 0, 0, 70, 0, 71, 72, 73, 74, 460, + 0, 0, 76, 0, 0, 77, 0, 0, 0, 78, + 1386, 1387, 1388, 1389, 1390, 1391, 79, 0, 0, 214, + 215, 216, 0, 80, 0, 1392, 1386, 1387, 1388, 1389, + 1390, 1391, 0, 0, 0, 0, 0, 0, 0, 81, + 0, 1392, 1386, 1387, 1388, 1389, 1390, 1391, 0, 0, + 0, 0, 0, 0, 0, 461, 0, 1392, 82, 83, + 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, + 0, 0, 85, 86, 87, 88, 0, 0, 89, 0, + 90, 0, 0, 0, 0, 217, 218, 0, 0, 0, + 0, 0, 0, 462, 0, 0, 0, 0, 463, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 219, 220, 0, 221, 0, 0, 0, 0, 222, + 0, 223, 0, 0, 0, 0, 0, 478, 479, 480, + 0, 0, 1266, 0, 1394, 1395, 1396, 1342, 0, 1397, + 1398, 1399, 1400, 1401, 302, 1402, 1403, 1404, 0, 0, + 0, 1395, 1396, 0, 0, 1397, 1398, 1399, 1400, 1401, + 175, 1402, 1403, 1404, 481, 0, 482, 0, 1396, 0, + 0, 1397, 1398, 1399, 1400, 1401, 0, 1402, 1403, 1404, + 0, 302, 0, 0, 0, 105, 0, 106, 0, 0, + 0, 108, 0, 217, 218, 0, 0, 0, 109, 110, + 176, 0, 0, 70, 0, 71, 72, 73, 74, 112, + 113, 114, 177, 0, 0, 77, 0, 0, 0, 78, + 0, 297, 105, 0, 106, 0, 79, 0, 108, 483, + 220, 0, 221, 80, 0, 109, 110, 222, 0, 223, + 0, 0, 0, 0, 122, 0, 112, 296, 114, 81, + 0, 0, 0, 0, 127, 0, 0, 0, 297, 0, + 128, 0, 0, 484, 130, 131, 0, 0, 82, 83, + 394, 67, 68, 0, 84, 0, 134, 0, 135, 0, + 0, 122, 178, 179, 87, 88, 0, 0, 89, 0, + 90, 127, 0, 0, 0, 0, 0, 128, 0, 1027, + 67, 68, 131, 0, 0, 0, 0, 0, 0, 0, + 0, 69, 0, 134, 70, 135, 71, 72, 73, 74, + 75, 0, 0, 76, 0, 0, 77, 0, 0, 0, + 78, 0, 0, 0, 0, 0, 0, 79, 0, 0, + 69, 0, 0, 70, 80, 71, 72, 73, 74, 75, + 0, 0, 76, 0, 0, 77, 0, 0, 0, 78, + 81, 0, 0, 0, 0, 0, 79, 70, 0, 71, + 72, 73, 0, 80, 0, 0, 0, 0, 0, 82, + 83, 0, 0, 0, 0, 84, 0, 0, 0, 81, + 1447, 67, 68, 85, 86, 87, 88, 80, 0, 89, + 0, 90, 0, 0, 0, 0, 0, 0, 82, 83, + 0, 0, 0, 263, 84, 0, 0, 0, 0, 690, + 691, 692, 85, 86, 87, 88, 0, 0, 89, 0, + 90, 69, 82, 83, 70, 0, 71, 72, 73, 74, + 75, 0, 0, 76, 0, 0, 77, 0, 0, 88, + 78, 0, 0, 0, 90, 0, 0, 79, 0, 0, + 0, 0, 0, 70, 80, 71, 72, 73, 693, 694, + 0, 0, 0, 0, 0, 77, 0, 185, 0, 0, + 81, 0, 0, 0, 0, 0, 79, 690, 691, 692, + 0, 0, 0, 80, 0, 0, 0, 0, 0, 82, + 83, 0, 0, 0, 0, 84, 0, 0, 0, 81, + 0, 0, 0, 85, 86, 87, 88, 0, 0, 89, + 0, 90, 0, 0, 0, 0, 67, 68, 82, 83, + 457, 70, 0, 71, 72, 73, 0, 0, 0, 0, + 0, 0, 695, 77, 0, 88, 0, 0, 89, 0, + 90, 0, 0, 0, 79, 67, 68, 0, 0, 791, + 0, 80, 459, 0, 0, 0, 69, 0, 0, 70, + 0, 71, 72, 73, 74, 460, 0, 81, 76, 0, + 0, 77, 0, 0, 0, 78, 0, 0, 0, 0, + 0, 459, 79, 0, 0, 69, 82, 83, 70, 80, + 71, 72, 73, 74, 460, 0, 0, 76, 0, 0, + 77, 0, 0, 88, 78, 81, 89, 0, 90, 0, + 0, 79, 0, 0, 0, 0, 0, 0, 80, 0, + 0, 461, 0, 0, 82, 83, 0, 0, 0, 0, + 84, 0, 0, 0, 81, 0, 67, 68, 85, 86, + 87, 88, 0, 0, 89, 0, 90, 0, 0, 0, + 461, 0, 0, 82, 83, 0, 0, 0, 0, 84, + 214, 215, 216, 0, 0, 67, 68, 85, 86, 87, + 88, 0, 459, 89, 0, 90, 69, 0, 0, 70, + 0, 71, 72, 73, 74, 460, 0, 0, 76, 0, + 0, 77, 0, 0, 0, 78, 0, 481, 0, 482, + 0, 0, 79, 0, 0, 69, 0, 0, 70, 80, + 71, 72, 73, 74, 75, 0, 0, 76, 0, 0, + 77, 0, 0, 0, 78, 81, 217, 218, 0, 0, + 0, 79, 0, 0, 214, 215, 216, 0, 80, 0, + 0, 461, 0, 0, 82, 83, 0, 0, 0, 0, + 84, 67, 68, 0, 81, 0, 0, 0, 85, 86, + 87, 88, 219, 220, 89, 221, 90, 0, 0, 0, + 222, 0, 223, 82, 83, 67, 68, 0, 0, 84, + 0, 0, 0, 0, 0, 0, 0, 85, 86, 87, + 88, 69, 0, 89, 70, 90, 71, 72, 73, 74, + 217, 218, 0, 76, 0, 70, 77, 71, 72, 73, + 78, 0, 0, 0, 0, 69, 0, 79, 70, 0, + 71, 72, 73, 74, 80, 0, 0, 76, 0, 0, + 77, 0, 0, 0, 78, 80, 219, 220, 0, 221, + 81, 79, 0, 0, 222, 0, 223, 0, 80, 0, + 0, 263, 0, 0, 0, 0, 604, 1266, 0, 82, + 83, 67, 1344, 0, 81, 84, 0, 0, 0, 0, + 82, 83, 0, 85, 86, 87, 88, 0, 0, 89, + 0, 90, 0, 82, 83, 0, 0, 88, 0, 84, + 175, 0, 90, 0, 0, 0, 0, 85, 86, 87, + 88, 69, 0, 89, 70, 90, 71, 72, 73, 74, + 517, 0, 0, 76, 0, 186, 77, 0, 0, 0, + 78, 0, 0, 0, 0, 0, 0, 79, 0, 0, + 176, 0, 0, 70, 80, 71, 72, 73, 74, 992, + 0, 0, 177, 0, 0, 77, 0, 0, 0, 78, + 81, 0, 0, 0, 0, 0, 79, 0, 0, 214, + 215, 216, 0, 80, 70, 0, 71, 72, 73, 82, + 83, 0, 0, 0, 0, 84, 67, 0, 0, 81, + 0, 0, 0, 85, 86, 87, 88, 0, 0, 89, + 0, 90, 0, 0, 80, 0, 0, 0, 82, 83, + 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, + 263, 0, 178, 179, 87, 88, 69, 0, 89, 70, + 90, 71, 72, 73, 74, 217, 218, 0, 76, 82, + 83, 77, 0, 0, 0, 78, 0, 0, 0, 0, + 0, 0, 79, 0, 0, 0, 88, 0, 0, 80, + 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 219, 220, 0, 221, 81, 0, 0, 0, 222, + 0, 223, 0, 0, 191, 0, 0, 0, 0, 0, + 0, 0, 1266, 0, 82, 83, 0, 1346, 0, 105, + 84, 106, 0, 0, 107, 108, 0, 0, 85, 86, + 87, 88, 109, 110, 89, 0, 90, 0, 0, 0, + 0, 111, 0, 112, 113, 114, 115, 0, 0, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1022, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1072, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, @@ -2140,371 +2110,371 @@ static const yytype_int16 yytable[] = 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1291, 0, 0, 0, 0, 0, 0, 118, 119, + 0, 867, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, - 0, 108, 130, 131, 105, 0, 106, 132, 109, 110, - 108, 0, 0, 133, 134, 0, 135, 109, 110, 112, - 296, 114, 0, 0, 136, 0, 116, 0, 112, 113, - 114, 297, 0, 0, 0, 116, 0, 0, 0, 0, - 297, 0, 0, 1430, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, - 0, 0, 0, 122, 127, 0, 0, 0, 0, 0, - 128, 0, 0, 127, 0, 131, 0, 0, 0, 128, - 0, 0, 0, 130, 131, 133, 134, 105, 135, 106, - 0, 0, 107, 108, 133, 134, 0, 135, 0, 0, - 109, 110, 0, -148, 0, 0, 0, 0, 0, 111, - 0, 112, 113, 114, 115, 105, 0, 106, 116, 0, - 0, 108, 0, 117, 105, 0, 106, 0, 109, 110, - 108, 0, 0, 0, 0, 0, 0, 109, 110, 112, - 296, 114, 118, 119, 120, 121, 122, 123, 112, 296, - 114, 297, 0, 124, 125, 126, 127, 0, 0, 0, - 297, 0, 128, 129, 0, 0, 130, 131, 0, 0, - 0, 132, 0, 0, 122, 308, 0, 133, 134, 0, - 135, 0, 0, 122, 127, 0, 0, 0, 0, 0, - 128, 0, 0, 127, 0, 131, 0, 0, 0, 128, - 0, 0, 0, 0, 131, 0, 134, 0, 135, 0, - 0, 0, 0, 0, 0, 134, 0, 135 + 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, + 0, 0, 0, 133, 134, 0, 135, 111, 0, 112, + 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, + 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 909, 0, 0, 0, 0, 0, 0, + 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, + 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, + 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, + 109, 110, 0, 0, 0, 133, 134, 0, 135, 111, + 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, + 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1016, 0, 0, 0, 0, + 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, + 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, + 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, + 0, 132, 109, 110, 0, 0, 0, 133, 134, 0, + 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, + 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1066, 0, 0, + 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, + 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, + 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, + 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, + 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, + 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, + 0, 70, 0, 71, 72, 73, 0, 0, 0, 1288, + 0, 0, 0, 262, 0, 0, 118, 119, 120, 121, + 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, + 127, 80, 0, 0, 0, 0, 128, 129, 0, 0, + 130, 131, 0, 0, 105, 132, 106, 263, 0, 0, + 108, 133, 134, 0, 135, 0, 0, 109, 110, 0, + 0, 0, 136, 0, 0, 0, 82, 83, 112, 296, + 114, 0, 0, 0, 0, 116, 0, 0, 0, 0, + 297, 1430, 0, 88, 0, 0, 0, 0, 90, 0, + 0, 0, 0, 0, 0, 0, 105, 0, 106, 0, + 0, 0, 108, 122, 0, 0, 0, 0, 0, 109, + 110, 174, 0, 127, 0, 0, 0, 0, 0, 128, + 112, 113, 114, 0, 131, 0, 0, 116, 0, 0, + 0, 0, 297, 0, 133, 134, 105, 135, 106, 0, + 0, 107, 108, 0, 0, 0, 0, 0, 0, 109, + 110, 0, -149, 0, 0, 122, 0, 0, 111, 0, + 112, 113, 114, 115, 0, 127, 0, 116, 0, 0, + 0, 128, 117, 0, 0, 130, 131, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 133, 134, 0, 135, + 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, + 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, + 106, 128, 129, 0, 108, 130, 131, 105, 0, 106, + 132, 109, 110, 108, 0, 0, 133, 134, 0, 135, + 109, 110, 112, 296, 114, 0, 0, 0, 0, 0, + 0, 112, 296, 114, 297, 0, 0, 0, 0, 0, + 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 122, 308, 0, + 0, 0, 0, 0, 0, 0, 122, 127, 0, 0, + 0, 0, 0, 128, 0, 0, 127, 0, 131, 0, + 0, 0, 128, 0, 0, 0, 0, 131, 0, 134, + 0, 135, 0, 0, 0, 0, 0, 0, 134, 0, + 135 }; static const yytype_int16 yycheck[] = { - 1, 61, 113, 130, 130, 92, 477, 928, 295, 490, - 140, 587, 140, 660, 528, 44, 508, 15, 709, 140, - 182, 146, 15, 6, 752, 8, 44, 461, 586, 15, - 98, 315, 614, 146, 13, 459, 59, 0, 605, 164, - 15, 328, 164, 147, 147, 149, 150, 151, 152, 147, - 154, 164, 156, 15, 158, 15, 490, 481, 10, 11, - 12, 62, 44, 166, 76, 489, 624, 795, 76, 164, - 174, 169, 13, 714, 15, 164, 17, 635, 147, 164, - 150, 185, 186, 6, 33, 8, 76, 191, 192, 147, - 91, 92, 150, 164, 33, 165, 155, 166, 99, 75, - 33, 147, 125, 744, 745, 155, 747, 748, 749, 750, - 718, 140, 720, 721, 722, 723, 724, 150, 155, 60, - 166, 147, 140, 164, 771, 146, 164, 148, 149, 150, - 64, 65, 165, 147, 146, 155, 712, 149, 146, 715, - 166, 149, 10, 11, 12, 146, 147, 76, 149, 150, - 151, 152, 166, 154, 147, 156, 146, 158, 140, 149, - 112, 75, 81, 82, 83, 295, 146, 295, 166, 88, - 257, 258, 147, 174, 295, 13, 164, 15, 164, 17, - 159, 182, 616, 166, 185, 186, 273, 274, 149, 351, - 191, 192, 164, 253, 324, 753, 324, 149, 328, 140, - 328, 149, 164, 324, 164, 147, 164, 328, 76, 77, - 149, 692, 496, 154, 163, 164, 165, 146, 159, 164, - 149, 289, 60, 164, 166, 164, 165, 228, 165, 166, - 163, 164, 165, 791, 792, 150, 147, 521, 805, 164, - 147, 147, 164, 147, 112, 113, 147, 115, 815, 149, - 165, 147, 120, 166, 122, 166, 257, 258, 899, 166, - 166, 753, 166, 165, 166, 166, 295, 10, 11, 12, - 166, 272, 273, 274, 275, 276, 277, 295, 143, 144, - 145, 282, 350, 387, 755, 165, 166, 206, 207, 208, - 209, 61, 147, 934, 164, 324, 147, 905, 166, 328, - 147, 277, 140, 108, 109, 110, 324, 112, 113, 114, - 328, 166, 117, 295, 315, 166, 154, 122, 147, 166, - 164, 159, 127, 128, 147, 130, 131, 132, 147, 134, - 135, 164, 165, 76, 77, 149, 147, 166, 896, 915, - 147, 150, 324, 166, 263, 912, 328, 166, 772, 164, - 351, 998, 147, 165, 788, 166, 643, 147, 164, 166, - 644, 147, 338, 277, 148, 846, 150, 164, 287, 112, - 113, 166, 115, 164, 165, 166, 166, 120, 148, 122, - 166, 164, 6, 153, 8, 155, 387, 157, 164, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 896, 919, 407, 691, 1329, 13, - 147, 15, 846, 17, 184, 997, 164, 984, 188, 189, - 190, 159, 165, 10, 11, 12, 13, 149, 1004, 166, - 17, 164, 165, 166, 1010, 1011, 146, 147, 33, 440, - 164, 165, 166, 444, 445, 446, 447, 448, 1006, 1007, - 518, 164, 10, 11, 12, 13, 60, 458, 164, 17, - 164, 462, 463, 165, 166, 533, 467, 164, 536, 470, - 146, 164, 148, 60, 150, 164, 505, 164, 10, 11, - 12, 113, 114, 115, 460, 461, 165, 166, 1002, 490, - 164, 296, 297, 164, 165, 496, 164, 302, 268, 146, - 164, 148, 60, 150, 505, 164, 165, 1089, 164, 164, - 1092, 164, 164, 643, 490, 643, 164, 518, 164, 1095, - 521, 1249, 643, 164, 111, 112, 164, 20, 21, 22, - 23, 146, 165, 148, 164, 150, 140, 164, 164, 48, - 33, 517, 147, 164, 76, 77, 460, 461, 146, 164, - 154, 164, 155, 140, 112, 159, 164, 146, 477, 148, - 164, 150, 157, 158, 159, 160, 161, 154, 163, 164, - 165, 164, 159, 148, 147, 167, 490, 164, 166, 156, - 112, 113, 140, 115, 166, 586, 587, 588, 120, 873, - 122, 22, 23, 156, 166, 166, 154, 598, 166, 166, - 166, 159, 33, 147, 605, 137, 164, 166, 609, 166, - 166, 587, 672, 614, 643, 166, 386, 618, 619, 620, - 621, 622, 623, 624, 1315, 643, 22, 23, 166, 147, - 166, 660, 608, 166, 635, 166, 166, 33, 166, 166, - 616, 709, 660, 644, 645, 166, 714, 166, 15, 166, - 718, 166, 720, 721, 722, 723, 724, 156, 166, 166, - 166, 643, 155, 156, 157, 158, 159, 160, 161, 698, - 163, 164, 165, 587, 166, 166, 744, 745, 660, 747, - 748, 749, 750, 488, 156, 1261, 166, 1263, 166, 166, - 691, 1419, 1420, 1421, 608, 33, 164, 757, 758, 166, - 166, 165, 616, 704, 159, 765, 165, 767, 467, 166, - 149, 712, 164, 167, 715, 166, 33, 718, 2, 720, - 721, 722, 723, 724, 146, 148, 157, 158, 159, 160, - 161, 732, 163, 164, 165, 147, 712, 147, 147, 715, - 741, 1323, 771, 513, 1320, 147, 164, 164, 149, 164, - 520, 752, 753, 771, 48, 882, 882, 1339, 1340, 1341, - 1241, 157, 158, 159, 160, 161, 164, 163, 164, 165, - 164, 882, 56, 57, 58, 59, 60, 166, 166, 63, - 166, 551, 164, 553, 159, 555, 159, 146, 789, 771, - 791, 792, 169, 1521, 795, 48, 76, 798, 712, 164, - 1528, 715, 155, 33, 805, 155, 155, 1241, 868, 155, - 164, 166, 788, 10, 815, 10, 10, 921, 922, 157, - 158, 159, 160, 161, 825, 163, 164, 165, 10, 1411, - 148, 899, 156, 1409, 1416, 147, 755, 905, 148, 159, - 1422, 1423, 159, 160, 161, 166, 163, 164, 165, 148, - 609, 159, 166, 148, 883, 148, 167, 468, 167, 148, - 619, 620, 621, 622, 623, 166, 934, 159, 166, 166, - 846, 146, 873, 169, 788, 166, 164, 682, 683, 164, - 881, 272, 273, 274, 275, 276, 887, 888, 889, 890, - 891, 892, 893, 164, 1476, 896, 164, 166, 1474, 1266, - 1267, 1268, 672, 1417, 905, 165, 190, 165, 165, 149, - 164, 912, 999, 164, 915, 147, 166, 150, 147, 147, - 921, 922, 159, 166, 166, 1507, 1030, 928, 167, 159, - 160, 161, 846, 163, 164, 165, 147, 10, 1520, 915, - 165, 4, 166, 169, 147, 704, 48, 164, 232, 233, - 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 998, - 254, 169, 164, 169, 146, 259, 147, 1344, 166, 1346, - 998, 1348, 156, 984, 1351, 1352, 1353, 156, 156, 166, - 1274, 166, 156, 166, 10, 148, 997, 10, 999, 610, - 10, 915, 10, 1004, 148, 1006, 1007, 147, 164, 1010, - 1011, 295, 169, 167, 166, 166, 998, 167, 167, 630, - 631, 632, 633, 634, 169, 167, 15, 166, 1004, 1030, - 789, 166, 166, 164, 1010, 1011, 164, 166, 322, 798, - 164, 10, 11, 12, 166, 10, 11, 12, 13, 440, - 15, 164, 17, 444, 445, 446, 447, 448, 828, 829, - 830, 166, 832, 164, 834, 835, 836, 458, 10, 11, - 12, 462, 463, 1074, 155, 155, 155, 882, 155, 164, - 166, 15, 1083, 166, 146, 10, 10, 148, 1089, 148, - 1004, 1092, 166, 704, 1095, 60, 1010, 1011, 166, 166, - 384, 148, 10, 148, 164, 147, 156, 76, 77, 10, - 11, 12, 13, 166, 166, 166, 17, 401, 402, 1095, - 156, 167, 881, 166, 408, 10, 11, 12, 156, 888, - 889, 890, 891, 892, 76, 77, 166, 166, 156, 166, - 10, 167, 148, 112, 113, 10, 115, 112, 148, 164, - 164, 120, 164, 122, 148, 166, 148, 164, 920, 60, - 307, 166, 166, 1250, 166, 646, 1244, 1315, 328, 883, - 112, 113, 698, 115, 1084, 140, 1244, 1241, 120, 790, - 122, 1095, 1074, 846, 1275, 154, 470, 328, 1204, 154, - 159, 76, 77, 406, 159, -1, 807, -1, -1, 164, - -1, -1, -1, 1204, -1, -1, -1, 598, 150, -1, - -1, 112, 154, -1, -1, -1, -1, 159, -1, 16, - 17, 18, 19, 20, 21, 22, 23, 112, 113, -1, - 115, -1, 516, -1, -1, 120, 33, 122, -1, 140, - 1241, -1, -1, -1, -1, -1, 530, 1315, 1249, 1250, - -1, 1311, -1, 154, -1, -1, -1, -1, 159, -1, - 1261, -1, 1263, -1, 149, 1241, -1, -1, -1, -1, - 881, -1, -1, 1274, -1, -1, -1, 888, 889, 890, - 891, 892, -1, -1, -1, 1261, -1, 1263, -1, 18, - 19, 20, 21, 22, 23, -1, -1, 1357, 1358, -1, - 1360, -1, 1362, -1, 33, -1, -1, 591, -1, -1, - -1, -1, 1082, -1, -1, -1, -1, -1, -1, 1320, - -1, 605, 1323, -1, 1083, -1, -1, 1241, 1329, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1339, 1340, - 1341, -1, -1, -1, 1320, 1405, -1, 1261, -1, 1263, - -1, -1, 149, -1, 151, 152, 153, 154, -1, 643, - 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, - 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, - -1, 62, -1, 33, 668, 669, 670, 671, -1, 673, - -1, -1, -1, -1, -1, -1, 1306, 1307, 1308, 1309, - 1310, -1, 1312, -1, 85, -1, 1320, -1, 1409, -1, - 1411, -1, -1, -1, -1, 1416, -1, -1, 1419, 1420, - 1421, 1422, 1423, -1, 105, 154, 155, 156, 157, 158, - 159, 160, 161, 1409, 163, 164, 165, -1, -1, -1, - -1, -1, 123, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 133, -1, 1514, 1515, 1516, 741, 1518, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1083, 1474, -1, 1476, 1386, 1387, 1388, 1389, - 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, - 1400, 1401, 1402, 1403, 1404, 1409, -1, 178, 1474, -1, - 181, -1, -1, -1, -1, -1, 1507, 157, 158, 159, - 160, 161, -1, 163, 164, 165, -1, -1, -1, 1520, - 1521, 805, -1, -1, -1, -1, -1, 1528, -1, -1, - -1, 815, -1, -1, -1, 819, -1, -1, -1, -1, - 1450, 1311, -1, -1, 225, 226, -1, -1, -1, -1, - -1, -1, 836, -1, -1, -1, -1, -1, -1, -1, - 1474, -1, -1, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, - 864, 865, 866, 867, -1, 869, -1, -1, -1, -1, - 271, -1, -1, 1503, 1306, 1307, 1308, 1309, 1310, -1, - 1312, 1371, 1372, 1373, 1374, -1, 1376, 1377, 289, 17, - 291, -1, -1, -1, -1, -1, -1, -1, 18, 19, - 20, 21, 22, 23, -1, 33, -1, 308, 912, 310, - 311, 312, 313, 33, -1, -1, -1, -1, -1, 47, - 10, 11, 12, -1, 928, -1, -1, -1, -1, 330, - -1, -1, 60, 61, -1, -1, -1, -1, 339, -1, - -1, 342, -1, -1, -1, -1, -1, -1, 76, 350, - -1, -1, -1, -1, 1386, 1387, 1388, 1389, 1390, 1391, + 1, 61, 315, 113, 490, 705, 92, 130, 44, 130, + 922, 601, 147, 461, 149, 150, 151, 152, 656, 154, + 182, 156, 747, 158, 727, 508, 477, 140, 13, 295, + 76, 44, 76, 15, 583, 15, 44, 140, 459, 174, + 140, 6, 490, 8, 15, 15, 710, 0, 76, 15, + 185, 186, 81, 82, 83, 147, 191, 192, 15, 88, + 481, 62, 328, 582, 76, 790, 147, 714, 489, 716, + 717, 718, 719, 720, 147, 739, 740, 169, 742, 743, + 744, 745, 150, 155, 150, 166, 59, 33, 147, 147, + 91, 92, 147, 166, 10, 11, 12, 165, 99, 165, + 146, 620, 146, 149, 140, 149, 147, 166, 166, 149, + 147, 166, 631, 33, 147, 10, 11, 12, 146, 164, + 150, 149, 147, 147, 147, 166, 164, 140, 766, 166, + 164, 165, 140, 166, 146, 165, 146, 149, 148, 75, + 150, 166, 166, 166, 147, 146, 147, 33, 149, 150, + 151, 152, 125, 154, 164, 156, 6, 158, 8, 708, + 76, 77, 711, 166, 612, 147, 147, 164, 6, 150, + 8, 257, 258, 174, 159, 33, 147, 206, 207, 208, + 209, 182, 295, 496, 185, 186, 166, 273, 274, 351, + 191, 192, 295, 253, 164, 295, 112, 113, 164, 115, + 164, 166, 688, 149, 120, 164, 122, 164, 521, 164, + 800, 324, 75, 147, 147, 328, 147, 112, 164, 165, + 810, 324, 164, 147, 324, 328, 155, 228, 328, 748, + 894, 146, 166, 166, 263, 166, 147, 272, 273, 274, + 275, 276, 166, 163, 164, 165, 467, 147, 155, 164, + 166, 147, 387, 900, 149, 166, 257, 258, 287, 295, + 610, 62, 146, 164, 928, 748, 166, 786, 787, 146, + 166, 272, 273, 274, 275, 276, 277, 163, 164, 165, + 164, 282, 295, 148, 85, 150, 164, 295, 324, 164, + 147, 164, 328, 996, 147, 143, 144, 145, 164, 750, + 147, 159, 160, 161, 105, 163, 164, 165, 164, 166, + 33, 324, 147, 166, 315, 328, 324, 907, 147, 166, + 328, 146, 123, 148, 149, 150, 146, 640, 148, 166, + 150, 166, 133, 164, 146, 783, 148, 166, 150, 165, + 166, 277, 164, 108, 109, 110, 767, 112, 113, 114, + 351, 164, 117, 164, 992, 841, 13, 122, 15, 164, + 17, 910, 127, 128, 164, 130, 131, 132, 164, 134, + 135, 164, 891, 639, 687, 165, 166, 178, 164, 146, + 181, 148, 164, 150, 605, 164, 387, 164, 978, 164, + 1093, 165, 166, 841, 615, 616, 617, 618, 619, 155, + 164, 165, 166, 60, 164, 440, 407, 164, 891, 444, + 445, 446, 447, 448, 277, 1327, 13, 164, 15, 164, + 17, 64, 65, 458, 225, 226, 164, 462, 463, 13, + 164, 15, 164, 17, 157, 158, 159, 160, 161, 440, + 163, 164, 165, 444, 445, 446, 447, 448, 477, 998, + 164, 165, 166, 165, 166, 1004, 1005, 458, 164, 165, + 166, 462, 463, 60, 165, 166, 467, 164, 165, 470, + 271, 113, 114, 115, 164, 338, 60, 146, 147, 700, + 164, 1000, 1001, 140, 10, 11, 12, 164, 289, 490, + 291, 164, 505, 164, 165, 496, 149, 154, 149, 149, + 164, 164, 159, 164, 505, 164, 164, 308, 149, 310, + 311, 312, 313, 150, 159, 48, 165, 518, 165, 147, + 521, 1246, 146, 155, 460, 461, 639, 148, 164, 330, + 164, 296, 297, 164, 164, 147, 639, 302, 339, 639, + 1089, 342, 167, 140, 166, 15, 166, 166, 166, 350, + 76, 77, 166, 166, 490, 868, 140, 154, 156, 594, + 166, 156, 159, 784, 166, 166, 166, 164, 147, 147, + 154, 156, 793, 166, 166, 159, 166, 166, 166, 166, + 164, 582, 583, 584, 166, 166, 112, 113, 389, 115, + 166, 166, 393, 594, 120, 166, 122, 460, 461, 166, + 601, 166, 166, 639, 605, 406, 166, 166, 668, 610, + 166, 156, 1312, 614, 615, 616, 617, 618, 619, 620, + 656, 159, 166, 166, 150, 166, 639, 490, 154, 164, + 631, 639, 166, 159, 166, 165, 165, 164, 166, 640, + 641, 991, 443, 656, 167, 149, 166, 583, 656, 146, + 164, 147, 147, 147, 517, 876, 147, 164, 459, 148, + 166, 149, 883, 884, 885, 886, 887, 166, 604, 48, + 471, 164, 10, 11, 12, 13, 612, 164, 164, 17, + 481, 694, 166, 164, 159, 159, 687, 169, 489, 146, + 48, 76, 752, 753, 1419, 1420, 1421, 164, 164, 700, + 760, 155, 762, 155, 155, 2, 155, 708, 166, 1258, + 711, 1260, 10, 714, 1417, 716, 717, 718, 719, 720, + 583, 750, 60, 488, 10, 10, 61, 10, 148, 156, + 766, 532, 733, 1083, 147, 736, 1086, 148, 159, 167, + 166, 604, 159, 166, 148, 148, 747, 748, 166, 612, + 159, 17, 1238, 766, 877, 146, 877, 164, 766, 56, + 57, 58, 59, 60, 166, 166, 63, 877, 1317, 166, + 169, 164, 708, 165, 112, 711, 164, 164, 149, 165, + 581, 47, 165, 784, 166, 786, 787, 164, 164, 790, + 1238, 166, 793, 147, 60, 61, 147, 1522, 147, 800, + 150, 166, 140, 863, 1529, 166, 159, 167, 165, 810, + 76, 148, 148, 148, 147, 167, 154, 10, 153, 820, + 155, 159, 157, 624, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 166, + 106, 642, 4, 109, 169, 708, 112, 783, 711, 184, + 48, 147, 164, 188, 189, 190, 1077, 468, 1407, 169, + 164, 169, 128, 147, 146, 878, 166, 868, 156, 156, + 10, 166, 166, 166, 140, 876, 156, 156, 148, 33, + 10, 882, 883, 884, 885, 886, 887, 888, 154, 1024, + 891, 10, 10, 190, 148, 147, 164, 698, 169, 900, + 22, 23, 166, 15, 167, 841, 907, 993, 169, 910, + 167, 33, 155, 678, 679, 166, 166, 166, 164, 164, + 783, 922, 166, 164, 166, 1474, 164, 166, 729, 164, + 155, 155, 155, 268, 164, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 992, 254, 1271, 98, + 1095, 1096, 259, 166, 146, 167, 767, 167, 10, 166, + 1320, 166, 166, 148, 910, 166, 166, 978, 841, 992, + 20, 21, 22, 23, 992, 10, 10, 1337, 1338, 1339, + 991, 148, 993, 33, 164, 606, 148, 998, 295, 1000, + 1001, 148, 166, 1004, 1005, 159, 160, 161, 166, 163, + 164, 165, 15, 147, 167, 626, 627, 628, 629, 630, + 166, 166, 166, 1024, 156, 322, 10, 11, 12, 156, + 156, 166, 156, 166, 148, 157, 158, 159, 160, 161, + 10, 163, 164, 165, 167, 10, 148, 910, 164, 164, + 148, 386, 1094, 10, 11, 12, 13, 164, 166, 1409, + 17, 164, 998, 148, 1241, 166, 1416, 1068, 1004, 1005, + 166, 166, 1422, 1423, 307, 1312, 1077, 694, 879, 642, + 328, 878, 1083, 1238, 1068, 1086, 841, 384, 1089, 700, + 1272, 328, 76, 77, 1095, 1096, 1205, 406, -1, -1, + -1, -1, -1, 60, 401, 402, 10, 11, 12, 13, + -1, 408, 877, 17, -1, 155, 156, 157, 158, 159, + 160, 161, -1, 163, 164, 165, 1476, -1, 112, 113, + -1, 115, -1, -1, -1, 998, 120, -1, 122, -1, + -1, 1004, 1005, -1, -1, -1, -1, -1, -1, -1, + 289, -1, -1, 1089, 111, 112, 60, -1, 1508, -1, + -1, 1247, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1521, -1, 470, 785, 1263, 1264, 1265, 513, -1, + -1, 165, -1, 140, -1, 520, -1, -1, -1, -1, + -1, 802, -1, -1, 995, -1, -1, 154, -1, -1, + -1, -1, 159, -1, 1205, -1, -1, 164, 112, -1, + -1, 350, 547, -1, 549, -1, 551, -1, -1, 516, + -1, -1, -1, -1, -1, 1026, 1089, -1, -1, 526, + -1, -1, -1, -1, -1, -1, 140, 1238, -1, -1, + -1, -1, 10, 11, 12, 1246, 1247, -1, 1308, -1, + 154, -1, -1, -1, 1342, 159, 1344, 1258, 1346, 1260, + 164, 1349, 1350, 1351, -1, 876, -1, -1, -1, -1, + 1271, -1, 883, 884, 885, 886, 887, -1, -1, -1, + 10, 11, 12, 13, -1, 15, -1, 17, -1, -1, + 587, -1, -1, 1094, -1, 1355, 1356, -1, 1358, -1, + 1360, -1, 1238, 11, 601, -1, -1, -1, 76, 77, + -1, -1, -1, -1, -1, -1, 1317, -1, -1, 1320, + -1, -1, 1258, -1, 1260, -1, 1327, -1, -1, -1, + 60, -1, -1, 668, -1, -1, 1337, 1338, 1339, -1, + -1, -1, 639, 1403, 112, 113, 54, 115, 56, 57, + 58, -1, 120, 33, 122, -1, -1, -1, -1, 18, + 19, 20, 21, 22, 23, -1, -1, 664, 665, 666, + 667, -1, 669, -1, 33, 1238, 84, -1, -1, 518, + -1, 1317, 112, -1, -1, -1, 154, 1078, 22, 23, + 529, 159, 100, 532, -1, 1258, -1, 1260, -1, 33, + -1, -1, -1, -1, -1, -1, 1407, -1, 1409, -1, + 140, 119, 120, -1, -1, 1416, -1, -1, 1419, 1420, + 1421, 1422, 1423, -1, 154, -1, -1, -1, 136, 159, + -1, -1, -1, 141, 164, -1, -1, -1, -1, 736, + -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, + 20, 21, 22, 23, 1317, 1515, 1516, 1517, -1, 1519, + -1, -1, -1, 33, -1, 1266, 1077, -1, -1, -1, + -1, 1407, -1, 1474, -1, 1476, -1, 157, 158, 159, + 160, 161, -1, 163, 164, 165, -1, -1, 823, 824, + 825, -1, 827, -1, 829, 830, 831, -1, 157, 158, + 159, 160, 161, 800, 163, 164, 165, 1508, -1, 20, + 21, 22, 23, 810, -1, -1, -1, 814, -1, -1, + 1521, 1522, 33, 157, 158, 159, 160, 161, 1529, 163, + 164, 165, -1, -1, 831, -1, -1, -1, 1474, -1, + -1, -1, -1, -1, 1407, 842, 843, 844, 845, 846, + 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, + 857, 858, 859, 860, 861, 862, 705, 864, -1, -1, + -1, 710, 10, 11, 12, 714, -1, 716, 717, 718, + 719, 720, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, 164, 165, -1, -1, -1, -1, + 739, 740, -1, 742, 743, 744, 745, -1, -1, -1, + 907, 1474, 1303, 1304, 1305, 1306, 1307, -1, 1309, -1, + -1, -1, -1, -1, -1, 922, -1, -1, -1, -1, + -1, 1303, 1304, 1305, 1306, 1307, -1, 1309, 76, 77, + -1, -1, -1, -1, -1, 1446, 157, 158, 159, 160, + 161, -1, 163, 164, 165, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, -1, -1, 107, + -1, -1, 33, -1, 112, 113, -1, 115, -1, -1, + -1, 978, 120, 980, 122, -1, -1, -1, -1, -1, + -1, -1, -1, 1384, 1385, 1386, 1387, 1388, 1389, 1390, + 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, + 1401, 1402, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, - 1402, 1403, 1404, -1, -1, -1, -1, -1, 106, -1, - 984, 109, 986, -1, 112, -1, 76, 77, 389, -1, - -1, -1, 393, -1, -1, -1, -1, -1, -1, -1, - 128, -1, -1, -1, -1, 406, -1, -1, -1, -1, - -1, -1, 140, -1, -1, -1, -1, -1, 1450, -1, - -1, -1, 112, 113, -1, 115, 154, -1, -1, -1, - 120, -1, 122, -1, 1038, 155, 156, 157, 158, 159, - 160, 161, 443, 163, 164, 165, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 146, -1, 459, 3, - 4, 5, 6, -1, 8, 9, 10, 11, 12, -1, - 471, 1503, -1, -1, -1, -1, -1, -1, -1, -1, - 481, -1, -1, -1, -1, -1, -1, -1, 489, -1, - -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, - 22, 23, -1, -1, -1, -1, 50, 51, -1, -1, - 54, 33, 56, 57, 58, 59, 60, -1, 62, 63, - -1, -1, 66, 67, 525, -1, 70, -1, -1, -1, - -1, 75, 76, 77, -1, 536, -1, 81, -1, -1, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, - -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, - -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, - 124, 125, -1, -1, 585, 129, -1, -1, 132, 133, - 134, 135, 136, -1, -1, 139, -1, 141, -1, -1, - 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, - 154, -1, 15, 157, 158, 159, -1, -1, 162, -1, - 164, 165, -1, -1, 168, -1, -1, 628, -1, -1, - 1234, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, 47, 646, -1, 50, 51, -1, - -1, 54, -1, 56, 57, 58, 59, 60, -1, 62, - 63, -1, -1, 66, 67, -1, -1, 70, -1, -1, - -1, -1, 75, 76, 77, -1, -1, -1, -1, -1, - -1, 84, -1, -1, 1288, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 100, -1, -1, - -1, 702, -1, -1, -1, 108, -1, 110, -1, 112, - -1, -1, -1, 116, 117, -1, 119, 120, 121, -1, - -1, 124, 125, -1, -1, 1329, 129, -1, -1, 132, - 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 154, -1, -1, 157, 158, -1, -1, -1, 162, - -1, 164, -1, -1, -1, 168, -1, -1, -1, -1, - -1, 772, -1, -1, -1, -1, -1, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, -1, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - -1, -1, 1406, -1, -1, -1, -1, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, -1, -1, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, -1, 70, -1, 72, 73, 74, 75, - 76, 77, 78, 79, 80, -1, 82, 83, 84, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 100, -1, -1, -1, -1, -1, - 106, 107, 108, 884, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, -1, -1, 920, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, -1, -1, -1, -1, -1, 16, - 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1001, -1, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, -1, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, - -1, 1032, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, -1, -1, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, -1, 70, - -1, 72, 73, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, 100, - -1, -1, 169, -1, -1, 106, 107, 108, -1, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, -1, -1, -1, 146, 147, 148, 149, 150, + 1402, -1, -1, -1, -1, 1032, -1, -1, -1, -1, + -1, 1076, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 894, -1, -1, -1, 1450, + -1, 900, -1, 3, 4, 5, 6, -1, 8, 9, + 10, 11, 12, -1, -1, -1, -1, -1, 1450, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 928, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, -1, 168, 169, 3, - 4, 5, 6, -1, 8, 9, 10, 11, -1, -1, + 161, -1, 163, 164, 165, -1, -1, -1, 169, -1, + 50, 51, -1, 1504, 54, -1, 56, 57, 58, 59, + 60, -1, 62, 63, -1, -1, 66, 67, -1, -1, + 70, -1, 1504, -1, -1, 75, 76, 77, 10, 11, + 12, 81, -1, -1, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 18, 19, 20, 21, 22, 23, -1, 108, -1, + 110, -1, 112, -1, -1, -1, 33, 117, -1, 119, + 120, 121, -1, -1, 124, 125, -1, -1, -1, 129, + -1, -1, 132, 133, 134, 135, 136, -1, -1, 139, + -1, 141, -1, -1, 76, 77, 16, 17, 18, 19, + 20, 21, 22, 23, 154, -1, -1, 157, 158, 159, + -1, -1, 162, 33, 164, 165, -1, -1, 168, -1, + -1, -1, -1, -1, 1231, -1, -1, -1, -1, -1, + 112, 113, -1, 115, -1, -1, -1, -1, 120, -1, + 122, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 10, 11, 12, -1, -1, + -1, -1, -1, 1308, -1, -1, -1, 149, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1285, -1, + -1, -1, -1, -1, -1, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, - -1, -1, -1, -1, -1, -1, 50, 51, 33, -1, - 54, -1, 56, 57, 58, 59, -1, -1, 62, 63, - -1, -1, 66, 67, -1, -1, 70, -1, -1, -1, - -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, -1, 1269, -1, - -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, - -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, - 124, 125, -1, -1, -1, 129, -1, -1, 132, 133, - 134, 135, 136, -1, -1, 139, -1, 141, 3, 4, - 5, 6, -1, 8, 9, 10, 11, -1, -1, -1, - 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, - 164, 165, -1, -1, 168, -1, 151, 152, 153, 154, + -1, -1, -1, 18, 19, 20, 21, 22, 23, -1, + 1327, 76, 77, -1, 1369, 1370, 1371, 1372, 33, 1374, + 1375, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, 164, 165, -1, -1, -1, 169, + -1, -1, -1, -1, -1, -1, -1, 112, 113, -1, + 115, -1, -1, -1, -1, 120, -1, 122, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 146, 1241, -1, -1, -1, -1, 1404, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, -1, -1, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, -1, 70, -1, 72, 73, 74, + 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, - 165, -1, -1, -1, 169, 50, -1, -1, -1, 54, - -1, 56, 57, 58, -1, -1, -1, 62, -1, 64, - 65, 66, 67, -1, -1, -1, 17, -1, -1, -1, - 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 47, -1, -1, -1, - -1, -1, -1, 108, -1, 110, -1, 112, -1, 60, - 61, -1, 117, -1, 119, 120, 121, -1, -1, 124, - -1, -1, -1, -1, 129, 76, -1, 132, -1, -1, - -1, 136, -1, -1, -1, 1446, 141, 3, 4, 5, - 6, 146, 8, 9, 10, 11, -1, -1, -1, 154, - -1, -1, 157, 158, 159, 106, -1, 162, 109, 164, - 165, 112, -1, 168, -1, -1, -1, -1, 16, 17, - 18, 19, 20, 21, 22, 23, -1, 128, -1, -1, - -1, -1, -1, -1, 50, 33, -1, -1, 54, 140, - 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, - 66, 67, -1, 154, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, - -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, - -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, - -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, - 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, - -1, 10, 11, 12, -1, -1, -1, -1, 154, -1, - -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, - 166, -1, 168, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, -1, 163, 164, 165, 50, 51, - -1, 169, 54, -1, 56, 57, 58, -1, -1, -1, - 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, - -1, -1, -1, 75, 76, 77, -1, 76, 77, 81, + 165, -1, -1, 1312, -1, 100, -1, -1, -1, -1, + -1, 106, 107, 108, -1, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, -1, -1, + -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, -1, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, + -1, -1, -1, -1, -1, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, -1, -1, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, -1, 70, -1, 72, 73, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 100, -1, -1, -1, -1, -1, 106, 107, + 108, -1, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, -1, -1, -1, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 169, 3, 4, 5, 6, -1, 8, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 16, 17, 18, 19, 20, 21, + 22, 23, -1, -1, -1, -1, -1, -1, -1, 50, + 51, 33, -1, 54, -1, 56, 57, 58, 59, -1, + -1, 62, 63, -1, -1, 66, 67, -1, -1, 70, + -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, + 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, + -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, + 121, -1, -1, 124, 125, -1, -1, -1, 129, -1, + -1, 132, 133, 134, 135, 136, -1, -1, 139, -1, + 141, 3, 4, 5, 6, -1, 8, 9, 10, 11, + -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, + -1, 162, -1, 164, 165, -1, -1, 168, -1, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, -1, -1, -1, 169, 50, -1, + -1, -1, 54, -1, 56, 57, 58, -1, -1, -1, + 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, + -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, - 112, -1, -1, 112, 113, 117, 115, 119, 120, 121, - -1, 120, 124, 122, -1, -1, -1, 129, -1, -1, + 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, + -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, - 8, 9, 10, 11, -1, -1, -1, 146, -1, -1, + 8, 9, 10, 11, 146, 10, 11, 12, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, - 162, -1, 164, 165, -1, -1, 168, -1, -1, -1, - 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, - -1, -1, 50, 51, -1, -1, 54, 33, 56, 57, + 162, -1, 164, 165, -1, -1, 168, 17, 18, 19, + 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, + -1, -1, 50, 33, -1, -1, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, + -1, 76, 77, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, - 108, -1, 110, -1, 112, -1, -1, -1, -1, 117, - -1, 119, 120, 121, -1, -1, 124, -1, -1, -1, + 108, -1, 110, -1, 112, -1, -1, 112, 113, 117, + 115, 119, 120, 121, -1, 120, 124, 122, -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, - 4, 5, 6, 141, 8, 9, 10, 11, -1, 10, - 11, 12, -1, -1, 15, -1, 154, -1, -1, 157, - 158, 159, -1, -1, 162, -1, 164, 165, -1, -1, - 168, -1, -1, 149, -1, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 50, 163, 164, 165, + 4, 5, 6, 141, 8, 9, 10, 11, -1, -1, + -1, 146, -1, -1, -1, -1, 154, -1, -1, 157, + 158, 159, -1, -1, 162, -1, 164, 165, 166, -1, + 168, -1, 152, 153, 154, -1, -1, 157, 158, 159, + 160, 161, -1, 163, 164, 165, 50, 51, -1, -1, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, - -1, 75, 76, 77, -1, 76, 77, 81, -1, -1, + -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, - -1, 112, 113, 117, 115, 119, 120, 121, -1, 120, - 124, 122, -1, -1, -1, 129, -1, -1, 132, -1, + -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, + 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, - 10, 11, 146, 10, 11, 12, -1, -1, -1, -1, + 10, 11, -1, 10, 11, 12, -1, -1, 15, -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, -1, -1, 168, -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, - 50, -1, -1, -1, 54, 33, 56, 57, 58, -1, + 50, 51, -1, -1, 54, 33, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, 76, 77, 81, -1, -1, 84, 85, 86, 87, 88, 89, @@ -2513,18 +2483,18 @@ static const yytype_int16 yycheck[] = 110, -1, 112, -1, -1, 112, 113, 117, 115, 119, 120, 121, -1, 120, 124, 122, -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, - 6, 141, 8, 9, 10, 11, -1, -1, -1, -1, + 6, 141, 8, 9, 10, 11, -1, 10, 11, 12, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, - -1, -1, 162, -1, 164, 165, 166, -1, 168, -1, - 148, -1, -1, 151, 152, 153, 154, 155, 156, 157, + -1, -1, 162, -1, 164, 165, -1, -1, 168, -1, + -1, 149, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 50, 163, 164, 165, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, + 76, 77, -1, 76, 77, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, - -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, - -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, + -1, -1, 108, -1, 110, -1, 112, -1, -1, 112, + 113, 117, 115, 119, 120, 121, -1, 120, 124, 122, -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, 146, -1, -1, -1, -1, -1, -1, -1, 154, -1, @@ -2542,7 +2512,7 @@ static const yytype_int16 yycheck[] = 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, - 162, -1, 164, 165, 166, -1, 168, 147, -1, -1, + 162, -1, 164, 165, 166, -1, 168, -1, 148, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 50, 163, 164, 165, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, @@ -2553,245 +2523,286 @@ static const yytype_int16 yycheck[] = 108, -1, 110, -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, - 4, 5, 6, 141, 8, 9, 10, 11, 12, -1, - -1, 15, -1, -1, -1, -1, 154, -1, -1, 157, + 4, 5, 6, 141, 8, 9, 10, 11, 146, -1, + -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, -1, -1, - 168, 16, 17, 18, 19, 20, 21, 22, 23, -1, - -1, -1, -1, 47, -1, -1, 50, 51, 33, -1, - 54, -1, 56, 57, 58, 59, 60, -1, 62, 63, - -1, -1, 66, 67, -1, -1, 70, -1, -1, -1, - -1, 75, 76, 77, -1, -1, -1, -1, -1, -1, - 84, -1, -1, -1, -1, -1, -1, -1, -1, 10, - 11, 12, -1, -1, -1, -1, 100, -1, -1, -1, + 168, -1, -1, -1, 16, 17, 18, 19, 20, 21, + 22, 23, -1, -1, -1, -1, 50, -1, -1, -1, + 54, 33, 56, 57, 58, -1, -1, -1, 62, -1, + -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, + -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, - -1, -1, 116, 117, -1, 119, 120, 121, -1, -1, - 124, 125, -1, -1, -1, 129, -1, -1, 132, 133, - 134, 135, 136, -1, -1, 139, -1, 141, 3, 4, - 5, 6, -1, 8, 9, 10, -1, -1, -1, -1, - 154, -1, -1, 157, 158, 76, 77, -1, 162, -1, - 164, -1, 147, -1, 168, -1, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, - 165, 166, -1, -1, -1, 50, -1, -1, -1, -1, - -1, 112, 113, 114, 115, -1, -1, 62, -1, 120, - -1, 122, 67, 17, 18, 19, 20, 21, 22, 23, - 75, 76, 133, -1, -1, -1, 81, 138, -1, 33, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, -1, 16, 17, 18, 19, - 20, 21, 22, 23, -1, 110, -1, 112, -1, -1, - -1, -1, 117, 33, -1, -1, 121, -1, -1, 124, - -1, -1, -1, -1, 129, -1, -1, -1, -1, -1, - -1, 54, -1, 56, 57, 58, -1, -1, -1, -1, - -1, -1, -1, 66, -1, -1, -1, -1, -1, 154, - -1, -1, 157, 158, 159, 6, -1, 162, -1, 164, - 165, 84, -1, 168, -1, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, 100, -1, -1, - -1, -1, 33, -1, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 119, 120, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - 164, 165, -1, 136, 65, -1, -1, -1, 141, -1, - -1, 10, 11, 12, -1, -1, 10, 11, -1, -1, - -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, 164, 165, 166, 16, 17, 18, - 19, 20, 21, 22, 23, -1, -1, 108, -1, -1, - -1, -1, -1, -1, 33, -1, -1, 51, -1, -1, - 54, -1, 56, 57, 58, 59, -1, -1, -1, 63, - -1, -1, 66, -1, -1, -1, 70, 76, 77, -1, - -1, -1, -1, 77, -1, -1, 147, -1, -1, 150, - 84, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, -1, 164, 165, -1, 100, 168, -1, 10, - 11, -1, -1, 112, 113, -1, 115, 111, -1, -1, - -1, 120, -1, 122, -1, 119, 120, -1, -1, -1, - -1, 125, -1, -1, 133, -1, -1, -1, -1, 133, - 134, 135, 136, -1, -1, 139, -1, 141, -1, -1, - 51, -1, 146, 54, -1, 56, 57, 58, 59, -1, - -1, -1, 63, -1, -1, 66, -1, -1, 162, 70, - -1, -1, 151, 152, 153, 154, 77, -1, 157, 158, - 159, 160, 161, 84, 163, 164, 165, -1, -1, -1, - -1, -1, -1, -1, -1, 10, 11, -1, -1, 100, - -1, 54, -1, 56, 57, 58, -1, -1, -1, -1, - 111, -1, -1, 66, -1, -1, -1, -1, 119, 120, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - -1, 84, 133, 134, 135, 136, 51, -1, 139, 54, - 141, 56, 57, 58, 59, -1, -1, 100, 63, -1, - -1, 66, 11, -1, -1, 70, -1, -1, -1, -1, - -1, 162, 77, -1, -1, -1, 119, 120, -1, 84, - 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, - -1, -1, -1, 136, -1, 100, -1, 33, 141, -1, - -1, -1, -1, -1, -1, 54, 111, 56, 57, 58, - -1, -1, -1, -1, 119, 120, -1, -1, -1, -1, - 125, 164, -1, 54, -1, 56, 57, 58, 133, 134, - 135, 136, -1, -1, 139, 84, 141, 16, 17, 18, - 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, - -1, 100, -1, 84, 33, -1, -1, 162, 16, 17, - 18, 19, 20, 21, 22, 23, -1, -1, -1, 100, - 119, 120, -1, -1, -1, 33, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, 136, 119, 120, - -1, -1, 141, 33, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, 136, -1, -1, -1, -1, - 141, 33, -1, -1, -1, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, - 166, 16, 17, 18, 19, 20, 21, 22, 23, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 33, 16, + -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, + 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, + -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, + 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, + 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, + 164, 165, 166, -1, 168, 147, -1, -1, -1, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 50, 163, 164, 165, 54, -1, 56, 57, 58, -1, + -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, + -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, + -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, + 110, -1, 112, -1, -1, -1, -1, 117, -1, 119, + 120, 121, -1, -1, 124, -1, -1, -1, -1, 129, + -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, + 6, 141, 8, 9, 10, 11, 12, -1, -1, 15, + -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, + -1, -1, 162, -1, 164, 165, -1, -1, 168, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, - -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, -1, 163, 164, 165, 166, -1, -1, + -1, 47, -1, -1, 50, 51, 33, -1, 54, -1, + 56, 57, 58, 59, 60, -1, 62, 63, -1, -1, + 66, 67, -1, -1, 70, -1, -1, -1, -1, 75, + 76, 77, -1, -1, -1, -1, -1, -1, 84, -1, + -1, -1, -1, -1, 16, 17, 18, 19, 20, 21, + 22, 23, -1, -1, 100, -1, -1, -1, -1, -1, + -1, 33, 108, -1, 110, -1, 112, -1, -1, -1, + 116, 117, -1, 119, 120, 121, -1, -1, 124, 125, + -1, -1, -1, 129, -1, -1, 132, 133, 134, 135, + 136, -1, -1, 139, -1, 141, -1, 3, 4, 5, + 6, -1, 8, 9, 10, 11, 12, -1, 154, 15, + -1, 157, 158, -1, -1, -1, 162, -1, 164, -1, + 147, -1, 168, -1, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, + -1, 47, -1, -1, 50, 51, -1, -1, 54, -1, + 56, 57, 58, 59, 60, -1, 62, 63, -1, -1, + 66, 67, -1, -1, 70, 10, 11, 12, -1, 75, + 76, 77, -1, -1, -1, -1, -1, 149, 84, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, 100, -1, -1, -1, -1, -1, + -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, + 116, 117, -1, 119, 120, 121, -1, -1, 124, 125, + -1, -1, -1, 129, -1, -1, 132, 133, 134, 135, + 136, 76, 77, 139, -1, 141, 3, 4, 5, 6, + -1, 8, 9, 10, -1, -1, -1, -1, 154, -1, + -1, 157, 158, -1, -1, -1, 162, -1, 164, -1, + -1, -1, 168, -1, -1, -1, -1, 112, 113, 114, + 115, -1, -1, -1, -1, 120, -1, 122, -1, -1, + -1, -1, -1, 50, -1, -1, -1, -1, 133, -1, + -1, -1, -1, 138, -1, 62, -1, -1, -1, -1, + 67, 18, 19, 20, 21, 22, 23, -1, 75, 76, + -1, -1, -1, -1, 81, -1, 33, -1, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, -1, 16, 17, 18, 19, 20, 21, + 22, 23, -1, 110, -1, 112, -1, -1, -1, -1, + 117, 33, -1, -1, 121, -1, -1, 124, -1, -1, + -1, -1, 129, -1, -1, -1, -1, -1, -1, 54, + -1, 56, 57, 58, -1, -1, -1, -1, -1, -1, + -1, 66, -1, -1, -1, -1, -1, 154, -1, -1, + 157, 158, 159, 6, -1, 162, -1, 164, 165, 84, + -1, 168, -1, 16, 17, 18, 19, 20, 21, 22, + 23, -1, -1, -1, -1, 100, -1, -1, -1, -1, + 33, -1, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 119, 120, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, + -1, 136, 65, -1, -1, -1, 141, -1, -1, 10, + 11, 12, -1, -1, 10, 11, -1, -1, -1, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, 166, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, 108, -1, -1, -1, -1, + -1, -1, 33, -1, -1, 51, -1, -1, 54, -1, + 56, 57, 58, 59, -1, -1, -1, 63, -1, -1, + 66, -1, -1, -1, 70, 76, 77, -1, -1, -1, + -1, 77, -1, -1, 147, -1, -1, 150, 84, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + -1, 164, 165, -1, 100, 168, -1, 10, 11, -1, + -1, 112, 113, -1, 115, 111, -1, -1, -1, 120, + -1, 122, -1, 119, 120, -1, -1, -1, -1, 125, + -1, -1, -1, -1, -1, -1, 137, 133, 134, 135, + 136, -1, -1, 139, -1, 141, -1, -1, 51, -1, + 146, 54, -1, 56, 57, 58, 59, -1, -1, -1, + 63, -1, -1, 66, -1, -1, 162, 70, 149, 17, + 151, 152, 153, 154, 77, -1, 157, 158, 159, 160, + 161, 84, 163, 164, 165, 33, -1, -1, 10, 11, + 12, -1, -1, 10, 11, -1, -1, 100, -1, 47, + -1, -1, -1, -1, -1, -1, -1, -1, 111, -1, + -1, -1, 60, 61, -1, -1, 119, 120, -1, -1, + -1, -1, 125, -1, -1, -1, -1, -1, 76, -1, + 133, 134, 135, 136, 51, -1, 139, 54, 141, 56, + 57, 58, 59, -1, -1, -1, 63, -1, -1, 66, + -1, -1, -1, 70, 76, 77, -1, -1, 106, 162, + 77, 109, -1, -1, 112, -1, -1, 84, 16, 17, + 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, + 128, -1, -1, 100, -1, 33, -1, -1, -1, -1, + 112, 113, 140, 115, 111, -1, -1, -1, 120, -1, + 122, -1, 119, 120, -1, -1, 154, -1, 125, -1, + 54, 133, 56, 57, 58, -1, 133, 134, 135, 136, + -1, -1, 139, -1, 141, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, + 84, -1, 33, -1, -1, 162, 16, 17, 18, 19, + 20, 21, 22, 23, -1, -1, 100, -1, -1, -1, + -1, -1, -1, 33, 16, 17, 18, 19, 20, 21, + 22, 23, -1, -1, -1, 119, 120, -1, -1, -1, + -1, 33, 16, 17, 18, 19, 20, 21, 22, 23, + -1, -1, 136, -1, -1, -1, -1, 141, -1, 33, -1, -1, -1, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, -1, 163, 164, 165, 166, -1, + 158, 159, 160, 161, -1, 163, 164, 165, 166, 16, + 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 33, 16, 17, 18, + 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, 164, 165, 166, -1, -1, -1, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, 166, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 33, -1, -1, -1, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, - 165, 166, 149, -1, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, 16, - 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, + -1, 163, 164, 165, 166, -1, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 164, 165, 166, 16, 17, 18, 19, 20, 21, 22, + 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 33, -1, -1, -1, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, + -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, 163, 164, 165, 16, 17, 18, + 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, -1, 163, 164, 165, 47, -1, 49, -1, -1, - 52, 53, -1, -1, -1, -1, -1, -1, 60, 61, - -1, -1, -1, -1, -1, -1, -1, 69, -1, 71, - 72, 73, 74, -1, -1, -1, 78, -1, -1, -1, - -1, 83, -1, -1, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, - 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, - -1, 113, 114, 115, 116, -1, -1, -1, -1, -1, - 122, 123, 11, 12, 126, 127, 15, -1, 17, 131, - -1, -1, -1, -1, -1, 137, 138, -1, 140, -1, - -1, -1, 152, 153, 154, -1, 148, 157, 158, 159, - 160, 161, -1, 163, 164, 165, -1, -1, 47, -1, - -1, -1, 51, -1, -1, 54, -1, 56, 57, 58, - 59, 60, -1, -1, 63, -1, -1, 66, -1, -1, - -1, 70, 18, 19, 20, 21, 22, 23, 77, -1, - -1, -1, -1, -1, -1, 84, -1, 33, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, - -1, 100, -1, 33, 18, 19, 20, 21, 22, 23, - -1, 54, -1, 56, 57, 58, -1, 116, -1, 33, - 119, 120, -1, -1, -1, -1, 125, -1, 18, 19, - 20, 21, 22, 23, 133, 134, 135, 136, -1, -1, - 139, 84, 141, 33, 18, 19, 20, 21, 22, 23, - -1, -1, -1, -1, -1, 154, -1, 100, -1, 33, - 159, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 119, 120, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 136, -1, -1, -1, -1, 141, 10, - 11, 12, -1, -1, -1, -1, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, - -1, 164, 152, 153, 154, -1, -1, 157, 158, 159, - 160, 161, -1, 163, 164, 165, 47, -1, 49, 153, - 154, -1, -1, 157, 158, 159, 160, 161, -1, 163, - 164, 165, 6, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 154, 76, 77, 157, 158, 159, - 160, 161, -1, 163, 164, 165, -1, -1, -1, 6, - -1, -1, -1, 157, 158, 159, 160, 161, -1, 163, - 164, 165, -1, 47, -1, 49, -1, -1, -1, 53, - -1, 112, 113, -1, 115, -1, 60, 61, -1, 120, - -1, 122, -1, -1, -1, -1, -1, 71, 72, 73, - 47, -1, 49, -1, -1, -1, 53, -1, -1, 83, - 10, 11, 12, 60, 61, 146, -1, -1, -1, -1, - -1, -1, -1, -1, 71, 72, 73, -1, -1, -1, - -1, -1, 106, -1, -1, -1, 83, -1, -1, -1, - -1, -1, 116, -1, -1, -1, -1, 47, 122, 49, - -1, -1, 126, 127, 10, 11, 12, -1, -1, 106, - -1, -1, -1, -1, 138, -1, 140, -1, -1, 116, - -1, -1, -1, -1, -1, 122, 76, 77, -1, -1, - 127, -1, -1, 10, 11, 12, -1, -1, -1, -1, - -1, 138, -1, 140, -1, 51, -1, -1, 54, -1, - 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, - 66, -1, 112, 113, 70, 115, -1, -1, -1, -1, - 120, 77, 122, -1, 51, -1, -1, 54, 84, 56, - 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, - -1, -1, -1, 70, 100, -1, -1, -1, -1, -1, - 77, 54, -1, 56, 57, 58, -1, 84, -1, -1, - -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, - -1, -1, -1, 100, 10, 11, 12, 133, 134, 135, - 136, 84, -1, 139, -1, 141, -1, -1, -1, -1, - -1, -1, 119, 120, -1, -1, -1, 100, 125, -1, - -1, -1, -1, 10, 11, 12, 133, 134, 135, 136, - -1, -1, 139, -1, 141, 51, 119, 120, 54, -1, - 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, - 66, -1, -1, 136, 70, -1, -1, -1, 141, -1, - -1, 77, -1, -1, -1, -1, -1, 54, 84, 56, - 57, 58, 59, 60, -1, -1, -1, -1, -1, 66, - -1, 164, -1, -1, 100, -1, -1, -1, -1, -1, - 77, 10, 11, 12, -1, -1, -1, 84, -1, -1, - -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, - -1, -1, -1, 100, -1, -1, -1, 133, 134, 135, - 136, -1, -1, 139, -1, 141, -1, -1, -1, -1, - 11, 12, 119, 120, 15, 54, -1, 56, 57, 58, - -1, -1, -1, -1, -1, -1, 133, 66, -1, 136, - -1, -1, 139, -1, 141, -1, -1, -1, 77, 11, - 12, -1, -1, 15, -1, 84, 47, -1, -1, -1, + -1, -1, 18, 19, 20, 21, 22, 23, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 33, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, 164, 165, 47, -1, 49, -1, -1, 52, 53, + -1, -1, -1, -1, -1, -1, 60, 61, -1, -1, + -1, -1, -1, -1, -1, 69, -1, 71, 72, 73, + 74, -1, -1, -1, 78, -1, -1, -1, -1, 83, + -1, -1, 151, 152, 153, 154, -1, -1, 157, 158, + 159, 160, 161, -1, 163, 164, 165, -1, 102, 103, + 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, + 114, 115, 116, -1, -1, -1, -1, -1, 122, 123, + 11, 12, 126, 127, 15, -1, 17, 131, -1, -1, + -1, -1, -1, 137, 138, -1, 140, -1, -1, -1, + -1, -1, -1, -1, 148, -1, -1, -1, 154, 155, + 156, 157, 158, 159, 160, 161, 47, 163, 164, 165, 51, -1, -1, 54, -1, 56, 57, 58, 59, 60, - -1, 100, 63, -1, -1, 66, -1, -1, -1, 70, - -1, -1, -1, -1, -1, 47, 77, -1, -1, 51, - 119, 120, 54, 84, 56, 57, 58, 59, 60, -1, - -1, 63, -1, -1, 66, -1, -1, 136, 70, 100, - 139, -1, 141, -1, -1, 77, 54, -1, 56, 57, - 58, -1, 84, -1, -1, 116, -1, -1, 119, 120, - -1, -1, -1, -1, 125, -1, -1, -1, 100, -1, - 11, 12, 133, 134, 135, 136, 84, -1, 139, -1, - 141, -1, -1, -1, 116, -1, -1, 119, 120, -1, - -1, -1, 100, 125, 10, 11, 12, -1, -1, 11, - 12, 133, 134, 135, 136, -1, 47, 139, -1, 141, - 51, 119, 120, 54, -1, 56, 57, 58, 59, 60, - -1, -1, 63, -1, -1, 66, -1, -1, 136, 70, - -1, -1, -1, 141, -1, -1, 77, -1, -1, 51, - -1, -1, 54, 84, 56, 57, 58, 59, 60, -1, - -1, 63, -1, -1, 66, -1, 164, -1, 70, 100, - 76, 77, -1, -1, -1, 77, -1, -1, 10, 11, - 12, -1, 84, -1, -1, 116, -1, -1, 119, 120, - -1, -1, -1, -1, 125, 11, 12, -1, 100, -1, - -1, 107, 133, 134, 135, 136, 112, 113, 139, 115, - 141, -1, -1, -1, 120, -1, 122, 119, 120, 11, - 12, -1, -1, 125, -1, -1, -1, -1, -1, -1, - -1, 133, 134, 135, 136, 51, -1, 139, 54, 141, - 56, 57, 58, 59, 76, 77, -1, 63, -1, -1, - 66, -1, -1, -1, 70, -1, -1, -1, -1, 51, - -1, 77, 54, -1, 56, 57, 58, 59, 84, -1, - -1, 63, -1, -1, 66, -1, -1, -1, 70, -1, - 112, 113, -1, 115, 100, 77, -1, -1, 120, -1, - 122, -1, 84, -1, -1, -1, -1, -1, -1, -1, - 116, 133, -1, 119, 120, 11, 138, -1, 100, 125, - -1, -1, -1, -1, -1, -1, -1, 133, 134, 135, - 136, -1, -1, 139, -1, 141, -1, 119, 120, -1, - -1, -1, -1, 125, 11, -1, -1, -1, -1, -1, - -1, 133, 134, 135, 136, 51, -1, 139, 54, 141, - 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, - 66, -1, -1, -1, 70, -1, -1, -1, -1, -1, - -1, 77, -1, -1, 51, -1, -1, 54, 84, 56, - 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, - -1, -1, -1, 70, 100, -1, -1, -1, -1, -1, - 77, -1, -1, 10, 11, 12, -1, 84, -1, -1, - -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, - 11, -1, -1, 100, -1, -1, -1, 133, 134, 135, - 136, -1, -1, 139, -1, 141, -1, -1, -1, -1, - -1, -1, 119, 120, 11, -1, -1, -1, 125, -1, - -1, -1, 10, 11, 12, -1, 133, 134, 135, 136, - 51, -1, 139, 54, 141, 56, 57, 58, 59, 76, - 77, -1, 63, -1, -1, 66, -1, -1, -1, 70, - -1, -1, -1, -1, 51, -1, 77, 54, -1, 56, - 57, 58, 59, 84, -1, -1, 63, -1, -1, 66, - -1, -1, -1, 70, -1, 112, 113, -1, 115, 100, - 77, -1, -1, 120, -1, 122, -1, 84, 76, 77, - -1, -1, -1, -1, -1, -1, 133, -1, 119, 120, - -1, 138, -1, 100, 125, -1, -1, -1, -1, -1, + -1, -1, 63, -1, -1, 66, -1, -1, -1, 70, + 18, 19, 20, 21, 22, 23, 77, -1, -1, 10, + 11, 12, -1, 84, -1, 33, 18, 19, 20, 21, + 22, 23, -1, -1, -1, -1, -1, -1, -1, 100, + -1, 33, 18, 19, 20, 21, 22, 23, -1, -1, + -1, -1, -1, -1, -1, 116, -1, 33, 119, 120, + -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, 133, 134, 135, 136, -1, -1, 139, -1, - 141, -1, 119, 120, 112, 113, -1, 115, 125, -1, - -1, -1, 120, -1, 122, -1, 133, 134, 135, 136, - -1, 47, 139, 49, 141, 133, 52, 53, -1, -1, - 138, -1, -1, -1, 60, 61, -1, -1, -1, -1, - -1, -1, -1, 69, -1, 71, 72, 73, 74, -1, - -1, -1, 78, -1, -1, -1, -1, 83, -1, -1, + 141, -1, -1, -1, -1, 76, 77, -1, -1, -1, + -1, -1, -1, 154, -1, -1, -1, -1, 159, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 112, 113, -1, 115, -1, -1, -1, -1, 120, + -1, 122, -1, -1, -1, -1, -1, 10, 11, 12, + -1, -1, 133, -1, 152, 153, 154, 138, -1, 157, + 158, 159, 160, 161, 6, 163, 164, 165, -1, -1, + -1, 153, 154, -1, -1, 157, 158, 159, 160, 161, + 11, 163, 164, 165, 47, -1, 49, -1, 154, -1, + -1, 157, 158, 159, 160, 161, -1, 163, 164, 165, + -1, 6, -1, -1, -1, 47, -1, 49, -1, -1, + -1, 53, -1, 76, 77, -1, -1, -1, 60, 61, + 51, -1, -1, 54, -1, 56, 57, 58, 59, 71, + 72, 73, 63, -1, -1, 66, -1, -1, -1, 70, + -1, 83, 47, -1, 49, -1, 77, -1, 53, 112, + 113, -1, 115, 84, -1, 60, 61, 120, -1, 122, + -1, -1, -1, -1, 106, -1, 71, 72, 73, 100, + -1, -1, -1, -1, 116, -1, -1, -1, 83, -1, + 122, -1, -1, 146, 126, 127, -1, -1, 119, 120, + 10, 11, 12, -1, 125, -1, 138, -1, 140, -1, + -1, 106, 133, 134, 135, 136, -1, -1, 139, -1, + 141, 116, -1, -1, -1, -1, -1, 122, -1, 10, + 11, 12, 127, -1, -1, -1, -1, -1, -1, -1, + -1, 51, -1, 138, 54, 140, 56, 57, 58, 59, + 60, -1, -1, 63, -1, -1, 66, -1, -1, -1, + 70, -1, -1, -1, -1, -1, -1, 77, -1, -1, + 51, -1, -1, 54, 84, 56, 57, 58, 59, 60, + -1, -1, 63, -1, -1, 66, -1, -1, -1, 70, + 100, -1, -1, -1, -1, -1, 77, 54, -1, 56, + 57, 58, -1, 84, -1, -1, -1, -1, -1, 119, + 120, -1, -1, -1, -1, 125, -1, -1, -1, 100, + 10, 11, 12, 133, 134, 135, 136, 84, -1, 139, + -1, 141, -1, -1, -1, -1, -1, -1, 119, 120, + -1, -1, -1, 100, 125, -1, -1, -1, -1, 10, + 11, 12, 133, 134, 135, 136, -1, -1, 139, -1, + 141, 51, 119, 120, 54, -1, 56, 57, 58, 59, + 60, -1, -1, 63, -1, -1, 66, -1, -1, 136, + 70, -1, -1, -1, 141, -1, -1, 77, -1, -1, + -1, -1, -1, 54, 84, 56, 57, 58, 59, 60, + -1, -1, -1, -1, -1, 66, -1, 164, -1, -1, + 100, -1, -1, -1, -1, -1, 77, 10, 11, 12, + -1, -1, -1, 84, -1, -1, -1, -1, -1, 119, + 120, -1, -1, -1, -1, 125, -1, -1, -1, 100, + -1, -1, -1, 133, 134, 135, 136, -1, -1, 139, + -1, 141, -1, -1, -1, -1, 11, 12, 119, 120, + 15, 54, -1, 56, 57, 58, -1, -1, -1, -1, + -1, -1, 133, 66, -1, 136, -1, -1, 139, -1, + 141, -1, -1, -1, 77, 11, 12, -1, -1, 15, + -1, 84, 47, -1, -1, -1, 51, -1, -1, 54, + -1, 56, 57, 58, 59, 60, -1, 100, 63, -1, + -1, 66, -1, -1, -1, 70, -1, -1, -1, -1, + -1, 47, 77, -1, -1, 51, 119, 120, 54, 84, + 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, + 66, -1, -1, 136, 70, 100, 139, -1, 141, -1, + -1, 77, -1, -1, -1, -1, -1, -1, 84, -1, + -1, 116, -1, -1, 119, 120, -1, -1, -1, -1, + 125, -1, -1, -1, 100, -1, 11, 12, 133, 134, + 135, 136, -1, -1, 139, -1, 141, -1, -1, -1, + 116, -1, -1, 119, 120, -1, -1, -1, -1, 125, + 10, 11, 12, -1, -1, 11, 12, 133, 134, 135, + 136, -1, 47, 139, -1, 141, 51, -1, -1, 54, + -1, 56, 57, 58, 59, 60, -1, -1, 63, -1, + -1, 66, -1, -1, -1, 70, -1, 47, -1, 49, + -1, -1, 77, -1, -1, 51, -1, -1, 54, 84, + 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, + 66, -1, -1, -1, 70, 100, 76, 77, -1, -1, + -1, 77, -1, -1, 10, 11, 12, -1, 84, -1, + -1, 116, -1, -1, 119, 120, -1, -1, -1, -1, + 125, 11, 12, -1, 100, -1, -1, -1, 133, 134, + 135, 136, 112, 113, 139, 115, 141, -1, -1, -1, + 120, -1, 122, 119, 120, 11, 12, -1, -1, 125, + -1, -1, -1, -1, -1, -1, -1, 133, 134, 135, + 136, 51, -1, 139, 54, 141, 56, 57, 58, 59, + 76, 77, -1, 63, -1, 54, 66, 56, 57, 58, + 70, -1, -1, -1, -1, 51, -1, 77, 54, -1, + 56, 57, 58, 59, 84, -1, -1, 63, -1, -1, + 66, -1, -1, -1, 70, 84, 112, 113, -1, 115, + 100, 77, -1, -1, 120, -1, 122, -1, 84, -1, + -1, 100, -1, -1, -1, -1, 116, 133, -1, 119, + 120, 11, 138, -1, 100, 125, -1, -1, -1, -1, + 119, 120, -1, 133, 134, 135, 136, -1, -1, 139, + -1, 141, -1, 119, 120, -1, -1, 136, -1, 125, + 11, -1, 141, -1, -1, -1, -1, 133, 134, 135, + 136, 51, -1, 139, 54, 141, 56, 57, 58, 59, + 60, -1, -1, 63, -1, 164, 66, -1, -1, -1, + 70, -1, -1, -1, -1, -1, -1, 77, -1, -1, + 51, -1, -1, 54, 84, 56, 57, 58, 59, 60, + -1, -1, 63, -1, -1, 66, -1, -1, -1, 70, + 100, -1, -1, -1, -1, -1, 77, -1, -1, 10, + 11, 12, -1, 84, 54, -1, 56, 57, 58, 119, + 120, -1, -1, -1, -1, 125, 11, -1, -1, 100, + -1, -1, -1, 133, 134, 135, 136, -1, -1, 139, + -1, 141, -1, -1, 84, -1, -1, -1, 119, 120, + -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, + 100, -1, 133, 134, 135, 136, 51, -1, 139, 54, + 141, 56, 57, 58, 59, 76, 77, -1, 63, 119, + 120, 66, -1, -1, -1, 70, -1, -1, -1, -1, + -1, -1, 77, -1, -1, -1, 136, -1, -1, 84, + -1, 141, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 112, 113, -1, 115, 100, -1, -1, -1, 120, + -1, 122, -1, -1, 164, -1, -1, -1, -1, -1, + -1, -1, 133, -1, 119, 120, -1, 138, -1, 47, + 125, 49, -1, -1, 52, 53, -1, -1, 133, 134, + 135, 136, 60, 61, 139, -1, 141, -1, -1, -1, + -1, 69, -1, 71, 72, 73, 74, -1, -1, -1, + 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, + -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, + -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, + -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, + 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, + 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, -1, -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, @@ -2827,199 +2838,198 @@ static const yytype_int16 yycheck[] = -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, - -1, -1, -1, -1, -1, -1, 102, 103, 104, 105, + -1, 54, -1, 56, 57, 58, -1, -1, -1, 167, + -1, -1, -1, 66, -1, -1, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, - 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, - 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, - -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, - 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 167, -1, -1, -1, -1, -1, -1, 102, 103, - 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, - 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, - -1, 53, 126, 127, 47, -1, 49, 131, 60, 61, - 53, -1, -1, 137, 138, -1, 140, 60, 61, 71, - 72, 73, -1, -1, 148, -1, 78, -1, 71, 72, - 73, 83, -1, -1, -1, 78, -1, -1, -1, -1, - 83, -1, -1, 167, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 106, -1, -1, -1, -1, -1, - -1, -1, -1, 106, 116, -1, -1, -1, -1, -1, - 122, -1, -1, 116, -1, 127, -1, -1, -1, 122, - -1, -1, -1, 126, 127, 137, 138, 47, 140, 49, - -1, -1, 52, 53, 137, 138, -1, 140, -1, -1, - 60, 61, -1, 155, -1, -1, -1, -1, -1, 69, - -1, 71, 72, 73, 74, 47, -1, 49, 78, -1, - -1, 53, -1, 83, 47, -1, 49, -1, 60, 61, - 53, -1, -1, -1, -1, -1, -1, 60, 61, 71, - 72, 73, 102, 103, 104, 105, 106, 107, 71, 72, - 73, 83, -1, 113, 114, 115, 116, -1, -1, -1, - 83, -1, 122, 123, -1, -1, 126, 127, -1, -1, - -1, 131, -1, -1, 106, 107, -1, 137, 138, -1, - 140, -1, -1, 106, 116, -1, -1, -1, -1, -1, - 122, -1, -1, 116, -1, 127, -1, -1, -1, 122, - -1, -1, -1, -1, 127, -1, 138, -1, 140, -1, - -1, -1, -1, -1, -1, 138, -1, 140 + 116, 84, -1, -1, -1, -1, 122, 123, -1, -1, + 126, 127, -1, -1, 47, 131, 49, 100, -1, -1, + 53, 137, 138, -1, 140, -1, -1, 60, 61, -1, + -1, -1, 148, -1, -1, -1, 119, 120, 71, 72, + 73, -1, -1, -1, -1, 78, -1, -1, -1, -1, + 83, 167, -1, 136, -1, -1, -1, -1, 141, -1, + -1, -1, -1, -1, -1, -1, 47, -1, 49, -1, + -1, -1, 53, 106, -1, -1, -1, -1, -1, 60, + 61, 164, -1, 116, -1, -1, -1, -1, -1, 122, + 71, 72, 73, -1, 127, -1, -1, 78, -1, -1, + -1, -1, 83, -1, 137, 138, 47, 140, 49, -1, + -1, 52, 53, -1, -1, -1, -1, -1, -1, 60, + 61, -1, 155, -1, -1, 106, -1, -1, 69, -1, + 71, 72, 73, 74, -1, 116, -1, 78, -1, -1, + -1, 122, 83, -1, -1, 126, 127, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 137, 138, -1, 140, + -1, 102, 103, 104, 105, 106, 107, -1, -1, -1, + -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, + 49, 122, 123, -1, 53, 126, 127, 47, -1, 49, + 131, 60, 61, 53, -1, -1, 137, 138, -1, 140, + 60, 61, 71, 72, 73, -1, -1, -1, -1, -1, + -1, 71, 72, 73, 83, -1, -1, -1, -1, -1, + -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 106, 107, -1, + -1, -1, -1, -1, -1, -1, 106, 116, -1, -1, + -1, -1, -1, 122, -1, -1, 116, -1, 127, -1, + -1, -1, 122, -1, -1, -1, -1, 127, -1, 138, + -1, 140, -1, -1, -1, -1, -1, -1, 138, -1, + 140 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 143, 144, 145, 171, 172, 277, 3, 4, 5, + 0, 143, 144, 145, 171, 172, 278, 3, 4, 5, 6, 8, 9, 10, 11, 50, 54, 56, 57, 58, 62, 66, 67, 75, 76, 77, 81, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 108, 110, 112, 117, 119, 120, 121, 124, 129, 132, 136, 141, 154, 157, 158, 159, - 162, 164, 165, 168, 267, 268, 276, 11, 12, 51, + 162, 164, 165, 168, 268, 269, 277, 11, 12, 51, 54, 56, 57, 58, 59, 60, 63, 66, 70, 77, 84, 100, 119, 120, 125, 133, 134, 135, 136, 139, - 141, 229, 230, 234, 236, 238, 244, 245, 249, 250, - 255, 256, 257, 258, 0, 47, 49, 52, 53, 60, + 141, 230, 231, 235, 237, 239, 245, 246, 250, 251, + 256, 257, 258, 259, 0, 47, 49, 52, 53, 60, 61, 69, 71, 72, 73, 74, 78, 83, 102, 103, 104, 105, 106, 107, 113, 114, 115, 116, 122, 123, 126, 127, 131, 137, 138, 140, 148, 175, 177, 178, - 180, 183, 201, 251, 254, 277, 146, 164, 164, 164, + 180, 183, 202, 252, 255, 278, 146, 164, 164, 164, 164, 164, 164, 155, 164, 155, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 11, 51, 63, 133, 134, - 232, 249, 250, 255, 155, 164, 164, 15, 164, 155, - 164, 164, 164, 267, 267, 267, 267, 267, 11, 54, + 233, 250, 251, 256, 155, 164, 164, 15, 164, 155, + 164, 164, 164, 268, 268, 268, 268, 268, 11, 54, 56, 57, 58, 66, 77, 84, 100, 119, 120, 136, - 141, 234, 265, 267, 10, 11, 12, 76, 77, 112, - 113, 115, 120, 122, 150, 154, 159, 271, 272, 274, - 277, 267, 16, 17, 18, 19, 20, 21, 22, 23, + 141, 235, 266, 268, 10, 11, 12, 76, 77, 112, + 113, 115, 120, 122, 150, 154, 159, 272, 273, 275, + 278, 268, 16, 17, 18, 19, 20, 21, 22, 23, 33, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 163, 164, 165, 6, 8, 229, 230, 164, - 59, 125, 66, 100, 256, 256, 256, 274, 164, 256, - 13, 15, 17, 60, 140, 154, 159, 164, 227, 228, - 277, 228, 146, 10, 11, 12, 112, 149, 275, 235, - 277, 137, 181, 182, 274, 164, 72, 83, 180, 180, - 180, 180, 6, 180, 201, 180, 149, 179, 107, 180, - 164, 164, 164, 164, 180, 146, 274, 149, 149, 149, - 180, 180, 164, 178, 180, 183, 202, 180, 180, 186, - 107, 274, 180, 180, 10, 11, 51, 63, 111, 133, - 134, 146, 162, 189, 192, 231, 233, 236, 238, 244, - 249, 250, 255, 264, 265, 277, 264, 234, 264, 264, - 264, 264, 234, 264, 234, 264, 234, 264, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 264, 164, 274, 164, 164, 274, 235, - 234, 264, 264, 164, 10, 234, 234, 234, 267, 264, - 264, 166, 147, 166, 274, 274, 147, 169, 150, 217, - 277, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 160, 161, 163, 164, 165, 6, 8, 230, 231, 164, + 59, 125, 66, 100, 257, 257, 257, 275, 164, 257, + 13, 15, 17, 60, 140, 154, 159, 164, 228, 229, + 278, 229, 146, 10, 11, 12, 112, 149, 276, 236, + 278, 137, 181, 182, 275, 164, 72, 83, 180, 180, + 180, 180, 6, 180, 202, 180, 149, 179, 107, 180, + 164, 164, 164, 164, 180, 146, 275, 149, 149, 149, + 180, 180, 164, 178, 180, 183, 203, 180, 180, 187, + 107, 275, 180, 180, 10, 11, 51, 63, 111, 133, + 134, 146, 162, 190, 193, 232, 234, 237, 239, 245, + 250, 251, 256, 265, 266, 278, 265, 235, 265, 265, + 265, 265, 235, 265, 235, 265, 235, 265, 235, 235, + 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, + 235, 235, 235, 265, 164, 275, 164, 164, 275, 236, + 235, 265, 265, 164, 10, 235, 235, 235, 268, 265, + 265, 166, 147, 166, 275, 275, 147, 169, 150, 218, + 278, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 166, 266, 268, 229, 229, 51, 268, 235, + 159, 275, 13, 15, 17, 60, 140, 154, 159, 228, + 278, 228, 229, 228, 229, 228, 228, 15, 17, 47, + 60, 116, 154, 159, 213, 214, 223, 230, 231, 278, + 165, 248, 249, 278, 11, 247, 257, 149, 10, 11, + 12, 47, 49, 112, 146, 275, 276, 275, 48, 147, + 164, 11, 232, 268, 180, 177, 146, 275, 275, 275, + 275, 275, 172, 146, 268, 155, 10, 11, 193, 232, + 234, 275, 148, 150, 164, 164, 164, 60, 230, 275, + 164, 176, 275, 185, 146, 148, 150, 220, 148, 184, + 275, 276, 236, 167, 166, 166, 166, 166, 166, 166, + 156, 166, 156, 166, 166, 166, 166, 147, 166, 147, + 166, 147, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 268, 235, 265, 275, 156, 166, 166, + 275, 166, 166, 156, 166, 166, 166, 166, 268, 268, + 15, 154, 273, 164, 199, 278, 268, 149, 166, 169, + 166, 166, 166, 228, 159, 275, 228, 228, 228, 228, + 228, 165, 228, 181, 116, 230, 231, 223, 228, 228, + 166, 15, 147, 13, 17, 60, 140, 154, 159, 164, + 226, 276, 278, 13, 15, 17, 60, 140, 154, 159, + 164, 227, 264, 268, 278, 275, 167, 247, 181, 164, + 238, 240, 149, 180, 181, 3, 4, 5, 9, 10, + 15, 50, 62, 67, 75, 76, 108, 110, 112, 117, + 121, 124, 129, 132, 154, 157, 158, 162, 164, 168, + 215, 216, 223, 224, 270, 271, 277, 278, 166, 166, + 172, 146, 147, 147, 147, 147, 167, 253, 147, 166, + 10, 11, 12, 59, 60, 133, 204, 205, 206, 207, + 208, 256, 278, 164, 220, 188, 148, 235, 191, 13, + 159, 192, 51, 268, 230, 13, 17, 60, 140, 154, + 159, 225, 276, 278, 235, 172, 164, 146, 148, 149, + 150, 219, 260, 261, 64, 65, 146, 268, 13, 17, + 60, 111, 140, 154, 159, 164, 186, 209, 211, 276, + 149, 275, 164, 164, 235, 235, 235, 166, 166, 166, + 164, 166, 164, 218, 213, 17, 33, 47, 60, 61, + 76, 106, 109, 112, 128, 140, 154, 212, 278, 268, + 228, 264, 166, 48, 230, 231, 226, 227, 166, 166, + 199, 15, 223, 159, 226, 226, 226, 226, 226, 226, + 165, 218, 159, 275, 227, 227, 227, 227, 227, 227, + 165, 218, 169, 147, 150, 48, 232, 268, 172, 76, + 241, 278, 182, 164, 155, 155, 233, 155, 15, 164, + 155, 164, 268, 268, 268, 268, 235, 266, 268, 166, + 15, 147, 16, 17, 18, 19, 20, 21, 22, 23, + 33, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 163, 164, 165, 180, 180, 167, 254, 10, + 10, 10, 10, 172, 277, 148, 208, 156, 147, 15, + 275, 13, 17, 60, 140, 154, 159, 164, 226, 227, + 189, 211, 148, 213, 159, 209, 213, 166, 166, 225, + 159, 225, 225, 225, 225, 225, 164, 165, 166, 167, + 194, 260, 173, 174, 275, 64, 65, 167, 262, 278, + 148, 148, 146, 221, 222, 268, 278, 148, 159, 209, + 209, 6, 16, 17, 18, 19, 20, 21, 22, 23, + 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 65, 108, 147, 150, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 164, 165, + 168, 200, 209, 209, 209, 209, 149, 164, 165, 212, + 150, 218, 220, 247, 266, 266, 166, 166, 166, 266, + 266, 166, 60, 233, 181, 164, 146, 169, 164, 223, + 226, 227, 218, 218, 164, 164, 212, 226, 166, 264, + 227, 166, 264, 268, 166, 166, 167, 149, 242, 243, + 278, 235, 235, 235, 164, 235, 164, 10, 235, 235, + 235, 268, 166, 166, 15, 224, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 166, 266, 268, + 172, 147, 166, 147, 147, 147, 167, 166, 226, 227, + 178, 183, 201, 202, 207, 275, 150, 159, 150, 217, + 278, 218, 220, 166, 209, 166, 166, 164, 225, 197, + 264, 213, 167, 146, 147, 146, 164, 148, 148, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 70, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 82, 83, 84, 100, 106, + 107, 108, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 168, 169, 263, 221, + 167, 147, 209, 10, 166, 169, 166, 4, 210, 264, + 268, 147, 166, 166, 166, 166, 199, 233, 229, 48, + 166, 275, 260, 213, 218, 218, 213, 213, 164, 169, + 164, 169, 147, 113, 114, 115, 133, 138, 244, 274, + 275, 146, 147, 166, 156, 156, 265, 156, 275, 166, + 166, 156, 166, 166, 268, 149, 166, 169, 167, 10, + 148, 10, 10, 10, 148, 217, 235, 50, 62, 67, + 117, 121, 124, 154, 157, 158, 159, 162, 164, 168, + 267, 269, 147, 199, 166, 164, 199, 198, 213, 169, + 166, 260, 174, 265, 265, 262, 167, 146, 268, 215, + 169, 186, 212, 229, 15, 166, 167, 166, 166, 166, + 213, 213, 138, 274, 138, 274, 138, 274, 275, 113, + 114, 115, 15, 172, 244, 164, 164, 166, 164, 166, + 164, 268, 147, 166, 147, 166, 166, 147, 166, 164, + 155, 155, 155, 15, 164, 155, 267, 267, 267, 267, + 267, 235, 266, 267, 16, 17, 18, 19, 20, 21, + 22, 23, 33, 151, 152, 153, 154, 157, 158, 159, + 160, 161, 163, 164, 165, 189, 164, 195, 213, 166, + 199, 167, 167, 166, 167, 221, 166, 146, 166, 199, + 199, 199, 166, 166, 274, 274, 274, 274, 274, 274, + 167, 266, 266, 266, 266, 10, 148, 10, 148, 148, + 10, 148, 235, 235, 235, 235, 164, 10, 235, 235, + 166, 166, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 166, 265, 267, 228, 228, 51, 267, 234, - 159, 274, 13, 15, 17, 60, 140, 154, 159, 227, - 277, 227, 228, 227, 228, 227, 227, 15, 17, 47, - 60, 116, 154, 159, 212, 213, 222, 229, 230, 277, - 165, 247, 248, 277, 11, 246, 256, 149, 10, 11, - 12, 47, 49, 112, 146, 274, 275, 274, 48, 147, - 164, 11, 231, 267, 180, 177, 146, 274, 274, 274, - 274, 274, 172, 146, 267, 155, 10, 11, 192, 231, - 233, 274, 148, 150, 164, 164, 164, 60, 229, 274, - 164, 176, 274, 146, 148, 149, 150, 218, 146, 148, - 150, 219, 148, 184, 274, 275, 235, 167, 166, 166, - 166, 166, 166, 166, 156, 166, 156, 166, 166, 166, - 166, 147, 166, 147, 166, 147, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 267, 234, 264, - 274, 156, 166, 166, 274, 166, 166, 156, 166, 166, - 166, 166, 267, 267, 15, 154, 272, 164, 198, 277, - 267, 149, 166, 169, 166, 166, 166, 227, 159, 274, - 227, 227, 227, 227, 227, 165, 227, 181, 116, 229, - 230, 222, 227, 227, 166, 15, 147, 13, 17, 60, - 140, 154, 159, 164, 225, 275, 277, 13, 15, 17, - 60, 140, 154, 159, 164, 226, 263, 267, 277, 274, - 167, 246, 181, 164, 237, 239, 149, 180, 181, 3, - 4, 5, 9, 10, 15, 50, 62, 67, 75, 76, - 108, 110, 112, 117, 121, 124, 129, 132, 154, 157, - 158, 162, 164, 168, 214, 215, 222, 223, 269, 270, - 276, 277, 166, 166, 172, 146, 147, 147, 147, 147, - 167, 252, 147, 166, 10, 11, 12, 59, 60, 133, - 203, 204, 205, 206, 207, 255, 277, 164, 219, 187, - 148, 234, 190, 13, 159, 191, 51, 267, 229, 13, - 17, 60, 140, 154, 159, 224, 275, 277, 234, 172, - 164, 259, 260, 173, 174, 274, 64, 65, 259, 64, - 65, 146, 267, 13, 17, 60, 111, 140, 154, 159, - 164, 185, 208, 210, 275, 149, 274, 164, 164, 234, - 234, 234, 166, 166, 166, 164, 166, 164, 217, 212, - 17, 33, 47, 60, 61, 76, 106, 109, 112, 128, - 140, 154, 211, 277, 267, 227, 263, 166, 48, 229, - 230, 225, 226, 166, 166, 198, 15, 222, 159, 225, - 225, 225, 225, 225, 225, 165, 217, 159, 274, 226, - 226, 226, 226, 226, 226, 165, 217, 169, 147, 150, - 48, 231, 267, 172, 76, 240, 277, 182, 164, 155, - 155, 232, 155, 15, 164, 155, 164, 267, 267, 267, - 267, 234, 265, 267, 166, 15, 147, 16, 17, 18, - 19, 20, 21, 22, 23, 33, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 163, 164, 165, - 180, 180, 167, 253, 10, 10, 10, 10, 172, 276, - 148, 207, 156, 147, 15, 274, 13, 17, 60, 140, - 154, 159, 164, 225, 226, 188, 210, 148, 212, 159, - 208, 212, 166, 166, 224, 159, 224, 224, 224, 224, - 224, 164, 165, 166, 167, 193, 167, 261, 277, 146, - 147, 146, 164, 148, 148, 167, 148, 148, 146, 220, - 221, 267, 277, 148, 159, 208, 208, 6, 16, 17, - 18, 19, 20, 21, 22, 23, 33, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 65, - 108, 147, 150, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 164, 165, 168, 199, 208, 208, - 208, 208, 149, 164, 165, 211, 150, 217, 219, 246, - 265, 265, 166, 166, 166, 265, 265, 166, 60, 232, - 181, 164, 146, 169, 164, 222, 225, 226, 217, 217, - 164, 164, 211, 225, 166, 263, 226, 166, 263, 267, - 166, 166, 167, 149, 241, 242, 277, 234, 234, 234, - 164, 234, 164, 10, 234, 234, 234, 267, 166, 166, - 15, 223, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 166, 265, 267, 172, 147, 166, 147, - 147, 147, 167, 166, 225, 226, 178, 183, 200, 201, - 206, 274, 150, 159, 150, 216, 277, 217, 219, 166, - 208, 166, 166, 164, 224, 196, 263, 212, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 70, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 82, 83, 84, 100, 106, 107, - 108, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 168, 169, 262, 259, 174, - 264, 264, 220, 167, 147, 208, 10, 166, 169, 166, - 4, 209, 263, 267, 147, 166, 166, 166, 166, 198, - 232, 228, 48, 166, 274, 259, 212, 217, 217, 212, - 212, 164, 169, 164, 169, 147, 113, 114, 115, 133, - 138, 243, 273, 274, 146, 147, 166, 156, 156, 264, - 156, 274, 166, 166, 156, 166, 166, 267, 149, 166, - 169, 167, 10, 148, 10, 10, 10, 148, 216, 234, - 50, 62, 67, 117, 121, 124, 154, 157, 158, 159, - 162, 164, 168, 266, 268, 147, 198, 166, 164, 198, - 197, 212, 169, 166, 261, 167, 167, 166, 167, 146, - 267, 214, 169, 185, 211, 228, 15, 166, 167, 166, - 166, 166, 212, 212, 138, 273, 138, 273, 138, 273, - 274, 113, 114, 115, 15, 172, 243, 164, 164, 166, - 164, 166, 164, 267, 147, 166, 147, 166, 166, 147, - 166, 164, 155, 155, 155, 15, 164, 155, 266, 266, - 266, 266, 266, 234, 265, 266, 16, 17, 18, 19, - 20, 21, 22, 23, 33, 151, 152, 153, 154, 157, - 158, 159, 160, 161, 163, 164, 165, 188, 164, 194, - 212, 166, 198, 167, 15, 220, 166, 146, 166, 198, - 198, 198, 166, 166, 273, 273, 273, 273, 273, 273, - 167, 265, 265, 265, 265, 10, 148, 10, 148, 148, - 10, 148, 234, 234, 234, 234, 164, 10, 234, 234, - 166, 166, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 166, 265, 267, 195, 212, 166, 198, 167, 198, - 259, 211, 211, 211, 198, 198, 166, 166, 166, 166, - 166, 147, 147, 166, 166, 156, 156, 156, 274, 166, - 166, 156, 266, 149, 166, 169, 212, 166, 198, 167, - 148, 10, 10, 148, 164, 164, 164, 166, 164, 266, - 166, 198, 166, 166, 265, 265, 265, 265, 198, 211, - 148, 148, 166, 166, 166, 166, 211 + 267, 166, 266, 268, 196, 213, 166, 199, 15, 167, + 199, 260, 212, 212, 212, 199, 199, 166, 166, 166, + 166, 166, 147, 147, 166, 166, 156, 156, 156, 275, + 166, 166, 156, 267, 149, 166, 169, 213, 166, 199, + 167, 148, 10, 10, 148, 164, 164, 164, 166, 164, + 267, 166, 199, 166, 166, 266, 266, 266, 266, 199, + 212, 148, 148, 166, 166, 166, 166, 212 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -3031,76 +3041,76 @@ static const yytype_uint16 yyr1[] = 177, 177, 177, 177, 177, 177, 177, 177, 179, 178, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, - 182, 182, 182, 184, 183, 183, 183, 183, 183, 185, - 185, 187, 186, 186, 188, 188, 190, 189, 191, 189, - 193, 192, 194, 192, 195, 192, 196, 192, 197, 192, - 192, 198, 198, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 200, 200, 200, 201, 202, 201, - 201, 201, 203, 203, 204, 204, 205, 205, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, - 207, 208, 208, 208, 208, 208, 208, 208, 208, 208, - 208, 208, 209, 208, 210, 210, 211, 211, 211, 212, - 212, 212, 212, 212, 213, 213, 214, 214, 214, 214, - 214, 215, 215, 216, 216, 217, 217, 218, 218, 218, - 218, 218, 219, 219, 219, 219, 219, 219, 220, 220, - 220, 221, 221, 221, 221, 222, 222, 222, 222, 222, - 222, 222, 222, 223, 223, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, + 182, 182, 182, 184, 183, 183, 185, 183, 183, 183, + 186, 186, 188, 187, 187, 189, 189, 191, 190, 192, + 190, 194, 193, 195, 193, 196, 193, 197, 193, 198, + 193, 193, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 201, 201, 201, 202, 203, + 202, 202, 202, 204, 204, 205, 205, 206, 206, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, + 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 210, 209, 211, 211, 212, 212, 212, + 213, 213, 213, 213, 213, 214, 214, 215, 215, 215, + 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, + 219, 219, 219, 220, 220, 220, 220, 220, 220, 221, + 221, 221, 222, 222, 222, 222, 223, 223, 223, 223, + 223, 223, 223, 223, 224, 224, 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 227, 227, 227, 227, 227, 227, 227, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, - 229, 229, 230, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 232, 232, 232, 232, - 232, 232, 232, 232, 233, 233, 234, 234, 234, 234, - 235, 235, 235, 235, 237, 236, 239, 238, 240, 240, - 241, 241, 242, 242, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 244, 245, 245, 245, 245, 246, - 246, 247, 247, 247, 248, 248, 248, 249, 249, 249, - 250, 250, 250, 252, 251, 253, 251, 251, 251, 254, - 254, 254, 255, 255, 255, 256, 256, 256, 256, 256, - 256, 256, 256, 256, 256, 256, 256, 256, 256, 257, - 257, 257, 258, 260, 259, 261, 261, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 263, 263, 264, 264, - 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 266, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 229, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 231, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, + 233, 233, 233, 233, 233, 234, 234, 235, 235, 235, + 235, 236, 236, 236, 236, 238, 237, 240, 239, 241, + 241, 242, 242, 243, 243, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 245, 246, 246, 246, 246, + 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, + 250, 251, 251, 251, 253, 252, 254, 252, 252, 252, + 255, 255, 255, 256, 256, 256, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 258, 258, 258, 259, 261, 260, 262, 262, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 264, 264, 265, + 265, 266, 266, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 270, 270, 270, 270, 270, 270, + 269, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, - 272, 272, 272, 272, 273, 273, 273, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, - 275, 276, 276, 276, 276, 277 + 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, + 272, 273, 273, 273, 273, 274, 274, 274, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, + 276, 276, 277, 277, 277, 277, 278 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -3112,41 +3122,41 @@ static const yytype_uint8 yyr2[] = 9, 11, 13, 9, 13, 9, 7, 5, 0, 3, 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 5, 5, 1, 3, - 1, 4, 4, 0, 4, 3, 3, 3, 1, 2, - 4, 0, 4, 3, 2, 4, 0, 6, 0, 6, - 0, 7, 0, 11, 0, 12, 0, 8, 0, 9, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 4, 5, 6, 4, 1, 1, 1, 1, 1, + 1, 4, 4, 0, 4, 3, 0, 4, 3, 1, + 2, 4, 0, 4, 3, 2, 4, 0, 6, 0, + 6, 0, 7, 0, 11, 0, 12, 0, 8, 0, + 9, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 4, 5, 6, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 1, 1, 1, 1, 1, 2, 0, 6, - 2, 2, 1, 1, 1, 3, 1, 1, 1, 2, - 4, 2, 3, 3, 4, 2, 3, 1, 1, 1, - 1, 1, 2, 3, 2, 2, 2, 2, 2, 3, - 4, 3, 0, 6, 2, 3, 1, 3, 4, 1, - 1, 1, 3, 2, 1, 3, 1, 1, 1, 3, - 2, 1, 3, 1, 2, 1, 2, 1, 3, 5, - 3, 3, 1, 3, 3, 3, 3, 4, 1, 1, - 2, 1, 3, 3, 5, 3, 4, 5, 3, 4, - 5, 2, 4, 1, 1, 1, 1, 2, 2, 2, - 2, 2, 3, 4, 1, 1, 2, 2, 2, 2, - 2, 3, 4, 7, 3, 1, 2, 2, 2, 2, - 2, 2, 3, 4, 7, 3, 1, 1, 2, 2, - 2, 2, 2, 2, 3, 4, 1, 1, 2, 2, - 2, 2, 2, 2, 3, 4, 5, 9, 9, 9, - 1, 1, 2, 1, 1, 1, 3, 4, 4, 4, - 4, 1, 1, 1, 1, 2, 1, 1, 1, 3, - 4, 2, 4, 4, 4, 1, 1, 1, 2, 3, - 2, 4, 4, 1, 1, 1, 2, 3, 2, 3, - 1, 4, 5, 5, 0, 6, 0, 9, 1, 1, - 1, 1, 2, 3, 1, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 4, 3, 1, 4, 2, 1, - 1, 1, 3, 5, 1, 2, 4, 1, 2, 2, - 1, 1, 1, 0, 6, 0, 7, 4, 5, 3, - 5, 4, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, - 1, 2, 1, 0, 2, 1, 2, 1, 1, 1, + 1, 2, 2, 1, 1, 1, 1, 1, 2, 0, + 6, 2, 2, 1, 1, 1, 3, 1, 1, 1, + 2, 4, 2, 3, 3, 4, 2, 3, 1, 1, + 1, 1, 1, 2, 3, 2, 2, 2, 2, 2, + 3, 4, 3, 0, 6, 2, 3, 1, 3, 4, + 1, 1, 1, 3, 2, 1, 3, 1, 1, 1, + 3, 2, 1, 3, 1, 2, 1, 2, 1, 3, + 5, 3, 3, 1, 3, 3, 3, 3, 4, 1, + 1, 2, 1, 3, 3, 5, 3, 4, 5, 3, + 4, 5, 2, 4, 1, 1, 1, 1, 2, 2, + 2, 2, 2, 3, 4, 1, 1, 2, 2, 2, + 2, 2, 3, 4, 7, 3, 1, 2, 2, 2, + 2, 2, 2, 3, 4, 7, 3, 1, 1, 2, + 2, 2, 2, 2, 2, 3, 4, 1, 1, 2, + 2, 2, 2, 2, 2, 3, 4, 5, 9, 9, + 9, 1, 1, 2, 1, 1, 1, 3, 4, 4, + 4, 4, 1, 1, 1, 1, 2, 1, 1, 1, + 3, 4, 2, 4, 4, 4, 1, 1, 1, 2, + 3, 2, 4, 4, 1, 1, 1, 2, 3, 2, + 3, 1, 4, 5, 5, 0, 6, 0, 9, 1, + 1, 1, 1, 2, 3, 1, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 4, 3, 1, 4, 2, + 1, 1, 1, 3, 5, 1, 2, 4, 1, 2, + 2, 1, 1, 1, 0, 6, 0, 7, 4, 5, + 3, 5, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 1, 1, 2, 1, 0, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -3159,29 +3169,29 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, - 1, 3, 1, 4, 7, 7, 7, 7, 4, 4, - 5, 4, 2, 2, 2, 2, 2, 2, 3, 3, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 3, 1, 4, 7, 7, 7, 7, 4, + 4, 5, 4, 2, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 5, 4, 4, 3, 3, + 3, 3, 1, 4, 7, 7, 7, 7, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 5, 4, 2, 5, 4, 4, + 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, 3, 3, - 3, 1, 4, 7, 7, 7, 7, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 5, 4, 2, 5, 4, 4, 2, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 8, 11, 4, 4, 6, 4, 4, 6, + 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 1, 4, 7, 7, 7, 7, 4, 4, 5, + 4, 2, 5, 4, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 5, 4, 4, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, + 4, 3, 3, 3, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 4, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 8, 11, 4, 4, 6, 4, 4, 6, 6, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 1, 4, 7, 7, 7, 7, 4, 4, 5, 4, - 2, 5, 4, 4, 2, 2, 2, 2, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, - 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, - 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 0 + 1, 1, 1, 1, 2, 2, 0 }; @@ -3961,7 +3971,7 @@ yyreduce: { current_expr = (yyvsp[0].u.expr); } -#line 3965 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 3975 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 4: @@ -3969,7 +3979,7 @@ yyreduce: { current_type = (yyvsp[0].u.type); } -#line 3973 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 3983 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 10: @@ -3977,7 +3987,7 @@ yyreduce: { delete (yyvsp[-1].u.expr); } -#line 3981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 3991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 11: @@ -3985,7 +3995,7 @@ yyreduce: { delete (yyvsp[-2].u.expr); } -#line 3989 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 3999 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 12: @@ -3993,7 +4003,7 @@ yyreduce: { delete (yyvsp[-1].u.expr); } -#line 3997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4007 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 13: @@ -4002,7 +4012,7 @@ yyreduce: push_storage_class((current_storage_class & ~CPPInstance::SC_c_binding) | ((yyvsp[-1].u.integer) & CPPInstance::SC_c_binding)); } -#line 4006 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4016 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 14: @@ -4010,7 +4020,7 @@ yyreduce: { pop_storage_class(); } -#line 4014 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4024 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 21: @@ -4027,7 +4037,7 @@ yyreduce: publish_nest_level++; current_scope->set_current_vis(V_published); } -#line 4031 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4041 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 22: @@ -4040,7 +4050,7 @@ yyreduce: } publish_nest_level = 0; } -#line 4044 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4054 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 23: @@ -4048,7 +4058,7 @@ yyreduce: { current_scope->set_current_vis(V_published); } -#line 4052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4062 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 24: @@ -4060,7 +4070,7 @@ yyreduce: current_scope->set_current_vis(V_public); } } -#line 4064 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4074 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 25: @@ -4068,7 +4078,7 @@ yyreduce: { current_scope->set_current_vis(V_protected); } -#line 4072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 26: @@ -4076,7 +4086,7 @@ yyreduce: { current_scope->set_current_vis(V_private); } -#line 4080 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 27: @@ -4091,7 +4101,7 @@ yyreduce: CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-4].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[-6]).file); current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-6])); } -#line 4095 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4105 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 28: @@ -4116,7 +4126,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } } -#line 4120 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4130 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 29: @@ -4150,7 +4160,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); } } -#line 4154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 30: @@ -4171,7 +4181,7 @@ yyreduce: make_property->_length_function = length_getter->as_function_group(); current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } -#line 4175 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4185 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 31: @@ -4203,7 +4213,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); } } -#line 4207 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4217 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 32: @@ -4244,7 +4254,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); } } -#line 4248 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4258 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 33: @@ -4270,7 +4280,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } } -#line 4274 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4284 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 34: @@ -4307,7 +4317,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); } } -#line 4311 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4321 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 35: @@ -4333,7 +4343,7 @@ yyreduce: current_scope->add_declaration(make_seq, global_scope, current_lexer, (yylsp[-8])); } } -#line 4337 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4347 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 36: @@ -4348,7 +4358,7 @@ yyreduce: yywarning("static_assert failed: " + str.str(), (yylsp[-4])); } } -#line 4352 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4362 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 37: @@ -4362,7 +4372,7 @@ yyreduce: yywarning("static_assert failed", (yylsp[-2])); } } -#line 4366 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4376 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 38: @@ -4372,7 +4382,7 @@ yyreduce: V_public); push_scope(new_scope); } -#line 4376 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 39: @@ -4381,7 +4391,7 @@ yyreduce: delete current_scope; pop_scope(); } -#line 4385 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4395 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 40: @@ -4389,7 +4399,7 @@ yyreduce: { (yyval.u.integer) = 0; } -#line 4393 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4403 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 41: @@ -4398,7 +4408,7 @@ yyreduce: // This isn't really a storage class, but it helps with parsing. (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_const; } -#line 4402 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4412 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 42: @@ -4406,7 +4416,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extern; } -#line 4410 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4420 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 43: @@ -4421,7 +4431,7 @@ yyreduce: yywarning("Ignoring unknown linkage type \"" + (yyvsp[-1].str) + "\"", (yylsp[-1])); } } -#line 4425 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4435 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 44: @@ -4429,7 +4439,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_static; } -#line 4433 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4443 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 45: @@ -4437,7 +4447,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_inline; } -#line 4441 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4451 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 46: @@ -4445,7 +4455,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_virtual; } -#line 4449 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4459 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 47: @@ -4453,7 +4463,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_explicit; } -#line 4457 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 48: @@ -4461,7 +4471,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_register; } -#line 4465 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4475 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 49: @@ -4469,7 +4479,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_volatile; } -#line 4473 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4483 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 50: @@ -4477,7 +4487,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_mutable; } -#line 4481 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4491 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 51: @@ -4485,7 +4495,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_constexpr; } -#line 4489 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4499 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 52: @@ -4493,7 +4503,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_blocking; } -#line 4497 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4507 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 53: @@ -4501,7 +4511,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extension; } -#line 4505 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4515 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 54: @@ -4509,7 +4519,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_thread_local; } -#line 4513 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4523 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 55: @@ -4518,7 +4528,7 @@ yyreduce: // Ignore attribute specifiers for now. (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4522 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4532 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 56: @@ -4526,7 +4536,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4530 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4540 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 57: @@ -4534,7 +4544,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4538 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4548 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 63: @@ -4549,7 +4559,7 @@ yyreduce: } push_storage_class((yyvsp[-1].u.integer)); } -#line 4553 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4563 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 64: @@ -4557,7 +4567,7 @@ yyreduce: { pop_storage_class(); } -#line 4561 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4571 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 65: @@ -4570,23 +4580,36 @@ yyreduce: current_scope->add_declaration((yyvsp[-1].u.decl), global_scope, current_lexer, (yylsp[-1])); } -#line 4574 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4584 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 66: #line 932 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - if ((yyvsp[-1].u.instance) != (CPPInstance *)NULL) { - (yyvsp[-1].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); - current_scope->add_declaration((yyvsp[-1].u.instance), global_scope, current_lexer, (yylsp[-1])); - (yyvsp[-1].u.instance)->set_initializer((yyvsp[0].u.expr)); + if ((yyvsp[0].u.instance) != (CPPInstance *)NULL) { + // Push the scope so that the initializers can make use of things defined + // in the class body. + push_scope((yyvsp[0].u.instance)->get_scope(current_scope, global_scope)); + (yyvsp[0].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-1].u.integer)); } } -#line 4586 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4597 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 67: -#line 940 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 941 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + if ((yyvsp[-2].u.instance) != (CPPInstance *)NULL) { + pop_scope(); + current_scope->add_declaration((yyvsp[-2].u.instance), global_scope, current_lexer, (yylsp[-2])); + (yyvsp[-2].u.instance)->set_initializer((yyvsp[0].u.expr)); + } +} +#line 4609 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 68: +#line 949 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-1].u.instance) != (CPPInstance *)NULL) { (yyvsp[-1].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); @@ -4594,11 +4617,11 @@ yyreduce: (yyvsp[-1].u.instance)->set_initializer((yyvsp[0].u.expr)); } } -#line 4598 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 69: -#line 956 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 70: +#line 965 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); @@ -4609,11 +4632,11 @@ yyreduce: inst->set_initializer((yyvsp[0].u.expr)); current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-1])); } -#line 4613 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4636 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 70: -#line 967 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 71: +#line 976 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { (yyvsp[-3].u.inst_ident)->add_modifier(IIT_const); @@ -4624,11 +4647,11 @@ yyreduce: inst->set_initializer((yyvsp[-2].u.expr)); current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-3])); } -#line 4628 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4651 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 71: -#line 982 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 72: +#line 991 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We don't need to push/pop type, because we can't nest // multiple_var_declarations. @@ -4639,19 +4662,19 @@ yyreduce: } push_storage_class((yyvsp[-1].u.integer)); } -#line 4643 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 72: -#line 993 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - pop_storage_class(); -} -#line 4651 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4666 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 73: -#line 997 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1002 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + pop_storage_class(); +} +#line 4674 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 74: +#line 1006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-1].u.instance) != (CPPDeclaration *)NULL) { CPPInstance *inst = (yyvsp[-1].u.instance)->as_instance(); @@ -4663,11 +4686,11 @@ yyreduce: } } } -#line 4667 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4690 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 74: -#line 1012 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 75: +#line 1021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); @@ -4676,11 +4699,11 @@ yyreduce: CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-1].u.inst_ident), current_scope, (yylsp[-1]).file); current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-1])); } -#line 4680 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 75: -#line 1021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 76: +#line 1030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { (yyvsp[-3].u.inst_ident)->add_modifier(IIT_const); @@ -4689,19 +4712,19 @@ yyreduce: CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-3].u.inst_ident), current_scope, (yylsp[-3]).file); current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-3])); } -#line 4693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 76: -#line 1035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); -} -#line 4701 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4716 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 77: -#line 1039 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1044 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); +} +#line 4724 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 78: +#line 1048 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type; if ((yyvsp[-5].u.identifier)->get_simple_name() == current_scope->get_simple_name() || @@ -4721,19 +4744,19 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } -#line 4725 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 78: -#line 1059 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); -} -#line 4733 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4748 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 79: -#line 1063 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1068 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); +} +#line 4756 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 80: +#line 1072 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); CPPType *type; @@ -4751,19 +4774,19 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } -#line 4755 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 80: -#line 1086 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); -} -#line 4763 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4778 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 81: -#line 1090 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); +} +#line 4786 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 82: +#line 1099 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); if ((yyvsp[-5].u.identifier)->is_scoped()) { @@ -4782,19 +4805,19 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } } -#line 4786 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 82: -#line 1116 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); -} -#line 4794 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4809 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 83: -#line 1120 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1125 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); +} +#line 4817 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 84: +#line 1129 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); CPPType *type = (yyvsp[-10].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); @@ -4808,19 +4831,19 @@ yyreduce: ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-10]).file); } -#line 4812 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 84: -#line 1134 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); -} -#line 4820 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4835 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 85: -#line 1138 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1143 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); +} +#line 4843 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 86: +#line 1147 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); CPPType *type = (yyvsp[-11].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); @@ -4834,21 +4857,21 @@ yyreduce: ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-11]).file); } -#line 4838 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4861 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 86: -#line 1154 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 87: +#line 1163 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-3].u.identifier) != NULL) { push_scope((yyvsp[-3].u.identifier)->get_scope(current_scope, global_scope)); } } -#line 4848 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4871 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 87: -#line 1160 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 88: +#line 1169 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-7].u.identifier) != NULL) { pop_scope(); @@ -4873,21 +4896,21 @@ yyreduce: (yyval.u.instance) = CPPInstance::make_typecast_function (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 4877 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4900 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 88: -#line 1185 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 89: +#line 1194 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-4].u.identifier) != NULL) { push_scope((yyvsp[-4].u.identifier)->get_scope(current_scope, global_scope)); } } -#line 4887 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 89: -#line 1191 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 90: +#line 1200 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-8].u.identifier) != NULL) { pop_scope(); @@ -4903,11 +4926,11 @@ yyreduce: (yyval.u.instance) = CPPInstance::make_typecast_function (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 4907 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4930 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 90: -#line 1211 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 91: +#line 1220 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *decl = (yyvsp[0].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); @@ -4917,586 +4940,574 @@ yyreduce: (yyval.u.instance) = (CPPInstance *)NULL; } } -#line 4921 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 91: -#line 1224 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = 0; -} -#line 4929 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4944 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 92: -#line 1228 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1233 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_const_method; + (yyval.u.integer) = 0; } -#line 4937 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4952 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 93: -#line 1232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1237 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_volatile_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_const_method; } -#line 4945 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4960 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 94: -#line 1236 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1241 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_noexcept; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_volatile_method; } -#line 4953 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4968 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 95: -#line 1249 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1245 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_final; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_noexcept; } -#line 4961 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4976 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 96: -#line 1253 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1258 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_override; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_final; } -#line 4969 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4984 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 97: -#line 1257 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1262 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_lvalue_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_override; } -#line 4977 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4992 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 98: -#line 1261 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1266 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_rvalue_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_lvalue_method; } -#line 4985 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5000 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 99: -#line 1265 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1270 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_rvalue_method; +} +#line 5008 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 100: +#line 1274 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Used for lambdas, currently ignored. (yyval.u.integer) = (yyvsp[-1].u.integer); } -#line 4994 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5017 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 100: -#line 1270 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 101: +#line 1279 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Used for lambdas in C++17, currently ignored. (yyval.u.integer) = (yyvsp[-1].u.integer); } -#line 5003 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 101: -#line 1275 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-3].u.integer); -} -#line 5011 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5026 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 102: -#line 1279 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-4].u.integer); -} -#line 5019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 103: -#line 1283 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-5].u.integer); -} -#line 5027 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 104: -#line 1287 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1284 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = (yyvsp[-3].u.integer); } -#line 5035 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5034 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 103: +#line 1288 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.integer) = (yyvsp[-4].u.integer); +} +#line 5042 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 104: +#line 1292 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.integer) = (yyvsp[-5].u.integer); +} +#line 5050 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 105: -#line 1294 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1296 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "!"; + (yyval.u.integer) = (yyvsp[-3].u.integer); } -#line 5043 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5058 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 106: -#line 1298 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1303 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "~"; + (yyval.str) = "!"; } -#line 5051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5066 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 107: -#line 1302 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1307 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "*"; + (yyval.str) = "~"; } -#line 5059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5074 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 108: -#line 1306 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1311 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "/"; + (yyval.str) = "*"; } -#line 5067 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 109: -#line 1310 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1315 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "%"; + (yyval.str) = "/"; } -#line 5075 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 110: -#line 1314 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1319 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "+"; + (yyval.str) = "%"; } -#line 5083 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5098 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 111: -#line 1318 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1323 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "-"; + (yyval.str) = "+"; } -#line 5091 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5106 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 112: -#line 1322 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1327 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "|"; + (yyval.str) = "-"; } -#line 5099 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5114 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 113: -#line 1326 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1331 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "&"; + (yyval.str) = "|"; } -#line 5107 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5122 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 114: -#line 1330 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1335 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "^"; + (yyval.str) = "&"; } -#line 5115 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5130 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 115: -#line 1334 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1339 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "||"; + (yyval.str) = "^"; } -#line 5123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5138 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 116: -#line 1338 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1343 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "&&"; + (yyval.str) = "||"; } -#line 5131 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 117: -#line 1342 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1347 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "=="; + (yyval.str) = "&&"; } -#line 5139 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 118: -#line 1346 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1351 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "!="; + (yyval.str) = "=="; } -#line 5147 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5162 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 119: -#line 1350 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1355 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "<="; + (yyval.str) = "!="; } -#line 5155 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5170 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 120: -#line 1354 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1359 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ">="; + (yyval.str) = "<="; } -#line 5163 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5178 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 121: -#line 1358 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1363 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "<"; + (yyval.str) = ">="; } -#line 5171 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5186 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 122: -#line 1362 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1367 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ">"; + (yyval.str) = "<"; } -#line 5179 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5194 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 123: -#line 1366 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1371 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "<<"; + (yyval.str) = ">"; } -#line 5187 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5202 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 124: -#line 1370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1375 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ">>"; + (yyval.str) = "<<"; } -#line 5195 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5210 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 125: -#line 1374 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1379 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "="; + (yyval.str) = ">>"; } -#line 5203 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5218 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 126: -#line 1378 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1383 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ","; + (yyval.str) = "="; } -#line 5211 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5226 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 127: -#line 1382 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1387 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "++"; + (yyval.str) = ","; } -#line 5219 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5234 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 128: -#line 1386 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1391 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "--"; + (yyval.str) = "++"; } -#line 5227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 129: -#line 1390 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1395 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "*="; + (yyval.str) = "--"; } -#line 5235 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5250 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 130: -#line 1394 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1399 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "/="; + (yyval.str) = "*="; } -#line 5243 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5258 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 131: -#line 1398 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1403 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "%="; + (yyval.str) = "/="; } -#line 5251 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5266 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 132: -#line 1402 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1407 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "+="; + (yyval.str) = "%="; } -#line 5259 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5274 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 133: -#line 1406 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1411 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "-="; + (yyval.str) = "+="; } -#line 5267 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5282 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 134: -#line 1410 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1415 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "|="; + (yyval.str) = "-="; } -#line 5275 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5290 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 135: -#line 1414 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1419 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "&="; + (yyval.str) = "|="; } -#line 5283 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5298 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 136: -#line 1418 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1423 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "^="; + (yyval.str) = "&="; } -#line 5291 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5306 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 137: -#line 1422 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1427 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "<<="; + (yyval.str) = "^="; } -#line 5299 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5314 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 138: -#line 1426 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1431 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ">>="; + (yyval.str) = "<<="; } -#line 5307 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5322 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 139: -#line 1430 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1435 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "->"; + (yyval.str) = ">>="; } -#line 5315 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5330 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 140: -#line 1434 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1439 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "[]"; + (yyval.str) = "->"; } -#line 5323 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5338 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 141: -#line 1438 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1443 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "()"; + (yyval.str) = "[]"; } -#line 5331 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5346 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 142: -#line 1442 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1447 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "new"; + (yyval.str) = "()"; } -#line 5339 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5354 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 143: -#line 1446 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1451 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.str) = "new"; +} +#line 5362 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 144: +#line 1455 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "delete"; } -#line 5347 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 148: -#line 1460 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - push_scope(new CPPTemplateScope(current_scope)); -} -#line 5355 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5370 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 149: -#line 1464 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1469 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + push_scope(new CPPTemplateScope(current_scope)); +} +#line 5378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 150: +#line 1473 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); } -#line 5363 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 154: -#line 1478 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPTemplateScope *ts = current_scope->as_template_scope(); - assert(ts != NULL); - ts->add_template_parameter((yyvsp[0].u.decl)); -} -#line 5373 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 155: -#line 1484 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1487 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPTemplateScope *ts = current_scope->as_template_scope(); assert(ts != NULL); ts->add_template_parameter((yyvsp[0].u.decl)); } -#line 5383 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 158: -#line 1498 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 156: +#line 1493 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); + CPPTemplateScope *ts = current_scope->as_template_scope(); + assert(ts != NULL); + ts->add_template_parameter((yyvsp[0].u.decl)); } -#line 5391 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 159: -#line 1502 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1507 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[0].u.identifier))); + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); } -#line 5399 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 160: -#line 1506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1511 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[-2].u.identifier), (yyvsp[0].u.type))); + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[0].u.identifier))); } -#line 5407 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 161: -#line 1510 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1515 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[-2].u.identifier), (yyvsp[0].u.type))); +} +#line 5430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 162: +#line 1519 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((CPPIdentifier *)NULL); ctp->_packed = true; (yyval.u.decl) = CPPType::new_type(ctp); } -#line 5417 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5440 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 162: -#line 1516 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 163: +#line 1525 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[0].u.identifier)); ctp->_packed = true; (yyval.u.decl) = CPPType::new_type(ctp); } -#line 5427 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 163: -#line 1522 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 164: +#line 1531 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPInstance *inst = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); inst->set_initializer((yyvsp[0].u.expr)); (yyval.u.decl) = inst; } -#line 5437 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 164: -#line 1528 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 165: +#line 1537 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); CPPInstance *inst = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); inst->set_initializer((yyvsp[0].u.expr)); (yyval.u.decl) = inst; } -#line 5448 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 165: -#line 1535 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); - (yyval.u.decl) = inst; -} -#line 5457 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5471 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 166: -#line 1540 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1544 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); (yyval.u.decl) = inst; } -#line 5467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5480 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 167: #line 1549 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); + (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); + CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); + (yyval.u.decl) = inst; } -#line 5475 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5490 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 168: -#line 1553 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1558 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); +} +#line 5498 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 169: +#line 1562 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { yywarning("Not a type: " + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } -#line 5484 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 169: -#line 1558 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - } - assert((yyval.u.type) != NULL); -} -#line 5496 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5507 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 170: -#line 1566 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1567 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.type) == NULL) { @@ -5504,19 +5515,31 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 5508 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5519 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 171: -#line 1578 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1575 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + } + assert((yyval.u.type) != NULL); } -#line 5516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5531 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 172: -#line 1582 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1587 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); +} +#line 5539 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 173: +#line 1591 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // For an operator function. We implement this simply by building a // ficticious name for the function; in other respects it's just @@ -5530,11 +5553,11 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } -#line 5534 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5557 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 173: -#line 1596 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 174: +#line 1605 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A C++11 literal operator. if (!(yyvsp[-1].str).empty()) { @@ -5549,83 +5572,83 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } -#line 5553 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5576 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 174: -#line 1611 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 175: +#line 1620 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 5562 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5585 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 175: -#line 1616 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 176: +#line 1625 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 5571 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5594 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 176: -#line 1621 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 177: +#line 1630 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 5580 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5603 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 177: -#line 1626 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 178: +#line 1635 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 5589 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5612 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 178: -#line 1631 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 179: +#line 1640 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 5598 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 179: -#line 1636 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 180: +#line 1645 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 5607 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5630 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 180: -#line 1641 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 181: +#line 1650 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 5616 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 181: -#line 1646 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 182: +#line 1655 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 5625 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5648 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 182: -#line 1651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 183: +#line 1660 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Create a scope for this function (in case it is a function) CPPScope *scope = new CPPScope((yyvsp[-1].u.inst_ident)->get_scope(current_scope, global_scope), @@ -5638,11 +5661,11 @@ yyreduce: push_scope(scope); } -#line 5642 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5665 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 183: -#line 1664 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 184: +#line 1673 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); @@ -5656,11 +5679,11 @@ yyreduce: (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } } -#line 5660 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5683 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 184: -#line 1682 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 185: +#line 1691 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This is handled a bit awkwardly right now. Ideally it'd be wrapped // up in the instance_identifier rule, but then more needs to happen in @@ -5670,894 +5693,894 @@ yyreduce: } (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); } -#line 5674 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5697 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 185: -#line 1692 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 186: +#line 1701 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Bitfield definition. (yyvsp[-2].u.inst_ident)->_bit_width = (yyvsp[0].u.integer); (yyval.u.inst_ident) = (yyvsp[-2].u.inst_ident); } -#line 5684 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 186: -#line 1702 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = NULL; -} -#line 5692 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5707 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 187: -#line 1706 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1711 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); + (yyval.u.type) = NULL; } -#line 5700 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5715 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 188: -#line 1710 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1715 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 5709 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5723 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 189: #line 1719 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = new CPPParameterList; + (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 5717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5732 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 190: -#line 1723 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1728 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5726 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5740 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 191: -#line 1728 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1732 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[0].u.param_list); + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5749 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 192: -#line 1732 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; -} -#line 5743 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 193: #line 1737 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[-1].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; -} -#line 5752 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 194: -#line 1745 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); -} -#line 5761 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 195: -#line 1750 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); -} -#line 5770 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 196: -#line 1758 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; -} -#line 5778 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 197: -#line 1762 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_includes_ellipsis = true; -} -#line 5787 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 198: -#line 1767 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { (yyval.u.param_list) = (yyvsp[0].u.param_list); } -#line 5795 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 199: -#line 1771 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 193: +#line 1741 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = (yyvsp[-2].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5804 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 200: -#line 1776 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 194: +#line 1746 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = (yyvsp[-1].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5813 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5775 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 201: -#line 1784 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 195: +#line 1754 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = new CPPParameterList; (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5822 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5784 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 202: -#line 1789 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 196: +#line 1759 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = (yyvsp[-2].u.param_list); (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5793 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 197: +#line 1767 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = new CPPParameterList; +} +#line 5801 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 198: +#line 1771 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_includes_ellipsis = true; +} +#line 5810 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 199: +#line 1776 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = (yyvsp[0].u.param_list); +} +#line 5818 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 200: +#line 1780 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; +} +#line 5827 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 201: +#line 1785 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = (yyvsp[-1].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; +} +#line 5836 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 202: +#line 1793 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); +} +#line 5845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 203: -#line 1797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1798 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5839 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5854 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 204: -#line 1801 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1806 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5847 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5862 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 205: -#line 1808 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 5855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 206: -#line 1812 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1810 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 5863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5870 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 206: +#line 1817 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (CPPExpression *)NULL; +} +#line 5878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 207: -#line 1819 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (CPPExpression *)NULL; + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 5871 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5886 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 208: -#line 1823 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1828 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5879 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 209: -#line 1827 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1832 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5887 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5902 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 210: -#line 1831 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1836 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5895 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 211: -#line 1835 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); -} -#line 5903 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 212: -#line 1842 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 5911 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 213: -#line 1846 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 5919 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 214: -#line 1850 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[-1].u.expr); -} -#line 5927 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 215: -#line 1854 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1840 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); } -#line 5935 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5918 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 216: -#line 1858 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 212: +#line 1844 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); } -#line 5943 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5926 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 217: -#line 1862 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 213: +#line 1851 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5951 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 221: -#line 1875 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 214: +#line 1855 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { + (yyval.u.expr) = (CPPExpression *)NULL; +} +#line 5942 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 215: +#line 1859 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[-1].u.expr); +} +#line 5950 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 216: +#line 1863 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); } #line 5958 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 225: + case 217: +#line 1867 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); +} +#line 5966 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 218: +#line 1871 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (CPPExpression *)NULL; +} +#line 5974 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 222: #line 1884 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 5967 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 226: -#line 1889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1893 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 5977 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5990 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 227: -#line 1895 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1898 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 5987 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6000 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 228: -#line 1901 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); -} -#line 5996 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 229: -#line 1906 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); -} -#line 6006 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 230: -#line 1912 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1904 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6016 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6010 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 229: +#line 1910 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); +} +#line 6019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 230: +#line 1915 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); +} +#line 6029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 231: -#line 1918 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1921 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = (yyvsp[0].u.instance); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6024 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6039 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 232: -#line 1922 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1927 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.instance) = (yyvsp[0].u.instance); } -#line 6032 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6047 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 233: -#line 1933 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1931 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.instance) = (yyvsp[0].u.instance); } -#line 6040 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6055 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 234: -#line 1937 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1942 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.instance) = (yyvsp[0].u.instance); +} +#line 6063 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 235: +#line 1946 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_parameter)); (yyval.u.instance) = new CPPInstance(type, "expr"); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 235: -#line 1947 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); -} -#line 6059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6074 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 236: -#line 1951 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1956 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6067 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 237: -#line 1955 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1960 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); } -#line 6076 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 238: -#line 1960 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1964 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6085 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6099 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 239: -#line 1965 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1969 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6094 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6108 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 240: -#line 1970 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1974 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6103 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6117 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 241: -#line 1975 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1979 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6126 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 242: -#line 1980 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1984 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6121 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6135 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 243: -#line 1985 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1989 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6130 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6144 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 244: -#line 1993 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1994 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6138 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6153 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 245: -#line 1997 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2002 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6161 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 246: -#line 2001 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); } -#line 6155 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6169 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 247: -#line 2006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2010 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); + (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6178 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 248: -#line 2011 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2015 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6173 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6187 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 249: -#line 2016 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2020 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6182 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6196 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 250: -#line 2021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2025 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); + (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6191 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6205 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 251: -#line 2026 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6200 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6214 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 252: -#line 2031 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6209 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6223 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 253: -#line 2036 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2040 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6219 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6232 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 254: -#line 2042 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); -} -#line 6228 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 255: -#line 2050 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; -} -#line 6237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 256: -#line 2055 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); - (yyval.u.inst_ident)->_packed = true; -} -#line 6246 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 257: -#line 2060 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); -} -#line 6255 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 258: -#line 2065 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); -} -#line 6264 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 259: -#line 2070 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); -} -#line 6273 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 260: -#line 2075 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); -} -#line 6282 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 261: -#line 2080 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); -} -#line 6291 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 262: -#line 2085 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); -} -#line 6300 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 263: -#line 2090 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); -} -#line 6309 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 264: -#line 2095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2045 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 6319 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 265: -#line 2101 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 255: +#line 2051 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 6328 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6251 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 256: +#line 2059 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; +} +#line 6260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 257: +#line 2064 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident)->_packed = true; +} +#line 6269 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 258: +#line 2069 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); +} +#line 6278 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 259: +#line 2074 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); +} +#line 6287 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 260: +#line 2079 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); +} +#line 6296 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 261: +#line 2084 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); +} +#line 6305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 262: +#line 2089 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); +} +#line 6314 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 263: +#line 2094 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); +} +#line 6323 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 264: +#line 2099 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); +} +#line 6332 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 265: +#line 2104 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); +} +#line 6342 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 266: -#line 2109 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2110 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 6336 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6351 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 267: -#line 2113 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2118 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; } -#line 6345 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6359 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 268: -#line 2118 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2122 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); (yyval.u.inst_ident)->_packed = true; } -#line 6354 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6368 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 269: -#line 2123 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); -} -#line 6363 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 270: -#line 2128 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); -} -#line 6372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 271: -#line 2133 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); -} -#line 6381 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 272: -#line 2138 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); -} -#line 6390 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 273: -#line 2143 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); -} -#line 6399 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 274: -#line 2148 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); -} -#line 6408 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 275: -#line 2153 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); -} -#line 6417 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 276: -#line 2161 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); -} -#line 6425 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 277: -#line 2165 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; -} -#line 6434 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 278: -#line 2170 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2127 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); (yyval.u.inst_ident)->_packed = true; } -#line 6443 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6377 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 279: -#line 2175 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 270: +#line 2132 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 280: -#line 2180 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 271: +#line 2137 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6461 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6395 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 281: -#line 2185 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 272: +#line 2142 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6404 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 282: -#line 2190 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 273: +#line 2147 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6479 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 283: -#line 2195 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 274: +#line 2152 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6488 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 284: -#line 2200 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 275: +#line 2157 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6497 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6431 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 285: -#line 2205 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 276: +#line 2162 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6506 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6440 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 277: +#line 2170 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); +} +#line 6448 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 278: +#line 2174 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; +} +#line 6457 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 279: +#line 2179 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident)->_packed = true; +} +#line 6466 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 280: +#line 2184 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); +} +#line 6475 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 281: +#line 2189 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); +} +#line 6484 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 282: +#line 2194 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); +} +#line 6493 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 283: +#line 2199 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); +} +#line 6502 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 284: +#line 2204 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); +} +#line 6511 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 285: +#line 2209 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); +} +#line 6520 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 286: -#line 2210 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2214 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); +} +#line 6529 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 287: +#line 2219 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6539 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 287: -#line 2216 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 288: +#line 2225 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6527 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 288: -#line 2223 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 289: +#line 2232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6538 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6561 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 289: -#line 2230 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 290: +#line 2239 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 290: -#line 2240 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); -} -#line 6557 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6572 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 291: -#line 2244 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2249 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); +} +#line 6580 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 292: +#line 2253 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.type) == NULL) { @@ -6565,43 +6588,43 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6569 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 292: -#line 2252 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); -} -#line 6577 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6592 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 293: -#line 2256 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2261 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } -#line 6585 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6600 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 294: -#line 2260 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2265 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); } -#line 6593 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6608 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 295: -#line 2264 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2269 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.enum_type)); + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); } -#line 6601 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6616 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 296: -#line 2268 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2273 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.enum_type)); +} +#line 6624 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 297: +#line 2277 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6617,11 +6640,11 @@ yyreduce: (yyval.u.type) = et; } } -#line 6621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6644 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 297: -#line 2284 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 298: +#line 2293 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[-2].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6637,11 +6660,11 @@ yyreduce: (yyval.u.type) = et; } } -#line 6641 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6664 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 298: -#line 2300 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 299: +#line 2309 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[-1].u.expr)->determine_type(); if ((yyval.u.type) == (CPPType *)NULL) { @@ -6650,19 +6673,19 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 299: -#line 2309 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} -#line 6662 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6677 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 300: -#line 2313 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2318 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); +} +#line 6685 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 301: +#line 2322 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { @@ -6672,19 +6695,19 @@ yyreduce: (yyval.u.type) = enum_type->get_underlying_type(); } } -#line 6676 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 301: -#line 2323 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} -#line 6684 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6699 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 302: -#line 2330 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2332 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); +} +#line 6707 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 303: +#line 2339 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.type) == NULL) { @@ -6692,19 +6715,19 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6696 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 303: -#line 2341 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.simple_type)); -} -#line 6704 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6719 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 304: -#line 2345 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2350 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.simple_type)); +} +#line 6727 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 305: +#line 2354 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.decl) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.decl) == NULL) { @@ -6712,43 +6735,43 @@ yyreduce: } assert((yyval.u.decl) != NULL); } -#line 6716 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 305: -#line 2353 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); -} -#line 6724 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6739 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 306: -#line 2357 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2362 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.struct_type)); + (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } -#line 6732 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6747 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 307: -#line 2361 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2366 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.struct_type))); + (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.struct_type)); } -#line 6740 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6755 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 308: -#line 2365 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.enum_type))); + (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.struct_type))); } -#line 6748 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6763 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 309: -#line 2369 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2374 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.enum_type))); +} +#line 6771 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 310: +#line 2378 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6764,11 +6787,11 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6768 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6791 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 310: -#line 2385 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 311: +#line 2394 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[-2].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6784,11 +6807,11 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6788 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6811 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 311: -#line 2401 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 312: +#line 2410 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { yywarning(string("C++ does not permit forward declaration of untyped enum ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[-1])); @@ -6806,11 +6829,11 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6810 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6833 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 312: -#line 2419 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 313: +#line 2428 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.decl) = (yyvsp[-1].u.expr)->determine_type(); if ((yyval.u.decl) == (CPPType *)NULL) { @@ -6819,19 +6842,19 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6823 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 313: -#line 2428 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} -#line 6831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6846 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 314: -#line 2432 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2437 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); +} +#line 6854 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 315: +#line 2441 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { @@ -6841,27 +6864,27 @@ yyreduce: (yyval.u.decl) = enum_type->get_underlying_type(); } } -#line 6845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 315: -#line 2442 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} -#line 6853 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6868 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 316: -#line 2449 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2451 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); + (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6861 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6876 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 317: -#line 2453 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2458 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); +} +#line 6884 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 318: +#line 2462 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.type) == NULL) { @@ -6869,19 +6892,19 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6873 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 318: -#line 2461 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); -} -#line 6881 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6896 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 319: -#line 2465 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2470 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); +} +#line 6904 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 320: +#line 2474 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6897,11 +6920,11 @@ yyreduce: (yyval.u.type) = et; } } -#line 6901 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6924 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 320: -#line 2481 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 321: +#line 2490 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6917,11 +6940,11 @@ yyreduce: (yyval.u.type) = et; } } -#line 6921 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6944 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 321: -#line 2497 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 322: +#line 2506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[-1].u.expr)->determine_type(); if ((yyval.u.type) == (CPPType *)NULL) { @@ -6930,11 +6953,11 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6957 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 322: -#line 2506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 323: +#line 2515 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { @@ -6944,71 +6967,71 @@ yyreduce: (yyval.u.type) = enum_type->get_underlying_type(); } } -#line 6948 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 323: -#line 2516 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); -} -#line 6956 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6971 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 324: -#line 2523 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2525 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = (yyvsp[0].u.decl); + (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6964 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6979 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 325: -#line 2527 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2532 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = (yyvsp[0].u.decl); +} +#line 6987 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 326: +#line 2536 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { yyerror(string("unknown type '") + (yyvsp[0].u.identifier)->get_fully_scoped_name() + "'", (yylsp[0])); (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } -#line 6974 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 326: -#line 2535 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); -} -#line 6982 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 327: -#line 2539 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); -} -#line 6991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 328: #line 2544 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 6999 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7005 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 329: + case 328: #line 2548 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7008 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7014 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 334: -#line 2563 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 329: +#line 2553 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); +} +#line 7022 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 330: +#line 2557 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); +} +#line 7031 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 335: +#line 2572 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPVisibility starting_vis = ((yyvsp[-2].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; @@ -7022,22 +7045,22 @@ yyreduce: push_scope(new_scope); push_struct(st); } -#line 7026 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7049 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 335: -#line 2577 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 336: +#line 2586 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.struct_type) = current_struct; current_struct->_incomplete = false; pop_struct(); pop_scope(); } -#line 7037 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7060 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 336: -#line 2587 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 337: +#line 2596 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPVisibility starting_vis = ((yyvsp[-2].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; @@ -7057,253 +7080,253 @@ yyreduce: push_scope(new_scope); push_struct(st); } -#line 7061 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 337: -#line 2607 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 338: +#line 2616 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.struct_type) = current_struct; current_struct->_incomplete = false; pop_struct(); pop_scope(); } -#line 7072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7095 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 339: -#line 2618 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 340: +#line 2627 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_struct->_final = true; } -#line 7080 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 344: -#line 2635 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_unknown, false); -} -#line 7088 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7103 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 345: -#line 2639 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2644 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_public, false); + current_struct->append_derivation((yyvsp[0].u.type), V_unknown, false); } -#line 7096 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7111 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 346: -#line 2643 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2648 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_protected, false); + current_struct->append_derivation((yyvsp[0].u.type), V_public, false); } -#line 7104 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7119 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 347: -#line 2647 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2652 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_private, false); + current_struct->append_derivation((yyvsp[0].u.type), V_protected, false); } -#line 7112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7127 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 348: -#line 2651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2656 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_public, true); + current_struct->append_derivation((yyvsp[0].u.type), V_private, false); } -#line 7120 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7135 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 349: -#line 2655 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); -} -#line 7128 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 350: -#line 2659 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_private, true); -} -#line 7136 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 351: -#line 2663 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2660 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_struct->append_derivation((yyvsp[0].u.type), V_public, true); } -#line 7144 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7143 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 352: -#line 2667 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 350: +#line 2664 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); } -#line 7152 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7151 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 353: -#line 2671 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 351: +#line 2668 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_struct->append_derivation((yyvsp[0].u.type), V_private, true); } -#line 7160 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7159 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 352: +#line 2672 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_struct->append_derivation((yyvsp[0].u.type), V_public, true); +} +#line 7167 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 353: +#line 2676 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); +} +#line 7175 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 354: -#line 2678 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2680 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_struct->append_derivation((yyvsp[0].u.type), V_private, true); +} +#line 7183 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 355: +#line 2687 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.enum_type) = current_enum; current_enum = NULL; } -#line 7169 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 355: -#line 2686 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_enum = new CPPEnumType((yyvsp[-2].u.extension_enum), NULL, (yyvsp[0].u.type), current_scope, NULL, (yylsp[-2]).file); -} -#line 7177 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7192 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 356: -#line 2690 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2695 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_enum = new CPPEnumType((yyvsp[0].u.extension_enum), NULL, current_scope, NULL, (yylsp[0]).file); + current_enum = new CPPEnumType((yyvsp[-2].u.extension_enum), NULL, (yyvsp[0].u.type), current_scope, NULL, (yylsp[-2]).file); } -#line 7185 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7200 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 357: -#line 2694 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2699 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_enum = new CPPEnumType((yyvsp[0].u.extension_enum), NULL, current_scope, NULL, (yylsp[0]).file); +} +#line 7208 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 358: +#line 2703 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[-2].u.identifier)->_names.back(), V_public); current_enum = new CPPEnumType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), (yyvsp[0].u.type), current_scope, new_scope, (yylsp[-3]).file); } -#line 7194 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7217 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 358: -#line 2699 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 359: +#line 2708 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[0].u.identifier)->_names.back(), V_public); current_enum = new CPPEnumType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, new_scope, (yylsp[-1]).file); } -#line 7203 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 359: -#line 2707 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); -} -#line 7211 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7226 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 360: -#line 2711 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2716 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); +} +#line 7234 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 361: +#line 2720 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); } -#line 7219 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 362: -#line 2719 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 363: +#line 2728 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { assert(current_enum != NULL); current_enum->add_element((yyvsp[-1].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[-1])); } -#line 7228 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7251 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 363: -#line 2724 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 364: +#line 2733 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { assert(current_enum != NULL); current_enum->add_element((yyvsp[-3].u.identifier)->get_simple_name(), (yyvsp[-1].u.expr), current_lexer, (yylsp[-3])); } -#line 7237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 365: -#line 2732 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 366: +#line 2741 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { assert(current_enum != NULL); current_enum->add_element((yyvsp[0].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[0])); } -#line 7246 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7269 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 366: -#line 2737 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 367: +#line 2746 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { assert(current_enum != NULL); current_enum->add_element((yyvsp[-2].u.identifier)->get_simple_name(), (yyvsp[0].u.expr), current_lexer, (yylsp[-2])); } -#line 7255 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 367: -#line 2745 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.extension_enum) = CPPExtensionType::T_enum; -} -#line 7263 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7278 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 368: -#line 2749 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2754 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; + (yyval.u.extension_enum) = CPPExtensionType::T_enum; } -#line 7271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7286 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 369: -#line 2753 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2758 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; + (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; } -#line 7279 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7294 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 370: -#line 2760 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2762 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_class; + (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; } -#line 7287 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7302 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 371: -#line 2764 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2769 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_struct; + (yyval.u.extension_enum) = CPPExtensionType::T_class; } -#line 7295 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7310 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 372: -#line 2768 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2773 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_union; + (yyval.u.extension_enum) = CPPExtensionType::T_struct; } -#line 7303 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7318 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 373: -#line 2775 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2777 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.extension_enum) = CPPExtensionType::T_union; +} +#line 7326 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 374: +#line 2784 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPScope *scope = (yyvsp[-1].u.identifier)->find_scope(current_scope, global_scope, current_lexer); if (scope == NULL) { @@ -7321,19 +7344,19 @@ yyreduce: current_scope->define_namespace(nspace); push_scope(scope); } -#line 7325 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 374: -#line 2793 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - pop_scope(); -} -#line 7333 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7348 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 375: -#line 2797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2802 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + pop_scope(); +} +#line 7356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 376: +#line 2806 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPScope *scope = (yyvsp[-1].u.identifier)->find_scope(current_scope, global_scope, current_lexer); if (scope == NULL) { @@ -7352,143 +7375,143 @@ yyreduce: current_scope->define_namespace(nspace); push_scope(scope); } -#line 7356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7379 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 376: -#line 2816 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 377: +#line 2825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); } -#line 7364 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7387 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 379: -#line 2825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 380: +#line 2834 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPUsing *using_decl = new CPPUsing((yyvsp[-1].u.identifier), false, (yylsp[-2]).file); current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-2])); current_scope->add_using(using_decl, global_scope, current_lexer); } -#line 7374 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 380: -#line 2831 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 381: +#line 2840 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This is really just an alternative way to declare a typedef. CPPTypedefType *typedef_type = new CPPTypedefType((yyvsp[-1].u.type), (yyvsp[-3].u.identifier), current_scope); typedef_type->_using = true; current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-4])); } -#line 7385 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7408 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 381: -#line 2838 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 382: +#line 2847 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPUsing *using_decl = new CPPUsing((yyvsp[-1].u.identifier), true, (yylsp[-3]).file); current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-3])); current_scope->add_using(using_decl, global_scope, current_lexer); } -#line 7395 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 385: -#line 2853 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); -} -#line 7403 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7418 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 386: -#line 2857 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2862 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); } -#line 7411 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7426 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 387: -#line 2861 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2866 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); } -#line 7419 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7434 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 388: -#line 2865 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2870 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); } -#line 7427 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7442 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 389: -#line 2869 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2874 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char32_t); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); } -#line 7435 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 390: -#line 2873 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2878 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char32_t); +} +#line 7458 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 391: +#line 2882 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short); } -#line 7444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 391: -#line 2878 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 392: +#line 2887 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long); } -#line 7453 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7476 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 392: -#line 2883 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 393: +#line 2892 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned); } -#line 7462 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 393: -#line 2888 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 394: +#line 2897 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed); } -#line 7471 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 394: -#line 2893 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int); -} -#line 7479 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7494 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 395: -#line 2897 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2902 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int); +} +#line 7502 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 396: +#line 2906 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_short; } -#line 7488 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7511 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 396: -#line 2902 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 397: +#line 2911 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = (yyvsp[0].u.simple_type); if ((yyval.u.simple_type)->_flags & CPPSimpleType::F_long) { @@ -7497,189 +7520,189 @@ yyreduce: (yyval.u.simple_type)->_flags |= CPPSimpleType::F_long; } } -#line 7501 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7524 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 397: -#line 2911 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 398: +#line 2920 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_unsigned; } -#line 7510 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 398: -#line 2916 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 399: +#line 2925 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_signed; } -#line 7519 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 399: -#line 2924 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_float); -} -#line 7527 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 400: -#line 2928 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2933 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_float); } -#line 7535 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 401: -#line 2932 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2937 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double); +} +#line 7558 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 402: +#line 2941 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double, CPPSimpleType::F_long); } -#line 7544 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 402: -#line 2940 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_void); -} -#line 7552 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7567 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 403: #line 2949 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_lexer->_resolve_identifiers = false; -} -#line 7560 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 404: -#line 2953 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_lexer->_resolve_identifiers = true; -} -#line 7568 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 512: -#line 2997 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_void); } #line 7575 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 536: -#line 3006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 404: +#line 2958 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (CPPExpression *)NULL; + current_lexer->_resolve_identifiers = false; } #line 7583 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 537: -#line 3010 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 405: +#line 2962 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + current_lexer->_resolve_identifiers = true; } #line 7591 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 538: -#line 3017 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 513: +#line 3006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { +} +#line 7598 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 537: +#line 3015 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 7599 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7606 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 538: +#line 3019 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 7614 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 539: -#line 3021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3026 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 7607 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7622 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 540: -#line 3028 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7615 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7630 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 541: -#line 3032 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(',', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 7623 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 542: -#line 3039 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3037 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7638 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 542: +#line 3041 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(',', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); +} +#line 7646 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 543: -#line 3043 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3048 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 544: -#line 3047 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3052 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 7647 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7662 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 545: -#line 3051 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3056 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } -#line 7655 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7670 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 546: -#line 3055 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3060 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); } -#line 7663 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7678 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 547: -#line 3059 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3064 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); } -#line 7671 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7686 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 548: -#line 3063 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3068 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); } -#line 7679 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7694 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 549: -#line 3067 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3072 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); +} +#line 7702 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 550: +#line 3076 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (arg == (CPPDeclaration *)NULL) { @@ -7691,307 +7714,307 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 7695 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 550: -#line 3079 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 7703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7718 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 551: -#line 3083 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3088 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } -#line 7711 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7726 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 552: -#line 3087 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3092 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } -#line 7719 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 553: -#line 3091 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3096 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 7727 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7742 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 554: -#line 3095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3100 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 7735 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7750 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 555: -#line 3099 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3104 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 7743 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7758 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 556: -#line 3103 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3108 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 7751 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 557: -#line 3107 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3112 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); } -#line 7759 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7774 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 558: -#line 3111 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3116 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 7767 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7782 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 559: -#line 3115 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3120 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7775 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7790 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 560: -#line 3119 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3124 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7783 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7798 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 561: -#line 3123 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3128 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7791 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7806 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 562: -#line 3127 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3132 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7799 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7814 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 563: -#line 3131 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3136 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7807 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7822 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 564: -#line 3135 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3140 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7815 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7830 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 565: -#line 3139 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3144 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7823 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7838 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 566: -#line 3143 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3148 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7846 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 567: -#line 3147 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3152 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7839 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7854 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 568: -#line 3151 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3156 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7847 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7862 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 569: -#line 3155 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3160 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7870 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 570: -#line 3159 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3164 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 571: -#line 3163 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3168 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7871 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7886 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 572: -#line 3167 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3172 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7879 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 573: -#line 3171 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3176 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7887 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7902 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 574: -#line 3175 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3180 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7895 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 575: -#line 3179 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3184 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7903 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7918 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 576: -#line 3183 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3188 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 7911 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7926 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 577: -#line 3187 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3192 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 7919 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 578: -#line 3191 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3196 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 7927 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7942 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 579: -#line 3195 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3200 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7935 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7950 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 580: -#line 3199 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3204 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7943 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7958 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 581: -#line 3207 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3208 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 7951 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7966 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 582: -#line 3211 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3216 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7959 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7974 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 583: -#line 3215 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3220 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 7967 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7982 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 584: -#line 3219 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3224 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } -#line 7975 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7990 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 585: -#line 3223 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3228 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); } -#line 7983 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7998 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 586: -#line 3227 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); } -#line 7991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8006 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 587: -#line 3231 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3236 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); +} +#line 8014 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 588: +#line 3240 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A constructor call. CPPType *type = (yyvsp[-3].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); @@ -8001,11 +8024,11 @@ yyreduce: assert(type != NULL); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8005 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8028 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 588: -#line 3241 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 589: +#line 3250 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Aggregate initialization. CPPType *type = (yyvsp[-3].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); @@ -8015,143 +8038,143 @@ yyreduce: assert(type != NULL); (yyval.u.expr) = new CPPExpression(CPPExpression::aggregate_init_op(type, (yyvsp[-1].u.expr))); } -#line 8019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8042 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 589: -#line 3251 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 590: +#line 3260 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 590: -#line 3257 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 591: +#line 3266 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8039 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8062 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 591: -#line 3263 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 592: +#line 3272 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_wchar_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8049 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 592: -#line 3269 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 593: +#line 3278 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char16_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 593: -#line 3275 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 594: +#line 3284 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char32_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8069 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 594: -#line 3281 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 595: +#line 3290 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_bool)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8079 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8102 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 595: -#line 3287 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 596: +#line 3296 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8113 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 596: -#line 3294 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 597: +#line 3303 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8101 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8124 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 597: -#line 3301 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 598: +#line 3310 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8135 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 598: -#line 3308 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 599: +#line 3317 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 599: -#line 3315 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 600: +#line 3324 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_float)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8133 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8156 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 600: -#line 3321 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 601: +#line 3330 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_double)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8143 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 601: -#line 3327 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); -} -#line 8151 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8166 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 602: -#line 3331 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3336 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); +} +#line 8174 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 603: +#line 3340 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (arg == (CPPDeclaration *)NULL) { @@ -8163,43 +8186,43 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 8167 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 603: -#line 3343 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 8175 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8190 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 604: -#line 3347 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3352 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } -#line 8183 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8198 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 605: -#line 3351 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3356 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } -#line 8191 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8206 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 606: -#line 3355 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3360 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); } -#line 8199 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8214 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 607: -#line 3359 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3364 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); +} +#line 8222 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 608: +#line 3368 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); @@ -8210,11 +8233,11 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); } -#line 8214 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 608: -#line 3370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 609: +#line 3379 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); @@ -8225,564 +8248,564 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); } -#line 8229 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 609: -#line 3381 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); -} -#line 8237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 610: -#line 3385 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3390 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 8245 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 611: -#line 3389 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3394 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 8253 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8268 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 612: -#line 3393 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3398 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 8261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8276 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 613: -#line 3397 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3402 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 8269 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8284 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 614: -#line 3401 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3406 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); } -#line 8277 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8292 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 615: -#line 3405 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3410 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 8285 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8300 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 616: -#line 3409 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3414 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8293 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8308 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 617: -#line 3413 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3418 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8301 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8316 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 618: -#line 3417 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3422 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8309 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8324 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 619: -#line 3421 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3426 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8317 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8332 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 620: -#line 3425 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3430 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8325 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8340 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 621: -#line 3429 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3434 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8333 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8348 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 622: -#line 3433 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3438 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8341 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 623: -#line 3437 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3442 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8349 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8364 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 624: -#line 3441 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3446 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8357 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 625: -#line 3445 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3450 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8365 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8380 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 626: -#line 3449 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3454 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8373 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 627: -#line 3453 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3458 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8381 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 628: -#line 3457 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3462 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8389 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8404 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 629: -#line 3461 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3466 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8412 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 630: -#line 3465 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3470 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8420 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 631: -#line 3469 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3474 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8428 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 632: -#line 3473 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3478 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8421 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8436 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 633: -#line 3477 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3482 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8429 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 634: -#line 3481 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3486 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8437 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 635: -#line 3485 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3490 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 8445 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 636: -#line 3489 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3494 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 8453 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 637: -#line 3493 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3498 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 8461 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8476 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 638: -#line 3497 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3502 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8469 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8484 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 639: -#line 3501 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8477 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8492 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 640: -#line 3508 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3510 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 8485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8500 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 641: -#line 3512 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(true); -} -#line 8493 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 642: -#line 3516 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(false); -} -#line 8501 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 643: -#line 3520 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3517 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 8509 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8508 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 642: +#line 3521 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(true); +} +#line 8516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 643: +#line 3525 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(false); +} +#line 8524 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 644: -#line 3524 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3529 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 8517 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8532 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 645: -#line 3528 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3533 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); } -#line 8525 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8540 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 646: -#line 3532 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3537 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 8533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8548 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 647: -#line 3536 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3541 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 8541 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8556 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 648: -#line 3540 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3545 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); +} +#line 8564 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 649: +#line 3549 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "final". C++11 explicitly permits this. CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8551 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8574 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 649: -#line 3546 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 650: +#line 3555 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "override". C++11 explicitly permits this. CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8561 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 650: -#line 3552 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); -} -#line 8569 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8584 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 651: -#line 3556 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3561 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); +} +#line 8592 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 652: +#line 3565 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-6].u.closure_type)->_flags = (yyvsp[-4].u.integer); (yyvsp[-6].u.closure_type)->_return_type = (yyvsp[-3].u.type); (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[-6].u.closure_type))); } -#line 8579 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8602 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 652: -#line 3562 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 653: +#line 3571 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-9].u.closure_type)->_parameters = (yyvsp[-6].u.param_list); (yyvsp[-9].u.closure_type)->_flags = (yyvsp[-4].u.integer); (yyvsp[-9].u.closure_type)->_return_type = (yyvsp[-3].u.type); (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[-9].u.closure_type))); } -#line 8590 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 653: -#line 3569 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[-1].u.type))); -} -#line 8598 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8613 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 654: -#line 3573 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3578 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[-1].u.type))); } -#line 8606 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 655: -#line 3577 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3582 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[-1].u.type))); } -#line 8614 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8629 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 656: -#line 3581 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3586 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8622 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8637 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 657: -#line 3585 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3590 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-1].u.type))); } -#line 8630 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8645 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 658: -#line 3589 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3594 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-1].u.type))); } -#line 8638 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8653 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 659: -#line 3593 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3598 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8646 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8661 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 660: -#line 3597 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3602 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8669 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 661: -#line 3601 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3606 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[-1].u.type))); } -#line 8662 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8677 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 662: -#line 3605 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3610 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[-1].u.type))); } -#line 8670 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8685 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 663: -#line 3609 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3614 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[-1].u.type))); } -#line 8678 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 664: -#line 3613 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3618 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[-1].u.type))); } -#line 8686 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8701 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 665: -#line 3617 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3622 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[-1].u.type))); } -#line 8694 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8709 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 666: -#line 3621 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3626 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[-1].u.type))); } -#line 8702 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 667: -#line 3625 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3630 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[-1].u.type))); } -#line 8710 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8725 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 668: -#line 3629 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3634 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[-1].u.type))); } -#line 8718 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8733 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 669: -#line 3633 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3638 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[-1].u.type))); } -#line 8726 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8741 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 670: -#line 3647 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3642 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[-1].u.type))); } -#line 8734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8749 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 671: -#line 3651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3656 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 8742 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 672: -#line 3655 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3660 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 8750 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8765 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 673: -#line 3659 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3664 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } -#line 8758 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8773 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 674: -#line 3663 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3668 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); } -#line 8766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8781 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 675: -#line 3667 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3672 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); } -#line 8774 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8789 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 676: -#line 3671 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3676 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); } -#line 8782 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8797 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 677: -#line 3675 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3680 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); +} +#line 8805 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 678: +#line 3684 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (arg == (CPPDeclaration *)NULL) { @@ -8794,43 +8817,43 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 8798 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 678: -#line 3687 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 8806 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8821 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 679: -#line 3691 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3696 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } -#line 8814 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8829 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 680: -#line 3695 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3700 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } -#line 8822 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8837 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 681: -#line 3699 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3704 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); } -#line 8830 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 682: -#line 3703 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3708 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); +} +#line 8853 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 683: +#line 3712 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); @@ -8841,11 +8864,11 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); } -#line 8845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8868 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 683: -#line 3714 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 684: +#line 3723 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); @@ -8856,409 +8879,409 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); } -#line 8860 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 684: -#line 3725 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); -} -#line 8868 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8883 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 685: -#line 3729 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3734 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 8876 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8891 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 686: -#line 3733 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3738 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 8884 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8899 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 687: -#line 3737 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3742 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 8892 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8907 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 688: -#line 3741 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3746 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 8900 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8915 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 689: -#line 3745 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3750 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 8908 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8923 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 690: -#line 3749 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3754 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8916 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8931 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 691: -#line 3753 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3758 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8924 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8939 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 692: -#line 3757 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3762 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8932 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8947 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 693: -#line 3761 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3766 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8940 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8955 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 694: -#line 3765 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3770 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8948 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8963 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 695: -#line 3769 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3774 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8956 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8971 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 696: -#line 3773 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3778 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8964 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8979 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 697: -#line 3777 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3782 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8972 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8987 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 698: -#line 3781 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3786 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8980 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8995 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 699: -#line 3785 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3790 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8988 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9003 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 700: -#line 3789 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3794 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8996 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9011 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 701: -#line 3793 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3798 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9004 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 702: -#line 3797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3802 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9012 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9027 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 703: -#line 3801 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3806 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9020 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9035 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 704: -#line 3805 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3810 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9028 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9043 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 705: -#line 3809 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3814 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9036 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 706: -#line 3813 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3818 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9044 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 707: -#line 3817 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3822 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9067 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 708: -#line 3821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3826 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9060 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9075 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 709: -#line 3825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3830 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 9068 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9083 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 710: -#line 3829 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3834 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 9076 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9091 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 711: -#line 3833 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3838 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 9084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9099 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 712: -#line 3837 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3842 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9107 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 713: -#line 3841 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3846 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9100 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9115 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 714: -#line 3848 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3850 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 9108 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 715: -#line 3852 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(true); -} -#line 9116 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 716: -#line 3856 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(false); -} -#line 9124 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 717: -#line 3860 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3857 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 9132 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9131 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 716: +#line 3861 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(true); +} +#line 9139 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 717: +#line 3865 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(false); +} +#line 9147 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 718: -#line 3864 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3869 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 9140 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9155 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 719: -#line 3868 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3873 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); } -#line 9148 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9163 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 720: -#line 3872 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3877 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 9156 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9171 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 721: -#line 3876 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3881 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 9164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9179 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 722: -#line 3880 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3885 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); +} +#line 9187 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 723: +#line 3889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "final". C++11 explicitly permits this. CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 9174 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9197 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 723: -#line 3886 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 724: +#line 3895 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "override". C++11 explicitly permits this. CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 9184 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 724: -#line 3892 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); -} -#line 9192 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9207 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 725: -#line 3900 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3901 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.closure_type) = new CPPClosureType(); + (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); } -#line 9200 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9215 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 726: -#line 3904 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3909 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_value); + (yyval.u.closure_type) = new CPPClosureType(); } -#line 9208 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9223 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 727: -#line 3908 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3913 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_reference); + (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_value); } -#line 9216 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9231 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 728: -#line 3912 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3917 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_reference); +} +#line 9239 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 729: +#line 3921 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.closure_type) = new CPPClosureType(); (yyvsp[-1].u.capture)->_initializer = (yyvsp[0].u.expr); (yyval.u.closure_type)->_captures.push_back(*(yyvsp[-1].u.capture)); delete (yyvsp[-1].u.capture); } -#line 9227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9250 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 729: -#line 3919 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 730: +#line 3928 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.closure_type) = (yyvsp[-3].u.closure_type); (yyvsp[-1].u.capture)->_initializer = (yyvsp[0].u.expr); (yyval.u.closure_type)->_captures.push_back(*(yyvsp[-1].u.capture)); delete (yyvsp[-1].u.capture); } -#line 9238 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 730: -#line 3929 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 731: +#line 3938 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } -#line 9248 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 731: -#line 3935 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 732: +#line 3944 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; (yyval.u.capture)->_name = (yyvsp[-1].u.identifier)->get_simple_name(); (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } -#line 9258 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9281 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 732: -#line 3941 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 733: +#line 3950 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); @@ -9268,11 +9291,11 @@ yyreduce: (yyval.u.capture)->_type = CPPClosureType::CT_by_value; } } -#line 9272 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9295 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 733: -#line 3951 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 734: +#line 3960 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); @@ -9281,11 +9304,11 @@ yyreduce: yywarning("only capture name 'this' may be preceded by an asterisk", (yylsp[0])); } } -#line 9285 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9308 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 734: -#line 3963 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 735: +#line 3972 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, true); if (type == NULL) { @@ -9293,169 +9316,169 @@ yyreduce: } (yyval.u.type) = type; } -#line 9297 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 735: -#line 3971 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); -} -#line 9305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9320 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 736: -#line 3975 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3980 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); +} +#line 9328 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 737: +#line 3984 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[-1].u.identifier)); ctp->_packed = true; (yyval.u.type) = CPPType::new_type(ctp); } -#line 9315 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 737: -#line 4005 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = (yyvsp[0].u.identifier); -} -#line 9323 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9338 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 738: -#line 4009 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4014 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9331 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9346 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 739: -#line 4013 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4018 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9339 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9354 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 740: -#line 4017 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4022 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[0])); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9347 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9362 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 741: -#line 4021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4026 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); + (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[0])); } -#line 9355 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9370 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 742: -#line 4025 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); +} +#line 9378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 743: +#line 4034 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This is not a keyword in Python, so it is useful to be able to use this // in MAKE_PROPERTY definitions, etc. (yyval.u.identifier) = new CPPIdentifier("signed", (yylsp[0])); } -#line 9365 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 743: -#line 4031 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[0])); -} -#line 9373 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 744: -#line 4035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4040 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[0])); + (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[0])); } -#line 9381 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 745: -#line 4039 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4044 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[0])); + (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[0])); } -#line 9389 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9404 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 746: -#line 4043 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4048 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[0])); + (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[0])); } -#line 9397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9412 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 747: -#line 4054 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4052 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[0])); } -#line 9405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9420 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 748: -#line 4058 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4063 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9428 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 749: -#line 4062 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4067 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9421 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9436 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 750: -#line 4066 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4071 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9429 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 751: -#line 4074 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4075 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].str)); + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); } -#line 9437 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 752: -#line 4078 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4083 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression((yyvsp[0].str)); } -#line 9445 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 753: -#line 4082 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4087 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 9468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 754: +#line 4091 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // The right string takes on the literal type of the left. (yyval.u.expr) = (yyvsp[-1].u.expr); (yyval.u.expr)->_str += (yyvsp[0].str); } -#line 9455 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9478 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 754: -#line 4088 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 755: +#line 4097 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We have to check that the two literal types match up. (yyval.u.expr) = (yyvsp[-1].u.expr); @@ -9464,11 +9487,11 @@ yyreduce: } (yyval.u.expr)->_str += (yyvsp[0].u.expr)->_str; } -#line 9468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9491 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; -#line 9472 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9495 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 752bbbfecd..305b5a005c 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -928,12 +928,21 @@ type_like_declaration: current_scope->add_declaration($2, global_scope, current_lexer, @2); } - | storage_class constructor_prototype maybe_initialize_or_constructor_body + | storage_class constructor_prototype { if ($2 != (CPPInstance *)NULL) { + // Push the scope so that the initializers can make use of things defined + // in the class body. + push_scope($2->get_scope(current_scope, global_scope)); $2->_storage_class |= (current_storage_class | $1); + } +} + maybe_initialize_or_constructor_body +{ + if ($2 != (CPPInstance *)NULL) { + pop_scope(); current_scope->add_declaration($2, global_scope, current_lexer, @2); - $2->set_initializer($3); + $2->set_initializer($4); } } | storage_class function_prototype maybe_initialize_or_function_body From 4bcf225baf638d6d2e7302f1d39dc2f71ce67046 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 25 May 2017 21:34:02 +0200 Subject: [PATCH 118/254] openssl: fix use of deprecated calls --- dtool/src/prc/encryptStreamBuf.cxx | 2 +- dtool/src/prckeys/makePrcKey.cxx | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/dtool/src/prc/encryptStreamBuf.cxx b/dtool/src/prc/encryptStreamBuf.cxx index 3d428852d2..21a33f93c0 100644 --- a/dtool/src/prc/encryptStreamBuf.cxx +++ b/dtool/src/prc/encryptStreamBuf.cxx @@ -236,7 +236,7 @@ open_write(ostream *dest, bool owns_dest, const string &password) { // Generate a random IV. It doesn't need to be cryptographically secure, // just unique. unsigned char *iv = (unsigned char *)alloca(iv_length); - RAND_pseudo_bytes(iv, iv_length); + RAND_bytes(iv, iv_length); _write_ctx = EVP_CIPHER_CTX_new(); nassertv(_write_ctx != NULL); diff --git a/dtool/src/prckeys/makePrcKey.cxx b/dtool/src/prckeys/makePrcKey.cxx index f1d9046108..6832860540 100644 --- a/dtool/src/prckeys/makePrcKey.cxx +++ b/dtool/src/prckeys/makePrcKey.cxx @@ -108,16 +108,25 @@ output_c_string(ostream &out, const string &string_name, */ EVP_PKEY * generate_key() { - RSA *rsa = RSA_generate_key(1024, 7, NULL, NULL); - - if (rsa == (RSA *)NULL) { + RSA *rsa = RSA_new(); + BIGNUM *e = BN_new(); + if (rsa == nullptr || e == nullptr) { output_ssl_errors(); exit(1); } + BN_set_word(e, 7); + + if (!RSA_generate_key_ex(rsa, 1024, e, nullptr)) { + BN_free(e); + RSA_free(rsa); + output_ssl_errors(); + exit(1); + } + BN_free(e); + EVP_PKEY *pkey = EVP_PKEY_new(); EVP_PKEY_assign_RSA(pkey, rsa); - return pkey; } From ee2530ea5ff09dbd0d44c82cc075e02344cfa23b Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 29 May 2017 19:07:49 +0200 Subject: [PATCH 119/254] makepanda: changes for FreeBSD. Add instructions, and: - change package name from Panda3D to panda3d - change default compiler to clang on FreeBSD - fix ldconfig to point to panda3d lib dir [skip ci] --- README.md | 22 ++++++++++++++++++++++ makepanda/makepanda.py | 12 ++++++------ makepanda/makepandacore.py | 4 ++-- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b87fd4ca10..0323d41b02 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,28 @@ If the build was successful, makepanda will have generated a .dmg file in the source directory containing the installer. Simply open it and run the package file in order to install the SDK onto your system. +FreeBSD +------- + +Building on FreeBSD is very similar to building on Linux. You will need to +install the requisite packages using the system package manager. To install +the recommended set of dependencies, you can use this command: + +```bash +pkg install pkgconf png jpeg-turbo tiff freetype2 eigen squish openal opusfile libvorbis libX11 libGL ode bullet assimp openexr +``` + +You will also need to choose which version of Python you want to use. +Install the appropriate package for it (such as `python2` or `python36`) and +run the makepanda script with your chosen Python version: + +```bash +python3.6 makepanda/makepanda.py --everything --installer --no-egl --no-gles --no-gles2 +``` + +If successful, this will produce a .pkg file in the root of the source +directory which you can install using `pkg install`. + Reporting Issues ================ diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index b5044b1761..78779ca43b 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -6879,7 +6879,7 @@ Panda3D's intended game-development language is Python. The engine itself is wri This package contains the SDK for development with Panda3D, install panda3d-runtime for the runtime files. -WWW: http://www.panda3d.org/ +WWW: https://www.panda3d.org/ """ # FreeBSD pkg-descr @@ -6888,7 +6888,7 @@ Runtime binary and browser plugin for the Panda3D Game Engine This package contains the runtime distribution and browser plugin of the Panda3D engine. It allows you view webpages that contain Panda3D content and to run games created with Panda3D that are packaged as .p3d file. -WWW: http://www.panda3d.org/ +WWW: https://www.panda3d.org/ """ # FreeBSD PKG Manifest template file @@ -6897,8 +6897,8 @@ name: NAME version: VERSION arch: ARCH origin: ORIGIN -comment: "Panda 3D Engine" -www: http://www.panda3d.org +comment: "Panda3D free 3D engine SDK" +www: https://www.panda3d.org maintainer: rdb prefix: /usr/local flatsize: INSTSIZEMB @@ -7290,7 +7290,7 @@ def MakeInstallerFreeBSD(): plist_txt += os.path.join(root, f)[21:] + "\n" if not RUNTIME: - plist_txt += "@postexec /sbin/ldconfig -m /usr/local/lib\n" + plist_txt += "@postexec /sbin/ldconfig -m /usr/local/lib/panda3d\n" plist_txt += "@postunexec /sbin/ldconfig -R\n" for remdir in ("lib/panda3d", "share/panda3d", "include/panda3d"): @@ -7312,7 +7312,7 @@ def MakeInstallerFreeBSD(): if python_pkg: dependencies += python_pkg - manifest_txt = INSTALLER_PKG_MANIFEST_FILE[1:].replace("NAME", 'Panda3D' if not RUNTIME else 'Panda3D-Runtime') + manifest_txt = INSTALLER_PKG_MANIFEST_FILE[1:].replace("NAME", 'panda3d' if not RUNTIME else 'panda3d-runtime') manifest_txt = manifest_txt.replace("VERSION", VERSION) manifest_txt = manifest_txt.replace("ARCH", pkg_arch) manifest_txt = manifest_txt.replace("ORIGIN", 'devel/panda3d' if not RUNTIME else 'graphics/panda3d-runtime') diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 7d86accc07..0999b5a42f 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -397,13 +397,13 @@ def CrossCompiling(): return GetTarget() != GetHost() def GetCC(): - if TARGET == 'darwin': + if TARGET == 'darwin' or TARGET == 'freebsd': return os.environ.get('CC', TOOLCHAIN_PREFIX + 'clang') else: return os.environ.get('CC', TOOLCHAIN_PREFIX + 'gcc') def GetCXX(): - if TARGET == 'darwin': + if TARGET == 'darwin' or TARGET == 'freebsd': return os.environ.get('CXX', TOOLCHAIN_PREFIX + 'clang++') else: return os.environ.get('CXX', TOOLCHAIN_PREFIX + 'g++') From 2e8d09a99c29e6a5d1c3ecd36519538aca114f33 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 9 Jun 2017 19:48:04 +0200 Subject: [PATCH 120/254] Workaround for compiler bug when producing debug build (with thanks to consultit) --- panda/src/express/pointerTo.h | 4 ++-- panda/src/express/pointerToBase.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/panda/src/express/pointerTo.h b/panda/src/express/pointerTo.h index 1c4db74bea..15dbcdefb0 100644 --- a/panda/src/express/pointerTo.h +++ b/panda/src/express/pointerTo.h @@ -70,7 +70,7 @@ class PointerTo : public PointerToBase { public: typedef TYPENAME PointerToBase::To To; PUBLISHED: - CONSTEXPR PointerTo() NOEXCEPT DEFAULT_CTOR; + ALWAYS_INLINE CONSTEXPR PointerTo() NOEXCEPT DEFAULT_CTOR; ALWAYS_INLINE PointerTo(To *ptr) NOEXCEPT; INLINE PointerTo(const PointerTo ©); @@ -133,7 +133,7 @@ class ConstPointerTo : public PointerToBase { public: typedef TYPENAME PointerToBase::To To; PUBLISHED: - CONSTEXPR ConstPointerTo() NOEXCEPT DEFAULT_CTOR; + ALWAYS_INLINE CONSTEXPR ConstPointerTo() NOEXCEPT DEFAULT_CTOR; ALWAYS_INLINE ConstPointerTo(const To *ptr) NOEXCEPT; INLINE ConstPointerTo(const PointerTo ©); INLINE ConstPointerTo(const ConstPointerTo ©); diff --git a/panda/src/express/pointerToBase.h b/panda/src/express/pointerToBase.h index d19edd6b5c..4263312daa 100644 --- a/panda/src/express/pointerToBase.h +++ b/panda/src/express/pointerToBase.h @@ -31,7 +31,7 @@ public: typedef T To; protected: - CONSTEXPR PointerToBase() NOEXCEPT DEFAULT_CTOR; + ALWAYS_INLINE CONSTEXPR PointerToBase() NOEXCEPT DEFAULT_CTOR; INLINE PointerToBase(To *ptr); INLINE PointerToBase(const PointerToBase ©); INLINE ~PointerToBase(); From 6b882ac767704d4843db72988ef8229cb935fd33 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 9 Jun 2017 20:12:49 +0200 Subject: [PATCH 121/254] Fix slow garbage collect after using a lot of states --- panda/src/pgraph/renderAttrib.cxx | 4 ++++ panda/src/pgraph/renderState.cxx | 4 ++++ panda/src/pgraph/transformState.cxx | 4 ++++ panda/src/putil/simpleHashMap.I | 35 +++++++++++++++++++++++------ panda/src/putil/simpleHashMap.h | 4 +++- 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/panda/src/pgraph/renderAttrib.cxx b/panda/src/pgraph/renderAttrib.cxx index 3a7b511381..f2425a32ff 100644 --- a/panda/src/pgraph/renderAttrib.cxx +++ b/panda/src/pgraph/renderAttrib.cxx @@ -255,6 +255,10 @@ garbage_collect() { nassertr(_attribs->validate(), 0); #endif + // If we just cleaned up a lot of attribs, see if we can reduce the table in + // size. This will help reduce iteration overhead in the future. + _attribs->consider_shrink_table(); + size_t new_size = _attribs->get_num_entries(); return orig_size - new_size; } diff --git a/panda/src/pgraph/renderState.cxx b/panda/src/pgraph/renderState.cxx index d8cd5a6dd3..99e02792b2 100644 --- a/panda/src/pgraph/renderState.cxx +++ b/panda/src/pgraph/renderState.cxx @@ -1001,6 +1001,10 @@ garbage_collect() { nassertr(_states->validate(), 0); #endif + // If we just cleaned up a lot of states, see if we can reduce the table in + // size. This will help reduce iteration overhead in the future. + _states->consider_shrink_table(); + int new_size = _states->get_num_entries(); return orig_size - new_size + num_attribs; } diff --git a/panda/src/pgraph/transformState.cxx b/panda/src/pgraph/transformState.cxx index be1ed4a15a..765dafb96a 100644 --- a/panda/src/pgraph/transformState.cxx +++ b/panda/src/pgraph/transformState.cxx @@ -1253,6 +1253,10 @@ garbage_collect() { nassertr(_states->validate(), 0); #endif + // If we just cleaned up a lot of states, see if we can reduce the table in + // size. This will help reduce iteration overhead in the future. + _states->consider_shrink_table(); + int new_size = _states->get_num_entries(); return orig_size - new_size; } diff --git a/panda/src/putil/simpleHashMap.I b/panda/src/putil/simpleHashMap.I index 74245fd606..4b21b02d1e 100644 --- a/panda/src/putil/simpleHashMap.I +++ b/panda/src/putil/simpleHashMap.I @@ -522,27 +522,48 @@ new_table() { template INLINE bool SimpleHashMap:: consider_expand_table() { - if (_num_entries >= (_table_size >> 1)) { - expand_table(); + if (_num_entries < (_table_size >> 1)) { + return false; + } else { + resize_table(_table_size << 1); return true; } - return false; } /** - * Doubles the size of the existing table. + * Shrinks the table if the allocated storage is significantly larger than the + * number of elements in it. Returns true if shrunk, false otherwise. + */ +template +INLINE bool SimpleHashMap:: +consider_shrink_table() { + // If the number of elements gets less than an eighth of the table size, we + // know it's probably time to shrink it down, lest it hurt iteration time. + if (_table_size <= 8 || (_table_size >> 3) < _num_entries) { + return false; + } else { + size_t new_size = _table_size; + do { + new_size >>= 1; + } while ((new_size >> 3) >= _num_entries); + resize_table(new_size); + return true; + } +} + +/** + * Resizes the existing table. */ template void SimpleHashMap:: -expand_table() { +resize_table(size_t new_size) { nassertv(_table_size != 0); SimpleHashMap old_map(_comp); swap(old_map); - // Double the table size. size_t old_table_size = old_map._table_size; - _table_size = (old_table_size << 1); + _table_size = new_size; nassertv(_table == NULL); // We allocate enough bytes for _table_size elements of TableEntry, plus diff --git a/panda/src/putil/simpleHashMap.h b/panda/src/putil/simpleHashMap.h index c1a25fc7f9..928b704e05 100644 --- a/panda/src/putil/simpleHashMap.h +++ b/panda/src/putil/simpleHashMap.h @@ -56,6 +56,8 @@ public: void write(ostream &out) const; bool validate() const; + INLINE bool consider_shrink_table(); + private: class TableEntry; @@ -68,7 +70,7 @@ private: void new_table(); INLINE bool consider_expand_table(); - void expand_table(); + void resize_table(size_t new_size); class TableEntry { public: From 59c435c487716e769858ac3d068b39d9aa66361d Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 9 Jun 2017 20:17:30 +0200 Subject: [PATCH 122/254] Add FreeBSD package-related files to .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 44373e05fe..599bb0fd9f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ core core.* vgcore.* +*.core # Editor files/directories *.save @@ -22,6 +23,9 @@ vgcore.* *.o *.gch *.pch +/+DESC +/+MANIFEST +/pkg-plist # Produced installer/executables /*.exe @@ -31,6 +35,7 @@ vgcore.* /*.pkg /*.dmg /*.whl +/*.txz # CMake /build/ From 88e963b936b96f9e262d4642377f26fd6fabc9ac Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 9 Jun 2017 20:36:45 +0200 Subject: [PATCH 123/254] Fix compilation errors in GCC 4.6 and 4.8 --- dtool/src/dtoolbase/dtoolbase_cc.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index 88d4244af6..cd6e76b4fe 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -178,12 +178,6 @@ template typename remove_reference::type &&move(T &&t) { # endif #elif defined(__GNUC__) && (__cplusplus >= 201103L) // GCC -// GCC defines several macros which we can query. List of all supported -// builtin macros: https://gcc.gnu.org/projects/cxx-status.html -# if __cpp_constexpr >= 200704 -# define CONSTEXPR constexpr -# endif - // Starting at GCC 4.4 # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) # define DEFAULT_CTOR = default @@ -194,6 +188,7 @@ template typename remove_reference::type &&move(T &&t) { // Starting at GCC 4.6 # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +# define CONSTEXPR constexpr # define NOEXCEPT noexcept # define USE_MOVE_SEMANTICS # define FINAL final @@ -205,6 +200,12 @@ template typename remove_reference::type &&move(T &&t) { # define OVERRIDE override # endif +// GCC defines several macros which we can query. List of all supported +// builtin macros: https://gcc.gnu.org/projects/cxx-status.html +# if !defined(CONSTEXPR) && __cpp_constexpr >= 200704 +# define CONSTEXPR constexpr +# endif + #elif defined(_MSC_VER) && _MSC_VER >= 1900 // Visual Studio 2015 # define CONSTEXPR constexpr # define NOEXCEPT noexcept From ca2e96d296eea31670819b1eb11914299a771c72 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 12 Jun 2017 19:46:59 +0200 Subject: [PATCH 124/254] Fix for certain libjpeg versions that override INLINE macro --- panda/src/pnmimagetypes/pnmFileTypeJPG.h | 9 +++++++++ panda/src/vision/webcamVideoCursorV4L.h | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPG.h b/panda/src/pnmimagetypes/pnmFileTypeJPG.h index 2dcd506322..b82534189a 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPG.h +++ b/panda/src/pnmimagetypes/pnmFileTypeJPG.h @@ -36,6 +36,10 @@ #include #endif +// jconfig.h overrides our INLINE definition. +#ifdef __GNUC__ +#pragma push_macro("INLINE") +#endif extern "C" { #include // jpeglib requires this to be included first. @@ -43,6 +47,11 @@ extern "C" { #include } +// Restore our own INLINE definition. +#ifdef __GNUC__ +#pragma pop_macro("INLINE") +#endif + /** * For reading and writing Jpeg files. */ diff --git a/panda/src/vision/webcamVideoCursorV4L.h b/panda/src/vision/webcamVideoCursorV4L.h index 7eb7b02763..9555096eea 100644 --- a/panda/src/vision/webcamVideoCursorV4L.h +++ b/panda/src/vision/webcamVideoCursorV4L.h @@ -24,9 +24,18 @@ #include #ifdef HAVE_JPEG +// jconfig.h overrides our INLINE definition. +#ifdef __GNUC__ +#pragma push_macro("INLINE") +#endif + extern "C" { #include } + +#ifdef __GNUC__ +#pragma pop_macro("INLINE") +#endif #endif class WebcamVideoV4L; From a66b497f2b6d5e06012d9aee7a2b9286c8d40681 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 12 Jun 2017 19:47:54 +0200 Subject: [PATCH 125/254] We no longer support GCC 4.6. Version 4.8+ is recommended. Ubuntu Precise users can install GCC 4.8 from the ppa:ubuntu-toolchain-r/test repository. CentOS 5/6 users can install devtoolset-2 or later. --- .travis.yml | 11 +++++++++-- dtool/src/dtoolbase/dtoolbase_cc.h | 4 ++-- makepanda/makepanda.py | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c8176d293b..7d8a3003b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,15 +2,22 @@ language: cpp sudo: false matrix: include: - - compiler: gcc - env: PYTHONV=python2.7 FLAGS=--optimize=4 - compiler: clang env: PYTHONV=python3 FLAGS=--installer - compiler: clang env: PYTHONV=python2.7 FLAGS=--override=STDFLOAT_DOUBLE=1 + - compiler: gcc + env: PYTHONV=python2.7 FLAGS=--optimize=4 + before_install: + - export CC=gcc-4.7 + - export CXX=g++-4.7 addons: apt: + sources: + - ubuntu-toolchain-r-test packages: + - gcc-4.7 + - g++-4.7 - bison - flex - libfreetype6-dev diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index cd6e76b4fe..f4fb89015c 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -176,7 +176,7 @@ template typename remove_reference::type &&move(T &&t) { # if __has_extension(cxx_deleted_functions) # define DELETED = delete # endif -#elif defined(__GNUC__) && (__cplusplus >= 201103L) // GCC +#elif defined(__GNUC__) // GCC // Starting at GCC 4.4 # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) @@ -191,12 +191,12 @@ template typename remove_reference::type &&move(T &&t) { # define CONSTEXPR constexpr # define NOEXCEPT noexcept # define USE_MOVE_SEMANTICS -# define FINAL final # define MOVE(x) move(x) # endif // Starting at GCC 4.7 # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) +# define FINAL final # define OVERRIDE override # endif diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 78779ca43b..a2df279c0d 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -1214,7 +1214,7 @@ def CompileCxx(obj,src,opts): if (COMPILER=="GCC"): if (src.endswith(".c")): cmd = GetCC() +' -fPIC -c -o ' + obj - else: cmd = GetCXX()+' -std=gnu++0x -ftemplate-depth-70 -fPIC -c -o ' + obj + else: cmd = GetCXX()+' -std=gnu++11 -ftemplate-depth-70 -fPIC -c -o ' + obj for (opt, dir) in INCDIRECTORIES: if (opt=="ALWAYS") or (opt in opts): cmd += ' -I' + BracketNameWithQuotes(dir) for (opt, dir) in FRAMEWORKDIRECTORIES: From 90f96fc1a9f6f49c8a15aa935d7faef401d1d895 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 12 Jun 2017 19:55:35 +0200 Subject: [PATCH 126/254] Change SimpleHashMap implementation to improve performance of GC. The new implementation stores elements contiguously and keeps a separate sparse array of indices, similar to the new PyPy and CPython implementations. This vastly improves performance when iterating over the individual elements, such as when garbage collecting states, and decreases memory usage. --- panda/src/pgraph/renderAttrib.cxx | 75 ++-- panda/src/pgraph/renderState.I | 16 +- panda/src/pgraph/renderState.cxx | 314 +++++++-------- panda/src/pgraph/renderState_ext.cxx | 73 ++-- panda/src/pgraph/transformState.I | 16 +- panda/src/pgraph/transformState.cxx | 321 +++++++--------- panda/src/pgraph/transformState_ext.cxx | 30 +- panda/src/putil/simpleHashMap.I | 487 +++++++++++++----------- panda/src/putil/simpleHashMap.h | 30 +- 9 files changed, 641 insertions(+), 721 deletions(-) diff --git a/panda/src/pgraph/renderAttrib.cxx b/panda/src/pgraph/renderAttrib.cxx index f2425a32ff..3b8c68ad0c 100644 --- a/panda/src/pgraph/renderAttrib.cxx +++ b/panda/src/pgraph/renderAttrib.cxx @@ -194,12 +194,9 @@ void RenderAttrib:: list_attribs(ostream &out) { LightReMutexHolder holder(*_attribs_lock); - out << _attribs->get_num_entries() << " attribs:\n"; - size_t size = _attribs->get_size(); + size_t size = _attribs->get_num_entries(); + out << size << " attribs:\n"; for (size_t si = 0; si < size; ++si) { - if (!_attribs->has_element(si)) { - continue; - } const RenderAttrib *attrib = _attribs->get_key(si); attrib->write(out, 2); } @@ -217,40 +214,51 @@ garbage_collect() { LightReMutexHolder holder(*_attribs_lock); PStatTimer timer(_garbage_collect_pcollector); - int orig_size = _attribs->get_num_entries(); + size_t orig_size = _attribs->get_num_entries(); #ifdef _DEBUG nassertr(_attribs->validate(), 0); #endif // How many elements to process this pass? - int size = _attribs->get_size(); - int num_this_pass = int(size * garbage_collect_states_rate); + size_t size = orig_size; + size_t num_this_pass = max(0, int(size * garbage_collect_states_rate)); if (num_this_pass <= 0) { return 0; } - num_this_pass = min(num_this_pass, size); - int stop_at_element = (_garbage_index + num_this_pass) % size; size_t si = _garbage_index; + if (si >= size) { + si = 0; + } + + num_this_pass = min(num_this_pass, size); + size_t stop_at_element = (_garbage_index + num_this_pass) % size; + do { - if (_attribs->has_element(si)) { - RenderAttrib *attrib = (RenderAttrib *)_attribs->get_key(si); - if (attrib->get_ref_count() == 1) { - // This attrib has recently been unreffed to 1 (the one we added when - // we stored it in the cache). Now it's time to delete it. This is - // safe, because we're holding the _attribs_lock, so it's not possible - // for some other thread to find the attrib in the cache and ref it - // while we're doing this. - attrib->release_new(); - unref_delete(attrib); - } + RenderAttrib *attrib = (RenderAttrib *)_attribs->get_key(si); + if (attrib->get_ref_count() == 1) { + // This attrib has recently been unreffed to 1 (the one we added when + // we stored it in the cache). Now it's time to delete it. This is + // safe, because we're holding the _attribs_lock, so it's not possible + // for some other thread to find the attrib in the cache and ref it + // while we're doing this. + attrib->release_new(); + unref_delete(attrib); + + // When we removed it from the hash map, it swapped the last element + // with the one we just removed. So the current index contains one we + // still need to visit. + --size; + --si; } si = (si + 1) % size; } while (si != stop_at_element); _garbage_index = si; + nassertr(_attribs->get_num_entries() == size, 0); + #ifdef _DEBUG nassertr(_attribs->validate(), 0); #endif @@ -259,8 +267,7 @@ garbage_collect() { // size. This will help reduce iteration overhead in the future. _attribs->consider_shrink_table(); - size_t new_size = _attribs->get_num_entries(); - return orig_size - new_size; + return (int)orig_size - (int)size; } /** @@ -279,31 +286,22 @@ validate_attribs() { pgraph_cat.error() << "RenderAttrib::_attribs cache is invalid!\n"; - size_t size = _attribs->get_size(); + size_t size = _attribs->get_num_entries(); for (size_t si = 0; si < size; ++si) { - if (!_attribs->has_element(si)) { - continue; - } const RenderAttrib *attrib = _attribs->get_key(si); - cerr << si << ": " << attrib << "\n"; + //cerr << si << ": " << attrib << "\n"; attrib->write(cerr, 2); } return false; } - size_t size = _attribs->get_size(); + size_t size = _attribs->get_num_entries(); size_t si = 0; - while (si < size && !_attribs->has_element(si)) { - ++si; - } nassertr(si < size, false); nassertr(_attribs->get_key(si)->get_ref_count() >= 0, false); size_t snext = si; ++snext; - while (snext < size && !_attribs->has_element(snext)) { - ++snext; - } while (snext < size) { nassertr(_attribs->get_key(snext)->get_ref_count() >= 0, false); const RenderAttrib *ssi = _attribs->get_key(si); @@ -325,9 +323,6 @@ validate_attribs() { } si = snext; ++snext; - while (snext < size && !_attribs->has_element(snext)) { - ++snext; - } } return true; @@ -518,10 +513,8 @@ release_new() { nassertv(_attribs_lock->debug_is_locked()); if (_saved_entry != -1) { - // nassertv(_attribs->find(this) == _saved_entry); - _saved_entry = _attribs->find(this); - _attribs->remove_element(_saved_entry); _saved_entry = -1; + nassertv(_attribs->remove(this)); } } diff --git a/panda/src/pgraph/renderState.I b/panda/src/pgraph/renderState.I index 75b6f1070a..185b18b24d 100644 --- a/panda/src/pgraph/renderState.I +++ b/panda/src/pgraph/renderState.I @@ -237,7 +237,7 @@ get_invert_composition_cache_num_entries() const { INLINE size_t RenderState:: get_composition_cache_size() const { LightReMutexHolder holder(*_states_lock); - return _composition_cache.get_size(); + return _composition_cache.get_num_entries(); } /** @@ -251,9 +251,6 @@ get_composition_cache_size() const { INLINE const RenderState *RenderState:: get_composition_cache_source(size_t n) const { LightReMutexHolder holder(*_states_lock); - if (!_composition_cache.has_element(n)) { - return NULL; - } return _composition_cache.get_key(n); } @@ -270,9 +267,6 @@ get_composition_cache_source(size_t n) const { INLINE const RenderState *RenderState:: get_composition_cache_result(size_t n) const { LightReMutexHolder holder(*_states_lock); - if (!_composition_cache.has_element(n)) { - return NULL; - } return _composition_cache.get_data(n)._result; } @@ -288,7 +282,7 @@ get_composition_cache_result(size_t n) const { INLINE size_t RenderState:: get_invert_composition_cache_size() const { LightReMutexHolder holder(*_states_lock); - return _invert_composition_cache.get_size(); + return _invert_composition_cache.get_num_entries(); } /** @@ -302,9 +296,6 @@ get_invert_composition_cache_size() const { INLINE const RenderState *RenderState:: get_invert_composition_cache_source(size_t n) const { LightReMutexHolder holder(*_states_lock); - if (!_invert_composition_cache.has_element(n)) { - return NULL; - } return _invert_composition_cache.get_key(n); } @@ -322,9 +313,6 @@ get_invert_composition_cache_source(size_t n) const { INLINE const RenderState *RenderState:: get_invert_composition_cache_result(size_t n) const { LightReMutexHolder holder(*_states_lock); - if (!_invert_composition_cache.has_element(n)) { - return NULL; - } return _invert_composition_cache.get_data(n)._result; } diff --git a/panda/src/pgraph/renderState.cxx b/panda/src/pgraph/renderState.cxx index 99e02792b2..8faef8676c 100644 --- a/panda/src/pgraph/renderState.cxx +++ b/panda/src/pgraph/renderState.cxx @@ -408,13 +408,13 @@ compose(const RenderState *other) const { CPT(RenderState) result = do_compose(other); _cache_stats.add_total_size(1); - _cache_stats.inc_adds(_composition_cache.get_size() == 0); + _cache_stats.inc_adds(_composition_cache.is_empty()); ((RenderState *)this)->_composition_cache[other]._result = result; if (other != this) { _cache_stats.add_total_size(1); - _cache_stats.inc_adds(other->_composition_cache.get_size() == 0); + _cache_stats.inc_adds(other->_composition_cache.is_empty()); ((RenderState *)other)->_composition_cache[this]._result = NULL; } @@ -497,12 +497,12 @@ invert_compose(const RenderState *other) const { CPT(RenderState) result = do_invert_compose(other); _cache_stats.add_total_size(1); - _cache_stats.inc_adds(_invert_composition_cache.get_size() == 0); + _cache_stats.inc_adds(_invert_composition_cache.is_empty()); ((RenderState *)this)->_invert_composition_cache[other]._result = result; if (other != this) { _cache_stats.add_total_size(1); - _cache_stats.inc_adds(other->_invert_composition_cache.get_size() == 0); + _cache_stats.inc_adds(other->_invert_composition_cache.is_empty()); ((RenderState *)other)->_invert_composition_cache[this]._result = NULL; } @@ -782,40 +782,33 @@ get_num_unused_states() { typedef pmap StateCount; StateCount state_count; - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } const RenderState *state = _states->get_key(si); - int i; - int cache_size = state->_composition_cache.get_size(); + size_t i; + size_t cache_size = state->_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (state->_composition_cache.has_element(i)) { - const RenderState *result = state->_composition_cache.get_data(i)._result; - if (result != (const RenderState *)NULL && result != state) { - // Here's a RenderState that's recorded in the cache. Count it. - pair ir = - state_count.insert(StateCount::value_type(result, 1)); - if (!ir.second) { - // If the above insert operation fails, then it's already in the - // cache; increment its value. - (*(ir.first)).second++; - } + const RenderState *result = state->_composition_cache.get_data(i)._result; + if (result != (const RenderState *)NULL && result != state) { + // Here's a RenderState that's recorded in the cache. Count it. + pair ir = + state_count.insert(StateCount::value_type(result, 1)); + if (!ir.second) { + // If the above insert operation fails, then it's already in the + // cache; increment its value. + (*(ir.first)).second++; } } } - cache_size = state->_invert_composition_cache.get_size(); + cache_size = state->_invert_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (state->_invert_composition_cache.has_element(i)) { - const RenderState *result = state->_invert_composition_cache.get_data(i)._result; - if (result != (const RenderState *)NULL && result != state) { - pair ir = - state_count.insert(StateCount::value_type(result, 1)); - if (!ir.second) { - (*(ir.first)).second++; - } + const RenderState *result = state->_invert_composition_cache.get_data(i)._result; + if (result != (const RenderState *)NULL && result != state) { + pair ir = + state_count.insert(StateCount::value_type(result, 1)); + if (!ir.second) { + (*(ir.first)).second++; } } } @@ -879,11 +872,8 @@ clear_cache() { TempStates temp_states; temp_states.reserve(orig_size); - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } const RenderState *state = _states->get_key(si); temp_states.push_back(state); } @@ -894,28 +884,24 @@ clear_cache() { for (ti = temp_states.begin(); ti != temp_states.end(); ++ti) { RenderState *state = (RenderState *)(*ti).p(); - int i; - int cache_size = (int)state->_composition_cache.get_size(); + size_t i; + size_t cache_size = (int)state->_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (state->_composition_cache.has_element(i)) { - const RenderState *result = state->_composition_cache.get_data(i)._result; - if (result != (const RenderState *)NULL && result != state) { - result->cache_unref(); - nassertr(result->get_ref_count() > 0, 0); - } + const RenderState *result = state->_composition_cache.get_data(i)._result; + if (result != (const RenderState *)NULL && result != state) { + result->cache_unref(); + nassertr(result->get_ref_count() > 0, 0); } } _cache_stats.add_total_size(-(int)state->_composition_cache.get_num_entries()); state->_composition_cache.clear(); - cache_size = (int)state->_invert_composition_cache.get_size(); + cache_size = (int)state->_invert_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (state->_invert_composition_cache.has_element(i)) { - const RenderState *result = state->_invert_composition_cache.get_data(i)._result; - if (result != (const RenderState *)NULL && result != state) { - result->cache_unref(); - nassertr(result->get_ref_count() > 0, 0); - } + const RenderState *result = state->_invert_composition_cache.get_data(i)._result; + if (result != (const RenderState *)NULL && result != state) { + result->cache_unref(); + nassertr(result->get_ref_count() > 0, 0); } } _cache_stats.add_total_size(-(int)state->_invert_composition_cache.get_num_entries()); @@ -950,53 +936,62 @@ garbage_collect() { LightReMutexHolder holder(*_states_lock); PStatTimer timer(_garbage_collect_pcollector); - int orig_size = _states->get_num_entries(); + size_t orig_size = _states->get_num_entries(); // How many elements to process this pass? - size_t size = _states->get_size(); - size_t num_this_pass = int((int)size * garbage_collect_states_rate); - if (size <= 0 || num_this_pass <= 0) { + size_t size = orig_size; + size_t num_this_pass = max(0, int(size * garbage_collect_states_rate)); + if (num_this_pass <= 0) { return num_attribs; } bool break_and_uniquify = (auto_break_cycles && uniquify_transforms); size_t si = _garbage_index; + if (si >= size) { + si = 0; + } num_this_pass = min(num_this_pass, size); - size_t stop_at_element = (si + num_this_pass) & (size - 1); + size_t stop_at_element = (si + num_this_pass) % size; do { - if (_states->has_element(si)) { - RenderState *state = (RenderState *)_states->get_key(si); - if (break_and_uniquify) { - if (state->get_cache_ref_count() > 0 && - state->get_ref_count() == state->get_cache_ref_count()) { - // If we have removed all the references to this state not in the - // cache, leaving only references in the cache, then we need to - // check for a cycle involving this RenderState and break it if it - // exists. - state->detect_and_break_cycles(); - } - } - - if (state->get_ref_count() == 1) { - // This state has recently been unreffed to 1 (the one we added when - // we stored it in the cache). Now it's time to delete it. This is - // safe, because we're holding the _states_lock, so it's not possible - // for some other thread to find the state in the cache and ref it - // while we're doing this. - state->release_new(); - state->remove_cache_pointers(); - state->cache_unref(); - delete state; + RenderState *state = (RenderState *)_states->get_key(si); + if (break_and_uniquify) { + if (state->get_cache_ref_count() > 0 && + state->get_ref_count() == state->get_cache_ref_count()) { + // If we have removed all the references to this state not in the + // cache, leaving only references in the cache, then we need to + // check for a cycle involving this RenderState and break it if it + // exists. + state->detect_and_break_cycles(); } } - si = (si + 1) & (size - 1); + if (state->get_ref_count() == 1) { + // This state has recently been unreffed to 1 (the one we added when + // we stored it in the cache). Now it's time to delete it. This is + // safe, because we're holding the _states_lock, so it's not possible + // for some other thread to find the state in the cache and ref it + // while we're doing this. + state->release_new(); + state->remove_cache_pointers(); + state->cache_unref(); + delete state; + + // When we removed it from the hash map, it swapped the last element + // with the one we just removed. So the current index contains one we + // still need to visit. + --size; + --si; + } + + si = (si + 1) % size; } while (si != stop_at_element); _garbage_index = si; + nassertr(_states->get_num_entries() == size, 0); + #ifdef _DEBUG nassertr(_states->validate(), 0); #endif @@ -1005,8 +1000,7 @@ garbage_collect() { // size. This will help reduce iteration overhead in the future. _states->consider_shrink_table(); - int new_size = _states->get_num_entries(); - return orig_size - new_size + num_attribs; + return (int)orig_size - (int)size + num_attribs; } /** @@ -1017,11 +1011,8 @@ void RenderState:: clear_munger_cache() { LightReMutexHolder holder(*_states_lock); - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } RenderState *state = (RenderState *)(_states->get_key(si)); state->_mungers.clear(); state->_last_mi = -1; @@ -1052,11 +1043,8 @@ list_cycles(ostream &out) { VisitedStates visited; CompositionCycleDesc cycle_desc; - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } const RenderState *state = _states->get_key(si); bool inserted = visited.insert(state).second; @@ -1129,13 +1117,9 @@ list_states(ostream &out) { } LightReMutexHolder holder(*_states_lock); - out << _states->get_num_entries() << " states:\n"; - - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); + out << size << " states:\n"; for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } const RenderState *state = _states->get_key(si); state->write(out, 2); } @@ -1166,18 +1150,12 @@ validate_states() { return false; } - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); size_t si = 0; - while (si < size && !_states->has_element(si)) { - ++si; - } nassertr(si < size, false); nassertr(_states->get_key(si)->get_ref_count() >= 0, false); size_t snext = si; ++snext; - while (snext < size && !_states->has_element(snext)) { - ++snext; - } while (snext < size) { nassertr(_states->get_key(snext)->get_ref_count() >= 0, false); const RenderState *ssi = _states->get_key(si); @@ -1199,9 +1177,6 @@ validate_states() { } si = snext; ++snext; - while (snext < size && !_states->has_element(snext)) { - ++snext; - } } return true; @@ -1593,41 +1568,37 @@ r_detect_cycles(const RenderState *start_state, } ((RenderState *)current_state)->_cycle_detect = this_seq; - int i; - int cache_size = current_state->_composition_cache.get_size(); + size_t i; + size_t cache_size = current_state->_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (current_state->_composition_cache.has_element(i)) { - const RenderState *result = current_state->_composition_cache.get_data(i)._result; - if (result != (const RenderState *)NULL) { - if (r_detect_cycles(start_state, result, length + 1, - this_seq, cycle_desc)) { - // Cycle detected. - if (cycle_desc != (CompositionCycleDesc *)NULL) { - const RenderState *other = current_state->_composition_cache.get_key(i); - CompositionCycleDescEntry entry(other, result, false); - cycle_desc->push_back(entry); - } - return true; + const RenderState *result = current_state->_composition_cache.get_data(i)._result; + if (result != (const RenderState *)NULL) { + if (r_detect_cycles(start_state, result, length + 1, + this_seq, cycle_desc)) { + // Cycle detected. + if (cycle_desc != (CompositionCycleDesc *)NULL) { + const RenderState *other = current_state->_composition_cache.get_key(i); + CompositionCycleDescEntry entry(other, result, false); + cycle_desc->push_back(entry); } + return true; } } } - cache_size = current_state->_invert_composition_cache.get_size(); + cache_size = current_state->_invert_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (current_state->_invert_composition_cache.has_element(i)) { - const RenderState *result = current_state->_invert_composition_cache.get_data(i)._result; - if (result != (const RenderState *)NULL) { - if (r_detect_cycles(start_state, result, length + 1, - this_seq, cycle_desc)) { - // Cycle detected. - if (cycle_desc != (CompositionCycleDesc *)NULL) { - const RenderState *other = current_state->_invert_composition_cache.get_key(i); - CompositionCycleDescEntry entry(other, result, true); - cycle_desc->push_back(entry); - } - return true; + const RenderState *result = current_state->_invert_composition_cache.get_data(i)._result; + if (result != (const RenderState *)NULL) { + if (r_detect_cycles(start_state, result, length + 1, + this_seq, cycle_desc)) { + // Cycle detected. + if (cycle_desc != (CompositionCycleDesc *)NULL) { + const RenderState *other = current_state->_invert_composition_cache.get_key(i); + CompositionCycleDescEntry entry(other, result, true); + cycle_desc->push_back(entry); } + return true; } } } @@ -1656,52 +1627,48 @@ r_detect_reverse_cycles(const RenderState *start_state, } ((RenderState *)current_state)->_cycle_detect = this_seq; - int i; - int cache_size = current_state->_composition_cache.get_size(); + size_t i; + size_t cache_size = current_state->_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (current_state->_composition_cache.has_element(i)) { - const RenderState *other = current_state->_composition_cache.get_key(i); - if (other != current_state) { - int oi = other->_composition_cache.find(current_state); - nassertr(oi != -1, false); + const RenderState *other = current_state->_composition_cache.get_key(i); + if (other != current_state) { + int oi = other->_composition_cache.find(current_state); + nassertr(oi != -1, false); - const RenderState *result = other->_composition_cache.get_data(oi)._result; - if (result != (const RenderState *)NULL) { - if (r_detect_reverse_cycles(start_state, result, length + 1, - this_seq, cycle_desc)) { - // Cycle detected. - if (cycle_desc != (CompositionCycleDesc *)NULL) { - const RenderState *other = current_state->_composition_cache.get_key(i); - CompositionCycleDescEntry entry(other, result, false); - cycle_desc->push_back(entry); - } - return true; + const RenderState *result = other->_composition_cache.get_data(oi)._result; + if (result != (const RenderState *)NULL) { + if (r_detect_reverse_cycles(start_state, result, length + 1, + this_seq, cycle_desc)) { + // Cycle detected. + if (cycle_desc != (CompositionCycleDesc *)NULL) { + const RenderState *other = current_state->_composition_cache.get_key(i); + CompositionCycleDescEntry entry(other, result, false); + cycle_desc->push_back(entry); } + return true; } } } } - cache_size = current_state->_invert_composition_cache.get_size(); + cache_size = current_state->_invert_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (current_state->_invert_composition_cache.has_element(i)) { - const RenderState *other = current_state->_invert_composition_cache.get_key(i); - if (other != current_state) { - int oi = other->_invert_composition_cache.find(current_state); - nassertr(oi != -1, false); + const RenderState *other = current_state->_invert_composition_cache.get_key(i); + if (other != current_state) { + int oi = other->_invert_composition_cache.find(current_state); + nassertr(oi != -1, false); - const RenderState *result = other->_invert_composition_cache.get_data(oi)._result; - if (result != (const RenderState *)NULL) { - if (r_detect_reverse_cycles(start_state, result, length + 1, - this_seq, cycle_desc)) { - // Cycle detected. - if (cycle_desc != (CompositionCycleDesc *)NULL) { - const RenderState *other = current_state->_invert_composition_cache.get_key(i); - CompositionCycleDescEntry entry(other, result, false); - cycle_desc->push_back(entry); - } - return true; + const RenderState *result = other->_invert_composition_cache.get_data(oi)._result; + if (result != (const RenderState *)NULL) { + if (r_detect_reverse_cycles(start_state, result, length + 1, + this_seq, cycle_desc)) { + // Cycle detected. + if (cycle_desc != (CompositionCycleDesc *)NULL) { + const RenderState *other = current_state->_invert_composition_cache.get_key(i); + CompositionCycleDescEntry entry(other, result, false); + cycle_desc->push_back(entry); } + return true; } } } @@ -1722,10 +1689,8 @@ release_new() { nassertv(_states_lock->debug_is_locked()); if (_saved_entry != -1) { - // nassertv(_states->find(this) == _saved_entry); - _saved_entry = _states->find(this); - _states->remove_element(_saved_entry); _saved_entry = -1; + nassertv(_states->remove(this)); } } @@ -1771,13 +1736,8 @@ remove_cache_pointers() { // There are lots of ways to do this loop wrong. Be very careful if you // need to modify it for any reason. - int i = 0; + size_t i = 0; while (!_composition_cache.is_empty()) { - // Scan for the next used slot in the table. - while (!_composition_cache.has_element(i)) { - ++i; - } - // It is possible that the "other" RenderState object is currently within // its own destructor. We therefore can't use a PT() to hold its pointer; // that could end up calling its destructor twice. Fortunately, we don't @@ -1829,10 +1789,6 @@ remove_cache_pointers() { // A similar bit of code for the invert cache. i = 0; while (!_invert_composition_cache.is_empty()) { - while (!_invert_composition_cache.has_element(i)) { - ++i; - } - RenderState *other = (RenderState *)_invert_composition_cache.get_key(i); nassertv(other != this); Composition comp = _invert_composition_cache.get_data(i); diff --git a/panda/src/pgraph/renderState_ext.cxx b/panda/src/pgraph/renderState_ext.cxx index 5a7288f518..0dc0d8acc5 100644 --- a/panda/src/pgraph/renderState_ext.cxx +++ b/panda/src/pgraph/renderState_ext.cxx @@ -30,36 +30,29 @@ PyObject *Extension:: get_composition_cache() const { extern struct Dtool_PyTypedObject Dtool_RenderState; LightReMutexHolder holder(*RenderState::_states_lock); - size_t cache_size = _this->_composition_cache.get_size(); + size_t cache_size = _this->_composition_cache.get_num_entries(); PyObject *list = PyList_New(cache_size); for (size_t i = 0; i < cache_size; ++i) { PyObject *tuple = PyTuple_New(2); PyObject *a, *b; - if (!_this->_composition_cache.has_element(i)) { + const RenderState *source = _this->_composition_cache.get_key(i); + if (source == (RenderState *)NULL) { a = Py_None; Py_INCREF(a); + } else { + source->ref(); + a = DTool_CreatePyInstanceTyped((void *)source, Dtool_RenderState, + true, true, source->get_type_index()); + } + const RenderState *result = _this->_composition_cache.get_data(i)._result; + if (result == (RenderState *)NULL) { b = Py_None; Py_INCREF(b); } else { - const RenderState *source = _this->_composition_cache.get_key(i); - if (source == (RenderState *)NULL) { - a = Py_None; - Py_INCREF(a); - } else { - source->ref(); - a = DTool_CreatePyInstanceTyped((void *)source, Dtool_RenderState, - true, true, source->get_type_index()); - } - const RenderState *result = _this->_composition_cache.get_data(i)._result; - if (result == (RenderState *)NULL) { - b = Py_None; - Py_INCREF(b); - } else { - result->ref(); - b = DTool_CreatePyInstanceTyped((void *)result, Dtool_RenderState, - true, true, result->get_type_index()); - } + result->ref(); + b = DTool_CreatePyInstanceTyped((void *)result, Dtool_RenderState, + true, true, result->get_type_index()); } PyTuple_SET_ITEM(tuple, 0, a); PyTuple_SET_ITEM(tuple, 1, b); @@ -85,36 +78,29 @@ PyObject *Extension:: get_invert_composition_cache() const { extern struct Dtool_PyTypedObject Dtool_RenderState; LightReMutexHolder holder(*RenderState::_states_lock); - size_t cache_size = _this->_invert_composition_cache.get_size(); + size_t cache_size = _this->_invert_composition_cache.get_num_entries(); PyObject *list = PyList_New(cache_size); for (size_t i = 0; i < cache_size; ++i) { PyObject *tuple = PyTuple_New(2); PyObject *a, *b; - if (!_this->_invert_composition_cache.has_element(i)) { + const RenderState *source = _this->_invert_composition_cache.get_key(i); + if (source == (RenderState *)NULL) { a = Py_None; Py_INCREF(a); + } else { + source->ref(); + a = DTool_CreatePyInstanceTyped((void *)source, Dtool_RenderState, + true, true, source->get_type_index()); + } + const RenderState *result = _this->_invert_composition_cache.get_data(i)._result; + if (result == (RenderState *)NULL) { b = Py_None; Py_INCREF(b); } else { - const RenderState *source = _this->_invert_composition_cache.get_key(i); - if (source == (RenderState *)NULL) { - a = Py_None; - Py_INCREF(a); - } else { - source->ref(); - a = DTool_CreatePyInstanceTyped((void *)source, Dtool_RenderState, - true, true, source->get_type_index()); - } - const RenderState *result = _this->_invert_composition_cache.get_data(i)._result; - if (result == (RenderState *)NULL) { - b = Py_None; - Py_INCREF(b); - } else { - result->ref(); - b = DTool_CreatePyInstanceTyped((void *)result, Dtool_RenderState, - true, true, result->get_type_index()); - } + result->ref(); + b = DTool_CreatePyInstanceTyped((void *)result, Dtool_RenderState, + true, true, result->get_type_index()); } PyTuple_SET_ITEM(tuple, 0, a); PyTuple_SET_ITEM(tuple, 1, b); @@ -141,11 +127,8 @@ get_states() { PyObject *list = PyList_New(num_states); size_t i = 0; - int size = RenderState::_states->get_size(); - for (int si = 0; si < size; ++si) { - if (!RenderState::_states->has_element(si)) { - continue; - } + size_t size = RenderState::_states->get_num_entries(); + for (size_t si = 0; si < size; ++si) { const RenderState *state = RenderState::_states->get_key(si); state->ref(); PyObject *a = diff --git a/panda/src/pgraph/transformState.I b/panda/src/pgraph/transformState.I index 3decc64a51..474b78891f 100644 --- a/panda/src/pgraph/transformState.I +++ b/panda/src/pgraph/transformState.I @@ -664,7 +664,7 @@ get_invert_composition_cache_num_entries() const { INLINE size_t TransformState:: get_composition_cache_size() const { LightReMutexHolder holder(*_states_lock); - return _composition_cache.get_size(); + return _composition_cache.get_num_entries(); } /** @@ -678,9 +678,6 @@ get_composition_cache_size() const { INLINE const TransformState *TransformState:: get_composition_cache_source(size_t n) const { LightReMutexHolder holder(*_states_lock); - if (!_composition_cache.has_element(n)) { - return NULL; - } return _composition_cache.get_key(n); } @@ -698,9 +695,6 @@ get_composition_cache_source(size_t n) const { INLINE const TransformState *TransformState:: get_composition_cache_result(size_t n) const { LightReMutexHolder holder(*_states_lock); - if (!_composition_cache.has_element(n)) { - return NULL; - } return _composition_cache.get_data(n)._result; } @@ -716,7 +710,7 @@ get_composition_cache_result(size_t n) const { INLINE size_t TransformState:: get_invert_composition_cache_size() const { LightReMutexHolder holder(*_states_lock); - return _invert_composition_cache.get_size(); + return _invert_composition_cache.get_num_entries(); } /** @@ -730,9 +724,6 @@ get_invert_composition_cache_size() const { INLINE const TransformState *TransformState:: get_invert_composition_cache_source(size_t n) const { LightReMutexHolder holder(*_states_lock); - if (!_invert_composition_cache.has_element(n)) { - return NULL; - } return _invert_composition_cache.get_key(n); } @@ -750,9 +741,6 @@ get_invert_composition_cache_source(size_t n) const { INLINE const TransformState *TransformState:: get_invert_composition_cache_result(size_t n) const { LightReMutexHolder holder(*_states_lock); - if (!_invert_composition_cache.has_element(n)) { - return NULL; - } return _invert_composition_cache.get_data(n)._result; } diff --git a/panda/src/pgraph/transformState.cxx b/panda/src/pgraph/transformState.cxx index 765dafb96a..ae0d99b794 100644 --- a/panda/src/pgraph/transformState.cxx +++ b/panda/src/pgraph/transformState.cxx @@ -656,13 +656,13 @@ compose(const TransformState *other) const { // The cache entry in this object is the only one that indicates the result; // the other will be NULL for now. _cache_stats.add_total_size(1); - _cache_stats.inc_adds(_composition_cache.get_size() == 0); + _cache_stats.inc_adds(_composition_cache.is_empty()); _composition_cache[other]._result = result; if (other != this) { _cache_stats.add_total_size(1); - _cache_stats.inc_adds(other->_composition_cache.get_size() == 0); + _cache_stats.inc_adds(other->_composition_cache.is_empty()); other->_composition_cache[this]._result = NULL; } @@ -763,12 +763,12 @@ invert_compose(const TransformState *other) const { // The cache entry in this object is the only one that indicates the result; // the other will be NULL for now. _cache_stats.add_total_size(1); - _cache_stats.inc_adds(_invert_composition_cache.get_size() == 0); + _cache_stats.inc_adds(_invert_composition_cache.is_empty()); _invert_composition_cache[other]._result = result; if (other != this) { _cache_stats.add_total_size(1); - _cache_stats.inc_adds(other->_invert_composition_cache.get_size() == 0); + _cache_stats.inc_adds(other->_invert_composition_cache.is_empty()); other->_invert_composition_cache[this]._result = NULL; } @@ -842,11 +842,8 @@ bool TransformState:: validate_composition_cache() const { LightReMutexHolder holder(*_states_lock); - size_t size = _composition_cache.get_size(); + size_t size = _composition_cache.get_num_entries(); for (size_t i = 0; i < size; ++i) { - if (!_composition_cache.has_element(i)) { - continue; - } const TransformState *source = _composition_cache.get_key(i); if (source != (TransformState *)NULL) { // Check that the source also has a pointer back to this one. We always @@ -865,11 +862,8 @@ validate_composition_cache() const { } } - size = _invert_composition_cache.get_size(); - for (int i = 0; i < size; ++i) { - if (!_invert_composition_cache.has_element(i)) { - continue; - } + size = _invert_composition_cache.get_num_entries(); + for (size_t i = 0; i < size; ++i) { const TransformState *source = _invert_composition_cache.get_key(i); if (source != (TransformState *)NULL) { // Check that the source also has a pointer back to this one. We always @@ -1037,40 +1031,33 @@ get_num_unused_states() { typedef pmap StateCount; StateCount state_count; - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } const TransformState *state = _states->get_key(si); size_t i; - size_t cache_size = state->_composition_cache.get_size(); + size_t cache_size = state->_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (state->_composition_cache.has_element(i)) { - const TransformState *result = state->_composition_cache.get_data(i)._result; - if (result != (const TransformState *)NULL && result != state) { - // Here's a TransformState that's recorded in the cache. Count it. - pair ir = - state_count.insert(StateCount::value_type(result, 1)); - if (!ir.second) { - // If the above insert operation fails, then it's already in the - // cache; increment its value. - (*(ir.first)).second++; - } + const TransformState *result = state->_composition_cache.get_data(i)._result; + if (result != (const TransformState *)NULL && result != state) { + // Here's a TransformState that's recorded in the cache. Count it. + pair ir = + state_count.insert(StateCount::value_type(result, 1)); + if (!ir.second) { + // If the above insert operation fails, then it's already in the + // cache; increment its value. + (*(ir.first)).second++; } } } - cache_size = state->_invert_composition_cache.get_size(); + cache_size = state->_invert_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (state->_invert_composition_cache.has_element(i)) { - const TransformState *result = state->_invert_composition_cache.get_data(i)._result; - if (result != (const TransformState *)NULL && result != state) { - pair ir = - state_count.insert(StateCount::value_type(result, 1)); - if (!ir.second) { - (*(ir.first)).second++; - } + const TransformState *result = state->_invert_composition_cache.get_data(i)._result; + if (result != (const TransformState *)NULL && result != state) { + pair ir = + state_count.insert(StateCount::value_type(result, 1)); + if (!ir.second) { + (*(ir.first)).second++; } } } @@ -1135,11 +1122,8 @@ clear_cache() { TempStates temp_states; temp_states.reserve(orig_size); - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } const TransformState *state = _states->get_key(si); temp_states.push_back(state); } @@ -1150,28 +1134,24 @@ clear_cache() { for (ti = temp_states.begin(); ti != temp_states.end(); ++ti) { TransformState *state = (TransformState *)(*ti).p(); - int i; - int cache_size = (int)state->_composition_cache.get_size(); + size_t i; + size_t cache_size = state->_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (state->_composition_cache.has_element(i)) { - const TransformState *result = state->_composition_cache.get_data(i)._result; - if (result != (const TransformState *)NULL && result != state) { - result->cache_unref(); - nassertr(result->get_ref_count() > 0, 0); - } + const TransformState *result = state->_composition_cache.get_data(i)._result; + if (result != (const TransformState *)NULL && result != state) { + result->cache_unref(); + nassertr(result->get_ref_count() > 0, 0); } } _cache_stats.add_total_size(-(int)state->_composition_cache.get_num_entries()); state->_composition_cache.clear(); - cache_size = state->_invert_composition_cache.get_size(); + cache_size = state->_invert_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (state->_invert_composition_cache.has_element(i)) { - const TransformState *result = state->_invert_composition_cache.get_data(i)._result; - if (result != (const TransformState *)NULL && result != state) { - result->cache_unref(); - nassertr(result->get_ref_count() > 0, 0); - } + const TransformState *result = state->_invert_composition_cache.get_data(i)._result; + if (result != (const TransformState *)NULL && result != state) { + result->cache_unref(); + nassertr(result->get_ref_count() > 0, 0); } } _cache_stats.add_total_size(-(int)state->_invert_composition_cache.get_num_entries()); @@ -1199,56 +1179,65 @@ garbage_collect() { return 0; } - bool break_and_uniquify = (auto_break_cycles && uniquify_transforms); - LightReMutexHolder holder(*_states_lock); PStatTimer timer(_garbage_collect_pcollector); size_t orig_size = _states->get_num_entries(); // How many elements to process this pass? - size_t size = _states->get_size(); - size_t num_this_pass = int(size * garbage_collect_states_rate); - if (size <= 0 || num_this_pass <= 0) { + size_t size = orig_size; + size_t num_this_pass = max(0, int(size * garbage_collect_states_rate)); + if (num_this_pass <= 0) { return 0; } + bool break_and_uniquify = (auto_break_cycles && uniquify_transforms); + size_t si = _garbage_index; + if (si >= size) { + si = 0; + } num_this_pass = min(num_this_pass, size); - size_t stop_at_element = (si + num_this_pass) & (size - 1); + size_t stop_at_element = (si + num_this_pass) % size; do { - if (_states->has_element(si)) { - TransformState *state = (TransformState *)_states->get_key(si); - if (break_and_uniquify) { - if (state->get_cache_ref_count() > 0 && - state->get_ref_count() == state->get_cache_ref_count()) { - // If we have removed all the references to this state not in the - // cache, leaving only references in the cache, then we need to - // check for a cycle involving this TransformState and break it if - // it exists. - state->detect_and_break_cycles(); - } - } - - if (state->get_ref_count() == 1) { - // This state has recently been unreffed to 1 (the one we added when - // we stored it in the cache). Now it's time to delete it. This is - // safe, because we're holding the _states_lock, so it's not possible - // for some other thread to find the state in the cache and ref it - // while we're doing this. - state->release_new(); - state->remove_cache_pointers(); - state->cache_unref(); - delete state; + TransformState *state = (TransformState *)_states->get_key(si); + if (break_and_uniquify) { + if (state->get_cache_ref_count() > 0 && + state->get_ref_count() == state->get_cache_ref_count()) { + // If we have removed all the references to this state not in the + // cache, leaving only references in the cache, then we need to + // check for a cycle involving this TransformState and break it if + // it exists. + state->detect_and_break_cycles(); } } - si = (si + 1) & (size - 1); + if (state->get_ref_count() == 1) { + // This state has recently been unreffed to 1 (the one we added when + // we stored it in the cache). Now it's time to delete it. This is + // safe, because we're holding the _states_lock, so it's not possible + // for some other thread to find the state in the cache and ref it + // while we're doing this. + state->release_new(); + state->remove_cache_pointers(); + state->cache_unref(); + delete state; + + // When we removed it from the hash map, it swapped the last element + // with the one we just removed. So the current index contains one we + // still need to visit. + --size; + --si; + } + + si = (si + 1) % size; } while (si != stop_at_element); _garbage_index = si; + nassertr(_states->get_num_entries() == size, 0); + #ifdef _DEBUG nassertr(_states->validate(), 0); #endif @@ -1257,8 +1246,7 @@ garbage_collect() { // size. This will help reduce iteration overhead in the future. _states->consider_shrink_table(); - int new_size = _states->get_num_entries(); - return orig_size - new_size; + return (int)orig_size - (int)size; } /** @@ -1285,11 +1273,8 @@ list_cycles(ostream &out) { VisitedStates visited; CompositionCycleDesc cycle_desc; - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } const TransformState *state = _states->get_key(si); bool inserted = visited.insert(state).second; @@ -1362,13 +1347,9 @@ list_states(ostream &out) { } LightReMutexHolder holder(*_states_lock); - out << _states->get_num_entries() << " states:\n"; - - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); + out << size << " states:\n"; for (size_t si = 0; si < size; ++si) { - if (!_states->has_element(si)) { - continue; - } const TransformState *state = _states->get_key(si); state->write(out, 2); } @@ -1399,18 +1380,12 @@ validate_states() { return false; } - size_t size = _states->get_size(); + size_t size = _states->get_num_entries(); size_t si = 0; - while (si < size && !_states->has_element(si)) { - ++si; - } nassertr(si < size, false); nassertr(_states->get_key(si)->get_ref_count() >= 0, false); size_t snext = si; ++snext; - while (snext < size && !_states->has_element(snext)) { - ++snext; - } while (snext < size) { nassertr(_states->get_key(snext)->get_ref_count() >= 0, false); const TransformState *ssi = _states->get_key(si); @@ -1433,9 +1408,6 @@ validate_states() { } si = snext; ++snext; - while (snext < size && !_states->has_element(snext)) { - ++snext; - } } return true; @@ -1805,41 +1777,37 @@ r_detect_cycles(const TransformState *start_state, } ((TransformState *)current_state)->_cycle_detect = this_seq; - int i; - int cache_size = current_state->_composition_cache.get_size(); + size_t i; + size_t cache_size = current_state->_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (current_state->_composition_cache.has_element(i)) { - const TransformState *result = current_state->_composition_cache.get_data(i)._result; - if (result != (const TransformState *)NULL) { - if (r_detect_cycles(start_state, result, length + 1, - this_seq, cycle_desc)) { - // Cycle detected. - if (cycle_desc != (CompositionCycleDesc *)NULL) { - const TransformState *other = current_state->_composition_cache.get_key(i); - CompositionCycleDescEntry entry(other, result, false); - cycle_desc->push_back(entry); - } - return true; + const TransformState *result = current_state->_composition_cache.get_data(i)._result; + if (result != (const TransformState *)NULL) { + if (r_detect_cycles(start_state, result, length + 1, + this_seq, cycle_desc)) { + // Cycle detected. + if (cycle_desc != (CompositionCycleDesc *)NULL) { + const TransformState *other = current_state->_composition_cache.get_key(i); + CompositionCycleDescEntry entry(other, result, false); + cycle_desc->push_back(entry); } + return true; } } } - cache_size = current_state->_invert_composition_cache.get_size(); + cache_size = current_state->_invert_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (current_state->_invert_composition_cache.has_element(i)) { - const TransformState *result = current_state->_invert_composition_cache.get_data(i)._result; - if (result != (const TransformState *)NULL) { - if (r_detect_cycles(start_state, result, length + 1, - this_seq, cycle_desc)) { - // Cycle detected. - if (cycle_desc != (CompositionCycleDesc *)NULL) { - const TransformState *other = current_state->_invert_composition_cache.get_key(i); - CompositionCycleDescEntry entry(other, result, true); - cycle_desc->push_back(entry); - } - return true; + const TransformState *result = current_state->_invert_composition_cache.get_data(i)._result; + if (result != (const TransformState *)NULL) { + if (r_detect_cycles(start_state, result, length + 1, + this_seq, cycle_desc)) { + // Cycle detected. + if (cycle_desc != (CompositionCycleDesc *)NULL) { + const TransformState *other = current_state->_invert_composition_cache.get_key(i); + CompositionCycleDescEntry entry(other, result, true); + cycle_desc->push_back(entry); } + return true; } } } @@ -1868,52 +1836,48 @@ r_detect_reverse_cycles(const TransformState *start_state, } ((TransformState *)current_state)->_cycle_detect = this_seq; - int i; - int cache_size = current_state->_composition_cache.get_size(); + size_t i; + size_t cache_size = current_state->_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (current_state->_composition_cache.has_element(i)) { - const TransformState *other = current_state->_composition_cache.get_key(i); - if (other != current_state) { - int oi = other->_composition_cache.find(current_state); - nassertr(oi != -1, false); + const TransformState *other = current_state->_composition_cache.get_key(i); + if (other != current_state) { + int oi = other->_composition_cache.find(current_state); + nassertr(oi != -1, false); - const TransformState *result = other->_composition_cache.get_data(oi)._result; - if (result != (const TransformState *)NULL) { - if (r_detect_reverse_cycles(start_state, result, length + 1, - this_seq, cycle_desc)) { - // Cycle detected. - if (cycle_desc != (CompositionCycleDesc *)NULL) { - const TransformState *other = current_state->_composition_cache.get_key(i); - CompositionCycleDescEntry entry(other, result, false); - cycle_desc->push_back(entry); - } - return true; + const TransformState *result = other->_composition_cache.get_data(oi)._result; + if (result != (const TransformState *)NULL) { + if (r_detect_reverse_cycles(start_state, result, length + 1, + this_seq, cycle_desc)) { + // Cycle detected. + if (cycle_desc != (CompositionCycleDesc *)NULL) { + const TransformState *other = current_state->_composition_cache.get_key(i); + CompositionCycleDescEntry entry(other, result, false); + cycle_desc->push_back(entry); } + return true; } } } } - cache_size = current_state->_invert_composition_cache.get_size(); + cache_size = current_state->_invert_composition_cache.get_num_entries(); for (i = 0; i < cache_size; ++i) { - if (current_state->_invert_composition_cache.has_element(i)) { - const TransformState *other = current_state->_invert_composition_cache.get_key(i); - if (other != current_state) { - int oi = other->_invert_composition_cache.find(current_state); - nassertr(oi != -1, false); + const TransformState *other = current_state->_invert_composition_cache.get_key(i); + if (other != current_state) { + int oi = other->_invert_composition_cache.find(current_state); + nassertr(oi != -1, false); - const TransformState *result = other->_invert_composition_cache.get_data(oi)._result; - if (result != (const TransformState *)NULL) { - if (r_detect_reverse_cycles(start_state, result, length + 1, - this_seq, cycle_desc)) { - // Cycle detected. - if (cycle_desc != (CompositionCycleDesc *)NULL) { - const TransformState *other = current_state->_invert_composition_cache.get_key(i); - CompositionCycleDescEntry entry(other, result, false); - cycle_desc->push_back(entry); - } - return true; + const TransformState *result = other->_invert_composition_cache.get_data(oi)._result; + if (result != (const TransformState *)NULL) { + if (r_detect_reverse_cycles(start_state, result, length + 1, + this_seq, cycle_desc)) { + // Cycle detected. + if (cycle_desc != (CompositionCycleDesc *)NULL) { + const TransformState *other = current_state->_invert_composition_cache.get_key(i); + CompositionCycleDescEntry entry(other, result, false); + cycle_desc->push_back(entry); } + return true; } } } @@ -1935,10 +1899,8 @@ release_new() { nassertv(_states_lock->debug_is_locked()); if (_saved_entry != -1) { - // nassertv(_states->find(this) == _saved_entry); - _saved_entry = _states->find(this); - _states->remove_element(_saved_entry); _saved_entry = -1; + nassertv(_states->remove(this)); } } @@ -1977,13 +1939,8 @@ remove_cache_pointers() { // There are lots of ways to do this loop wrong. Be very careful if you // need to modify it for any reason. - int i = 0; + size_t i = 0; while (!_composition_cache.is_empty()) { - // Scan for the next used slot in the table. - while (!_composition_cache.has_element(i)) { - ++i; - } - // It is possible that the "other" TransformState object is currently // within its own destructor. We therefore can't use a PT() to hold its // pointer; that could end up calling its destructor twice. Fortunately, @@ -2036,10 +1993,6 @@ remove_cache_pointers() { // A similar bit of code for the invert cache. i = 0; while (!_invert_composition_cache.is_empty()) { - while (!_invert_composition_cache.has_element(i)) { - ++i; - } - TransformState *other = (TransformState *)_invert_composition_cache.get_key(i); nassertv(other != this); Composition comp = _invert_composition_cache.get_data(i); diff --git a/panda/src/pgraph/transformState_ext.cxx b/panda/src/pgraph/transformState_ext.cxx index e037cd2a16..44ddfd71f8 100644 --- a/panda/src/pgraph/transformState_ext.cxx +++ b/panda/src/pgraph/transformState_ext.cxx @@ -35,12 +35,8 @@ get_composition_cache() const { PyObject *list = PyList_New(num_states); size_t i = 0; - int size = _this->_composition_cache.get_size(); - for (int si = 0; si < size; ++si) { - if (!_this->_composition_cache.has_element(si)) { - continue; - } - + size_t size = _this->_composition_cache.get_num_entries(); + for (size_t si = 0; si < size; ++si) { PyObject *tuple = PyTuple_New(2); PyObject *a, *b; @@ -94,12 +90,8 @@ get_invert_composition_cache() const { PyObject *list = PyList_New(num_states); size_t i = 0; - int size = _this->_invert_composition_cache.get_size(); - for (int si = 0; si < size; ++si) { - if (!_this->_invert_composition_cache.has_element(si)) { - continue; - } - + size_t size = _this->_invert_composition_cache.get_num_entries(); + for (size_t si = 0; si < size; ++si) { PyObject *tuple = PyTuple_New(2); PyObject *a, *b; @@ -149,11 +141,8 @@ get_states() { PyObject *list = PyList_New(num_states); size_t i = 0; - int size = TransformState::_states->get_size(); - for (int si = 0; si < size; ++si) { - if (!TransformState::_states->has_element(si)) { - continue; - } + size_t size = TransformState::_states->get_num_entries(); + for (size_t si = 0; si < size; ++si) { const TransformState *state = TransformState::_states->get_key(si); state->ref(); PyObject *a = @@ -180,11 +169,8 @@ get_unused_states() { LightReMutexHolder holder(*TransformState::_states_lock); PyObject *list = PyList_New(0); - int size = TransformState::_states->get_size(); - for (int si = 0; si < size; ++si) { - if (!TransformState::_states->has_element(si)) { - continue; - } + size_t size = TransformState::_states->get_num_entries(); + for (size_t si = 0; si < size; ++si) { const TransformState *state = TransformState::_states->get_key(si); if (state->get_cache_ref_count() == state->get_ref_count()) { state->ref(); diff --git a/panda/src/putil/simpleHashMap.I b/panda/src/putil/simpleHashMap.I index 4b21b02d1e..5f797dfde1 100644 --- a/panda/src/putil/simpleHashMap.I +++ b/panda/src/putil/simpleHashMap.I @@ -15,16 +15,31 @@ * */ template -INLINE SimpleHashMap:: +CONSTEXPR SimpleHashMap:: SimpleHashMap(const Compare &comp) : - _table(NULL), - _deleted_chain(NULL), + _table(nullptr), + _deleted_chain(nullptr), _table_size(0), _num_entries(0), _comp(comp) { } +/** + * + */ +template +INLINE SimpleHashMap:: +SimpleHashMap(SimpleHashMap &&from) NOEXCEPT : + _table(from._table), + _deleted_chain(from._deleted_chain), + _table_size(from._table_size), + _num_entries(from._num_entries), + _comp(move(from._comp)) +{ + from._table_size = 0; +} + /** * */ @@ -69,29 +84,13 @@ find(const Key &key) const { return -1; } - size_t index = get_hash(key); - if (!has_element(index)) { + int slot = find_slot(key); + if (slot >= 0) { + return get_index_array()[slot]; + } else { + // The key is not in the table. return -1; } - if (is_element(index, key)) { - return index; - } - - // There was some other key at the hashed slot. That's a hash conflict. - // Maybe our entry was recorded at a later slot position; scan the - // subsequent positions until we find the entry or an unused slot, - // indicating the end of the scan. - size_t i = index; - i = (i + 1) & (_table_size - 1); - while (i != index && has_element(i)) { - if (is_element(i, key)) { - return i; - } - i = (i + 1) & (_table_size - 1); - } - - // The key is not in the table. - return -1; } /** @@ -105,23 +104,23 @@ store(const Key &key, const Value &data) { // Special case: the first key in an empty table. nassertr(_num_entries == 0, -1); new_table(); - size_t index = get_hash(key); - store_new_element(index, key, data); - ++_num_entries; + int pos = store_new_element(get_hash(key), key, data); #ifdef _DEBUG - nassertr(validate(), index); + nassertr(validate(), pos); #endif - return index; + return pos; } + consider_expand_table(); - size_t index = get_hash(key); - if (!has_element(index)) { + const int *index_array = get_index_array(); + size_t hash = get_hash(key); + int index = index_array[hash]; + if (index < 0) { // This element is not already in the map; add it. if (consider_expand_table()) { return store(key, data); } - store_new_element(index, key, data); - ++_num_entries; + index = store_new_element(hash, key, data); #ifdef _DEBUG nassertr(validate(), index); #endif @@ -138,28 +137,27 @@ store(const Key &key, const Value &data) { // There was some other key at the hashed slot. That's a hash conflict. // Record this entry at a later position. - size_t i = index; - i = (i + 1) & (_table_size - 1); - while (i != index) { - if (!has_element(i)) { + size_t slot = next_hash(hash); + while (slot != hash) { + index = index_array[slot]; + if (index < 0) { if (consider_expand_table()) { return store(key, data); } - store_new_element(i, key, data); - ++_num_entries; + index = store_new_element(slot, key, data); #ifdef _DEBUG - nassertr(validate(), i); + nassertr(validate(), index); #endif - return i; + return index; } - if (is_element(i, key)) { - _table[i]._data = data; + if (is_element(index, key)) { + _table[index]._data = data; #ifdef _DEBUG - nassertr(validate(), i); + nassertr(validate(), index); #endif - return i; + return index; } - i = (i + 1) & (_table_size - 1); + slot = next_hash(slot); } // Shouldn't get here unless _num_entries == _table_size, which shouldn't be @@ -171,15 +169,83 @@ store(const Key &key, const Value &data) { /** * Removes the indicated key and its associated data from the table. Returns * true if the key was removed, false if it was not present. + * + * Iterator safety: To perform removal during iteration, revisit the element + * at the current index if removal succeeds, keeping in mind that the number + * of elements has now shrunk by one. */ template INLINE bool SimpleHashMap:: remove(const Key &key) { - int index = find(key); - if (index == -1) { + if (_num_entries == 0) { + // Special case: the table is empty. return false; } - remove_element(index); + + int *index_array = get_index_array(); + size_t slot = (size_t)find_slot(key); + if (slot == (size_t)-1) { + // It wasn't in the hash map. + return false; + } + + // Now remove this element. + size_t last = _num_entries - 1; + size_t index = (size_t)index_array[slot]; + if (index < _num_entries) { + // Find the last element in the index array. + int other_slot = find_slot(_table[last]._key); + nassertr(other_slot != -1, false); + nassertr(index_array[(size_t)other_slot] == (int)last, false); + + // Swap it with the last one, so that we don't get any gaps in the table + // of entries. + _table[index]._key = move(_table[last]._key); + _table[index]._data = move(_table[last]._data); + index_array[(size_t)other_slot] = index; + } + + _table[last].~TableEntry(); + _num_entries = last; + + // It's important that we do this after the second find_slot, above, since + // it might otherwise fail due to the unexpected gap, since some indices may + // not be at their ideal positions right now. + index_array[slot] = -1; + + //if (consider_shrink_table()) { + // // No need to worry about that gap; resize_table() will rebuild the index. + // return true; + //} + + // Now we have put a hole in the index array. If there was a hash conflict + // in the slot after this one, we have to move it down to close the hole. + slot = next_hash(slot); + while (has_slot(slot)) { + size_t index = (size_t)index_array[slot]; + size_t wants_slot = get_hash(_table[index]._key); + if (wants_slot != slot) { + // This one was a hash conflict; try to put it where it belongs. We + // can't just put it in n, since maybe it belongs somewhere after n. + while (wants_slot != slot && has_slot(wants_slot)) { + wants_slot = next_hash(wants_slot); + } + if (wants_slot != slot) { + // We just have to flip the slots in the index array; we can keep the + // elements in the table where they are. + index_array[wants_slot] = index; + index_array[slot] = -1; + } + } + + // Continue until we encounter the next unused slot. Until we do, we + // can't be sure we've found all of the potential hash conflicts. + slot = next_hash(slot); + } + +#ifdef _DEBUG + nassertr(validate(), true); +#endif return true; } @@ -190,15 +256,13 @@ template void SimpleHashMap:: clear() { if (_table_size != 0) { - for (size_t i = 0; i < _table_size; ++i) { - if (has_element(i)) { - clear_element(i); - } + for (size_t i = 0; i < _num_entries; ++i) { + _table[i].~TableEntry(); } _deleted_chain->deallocate(_table, TypeHandle::none()); - _table = NULL; - _deleted_chain = NULL; + _table = nullptr; + _deleted_chain = nullptr; _table_size = 0; _num_entries = 0; } @@ -219,131 +283,76 @@ operator [] (const Key &key) { } /** - * Returns the total number of slots in the table. + * Returns the total number of entries in the table. Same as get_num_entries. */ template -INLINE size_t SimpleHashMap:: -get_size() const { - return _table_size; +CONSTEXPR size_t SimpleHashMap:: +size() const { + return _num_entries; } /** - * Returns true if there is an element stored in the nth slot, false - * otherwise. + * Returns the key in the nth entry of the table. * - * n should be in the range 0 <= n < get_size(). - */ -template -INLINE bool SimpleHashMap:: -has_element(size_t n) const { - nassertr(n < _table_size, false); - return (get_exists_array()[n] != 0); -} - -/** - * Returns the key in the nth slot of the table. - * - * It is an error to call this if there is nothing stored in the nth slot (use - * has_element() to check this first). n should be in the range 0 <= n < - * get_size(). + * @param n should be in the range 0 <= n < size(). */ template INLINE const Key &SimpleHashMap:: get_key(size_t n) const { - nassertr(has_element(n), _table[n]._key); + nassertr(n < _num_entries, _table[n]._key); return _table[n]._key; } /** - * Returns the data in the nth slot of the table. + * Returns the data in the nth entry of the table. * - * It is an error to call this if there is nothing stored in the nth slot (use - * has_element() to check this first). n should be in the range 0 <= n < - * get_size(). + * @param n should be in the range 0 <= n < size(). */ template INLINE const Value &SimpleHashMap:: get_data(size_t n) const { - nassertr(has_element(n), _table[n]._data); + nassertr(n < _num_entries, _table[n]._data); return _table[n]._data; } /** - * Returns a modifiable reference to the data in the nth slot of the table. + * Returns a modifiable reference to the data in the nth entry of the table. * - * It is an error to call this if there is nothing stored in the nth slot (use - * has_element() to check this first). n should be in the range 0 <= n < - * get_size(). + * @param n should be in the range 0 <= n < size(). */ template INLINE Value &SimpleHashMap:: modify_data(size_t n) { - nassertr(has_element(n), _table[n]._data); + nassertr(n < _num_entries, _table[n]._data); return _table[n]._data; } /** - * Changes the data for the nth slot of the table. + * Changes the data for the nth entry of the table. * - * It is an error to call this if there is nothing stored in the nth slot (use - * has_element() to check this first). n should be in the range 0 <= n < - * get_size(). + * @param n should be in the range 0 <= n < size(). */ template INLINE void SimpleHashMap:: set_data(size_t n, const Value &data) { - nassertv(has_element(n)); + nassertv(n < _num_entries); _table[n]._data = data; } /** - * Removes the nth slot from the table. + * Removes the nth entry from the table. * - * It is an error to call this if there is nothing stored in the nth slot (use - * has_element() to check this first). n should be in the range 0 <= n < - * get_size(). + * @param n should be in the range 0 <= n < size(). */ template void SimpleHashMap:: remove_element(size_t n) { - nassertv(has_element(n)); - - clear_element(n); - nassertv(_num_entries > 0); - --_num_entries; - - // Now we have put a hole in the table. If there was a hash conflict in the - // slot following this one, we have to move it down to close the hole. - size_t i = n; - i = (i + 1) & (_table_size - 1); - while (has_element(i)) { - size_t wants_index = get_hash(_table[i]._key); - if (wants_index != i) { - // This one was a hash conflict; try to put it where it belongs. We - // can't just put it in n, since maybe it belongs somewhere after n. - while (wants_index != i && has_element(wants_index)) { - wants_index = (wants_index + 1) & (_table_size - 1); - } - if (wants_index != i) { - store_new_element(wants_index, _table[i]._key, _table[i]._data); - clear_element(i); - } - } - - // Continue until we encounter the next unused slot. Until we do, we - // can't be sure we've found all of the potential hash conflicts. - i = (i + 1) & (_table_size - 1); - } - -#ifdef _DEBUG - nassertv(validate()); -#endif + nassertv(n < _num_entries); + remove(_table[n]._key); } /** - * Returns the number of active entries in the table. This is not necessarily - * related to the number of slots in the table as reported by get_size(). Use - * get_size() to iterate through all of the slots, not get_num_entries(). + * Returns the number of active entries in the table. Same as size(). */ template INLINE size_t SimpleHashMap:: @@ -352,7 +361,7 @@ get_num_entries() const { } /** - * Returns true if the table is empty; i.e. get_num_entries() == 0. + * Returns true if the table is empty; i.e. get_num_entries() == 0. */ template INLINE bool SimpleHashMap:: @@ -367,17 +376,20 @@ template void SimpleHashMap:: output(ostream &out) const { out << "SimpleHashMap (" << _num_entries << " entries): ["; - for (size_t i = 0; i < _table_size; ++i) { - if (!has_element(i)) { + const int *index_array = get_index_array(); + size_t num_slots = _table_size * sparsity; + for (size_t slot = 0; slot < num_slots; ++slot) { + if (!has_slot(slot)) { out << " *"; } else { - out << " " << _table[i]._key; - size_t index = get_hash(_table[i]._key); - if (index != i) { + size_t index = (size_t)index_array[slot]; + out << " " << index; + size_t ideal_slot = get_hash(_table[index]._key); + if (ideal_slot != slot) { // This was misplaced as the result of a hash conflict. Report how // far off it is. - out << "(" << ((_table_size + i - index) & (_table_size - 1)) << ")"; + out << "(" << ((_table_size + slot - ideal_slot) & (num_slots - 1)) << ")"; } } } @@ -392,6 +404,9 @@ void SimpleHashMap:: write(ostream &out) const { output(out); out << "\n"; + for (size_t i = 0; i < _num_entries; ++i) { + out << " " << _table[i]._key << " (hash " << get_hash(_table[i]._key) << ")\n"; + } } /** @@ -403,21 +418,31 @@ bool SimpleHashMap:: validate() const { size_t count = 0; - const unsigned char *exists_array = get_exists_array(); - - for (size_t i = 0; i < _table_size; ++i) { - if (exists_array[i] != 0) { + const int *index_array = get_index_array(); + size_t num_slots = _table_size * sparsity; + for (size_t slot = 0; slot < num_slots; ++slot) { + if (has_slot(slot)) { + size_t index = (size_t)index_array[slot]; ++count; - size_t ideal_index = get_hash(_table[i]._key); - size_t wants_index = ideal_index; - while (wants_index != i && exists_array[wants_index] != 0) { - wants_index = (wants_index + 1) & (_table_size - 1); - } - if (wants_index != i) { + if (index >= _num_entries) { util_cat.error() - << "SimpleHashMap is invalid: key " << _table[i]._key - << " should be in slot " << wants_index << " instead of " - << i << " (ideal is " << ideal_index << ")\n"; + << "SimpleHashMap " << this << " is invalid: slot " << slot + << " contains index " << index << " which is past the end of the" + " table\n"; + write(util_cat.error(false)); + return false; + } + nassertd(index < _num_entries) continue; + size_t ideal_slot = get_hash(_table[index]._key); + size_t wants_slot = ideal_slot; + while (wants_slot != slot && has_slot(wants_slot)) { + wants_slot = next_hash(wants_slot); + } + if (wants_slot != slot) { + util_cat.error() + << "SimpleHashMap " << this << " is invalid: key " + << _table[index]._key << " should be in slot " << wants_slot + << " instead of " << slot << " (ideal is " << ideal_slot << ")\n"; write(util_cat.error(false)); return false; } @@ -426,7 +451,7 @@ validate() const { if (count != _num_entries) { util_cat.error() - << "SimpleHashMap is invalid: reports " << _num_entries + << "SimpleHashMap " << this << " is invalid: reports " << _num_entries << " entries, actually has " << count << "\n"; write(util_cat.error(false)); return false; @@ -449,7 +474,57 @@ get_hash(const Key &key) const { return (size_t)floor(f * _table_size); */ - return ((_comp(key) * (size_t)9973) >> 8) & (_table_size - 1); + return ((_comp(key) * (size_t)9973) >> 8) & ((_table_size * sparsity) - 1); +} + +/** + * Given a hash value, increments it, looping around the hash space. + */ +template +INLINE size_t SimpleHashMap:: +next_hash(size_t hash) const { + return (hash + 1) & ((_table_size * sparsity) - 1); +} + +/** + * Finds the slot in which the given key should fit. + */ +template +INLINE int SimpleHashMap:: +find_slot(const Key &key) const { + const int *index_array = get_index_array(); + size_t hash = get_hash(key); + int index = index_array[hash]; + if (index < 0) { + return -1; + } + + if (is_element((size_t)index, key)) { + return hash; + } + + // There was some other key at the hashed slot. That's a hash conflict. + // Maybe our entry was recorded at a later slot position; scan the + // subsequent positions until we find the entry or an unused slot, + // indicating the end of the scan. + size_t slot = next_hash(hash); + while (slot != hash && has_slot(slot)) { + if (is_element((size_t)index_array[slot], key)) { + return (int)slot; + } + slot = next_hash(slot); + } + + return -1; +} + +/** + * Returns true if the given slot refers to an element. + */ +template +INLINE bool SimpleHashMap:: +has_slot(size_t slot) const { + return get_index_array()[slot] >= 0; } /** @@ -458,40 +533,33 @@ get_hash(const Key &key) const { template INLINE bool SimpleHashMap:: is_element(size_t n, const Key &key) const { - nassertr(has_element(n), false); + nassertr(n < _num_entries, false); return _comp.is_equal(_table[n]._key, key); } /** - * Constructs a new TableEntry at position n, storing the indicated key and - * value. + * Constructs a new TableEntry with the given slot, storing the indicated key + * and value. */ template -INLINE void SimpleHashMap:: -store_new_element(size_t n, const Key &key, const Value &data) { - new(&_table[n]) TableEntry(key, data); - get_exists_array()[n] = true; +INLINE size_t SimpleHashMap:: +store_new_element(size_t slot, const Key &key, const Value &data) { + size_t index = _num_entries++; + new(&_table[index]) TableEntry(key, data); + nassertr(get_index_array()[slot] == -1, index) + get_index_array()[slot] = index; + return index; } /** - * Destructs the TableEntry at position n. - */ -template -INLINE void SimpleHashMap:: -clear_element(size_t n) { - _table[n].~TableEntry(); - get_exists_array()[n] = false; -} - -/** - * Returns the beginning of the array of _table_size unsigned chars that are - * the boolean flags for whether each element exists (has been constructed) + * Returns the beginning of the array of _table_size ints that are the indices + * pointing to the location within the table where the elements are stored. * within the table. */ template -INLINE unsigned char *SimpleHashMap:: -get_exists_array() const { - return (unsigned char *)(_table + _table_size); +INLINE int *SimpleHashMap:: +get_index_array() const { + return (int *)(_table + _table_size); } /** @@ -504,15 +572,15 @@ new_table() { // Pick a good initial table size. For now, we make it really small. Maybe // that's the right answer. - _table_size = 4; + _table_size = 2; // We allocate enough bytes for _table_size elements of TableEntry, plus - // _table_size more bytes at the end (for the exists array). - size_t alloc_size = _table_size * sizeof(TableEntry) + _table_size; + // _table_size * 4 more ints at the end (for the index array). + size_t alloc_size = _table_size * (sizeof(TableEntry) + sizeof(int) * sparsity); _deleted_chain = memory_hook->get_deleted_chain(alloc_size); _table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none()); - memset(get_exists_array(), 0, _table_size); + memset(get_index_array(), -1, _table_size * sizeof(int) * sparsity); } /** @@ -522,7 +590,7 @@ new_table() { template INLINE bool SimpleHashMap:: consider_expand_table() { - if (_num_entries < (_table_size >> 1)) { + if (_num_entries < _table_size) { return false; } else { resize_table(_table_size << 1); @@ -538,14 +606,14 @@ template INLINE bool SimpleHashMap:: consider_shrink_table() { // If the number of elements gets less than an eighth of the table size, we - // know it's probably time to shrink it down, lest it hurt iteration time. - if (_table_size <= 8 || (_table_size >> 3) < _num_entries) { + // know it's probably time to shrink it down. + if (_table_size <= 16 || _num_entries >= (_table_size >> 3)) { return false; } else { size_t new_size = _table_size; do { new_size >>= 1; - } while ((new_size >> 3) >= _num_entries); + } while (new_size >= 16 && _num_entries < (new_size >> 2)); resize_table(new_size); return true; } @@ -558,47 +626,42 @@ template void SimpleHashMap:: resize_table(size_t new_size) { nassertv(_table_size != 0); + nassertv(new_size >= _num_entries); - SimpleHashMap old_map(_comp); - swap(old_map); + DeletedBufferChain *old_chain = _deleted_chain; + TableEntry *old_table = _table; - size_t old_table_size = old_map._table_size; _table_size = new_size; - nassertv(_table == NULL); // We allocate enough bytes for _table_size elements of TableEntry, plus - // _table_size more bytes at the end (for the exists array). - size_t alloc_size = _table_size * sizeof(TableEntry) + _table_size; + // _table_size * sparsity more ints at the end (for the sparse index array). + size_t alloc_size = _table_size * sizeof(TableEntry) + _table_size * sparsity * sizeof(int); _deleted_chain = memory_hook->get_deleted_chain(alloc_size); _table = (TableEntry *)_deleted_chain->allocate(alloc_size, TypeHandle::none()); - unsigned char *exists_array = get_exists_array(); - memset(exists_array, 0, _table_size); - nassertv(_num_entries == 0); + int *index_array = get_index_array(); + memset(index_array, -1, _table_size * sizeof(int) * sparsity); - // Now copy the entries from the old table into the new table. - for (size_t i = 0; i < old_table_size; ++i) { - if (old_map.has_element(i)) { - size_t new_index = get_hash(old_map._table[i]._key); + // Now copy the entries from the old table into the new table. We don't + // have to reorder these, fortunately. Hopefully, a smart compiler will + // optimize this to a memcpy. + for (size_t i = 0; i < _num_entries; ++i) { + new(&_table[i]) TableEntry(move(old_table[i])); + old_table[i].~TableEntry(); + } - while (exists_array[new_index] != 0) { - // Hash conflict; look for a better spot. This has to succeed. - new_index = (new_index + 1) & (_table_size - 1); - } + // We don't need this old thing anymore. + old_chain->deallocate(old_table, TypeHandle::none()); -#ifdef USE_MOVE_SEMANTICS - // Use C++11 rvalue references to invoke the move constructor, which may - // be more efficient. - new(&_table[new_index]) TableEntry(move(old_map._table[i])); -#else - new(&_table[new_index]) TableEntry(old_map._table[i]); -#endif - exists_array[new_index] = true; - ++_num_entries; + // Reindex the table. + for (size_t i = 0; i < _num_entries; ++i) { + size_t slot = get_hash(_table[i]._key); + + while (has_slot(slot)) { + // Hash conflict; look for a better spot. This has to succeed. + slot = next_hash(slot); } + index_array[slot] = (int)i; } nassertv(validate()); - nassertv(old_map.validate()); - - nassertv(_num_entries == old_map._num_entries); } diff --git a/panda/src/putil/simpleHashMap.h b/panda/src/putil/simpleHashMap.h index 928b704e05..d7d6aaa7fc 100644 --- a/panda/src/putil/simpleHashMap.h +++ b/panda/src/putil/simpleHashMap.h @@ -20,16 +20,25 @@ /** * This template class implements an unordered map of keys to data, - * implemented as a hashtable. It is similar to STL's hash_map, but (a) it - * has a simpler interface (we don't mess around with iterators), (b) it wants - * an additional method on the Compare object, Compare::is_equal(a, b), and - * (c) it doesn't depend on the system STL providing hash_map. + * implemented as a hashtable. It is similar to STL's hash_map, but + * (a) it has a simpler interface (we don't mess around with iterators), + * (b) it wants an additional method on the Compare object, + Compare::is_equal(a, b), + * (c) it doesn't depend on the system STL providing hash_map, + * (d) it allows for efficient iteration over the entries, + * (e) permits removal and resizing during forward iteration, and + * (f) it has a constexpr constructor. */ template > > class SimpleHashMap { + // Per-entry overhead is determined by sizeof(int) * sparsity. Should be a + // power of two. + static const unsigned int sparsity = 2u; + public: #ifndef CPPPARSER - INLINE SimpleHashMap(const Compare &comp = Compare()); + CONSTEXPR SimpleHashMap(const Compare &comp = Compare()); + INLINE SimpleHashMap(SimpleHashMap &&from) NOEXCEPT; INLINE ~SimpleHashMap(); INLINE void swap(SimpleHashMap &other); @@ -40,9 +49,8 @@ public: void clear(); INLINE Value &operator [] (const Key &key); + CONSTEXPR size_t size() const; - INLINE size_t get_size() const; - INLINE bool has_element(size_t n) const; INLINE const Key &get_key(size_t n) const; INLINE const Value &get_data(size_t n) const; INLINE Value &modify_data(size_t n); @@ -62,11 +70,13 @@ private: class TableEntry; INLINE size_t get_hash(const Key &key) const; + INLINE size_t next_hash(size_t hash) const; + INLINE int find_slot(const Key &key) const; + INLINE bool has_slot(size_t slot) const; INLINE bool is_element(size_t n, const Key &key) const; - INLINE void store_new_element(size_t n, const Key &key, const Value &data); - INLINE void clear_element(size_t n); - INLINE unsigned char *get_exists_array() const; + INLINE size_t store_new_element(size_t n, const Key &key, const Value &data); + INLINE int *get_index_array() const; void new_table(); INLINE bool consider_expand_table(); From 751299d65a0dd75278dce33a32321210285c204c Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 20 Jun 2017 15:45:21 +0200 Subject: [PATCH 127/254] makepanda: don't build with OpenCV if we have ffmpeg enabled (except on macOS, where we use OpenCV to provide webcam support) --- makepanda/makepanda.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index a2df279c0d..4c06fc4706 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -835,13 +835,16 @@ if (COMPILER=="GCC"): # Needed when linking ffmpeg statically on Linux. LibName("FFMPEG", "-Wl,-Bsymbolic") - cv_lib = ChooseLib(("opencv_core", "cv"), "OPENCV") - if cv_lib == "opencv_core": - OPENCV_VER_23 = True - SmartPkgEnable("OPENCV", "opencv", ("opencv_core", "opencv_highgui"), ("opencv2/core/core.hpp")) + if PkgSkip("FFMPEG") or GetTarget() == "darwin": + cv_lib = ChooseLib(("opencv_core", "cv"), "OPENCV") + if cv_lib == "opencv_core": + OPENCV_VER_23 = True + SmartPkgEnable("OPENCV", "opencv", ("opencv_core", "opencv_highgui"), ("opencv2/core/core.hpp")) + else: + SmartPkgEnable("OPENCV", "opencv", ("cv", "highgui", "cvaux", "ml", "cxcore"), + ("opencv", "opencv/cv.h", "opencv/cxcore.h", "opencv/highgui.h")) else: - SmartPkgEnable("OPENCV", "opencv", ("cv", "highgui", "cvaux", "ml", "cxcore"), - ("opencv", "opencv/cv.h", "opencv/cxcore.h", "opencv/highgui.h")) + PkgDisable("OPENCV") rocket_libs = ("RocketCore", "RocketControls") if (GetOptimize() <= 3): From b781995ef135fdaea6d2479f8b3b7e6213e9d9f3 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 20 Jun 2017 16:14:00 +0200 Subject: [PATCH 128/254] ShaderGenerator: prepare_scene now invokes shader generator. This also necessarily removes ShaderGenerator's dependency on a host window. --- panda/src/display/graphicsEngine.cxx | 10 --------- panda/src/display/standardMunger.cxx | 10 ++++----- panda/src/pgraph/geomNode.cxx | 26 +++++++++++------------ panda/src/pgraphnodes/shaderGenerator.cxx | 4 ++-- panda/src/pgraphnodes/shaderGenerator.h | 3 +-- 5 files changed, 21 insertions(+), 32 deletions(-) diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index 045c534ebe..a9ce3abbcb 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -1849,16 +1849,6 @@ setup_scene(GraphicsStateGuardian *gsg, DisplayRegionPipelineReader *dr) { CPT(TransformState) cs_world_transform = cs_transform->compose(world_transform); scene_setup->set_cs_world_transform(cs_world_transform); - // Make sure that the GSG has a ShaderGenerator for the munger to use. We - // have to do this here because the ShaderGenerator needs a host window - // pointer. Hopefully we'll be able to eliminate that requirement in the - // future. -#ifdef HAVE_CG - if (gsg->get_shader_generator() == NULL) { - gsg->set_shader_generator(new ShaderGenerator(gsg, window)); - } -#endif - return scene_setup; } diff --git a/panda/src/display/standardMunger.cxx b/panda/src/display/standardMunger.cxx index b6bc1ada2a..4b6aa01f67 100644 --- a/panda/src/display/standardMunger.cxx +++ b/panda/src/display/standardMunger.cxx @@ -344,11 +344,11 @@ munge_state_impl(const RenderState *state) { #ifdef HAVE_CG if (_auto_shader) { CPT(RenderState) shader_state = munged_state->get_auto_shader_state(); - ShaderGenerator *shader_generator = get_gsg()->get_shader_generator(); - if (shader_generator == NULL) { - pgraph_cat.error() - << "auto_shader enabled, but GSG has no shader generator assigned!\n"; - return munged_state; + GraphicsStateGuardian *gsg = get_gsg(); + ShaderGenerator *shader_generator = gsg->get_shader_generator(); + if (shader_generator == nullptr) { + shader_generator = new ShaderGenerator(gsg); + gsg->set_shader_generator(shader_generator); } if (shader_state->_generated_shader == NULL) { // Cache the generated ShaderAttrib on the shader state. diff --git a/panda/src/pgraph/geomNode.cxx b/panda/src/pgraph/geomNode.cxx index 7b850fafc6..11d319212f 100644 --- a/panda/src/pgraph/geomNode.cxx +++ b/panda/src/pgraph/geomNode.cxx @@ -15,6 +15,7 @@ #include "geom.h" #include "geomTransformer.h" #include "sceneGraphReducer.h" +#include "stateMunger.h" #include "accumulatedAttribs.h" #include "colorAttrib.h" #include "colorScaleAttrib.h" @@ -391,33 +392,32 @@ r_prepare_scene(GraphicsStateGuardianBase *gsg, const RenderState *node_state, ((GeomPrimitive *)prim.p())->prepare(prepared_objects); } + if (munger->is_of_type(StateMunger::get_class_type())) { + StateMunger *state_munger = (StateMunger *)munger.p(); + geom_state = state_munger->munge_state(geom_state); + } + // And now prepare each of the textures. - const RenderAttrib *attrib = - geom_state->get_attrib(TextureAttrib::get_class_slot()); - if (attrib != (const RenderAttrib *)NULL) { - const TextureAttrib *ta; - DCAST_INTO_V(ta, attrib); + const TextureAttrib *ta; + if (geom_state->get_attrib(ta)) { int num_stages = ta->get_num_on_stages(); for (int i = 0; i < num_stages; ++i) { Texture *texture = ta->get_on_texture(ta->get_on_stage(i)); // TODO: prepare the sampler states, if specified. - if (texture != (Texture *)NULL) { + if (texture != nullptr) { texture->prepare(prepared_objects); } } } // As well as the shaders. - attrib = geom_state->get_attrib(ShaderAttrib::get_class_slot()); - if (attrib != (const RenderAttrib *)NULL) { - const ShaderAttrib *sa; - DCAST_INTO_V(sa, attrib); + const ShaderAttrib *sa; + if (geom_state->get_attrib(sa)) { Shader *shader = (Shader *)sa->get_shader(); - if (shader != (Shader *)NULL) { + if (shader != nullptr) { shader->prepare(prepared_objects); } - // TODO: prepare the shader inputs. TODO: Invoke the shader generator - // if enabled. + // TODO: prepare the shader inputs. } } diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index 63973c6bc3..f5c15f136c 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -55,8 +55,8 @@ TypeHandle ShaderGenerator::_type_handle; * shader generator belongs. */ ShaderGenerator:: -ShaderGenerator(GraphicsStateGuardianBase *gsg, GraphicsOutputBase *host) : - _gsg(gsg), _host(host) { +ShaderGenerator(GraphicsStateGuardianBase *gsg) : + _gsg(gsg) { // The ATTR# input semantics seem to map to generic vertex attributes in // both arbvp1 and glslv, which behave more consistently. However, they diff --git a/panda/src/pgraphnodes/shaderGenerator.h b/panda/src/pgraphnodes/shaderGenerator.h index a1d83f0919..1fd597b215 100644 --- a/panda/src/pgraphnodes/shaderGenerator.h +++ b/panda/src/pgraphnodes/shaderGenerator.h @@ -60,7 +60,7 @@ class GeomVertexAnimationSpec; */ class EXPCL_PANDA_PGRAPHNODES ShaderGenerator : public TypedReferenceCount { PUBLISHED: - ShaderGenerator(GraphicsStateGuardianBase *gsg, GraphicsOutputBase *host); + ShaderGenerator(GraphicsStateGuardianBase *gsg); virtual ~ShaderGenerator(); virtual CPT(ShaderAttrib) synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim); @@ -144,7 +144,6 @@ protected: // This is not a PT() to prevent a circular reference. GraphicsStateGuardianBase *_gsg; - GraphicsOutputBase *_host; public: static TypeHandle get_class_type() { From af57c829d2c15530f72395895353c004a7440a35 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 20 Jun 2017 18:42:44 +0200 Subject: [PATCH 129/254] ShaderGenerator: reduce combinatoric explosion of shaders This is done by: * Not considering the texture pointer when looking up a generated shader, only type * Not requiring different shaders based on RescaleNormalAttrib * Not looking at AlphaTestAttrib unless it is going to be relevant This should dramatically reduce the number of shaders that are being generated for many scenes, especially since the only thing that differs from object to object is often just the texture. These changes are also necessary to make b781995ef135fdaea6d2479f8b3b7e6213e9d9f3 more usable, since prepare_scene may see a slightly different state than is encountered at render time due to code in CullResult adding in an AlphaTestAttrib or RescaleNormalAttrib. --- panda/src/pgraph/alphaTestAttrib.cxx | 11 +++- panda/src/pgraph/rescaleNormalAttrib.cxx | 7 ++- panda/src/pgraph/shaderAttrib.cxx | 9 +-- panda/src/pgraph/textureAttrib.I | 40 ++++++++++++ panda/src/pgraph/textureAttrib.cxx | 74 ++++++++++++++++++++++- panda/src/pgraph/textureAttrib.h | 8 +++ panda/src/pgraph/transparencyAttrib.cxx | 9 ++- panda/src/pgraphnodes/shaderGenerator.cxx | 45 +++++++------- 8 files changed, 170 insertions(+), 33 deletions(-) diff --git a/panda/src/pgraph/alphaTestAttrib.cxx b/panda/src/pgraph/alphaTestAttrib.cxx index 5a37a23531..8d31c57b12 100644 --- a/panda/src/pgraph/alphaTestAttrib.cxx +++ b/panda/src/pgraph/alphaTestAttrib.cxx @@ -18,6 +18,7 @@ #include "bamWriter.h" #include "datagram.h" #include "datagramIterator.h" +#include "auxBitplaneAttrib.h" TypeHandle AlphaTestAttrib::_type_handle; int AlphaTestAttrib::_attrib_slot; @@ -98,7 +99,15 @@ get_hash_impl() const { */ CPT(RenderAttrib) AlphaTestAttrib:: get_auto_shader_attrib_impl(const RenderState *state) const { - return this; + // This is only important if the shader subsumes the alpha test, which only + // happens if there is an AuxBitplaneAttrib with ABO_glow. + const AuxBitplaneAttrib *aux; + if (!state->get_attrib(aux) || + (aux->get_outputs() & AuxBitplaneAttrib::ABO_glow) == 0) { + return nullptr; + } else { + return this; + } } /** diff --git a/panda/src/pgraph/rescaleNormalAttrib.cxx b/panda/src/pgraph/rescaleNormalAttrib.cxx index 36af8ebafb..e9d081e43c 100644 --- a/panda/src/pgraph/rescaleNormalAttrib.cxx +++ b/panda/src/pgraph/rescaleNormalAttrib.cxx @@ -86,11 +86,14 @@ get_hash_impl() const { CPT(RenderAttrib) RescaleNormalAttrib:: get_auto_shader_attrib_impl(const RenderState *state) const { // We currently only support M_normalize in the ShaderGenerator. - if (_mode == M_none || _mode == M_normalize) { + /*if (_mode == M_none || _mode == M_normalize) { return this; } else { return RescaleNormalAttrib::make(M_normalize); - } + }*/ + // Actually, we currently ignore this attribute in the shader generator, + // and always normalize the normals. It's too much of a bother. + return nullptr; } /** diff --git a/panda/src/pgraph/shaderAttrib.cxx b/panda/src/pgraph/shaderAttrib.cxx index 6435ceed5d..04d6196aa2 100644 --- a/panda/src/pgraph/shaderAttrib.cxx +++ b/panda/src/pgraph/shaderAttrib.cxx @@ -523,14 +523,15 @@ void ShaderAttrib:: output(ostream &out) const { out << "ShaderAttrib:"; - if (_has_shader) { - if (_shader == NULL) { + if (_auto_shader) { + out << "auto"; + return; + } else if (_has_shader) { + if (_shader == nullptr) { out << "off"; } else { out << _shader->get_filename().get_basename(); } - } else if (_auto_shader) { - out << "auto"; } out << "," << _inputs.size() << " inputs"; diff --git a/panda/src/pgraph/textureAttrib.I b/panda/src/pgraph/textureAttrib.I index da1feca0be..2b008b2f51 100644 --- a/panda/src/pgraph/textureAttrib.I +++ b/panda/src/pgraph/textureAttrib.I @@ -140,6 +140,26 @@ get_on_texture(TextureStage *stage) const { return NULL; } +/** + * Returns the type of the texture associated with the indicated stage. It is + * an error to call this if has_on_stage(stage) returns false. + * + * This method is no different than get_on_texture(stage)->get_texture_type(); + * it merely exists to address a corner case for the shader generator. + */ +INLINE Texture::TextureType TextureAttrib:: +get_on_texture_type(TextureStage *stage) const { + Stages::const_iterator si; + si = _on_stages.find(StageNode(stage)); + nassertr(si != _on_stages.end(), Texture::TT_2d_texture); + + if ((*si)._texture == nullptr) { + return (*si)._texture_type; + } else { + return (*si)._texture->get_texture_type(); + } +} + /** * Returns the sampler associated with the indicated stage, or the one * associated with its texture if no custom stage has been specified. It is @@ -215,6 +235,26 @@ is_identity() const { return _on_stages.empty() && _off_stages.empty() && !_off_all_stages; } +/** + * Call only on a state returned by get_auto_shader_attrib. + */ +bool TextureAttrib:: +on_stage_affects_rgb(size_t n) const { + nassertr(n < _render_stages.size(), false); + StageNode *stage = _render_stages[n]; + return stage->_texture_affects_rgb; +} + +/** + * Call only on a state returned by get_auto_shader_attrib. + */ +bool TextureAttrib:: +on_stage_affects_alpha(size_t n) const { + nassertr(n < _render_stages.size(), false); + StageNode *stage = _render_stages[n]; + return stage->_texture_affects_alpha; +} + /** * Confirms whether the _on_stages list is still sorted. It will become * unsorted if someone calls TextureStage::set_sort(). diff --git a/panda/src/pgraph/textureAttrib.cxx b/panda/src/pgraph/textureAttrib.cxx index 157bf1d146..09e9f7ce7e 100644 --- a/panda/src/pgraph/textureAttrib.cxx +++ b/panda/src/pgraph/textureAttrib.cxx @@ -106,6 +106,8 @@ find_on_stage(const TextureStage *stage) const { */ CPT(RenderAttrib) TextureAttrib:: add_on_stage(TextureStage *stage, Texture *tex, int override) const { + nassertr(tex != nullptr, this); + TextureAttrib *attrib = new TextureAttrib(*this); Stages::iterator si = attrib->_on_stages.insert(StageNode(stage)).first; (*si)._override = override; @@ -127,6 +129,8 @@ add_on_stage(TextureStage *stage, Texture *tex, int override) const { */ CPT(RenderAttrib) TextureAttrib:: add_on_stage(TextureStage *stage, Texture *tex, const SamplerState &sampler, int override) const { + nassertr(tex != nullptr, this); + TextureAttrib *attrib = new TextureAttrib(*this); Stages::iterator si = attrib->_on_stages.insert(StageNode(stage)).first; (*si)._override = override; @@ -381,10 +385,19 @@ output(ostream &out) const { const StageNode &sn = *(*ri); TextureStage *stage = sn._stage; Texture *tex = sn._texture; - if (tex != NULL) { + if (tex != nullptr) { out << " " << stage->get_name() << ":" << tex->get_name(); } else { - out << " " << stage->get_name(); + out << " " << stage->get_name() << ":(" << sn._texture_type; + if (sn._texture_affects_rgb) { + out << " rgb"; + if (sn._texture_affects_alpha) { + out << "a"; + } + } else if (sn._texture_affects_alpha) { + out << " alpha"; + } + out << ")"; } if (sn._override != 0) { out << "^" << sn._override; @@ -500,6 +513,19 @@ compare_to_impl(const RenderAttrib *other) const { } } + if (texture == nullptr) { + // This is an attribute returned by get_auto_shader_attrib_impl. + if ((*si)._texture_type != (*osi)._texture_type) { + return (*si)._texture_type < (*osi)._texture_type ? -1 : 1; + } + if ((*si)._texture_affects_rgb != (*osi)._texture_affects_rgb) { + return (*si)._texture_affects_rgb < (*osi)._texture_affects_rgb ? -1 : 1; + } + if ((*si)._texture_affects_alpha != (*osi)._texture_affects_alpha) { + return (*si)._texture_affects_alpha < (*osi)._texture_affects_alpha ? -1 : 1; + } + } + ++si; ++osi; } @@ -563,6 +589,13 @@ get_hash_impl() const { hash = pointer_hash::add_hash(hash, sn._texture); hash = int_hash::add_hash(hash, (int)sn._implicit_sort); hash = int_hash::add_hash(hash, sn._override); + + if (sn._texture == nullptr) { + // This is an attribute returned by get_auto_shader_attrib_impl. + hash = int_hash::add_hash(hash, (int)sn._texture_type); + hash = int_hash::add_hash(hash, (int)sn._texture_affects_rgb); + hash = int_hash::add_hash(hash, (int)sn._texture_affects_alpha); + } } // This bool value goes here, between the two lists, to differentiate @@ -739,7 +772,42 @@ invert_compose_impl(const RenderAttrib *other) const { */ CPT(RenderAttrib) TextureAttrib:: get_auto_shader_attrib_impl(const RenderState *state) const { - return this; + if (_on_stages.empty()) { + // Having no stages is the same as not applying a texture attribute. + return nullptr; + } + + // We make a texture attribute that does not store the texture and sampler, + // so that we don't have to generate a shader for every possible texture. + // We do have to store the few texture properties that do affect the + // generated shader. + PT(TextureAttrib) attrib = new TextureAttrib; + attrib->_on_stages = _on_stages; + attrib->sort_on_stages(); + + Stages::iterator si; + for (si = attrib->_on_stages.begin(); si != attrib->_on_stages.end(); ++si) { + Texture::Format format = (*si)._texture->get_format(); + (*si)._texture_type = (*si)._texture->get_texture_type(); + (*si)._texture_affects_rgb = (format != Texture::F_alpha); + (*si)._texture_affects_alpha = Texture::has_alpha(format); + (*si)._texture = nullptr; + (*si)._has_sampler = false; + + // We will no longer be composing or sorting this state so we can get rid + // of these values. + (*si)._override = 0; + (*si)._implicit_sort = 0; + + // Exception to optimize a common case: if the first texture is an RGB + // texture, we don't care about whether it affects the alpha channel. + if (attrib->_render_stages[0] == &(*si) && + (*si)._texture_affects_rgb && !(*si)._texture_affects_alpha) { + (*si)._texture_affects_alpha = true; + } + } + + return return_new(attrib); } /** diff --git a/panda/src/pgraph/textureAttrib.h b/panda/src/pgraph/textureAttrib.h index 2cc5270536..9f1c13e3c8 100644 --- a/panda/src/pgraph/textureAttrib.h +++ b/panda/src/pgraph/textureAttrib.h @@ -59,6 +59,7 @@ PUBLISHED: INLINE int get_ff_tc_index(int n) const; INLINE bool has_on_stage(TextureStage *stage) const; INLINE Texture *get_on_texture(TextureStage *stage) const; + INLINE Texture::TextureType get_on_texture_type(TextureStage *stage) const; INLINE const SamplerState &get_on_sampler(TextureStage *stage) const; INLINE int get_on_stage_override(TextureStage *stage) const; @@ -81,6 +82,8 @@ PUBLISHED: CPT(RenderAttrib) unify_texture_stages(TextureStage *stage) const; public: + INLINE bool on_stage_affects_rgb(size_t n) const; + INLINE bool on_stage_affects_alpha(size_t n) const; CPT(TextureAttrib) filter_to_max(int max_texture_stages) const; virtual bool lower_attrib_can_override() const; @@ -114,6 +117,11 @@ private: int _ff_tc_index; unsigned int _implicit_sort; int _override; + + // These fields are used by the shader generator. + Texture::TextureType _texture_type : 16; + bool _texture_affects_rgb : 8; + bool _texture_affects_alpha : 8; }; class CompareTextureStagePriorities { diff --git a/panda/src/pgraph/transparencyAttrib.cxx b/panda/src/pgraph/transparencyAttrib.cxx index 4dd7d0a1c2..d998004f09 100644 --- a/panda/src/pgraph/transparencyAttrib.cxx +++ b/panda/src/pgraph/transparencyAttrib.cxx @@ -114,7 +114,14 @@ get_hash_impl() const { */ CPT(RenderAttrib) TransparencyAttrib:: get_auto_shader_attrib_impl(const RenderState *state) const { - return this; + if (_mode == TransparencyAttrib::M_alpha) { + return this; + } else if (_mode == TransparencyAttrib::M_premultiplied_alpha || + _mode == TransparencyAttrib::M_dual) { + return return_new(new TransparencyAttrib(M_alpha)); + } else { + return nullptr; + } } /** diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index f5c15f136c..46b9701d3c 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -357,10 +357,14 @@ analyze_renderstate(const RenderState *rs) { } // Determine whether we should normalize the normals. - const RescaleNormalAttrib *rescale; + /*const RescaleNormalAttrib *rescale; rs->get_attrib_def(rescale); _normalize_normals = (rescale->get_mode() != RescaleNormalAttrib::M_none); + */ + // Actually, let's always normalize the normals for now. This helps to + // reduce combinatoric explosion of shaders. + _normalize_normals = true; // Decide which material modes need to be calculated. @@ -823,11 +827,10 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t in float4 l_" << it->first->join("_") << " : " << it->second << ",\n"; } const TexMatrixAttrib *tex_matrix = DCAST(TexMatrixAttrib, rs->get_attrib_def(TexMatrixAttrib::get_class_slot())); - for (int i=0; i<_num_textures; i++) { + for (int i = 0; i < _num_textures; ++i) { TextureStage *stage = texture->get_on_stage(i); - Texture *tex = texture->get_on_texture(stage); - nassertr(tex != NULL, NULL); - text << "\t uniform sampler" << texture_type_as_string(tex->get_texture_type()) << " tex_" << i << ",\n"; + Texture::TextureType type = texture->get_on_texture_type(stage); + text << "\t uniform sampler" << texture_type_as_string(type) << " tex_" << i << ",\n"; if (tex_matrix->has_stage(stage)) { text << "\t uniform float4x4 texmat_" << i << ",\n"; } @@ -935,11 +938,10 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } text << "\t // Fetch all textures.\n"; if (_map_index_height >= 0 && parallax_mapping_samples > 0) { - Texture *tex = texture->get_on_texture(texture->get_on_stage(_map_index_height)); - nassertr(tex != NULL, NULL); - text << "\t float4 tex" << _map_index_height << " = tex" << texture_type_as_string(tex->get_texture_type()); + Texture::TextureType type = texture->get_on_texture_type(texture->get_on_stage(_map_index_height)); + text << "\t float4 tex" << _map_index_height << " = tex" << texture_type_as_string(type); text << "(tex_" << _map_index_height << ", texcoord" << _map_index_height << "."; - switch (tex->get_texture_type()) { + switch (type) { case Texture::TT_cube_map: case Texture::TT_3d_texture: case Texture::TT_2d_texture_array: @@ -972,18 +974,17 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << " * 2.0 - 1.0)) * " << 0.5 * parallax_mapping_scale << ";\n"; } } - for (int i=0; i<_num_textures; i++) { + for (int i = 0; i < _num_textures; ++i) { if (i != _map_index_height) { - Texture *tex = texture->get_on_texture(texture->get_on_stage(i)); - nassertr(tex != NULL, NULL); + Texture::TextureType type = texture->get_on_texture_type(texture->get_on_stage(i)); // Parallax mapping pushes the texture coordinates of the other textures // away from the camera. if (_map_index_height >= 0 && parallax_mapping_samples > 0) { text << "\t texcoord" << i << ".xyz -= parallax_offset;\n"; } - text << "\t float4 tex" << i << " = tex" << texture_type_as_string(tex->get_texture_type()); + text << "\t float4 tex" << i << " = tex" << texture_type_as_string(type); text << "(tex_" << i << ", texcoord" << i << "."; - switch(tex->get_texture_type()) { + switch (type) { case Texture::TT_cube_map: case Texture::TT_3d_texture: case Texture::TT_2d_texture_array: @@ -1263,20 +1264,20 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } // Now loop through the textures to compose our magic blending formulas. - for (int i=0; i<_num_textures; i++) { + for (int i = 0; i < _num_textures; ++i) { TextureStage *stage = texture->get_on_stage(i); switch (stage->get_mode()) { case TextureStage::M_modulate: { - int num_components = texture->get_on_texture(texture->get_on_stage(i))->get_num_components(); + bool affects_rgb = texture->on_stage_affects_rgb(i); + bool affects_alpha = texture->on_stage_affects_alpha(i); - if (num_components == 1) { - text << "\t result.a *= tex" << i << ".a;\n"; - } else if (num_components == 3) { - text << "\t result.rgb *= tex" << i << ".rgb;\n"; - } else { + if (affects_rgb && affects_alpha) { text << "\t result.rgba *= tex" << i << ".rgba;\n"; + } else if (affects_alpha) { + text << "\t result.a *= tex" << i << ".a;\n"; + } else if (affects_rgb) { + text << "\t result.rgb *= tex" << i << ".rgb;\n"; } - break; } case TextureStage::M_modulate_glow: case TextureStage::M_modulate_gloss: From b41496b17aec40604b9da4fdd011869e50415e65 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 20 Jun 2017 19:15:12 +0200 Subject: [PATCH 130/254] Fix texpad/texpix inputs not updating (fixes CommonFilters resize issue) --- panda/src/gobj/shader.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/panda/src/gobj/shader.cxx b/panda/src/gobj/shader.cxx index f0cb8e0506..7147a108c0 100644 --- a/panda/src/gobj/shader.cxx +++ b/panda/src/gobj/shader.cxx @@ -428,7 +428,9 @@ cp_dependency(ShaderMatInput inp) { (inp == SMO_view_to_apiclip_x)) { dep |= SSD_shaderinputs; - if ((inp == SMO_alight_x) || + if ((inp == SMO_texpad_x) || + (inp == SMO_texpix_x) || + (inp == SMO_alight_x) || (inp == SMO_dlight_x) || (inp == SMO_plight_x) || (inp == SMO_slight_x) || From 3eb91e38b51b4f7b699213514f60f99b1bafc80f Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 20 Jun 2017 19:37:57 +0200 Subject: [PATCH 131/254] CommonFilters: fix edge bleeding when using POT textures (LP 424640) --- direct/src/filter/filter-bloomx.sha | 5 +++-- direct/src/filter/filter-bloomy.sha | 5 +++-- direct/src/filter/filter-blurx.sha | 10 ++++++---- direct/src/filter/filter-blury.sha | 10 ++++++---- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/direct/src/filter/filter-bloomx.sha b/direct/src/filter/filter-bloomx.sha index 6819936fc4..300ffeff2e 100644 --- a/direct/src/filter/filter-bloomx.sha +++ b/direct/src/filter/filter-bloomx.sha @@ -12,8 +12,9 @@ void vshader(float4 vtx_position : POSITION, l_position=mul(mat_modelproj, vtx_position); float2 c=(vtx_position.xz * texpad_src.xy) + texpad_src.xy; float offset = texpix_src.x; - l_texcoord0 = float4(c.x-offset* -4, c.x-offset* -3, c.x-offset* -2, c.y); - l_texcoord1 = float4(c.x-offset* -1, c.x-offset* 0, c.x-offset* 1, c.y); + float pad = texpad_src.x * 2; + l_texcoord0 = float4(min(c.x-offset* -4, pad), min(c.x-offset* -3, pad), min(c.x-offset* -2, pad), c.y); + l_texcoord1 = float4(min(c.x-offset* -1, pad), c.x-offset* 0, c.x-offset* 1, c.y); l_texcoord2 = float4(c.x-offset* 2, c.x-offset* 3, c.x-offset* 4, c.y); } diff --git a/direct/src/filter/filter-bloomy.sha b/direct/src/filter/filter-bloomy.sha index 2351c70dd3..51912b8b60 100644 --- a/direct/src/filter/filter-bloomy.sha +++ b/direct/src/filter/filter-bloomy.sha @@ -12,8 +12,9 @@ void vshader(float4 vtx_position : POSITION, l_position=mul(mat_modelproj, vtx_position); float2 c=(vtx_position.xz * texpad_src.xy) + texpad_src.xy; float offset = texpix_src.y; - l_texcoord0 = float4(c.y-offset* -4, c.y-offset* -3, c.y-offset* -2, c.x); - l_texcoord1 = float4(c.y-offset* -1, c.y-offset* 0, c.y-offset* 1, c.x); + float pad = texpad_src.y * 2; + l_texcoord0 = float4(min(c.y-offset* -4, pad), min(c.y-offset* -3, pad), min(c.y-offset* -2, pad), c.x); + l_texcoord1 = float4(min(c.y-offset* -1, pad), c.y-offset* 0, c.y-offset* 1, c.x); l_texcoord2 = float4(c.y-offset* 2, c.y-offset* 3, c.y-offset* 4, c.x); } diff --git a/direct/src/filter/filter-blurx.sha b/direct/src/filter/filter-blurx.sha index 2cb6c1512d..47a2217af3 100644 --- a/direct/src/filter/filter-blurx.sha +++ b/direct/src/filter/filter-blurx.sha @@ -2,7 +2,7 @@ // //Cg profile arbvp1 arbfp1 -void vshader(float4 vtx_position : POSITION, +void vshader(float4 vtx_position : POSITION, float2 vtx_texcoord0 : TEXCOORD0, out float4 l_position : POSITION, out float2 l_texcoord0 : TEXCOORD0, @@ -17,16 +17,18 @@ void vshader(float4 vtx_position : POSITION, void fshader(float2 l_texcoord0 : TEXCOORD0, out float4 o_color : COLOR, uniform float2 texpix_src, + uniform float4 texpad_src, uniform sampler2D k_src : TEXUNIT0) { + float pad = texpad_src.x * 2; float3 offset = float3(1.0*texpix_src.x, 2.0*texpix_src.x, 3.0*texpix_src.x); o_color = tex2D(k_src, l_texcoord0); o_color += tex2D(k_src, float2(l_texcoord0.x - offset.z, l_texcoord0.y)); o_color += tex2D(k_src, float2(l_texcoord0.x - offset.y, l_texcoord0.y)); o_color += tex2D(k_src, float2(l_texcoord0.x - offset.x, l_texcoord0.y)); - o_color += tex2D(k_src, float2(l_texcoord0.x + offset.x, l_texcoord0.y)); - o_color += tex2D(k_src, float2(l_texcoord0.x + offset.y, l_texcoord0.y)); - o_color += tex2D(k_src, float2(l_texcoord0.x + offset.z, l_texcoord0.y)); + o_color += tex2D(k_src, float2(min(l_texcoord0.x + offset.x, pad), l_texcoord0.y)); + o_color += tex2D(k_src, float2(min(l_texcoord0.x + offset.y, pad), l_texcoord0.y)); + o_color += tex2D(k_src, float2(min(l_texcoord0.x + offset.z, pad), l_texcoord0.y)); o_color /= 7; o_color.w = 1; } diff --git a/direct/src/filter/filter-blury.sha b/direct/src/filter/filter-blury.sha index b927cf0329..ab135c363a 100644 --- a/direct/src/filter/filter-blury.sha +++ b/direct/src/filter/filter-blury.sha @@ -2,7 +2,7 @@ // //Cg profile arbvp1 arbfp1 -void vshader(float4 vtx_position : POSITION, +void vshader(float4 vtx_position : POSITION, float2 vtx_texcoord0 : TEXCOORD0, out float4 l_position : POSITION, out float2 l_texcoord0 : TEXCOORD0, @@ -17,16 +17,18 @@ void vshader(float4 vtx_position : POSITION, void fshader(float2 l_texcoord0 : TEXCOORD0, out float4 o_color : COLOR, uniform float2 texpix_src, + uniform float4 texpad_src, uniform sampler2D k_src : TEXUNIT0) { + float pad = texpad_src.y * 2; float3 offset = float3(1.0*texpix_src.y, 2.0*texpix_src.y, 3.0*texpix_src.y); o_color = tex2D(k_src, l_texcoord0); o_color += tex2D(k_src, float2(l_texcoord0.x, l_texcoord0.y - offset.z)); o_color += tex2D(k_src, float2(l_texcoord0.x, l_texcoord0.y - offset.y)); o_color += tex2D(k_src, float2(l_texcoord0.x, l_texcoord0.y - offset.x)); - o_color += tex2D(k_src, float2(l_texcoord0.x, l_texcoord0.y + offset.x)); - o_color += tex2D(k_src, float2(l_texcoord0.x, l_texcoord0.y + offset.y)); - o_color += tex2D(k_src, float2(l_texcoord0.x, l_texcoord0.y + offset.z)); + o_color += tex2D(k_src, float2(l_texcoord0.x, min(l_texcoord0.y + offset.x, pad))); + o_color += tex2D(k_src, float2(l_texcoord0.x, min(l_texcoord0.y + offset.y, pad))); + o_color += tex2D(k_src, float2(l_texcoord0.x, min(l_texcoord0.y + offset.z, pad))); o_color /= 7; o_color.w = 1; } From c6dda2a44a929f46ca86c5b197e0efe8bf9d0b37 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 20 Jun 2017 21:52:04 +0200 Subject: [PATCH 132/254] vfs: Show IOError instead of AssertionError if read_file fails The methods are marked non-BLOCKING since the GIL needs to be held while throwing exceptions. We handle the GIL in the extension functions instead. --- panda/src/express/virtualFile.h | 4 +-- panda/src/express/virtualFileSystem.h | 4 +-- panda/src/express/virtualFileSystem_ext.cxx | 15 +++++++++++- panda/src/express/virtualFile_ext.cxx | 27 ++++++++++++++++++++- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/panda/src/express/virtualFile.h b/panda/src/express/virtualFile.h index 0719f3f8d1..5322fce670 100644 --- a/panda/src/express/virtualFile.h +++ b/panda/src/express/virtualFile.h @@ -56,12 +56,12 @@ PUBLISHED: BLOCKING void ls(ostream &out = cout) const; BLOCKING void ls_all(ostream &out = cout) const; - EXTENSION(BLOCKING PyObject *read_file(bool auto_unwrap) const); + EXTENSION(PyObject *read_file(bool auto_unwrap) const); BLOCKING virtual istream *open_read_file(bool auto_unwrap) const; BLOCKING virtual void close_read_file(istream *stream) const; virtual bool was_read_successful() const; - EXTENSION(BLOCKING PyObject *write_file(PyObject *data, bool auto_wrap)); + EXTENSION(PyObject *write_file(PyObject *data, bool auto_wrap)); BLOCKING virtual ostream *open_write_file(bool auto_wrap, bool truncate); BLOCKING virtual ostream *open_append_file(); BLOCKING virtual void close_write_file(ostream *stream); diff --git a/panda/src/express/virtualFileSystem.h b/panda/src/express/virtualFileSystem.h index 22d6316ce7..2ff1fa4e95 100644 --- a/panda/src/express/virtualFileSystem.h +++ b/panda/src/express/virtualFileSystem.h @@ -95,11 +95,11 @@ PUBLISHED: static VirtualFileSystem *get_global_ptr(); - EXTENSION(BLOCKING PyObject *read_file(const Filename &filename, bool auto_unwrap) const); + EXTENSION(PyObject *read_file(const Filename &filename, bool auto_unwrap) const); BLOCKING istream *open_read_file(const Filename &filename, bool auto_unwrap) const; BLOCKING static void close_read_file(istream *stream); - EXTENSION(BLOCKING PyObject *write_file(const Filename &filename, PyObject *data, bool auto_wrap)); + EXTENSION(PyObject *write_file(const Filename &filename, PyObject *data, bool auto_wrap)); BLOCKING ostream *open_write_file(const Filename &filename, bool auto_wrap, bool truncate); BLOCKING ostream *open_append_file(const Filename &filename); BLOCKING static void close_write_file(ostream *stream); diff --git a/panda/src/express/virtualFileSystem_ext.cxx b/panda/src/express/virtualFileSystem_ext.cxx index dc50751c52..6bc375c0d9 100644 --- a/panda/src/express/virtualFileSystem_ext.cxx +++ b/panda/src/express/virtualFileSystem_ext.cxx @@ -26,9 +26,22 @@ */ PyObject *Extension:: read_file(const Filename &filename, bool auto_unwrap) const { + // Release the GIL while we do this potentially slow operation. +#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS) + PyThreadState *_save; + Py_UNBLOCK_THREADS +#endif + vector_uchar pv; bool okflag = _this->read_file(filename, pv, auto_unwrap); - nassertr(okflag, NULL); + +#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS) + Py_BLOCK_THREADS +#endif + + if (!okflag) { + return PyErr_Format(PyExc_IOError, "Failed to read file: '%s'", filename.c_str()); + } #if PY_MAJOR_VERSION >= 3 if (pv.empty()) { diff --git a/panda/src/express/virtualFile_ext.cxx b/panda/src/express/virtualFile_ext.cxx index d81672cc50..db1a9a62ab 100644 --- a/panda/src/express/virtualFile_ext.cxx +++ b/panda/src/express/virtualFile_ext.cxx @@ -26,9 +26,23 @@ */ PyObject *Extension:: read_file(bool auto_unwrap) const { + // Release the GIL while we do this potentially slow operation. +#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS) + PyThreadState *_save; + Py_UNBLOCK_THREADS +#endif + vector_uchar pv; bool okflag = _this->read_file(pv, auto_unwrap); - nassertr(okflag, NULL); + +#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS) + Py_BLOCK_THREADS +#endif + + if (!okflag) { + Filename fn = _this->get_filename(); + return PyErr_Format(PyExc_IOError, "Failed to read file: '%s'", fn.c_str()); + } #if PY_MAJOR_VERSION >= 3 if (pv.empty()) { @@ -68,7 +82,18 @@ write_file(PyObject *data, bool auto_wrap) { } #endif + // Release the GIL while we do this potentially slow operation. +#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS) + PyThreadState *_save; + Py_UNBLOCK_THREADS +#endif + bool result = _this->write_file((const unsigned char *)buffer, length, auto_wrap); + +#if defined(HAVE_THREADS) && !defined(SIMPLE_THREADS) + Py_BLOCK_THREADS +#endif + return PyBool_FromLong(result); } From 40c6f41da2864b4ddcd006373b831421001b93e7 Mon Sep 17 00:00:00 2001 From: wezu Date: Tue, 20 Jun 2017 21:53:57 +0200 Subject: [PATCH 133/254] direct: provide snake_case functions for some classes Closes #147 --- direct/src/actor/Actor.py | 94 +++++++++++++++++++++++++++ direct/src/controls/InputState.py | 13 ++++ direct/src/filter/CommonFilters.py | 21 ++++++ direct/src/filter/FilterManager.py | 12 ++++ direct/src/showbase/Audio3DManager.py | 24 +++++++ direct/src/showbase/DirectObject.py | 12 ++++ direct/src/showbase/Messenger.py | 13 ++++ 7 files changed, 189 insertions(+) diff --git a/direct/src/actor/Actor.py b/direct/src/actor/Actor.py index 29db4290bd..5a64c1fe2a 100644 --- a/direct/src/actor/Actor.py +++ b/direct/src/actor/Actor.py @@ -50,6 +50,10 @@ class Actor(DirectObject, NodePath): def __repr__(self): return 'Actor.PartDef(%s, %s)' % (repr(self.partBundleNP), repr(self.partModel)) + + #snake_case alias: + get_bundle = getBundle + class AnimDef: """Instances of this class are stored within the @@ -72,6 +76,10 @@ class Actor(DirectObject, NodePath): def __repr__(self): return 'Actor.AnimDef(%s)' % (repr(self.filename)) + + #snake_case alias: + make_copy = makeCopy + class SubpartDef: """Instances of this class are stored within the SubpartDict @@ -2549,3 +2557,89 @@ class Actor(DirectObject, NodePath): for partBundleDict in self.__partBundleDict.values(): partDef = partBundleDict.get(subpartDef.truePartName) partDef.getBundle().setName(newBundleName) + + #snake_case alias: + control_joint = controlJoint + set_lod_animation = setLODAnimation + get_anim_control_dict = getAnimControlDict + get_actor_info = getActorInfo + clear_lod_animation = clearLODAnimation + reset_lod = resetLOD + fix_bounds = fixBounds + get_anim_filename = getAnimFilename + get_subparts_complete = getSubpartsComplete + verify_subparts_complete = verifySubpartsComplete + get_play_rate = getPlayRate + clear_python_data = clearPythonData + load_anims = loadAnims + set_subparts_complete = setSubpartsComplete + draw_in_front = drawInFront + get_lod_node = getLODNode + hide_part = hidePart + get_joint_transform_state = getJointTransformState + set_control_effect = setControlEffect + get_anim_controls = getAnimControls + release_joint = releaseJoint + print_anim_blends = printAnimBlends + get_lod = getLOD + disable_blend = disableBlend + show_part = showPart + get_joint_transform = getJointTransform + face_away_from_viewer = faceAwayFromViewer + set_lod = setLOD + osd_anim_blends = osdAnimBlends + get_current_frame = getCurrentFrame + set_play_rate = setPlayRate + bind_all_anims = bindAllAnims + unload_anims = unloadAnims + remove_part = removePart + use_lod = useLOD + get_anim_blends = getAnimBlends + get_lod_index = getLODIndex + get_num_frames = getNumFrames + post_flatten = postFlatten + get_lod_names = getLODNames + list_joints = listJoints + make_subpart = makeSubpart + get_anim_control = getAnimControl + get_part_bundle = getPartBundle + get_part_bundle_dict = getPartBundleDict + get_duration = getDuration + has_lod = hasLOD + print_lod = printLOD + fix_bounds_old = fixBounds_old + get_anim_names = getAnimNames + get_part_bundles = getPartBundles + anim_panel = animPanel + stop_joint = stopJoint + actor_interval = actorInterval + hide_all_bounds = hideAllBounds + show_all_bounds = showAllBounds + init_anims_on_all_lods = initAnimsOnAllLODs + get_part = getPart + add_lod = addLOD + show_all_parts = showAllParts + get_joints = getJoints + get_overlapping_joints = getOverlappingJoints + enable_blend = enableBlend + face_towards_viewer = faceTowardsViewer + bind_anim = bindAnim + set_blend = setBlend + get_frame_time = getFrameTime + remove_node = removeNode + wait_pending = waitPending + expose_joint = exposeJoint + set_lod_node = setLODNode + get_frame_rate = getFrameRate + get_current_anim = getCurrentAnim + get_part_names = getPartNames + freeze_joint = freezeJoint + set_center = setCenter + rename_part_bundles = renamePartBundles + get_geom_node = getGeomNode + set_geom_node = setGeomNode + load_model = loadModel + copy_actor = copyActor + get_base_frame_rate = getBaseFrameRate + remove_anim_control_dict = removeAnimControlDict + load_anims_on_all_lods = loadAnimsOnAllLODs diff --git a/direct/src/controls/InputState.py b/direct/src/controls/InputState.py index 38b0d78892..68608e9bea 100755 --- a/direct/src/controls/InputState.py +++ b/direct/src/controls/InputState.py @@ -21,6 +21,9 @@ class InputStateToken: def __hash__(self): return self._hash + #snake_case alias: + is_valid = isValid + class InputStateWatchToken(InputStateToken, DirectObject.DirectObject): def release(self): self._inputState._ignore(self) @@ -39,6 +42,9 @@ class InputStateTokenGroup: token.release() self._tokens = [] + #snake_case alias: + add_token = addToken + class InputState(DirectObject.DirectObject): """ InputState is for tracking the on/off state of some events. @@ -235,3 +241,10 @@ class InputState(DirectObject.DirectObject): """for debugging""" return self.notify.debug( "%s (%s) %s"%(id(self), len(self._state), message)) + + #snake_case alias: + watch_with_modifiers = watchWithModifiers + is_set = isSet + get_event_name = getEventName + debug_print = debugPrint + release_inputs = releaseInputs diff --git a/direct/src/filter/CommonFilters.py b/direct/src/filter/CommonFilters.py index 9cfe72d987..493f2d9794 100644 --- a/direct/src/filter/CommonFilters.py +++ b/direct/src/filter/CommonFilters.py @@ -536,3 +536,24 @@ class CommonFilters: del self.configuration["GammaAdjust"] return self.reconfigure((old_gamma != 1.0), "GammaAdjust") return True + + #snake_case alias: + del_cartoon_ink = delCartoonInk + set_half_pixel_shift = setHalfPixelShift + del_half_pixel_shift = delHalfPixelShift + set_inverted = setInverted + del_inverted = delInverted + del_view_glow = delViewGlow + set_volumetric_lighting = setVolumetricLighting + del_gamma_adjust = delGammaAdjust + set_bloom = setBloom + set_view_glow = setViewGlow + set_ambient_occlusion = setAmbientOcclusion + set_cartoon_ink = setCartoonInk + del_bloom = delBloom + del_ambient_occlusion = delAmbientOcclusion + load_shader = loadShader + set_blur_sharpen = setBlurSharpen + del_blur_sharpen = delBlurSharpen + del_volumetric_lighting = delVolumetricLighting + set_gamma_adjust = setGammaAdjust diff --git a/direct/src/filter/FilterManager.py b/direct/src/filter/FilterManager.py index bf35abf3c9..1de63c702d 100644 --- a/direct/src/filter/FilterManager.py +++ b/direct/src/filter/FilterManager.py @@ -349,3 +349,15 @@ class FilterManager(DirectObject): self.nextsort = self.win.getSort() - 1000 self.basex = 0 self.basey = 0 + + #snake_case alias: + is_fullscreen = isFullscreen + resize_buffers = resizeBuffers + set_stacked_clears = setStackedClears + render_scene_into = renderSceneInto + get_scaled_size = getScaledSize + render_quad_into = renderQuadInto + get_clears = getClears + set_clears = setClears + create_buffer = createBuffer + window_event = windowEvent diff --git a/direct/src/showbase/Audio3DManager.py b/direct/src/showbase/Audio3DManager.py index 07407c822b..463d3b5bf0 100644 --- a/direct/src/showbase/Audio3DManager.py +++ b/direct/src/showbase/Audio3DManager.py @@ -289,3 +289,27 @@ class Audio3DManager: for sound in self.sound_dict[object]: self.detachSound(sound) + #snake_case alias: + get_doppler_factor = getDopplerFactor + set_listener_velocity_auto = setListenerVelocityAuto + attach_listener = attachListener + set_distance_factor = setDistanceFactor + attach_sound_to_object = attachSoundToObject + get_drop_off_factor = getDropOffFactor + set_doppler_factor = setDopplerFactor + get_sounds_on_object = getSoundsOnObject + set_sound_velocity_auto = setSoundVelocityAuto + get_sound_max_distance = getSoundMaxDistance + load_sfx = loadSfx + get_distance_factor = getDistanceFactor + set_listener_velocity = setListenerVelocity + set_sound_max_distance = setSoundMaxDistance + get_sound_velocity = getSoundVelocity + get_listener_velocity = getListenerVelocity + set_sound_velocity = setSoundVelocity + set_sound_min_distance = setSoundMinDistance + get_sound_min_distance = getSoundMinDistance + detach_listener = detachListener + set_drop_off_factor = setDropOffFactor + detach_sound = detachSound + diff --git a/direct/src/showbase/DirectObject.py b/direct/src/showbase/DirectObject.py index 9106637134..778328ea50 100644 --- a/direct/src/showbase/DirectObject.py +++ b/direct/src/showbase/DirectObject.py @@ -101,3 +101,15 @@ class DirectObject: func = choice(getRepository()._crashOnProactiveLeakDetect, self.notify.error, self.notify.warning) func('destroyed %s instance is still %s%s' % (self.__class__.__name__, estr, tstr)) + + #snake_case alias: + add_task = addTask + do_method_later = doMethodLater + detect_leaks = detectLeaks + accept_once = acceptOnce + ignore_all = ignoreAll + get_all_accepting = getAllAccepting + is_ignoring = isIgnoring + remove_all_tasks = removeAllTasks + remove_task = removeTask + is_accepting = isAccepting diff --git a/direct/src/showbase/Messenger.py b/direct/src/showbase/Messenger.py index 09ceb9cd0a..08062e4a3e 100644 --- a/direct/src/showbase/Messenger.py +++ b/direct/src/showbase/Messenger.py @@ -635,3 +635,16 @@ class Messenger: str = str + '='*50 + '\n' return str + #snake_case alias: + get_events = getEvents + is_ignoring = isIgnoring + who_accepts = whoAccepts + find_all = findAll + replace_method = replaceMethod + ignore_all = ignoreAll + is_accepting = isAccepting + is_empty = isEmpty + detailed_repr = detailedRepr + get_all_accepting = getAllAccepting + toggle_verbose = toggleVerbose + From 511b0c10e570a31a3454c36b2dad7631570aac2d Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 22 Jun 2017 13:35:46 +0200 Subject: [PATCH 134/254] ShaderGenerator: don't generate a shader per Material --- panda/src/gobj/material.h | 30 +++++---- panda/src/pgraph/materialAttrib.I | 12 +++- panda/src/pgraph/materialAttrib.cxx | 49 +++++++++++++-- panda/src/pgraph/materialAttrib.h | 4 ++ panda/src/pgraphnodes/shaderGenerator.cxx | 75 +++++++---------------- panda/src/pgraphnodes/shaderGenerator.h | 2 +- 6 files changed, 99 insertions(+), 73 deletions(-) diff --git a/panda/src/gobj/material.h b/panda/src/gobj/material.h index 1a37415294..eb1a36747e 100644 --- a/panda/src/gobj/material.h +++ b/panda/src/gobj/material.h @@ -127,19 +127,7 @@ PUBLISHED: MAKE_PROPERTY(local, get_local, set_local); MAKE_PROPERTY(twoside, get_twoside, set_twoside); -private: - LColor _base_color; - LColor _ambient; - LColor _diffuse; - LColor _specular; - LColor _emission; - PN_stdfloat _shininess; - PN_stdfloat _roughness; - PN_stdfloat _metallic; - PN_stdfloat _refractive_index; - - static PT(Material) _default; - +public: enum Flags { F_ambient = 0x001, F_diffuse = 0x002, @@ -153,8 +141,24 @@ private: F_base_color = 0x200, F_refractive_index = 0x400, }; + +private: + LColor _base_color; + LColor _ambient; + LColor _diffuse; + LColor _specular; + LColor _emission; + PN_stdfloat _shininess; + PN_stdfloat _roughness; + PN_stdfloat _metallic; + PN_stdfloat _refractive_index; + + static PT(Material) _default; + int _flags; + friend class MaterialAttrib; + public: static void register_with_read_factory(); virtual void write_datagram(BamWriter *manager, Datagram &me); diff --git a/panda/src/pgraph/materialAttrib.I b/panda/src/pgraph/materialAttrib.I index 2f2652f43c..3cb7f9e6be 100644 --- a/panda/src/pgraph/materialAttrib.I +++ b/panda/src/pgraph/materialAttrib.I @@ -15,7 +15,7 @@ * Use MaterialAttrib::make() to construct a new MaterialAttrib object. */ INLINE MaterialAttrib:: -MaterialAttrib() { +MaterialAttrib() : _flags(0) { } /** @@ -24,7 +24,7 @@ MaterialAttrib() { */ INLINE bool MaterialAttrib:: is_off() const { - return _material == (const Material *)NULL; + return _flags == 0; } /** @@ -35,3 +35,11 @@ INLINE Material *MaterialAttrib:: get_material() const { return _material; } + +/** + * Equivalent to get_material()->get_flags(). + */ +INLINE int MaterialAttrib:: +get_material_flags() const { + return _flags; +} diff --git a/panda/src/pgraph/materialAttrib.cxx b/panda/src/pgraph/materialAttrib.cxx index c3facc7bb4..d8eee605d7 100644 --- a/panda/src/pgraph/materialAttrib.cxx +++ b/panda/src/pgraph/materialAttrib.cxx @@ -30,6 +30,8 @@ make(Material *material) { MaterialAttrib *attrib = new MaterialAttrib; attrib->_material = material; material->set_attrib_lock(); + attrib->_flags = material->_flags; + nassertr(attrib->_flags & Material::F_attrib_lock, nullptr); return return_new(attrib); } @@ -58,10 +60,34 @@ make_default() { void MaterialAttrib:: output(ostream &out) const { out << get_type() << ":"; - if (is_off()) { + if (_material != nullptr) { + out << *_material; + } else if (is_off()) { out << "(off)"; } else { - out << *_material; + // This is a state returned from get_auto_shader_attrib(). + out << "(on"; +#ifndef NDEBUG + if (_flags & Material::F_ambient) { + out << " amb"; + } + if (_flags & Material::F_diffuse) { + out << " diff"; + } + if (_flags & Material::F_specular) { + out << " spec"; + } + if (_flags & Material::F_emission) { + out << " emit"; + } + if (_flags & Material::F_local) { + out << " local"; + } + if (_flags & Material::F_twoside) { + out << " twoside"; + } +#endif + out << ")"; } } @@ -87,7 +113,7 @@ compare_to_impl(const RenderAttrib *other) const { if (_material != ta->_material) { return _material < ta->_material ? -1 : 1; } - return 0; + return _flags < ta->_flags; } /** @@ -100,6 +126,7 @@ size_t MaterialAttrib:: get_hash_impl() const { size_t hash = 0; hash = pointer_hash::add_hash(hash, _material); + hash = int_hash::add_hash(hash, _flags); return hash; } @@ -108,7 +135,15 @@ get_hash_impl() const { */ CPT(RenderAttrib) MaterialAttrib:: get_auto_shader_attrib_impl(const RenderState *state) const { - return this; + if (_material == nullptr) { + return this; + } else { + // Make a copy, but only with the flags, not with the material itself. + MaterialAttrib *attrib = new MaterialAttrib(); + attrib->_material = nullptr; + attrib->_flags = _flags; + return return_new(attrib); + } } /** @@ -139,8 +174,12 @@ complete_pointers(TypedWritable **p_list, BamReader *manager) { int pi = RenderAttrib::complete_pointers(p_list, manager); TypedWritable *material = p_list[pi++]; - if (material != (TypedWritable *)NULL) { + if (material != nullptr) { _material = DCAST(Material, material); + _flags = _material->_flags | Material::F_attrib_lock; + } else { + _material = nullptr; + _flags = 0; } return pi; diff --git a/panda/src/pgraph/materialAttrib.h b/panda/src/pgraph/materialAttrib.h index f984b699b3..28bd90f8bd 100644 --- a/panda/src/pgraph/materialAttrib.h +++ b/panda/src/pgraph/materialAttrib.h @@ -36,6 +36,9 @@ PUBLISHED: INLINE bool is_off() const; INLINE Material *get_material() const; +public: + INLINE int get_material_flags() const; + PUBLISHED: MAKE_PROPERTY(material, get_material); @@ -49,6 +52,7 @@ protected: private: PT(Material) _material; + int _flags; PUBLISHED: static int get_class_slot() { diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index 46b9701d3c..e78ac65f3a 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -265,12 +265,7 @@ analyze_renderstate(const RenderState *rs) { const MaterialAttrib *material; rs->get_attrib_def(material); - - if (!material->is_off()) { - _material = material->get_material(); - } else { - _material = Material::get_default(); - } + _material_flags = material->get_material_flags(); // Break out the lights by type. @@ -285,14 +280,7 @@ analyze_renderstate(const RenderState *rs) { nassertv(light_obj != (PandaNode *)NULL); if (light_obj->is_ambient_light()) { - if (_material->has_ambient()) { - LColor a = _material->get_ambient(); - if ((a[0]!=0.0)||(a[1]!=0.0)||(a[2]!=0.0)) { - _have_ambient = true; - } - } else { - _have_ambient = true; - } + _have_ambient = true; _lighting = true; } else if (light_obj->is_of_type(LightLensNode::get_class_type())) { @@ -369,29 +357,16 @@ analyze_renderstate(const RenderState *rs) { // Decide which material modes need to be calculated. if (_lighting) { - if (_material->has_diffuse()) { - LColor d = _material->get_diffuse(); - if ((d[0]!=0.0)||(d[1]!=0.0)||(d[2]!=0.0)) { - _have_diffuse = true; - } - } else { - _have_diffuse = true; - } + _have_diffuse = true; } - if (_lighting && (_material->has_emission())) { - LColor e = _material->get_emission(); - if ((e[0]!=0.0)||(e[1]!=0.0)||(e[2]!=0.0)) { - _have_emission = true; - } + if (_lighting && (_material_flags & Material::F_emission) != 0) { + _have_emission = true; } if (_lighting) { - if (_material->has_specular()) { - LColor s = _material->get_specular(); - if ((s[0]!=0.0)||(s[1]!=0.0)||(s[2]!=0.0)) { - _have_specular = true; - } + if (_material_flags & Material::F_specular) { + _have_specular = true; } else if (_map_index_gloss >= 0) { _have_specular = true; } @@ -402,14 +377,10 @@ analyze_renderstate(const RenderState *rs) { // Decide whether to separate ambient and diffuse calculations. if (_have_ambient && _have_diffuse) { - if (_material->has_ambient()) { - if (_material->has_diffuse()) { - _separate_ambient_diffuse = _material->get_ambient() != _material->get_diffuse(); - } else { - _separate_ambient_diffuse = true; - } + if (_material_flags & Material::F_ambient) { + _separate_ambient_diffuse = true; } else { - if (_material->has_diffuse()) { + if (_material_flags & Material::F_diffuse) { _separate_ambient_diffuse = true; } else { _separate_ambient_diffuse = false; @@ -431,10 +402,10 @@ analyze_renderstate(const RenderState *rs) { // Does the shader need material properties as input? _need_material_props = - (_have_ambient && (_material->has_ambient()))|| - (_have_diffuse && (_material->has_diffuse()))|| - (_have_emission && (_material->has_emission()))|| - (_have_specular && (_material->has_specular())); + (_have_ambient && (_material_flags & Material::F_ambient) != 0) || + (_have_diffuse && (_material_flags & Material::F_diffuse) != 0) || + (_have_emission && (_material_flags & Material::F_emission) != 0) || + (_have_specular && (_material_flags & Material::F_specular) != 0); // Check for clip planes. @@ -494,7 +465,7 @@ clear_analysis() { _out_aux_normal = false; _out_aux_glow = false; _out_aux_any = false; - _material = (Material*)NULL; + _material_flags = 0; _need_material_props = false; _need_world_position = false; _need_world_normal = false; @@ -867,7 +838,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t uniform float4x4 attr_material,\n"; } if (_have_specular) { - if (_material->get_local()) { + if (_material_flags & Material::F_local) { text << "\t uniform float4 mspos_view,\n"; } else { text << "\t uniform float4 row1_view_to_model,\n"; @@ -1041,7 +1012,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } if (_have_specular) { text << "\t float4 tot_specular = float4(0,0,0,0);\n"; - if (_material->has_specular()) { + if (_material_flags & Material::F_specular) { text << "\t float shininess = attr_material[3].w;\n"; } else { text << "\t float shininess = 50; // no shininess specified, using default\n"; @@ -1073,7 +1044,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t tot_diffuse += lcolor;\n"; } if (_have_specular) { - if (_material->get_local()) { + if (_material_flags & Material::F_local) { text << "\t lhalf = normalize(lvec - normalize(l_eye_position.xyz));\n"; } else { text << "\t lhalf = dlight_light" << i << "_rel_view[3].xyz;\n"; @@ -1103,7 +1074,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t tot_diffuse += lcolor;\n"; } if (_have_specular) { - if (_material->get_local()) { + if (_material_flags & Material::F_local) { text << "\t lhalf = normalize(lvec - normalize(l_eye_position.xyz));\n"; } else { text << "\t lhalf = normalize(lvec - float3(0, 1, 0));\n"; @@ -1141,7 +1112,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t tot_diffuse += lcolor;\n"; } if (_have_specular) { - if (_material->get_local()) { + if (_material_flags & Material::F_local) { text << "\t lhalf = normalize(lvec - normalize(l_eye_position.xyz));\n"; } else { text << "\t lhalf = normalize(lvec - float3(0,1,0));\n"; @@ -1199,7 +1170,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } } if ((_have_ambient)&&(_separate_ambient_diffuse)) { - if (_material->has_ambient()) { + if (_material_flags & Material::F_ambient) { text << "\t result += tot_ambient * attr_material[0];\n"; } else if (_vertex_colors) { text << "\t result += tot_ambient * l_color;\n"; @@ -1210,7 +1181,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } } if (_have_diffuse) { - if (_material->has_diffuse()) { + if (_material_flags & Material::F_diffuse) { text << "\t result += tot_diffuse * attr_material[1];\n"; } else if (_vertex_colors) { text << "\t result += tot_diffuse * l_color;\n"; @@ -1389,7 +1360,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { if (_lighting) { if (_have_specular) { - if (_material->has_specular()) { + if (_material_flags & Material::F_specular) { text << "\t tot_specular *= attr_material[3];\n"; } if (_map_index_gloss >= 0 && _auto_gloss_on) { diff --git a/panda/src/pgraphnodes/shaderGenerator.h b/panda/src/pgraphnodes/shaderGenerator.h index 1fd597b215..9042291631 100644 --- a/panda/src/pgraphnodes/shaderGenerator.h +++ b/panda/src/pgraphnodes/shaderGenerator.h @@ -87,7 +87,7 @@ protected: // RenderState analysis information. Created by analyze_renderstate: CPT(RenderState) _state; - Material *_material; + int _material_flags; int _num_textures; pvector _lights; From 9c4151cb0f167feea43e74ed003a8c1f98e09f5b Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 22 Jun 2017 13:36:23 +0200 Subject: [PATCH 135/254] ShaderGenerator: fix TextureAttrib assertion This was caused by af57c829d2c15530f72395895353c004a7440a35 and was triggered by a change in TextureStage sort. --- panda/src/pgraph/textureAttrib.I | 2 +- panda/src/pgraph/textureAttrib.cxx | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/panda/src/pgraph/textureAttrib.I b/panda/src/pgraph/textureAttrib.I index 2b008b2f51..6649c8d87a 100644 --- a/panda/src/pgraph/textureAttrib.I +++ b/panda/src/pgraph/textureAttrib.I @@ -263,7 +263,7 @@ on_stage_affects_alpha(size_t n) const { */ INLINE void TextureAttrib:: check_sorted() const { - if (_sort_seq != TextureStage::get_sort_seq()) { + if (_sort_seq != TextureStage::get_sort_seq() && !_sort_seq.is_fresh()) { ((TextureAttrib *)this)->sort_on_stages(); } } diff --git a/panda/src/pgraph/textureAttrib.cxx b/panda/src/pgraph/textureAttrib.cxx index 09e9f7ce7e..8c1b4833ff 100644 --- a/panda/src/pgraph/textureAttrib.cxx +++ b/panda/src/pgraph/textureAttrib.cxx @@ -807,6 +807,9 @@ get_auto_shader_attrib_impl(const RenderState *state) const { } } + // Prevent check_sorted() from being called on this state. + attrib->_sort_seq = UpdateSeq::fresh(); + return return_new(attrib); } From f57a3f9cde5f78c992a65e4825071e6fb3264798 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 3 Jul 2017 11:13:02 +0200 Subject: [PATCH 136/254] Hack to remove build warning on MSVC 2010 Fixes LP #1700329 --- dtool/src/dtoolbase/dtoolbase_cc.h | 4 ++++ panda/src/express/pointerTo.h | 4 ++-- panda/src/express/pointerToBase.h | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index f4fb89015c..7ccca03e24 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -34,6 +34,7 @@ using namespace std; #define ALWAYS_INLINE inline #define TYPENAME typename #define CONSTEXPR constexpr +#define ALWAYS_INLINE_CONSTEXPR constexpr #define NOEXCEPT noexcept #define FINAL final #define OVERRIDE override @@ -231,6 +232,9 @@ template typename remove_reference::type &&move(T &&t) { // Fallbacks if features are not supported #ifndef CONSTEXPR # define CONSTEXPR INLINE +# define ALWAYS_INLINE_CONSTEXPR ALWAYS_INLINE +#else +# define ALWAYS_INLINE_CONSTEXPR ALWAYS_INLINE CONSTEXPR #endif #ifndef NOEXCEPT # define NOEXCEPT diff --git a/panda/src/express/pointerTo.h b/panda/src/express/pointerTo.h index 15dbcdefb0..62abdf8e57 100644 --- a/panda/src/express/pointerTo.h +++ b/panda/src/express/pointerTo.h @@ -70,7 +70,7 @@ class PointerTo : public PointerToBase { public: typedef TYPENAME PointerToBase::To To; PUBLISHED: - ALWAYS_INLINE CONSTEXPR PointerTo() NOEXCEPT DEFAULT_CTOR; + ALWAYS_INLINE_CONSTEXPR PointerTo() NOEXCEPT DEFAULT_CTOR; ALWAYS_INLINE PointerTo(To *ptr) NOEXCEPT; INLINE PointerTo(const PointerTo ©); @@ -133,7 +133,7 @@ class ConstPointerTo : public PointerToBase { public: typedef TYPENAME PointerToBase::To To; PUBLISHED: - ALWAYS_INLINE CONSTEXPR ConstPointerTo() NOEXCEPT DEFAULT_CTOR; + ALWAYS_INLINE_CONSTEXPR ConstPointerTo() NOEXCEPT DEFAULT_CTOR; ALWAYS_INLINE ConstPointerTo(const To *ptr) NOEXCEPT; INLINE ConstPointerTo(const PointerTo ©); INLINE ConstPointerTo(const ConstPointerTo ©); diff --git a/panda/src/express/pointerToBase.h b/panda/src/express/pointerToBase.h index 4263312daa..7d5524f2b9 100644 --- a/panda/src/express/pointerToBase.h +++ b/panda/src/express/pointerToBase.h @@ -31,7 +31,7 @@ public: typedef T To; protected: - ALWAYS_INLINE CONSTEXPR PointerToBase() NOEXCEPT DEFAULT_CTOR; + ALWAYS_INLINE_CONSTEXPR PointerToBase() NOEXCEPT DEFAULT_CTOR; INLINE PointerToBase(To *ptr); INLINE PointerToBase(const PointerToBase ©); INLINE ~PointerToBase(); From 48c811e112999b345346177b68185417857843a3 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 3 Jul 2017 11:47:59 +0200 Subject: [PATCH 137/254] cull: remove GeomMunger stored on CullableObject --- panda/src/cull/cullBinBackToFront.cxx | 2 +- panda/src/cull/cullBinFixed.cxx | 2 +- panda/src/cull/cullBinFrontToBack.cxx | 2 +- panda/src/cull/cullBinStateSorted.cxx | 2 +- panda/src/cull/cullBinUnsorted.cxx | 2 +- panda/src/display/graphicsStateGuardian.cxx | 3 --- panda/src/display/graphicsStateGuardian.h | 4 +--- panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx | 4 +--- panda/src/dxgsg9/dxGraphicsStateGuardian9.h | 1 - panda/src/glstuff/glGraphicsStateGuardian_src.cxx | 7 +++---- panda/src/glstuff/glGraphicsStateGuardian_src.h | 1 - panda/src/gobj/geom.cxx | 11 +++++------ panda/src/gobj/geom.h | 3 +-- panda/src/gsgbase/graphicsStateGuardianBase.h | 1 - panda/src/pgraph/cullableObject.I | 4 +--- panda/src/pgraph/cullableObject.cxx | 12 +++++------- panda/src/pgraph/cullableObject.h | 8 +++----- panda/src/pgraph/geomDrawCallbackData.cxx | 4 ++-- panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx | 3 +-- panda/src/tinydisplay/tinyGraphicsStateGuardian.h | 1 - 20 files changed, 28 insertions(+), 49 deletions(-) diff --git a/panda/src/cull/cullBinBackToFront.cxx b/panda/src/cull/cullBinBackToFront.cxx index 57168aa866..a1a7264af0 100644 --- a/panda/src/cull/cullBinBackToFront.cxx +++ b/panda/src/cull/cullBinBackToFront.cxx @@ -99,7 +99,7 @@ draw(bool force, Thread *current_thread) { data_reader.set_object(object->_munged_data); data_reader.check_array_readers(); geom_reader.set_object(object->_geom); - geom_reader.draw(_gsg, object->_munger, &data_reader, force); + geom_reader.draw(_gsg, &data_reader, force); } else { // It has a callback associated. object->draw_callback(_gsg, force, current_thread); diff --git a/panda/src/cull/cullBinFixed.cxx b/panda/src/cull/cullBinFixed.cxx index 6bbce5ed78..212bc4f320 100644 --- a/panda/src/cull/cullBinFixed.cxx +++ b/panda/src/cull/cullBinFixed.cxx @@ -85,7 +85,7 @@ draw(bool force, Thread *current_thread) { data_reader.set_object(object->_munged_data); data_reader.check_array_readers(); geom_reader.set_object(object->_geom); - geom_reader.draw(_gsg, object->_munger, &data_reader, force); + geom_reader.draw(_gsg, &data_reader, force); } else { // It has a callback associated. object->draw_callback(_gsg, force, current_thread); diff --git a/panda/src/cull/cullBinFrontToBack.cxx b/panda/src/cull/cullBinFrontToBack.cxx index a532fef811..0fb05a68b5 100644 --- a/panda/src/cull/cullBinFrontToBack.cxx +++ b/panda/src/cull/cullBinFrontToBack.cxx @@ -99,7 +99,7 @@ draw(bool force, Thread *current_thread) { data_reader.set_object(object->_munged_data); data_reader.check_array_readers(); geom_reader.set_object(object->_geom); - geom_reader.draw(_gsg, object->_munger, &data_reader, force); + geom_reader.draw(_gsg, &data_reader, force); } else { // It has a callback associated. object->draw_callback(_gsg, force, current_thread); diff --git a/panda/src/cull/cullBinStateSorted.cxx b/panda/src/cull/cullBinStateSorted.cxx index 07f3f9c9a3..04890af48c 100644 --- a/panda/src/cull/cullBinStateSorted.cxx +++ b/panda/src/cull/cullBinStateSorted.cxx @@ -84,7 +84,7 @@ draw(bool force, Thread *current_thread) { data_reader.set_object(object->_munged_data); data_reader.check_array_readers(); geom_reader.set_object(object->_geom); - geom_reader.draw(_gsg, object->_munger, &data_reader, force); + geom_reader.draw(_gsg, &data_reader, force); } else { // It has a callback associated. object->draw_callback(_gsg, force, current_thread); diff --git a/panda/src/cull/cullBinUnsorted.cxx b/panda/src/cull/cullBinUnsorted.cxx index c9a68401b6..4ef8c35ae6 100644 --- a/panda/src/cull/cullBinUnsorted.cxx +++ b/panda/src/cull/cullBinUnsorted.cxx @@ -69,7 +69,7 @@ draw(bool force, Thread *current_thread) { data_reader.set_object(object->_munged_data); data_reader.check_array_readers(); geom_reader.set_object(object->_geom); - geom_reader.draw(_gsg, object->_munger, &data_reader, force); + geom_reader.draw(_gsg, &data_reader, force); } else { // It has a callback associated. object->draw_callback(_gsg, force, current_thread); diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 70dfcc80ac..05126797a1 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -2263,10 +2263,8 @@ finish_decal() { */ bool GraphicsStateGuardian:: begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force) { - _munger = munger; _data_reader = data_reader; // Always draw if we have a shader, since the shader might use a different @@ -2337,7 +2335,6 @@ draw_points(const GeomPrimitivePipelineReader *, bool) { */ void GraphicsStateGuardian:: end_draw_primitives() { - _munger = NULL; _data_reader = NULL; } diff --git a/panda/src/display/graphicsStateGuardian.h b/panda/src/display/graphicsStateGuardian.h index 22f4f07fec..305a8d62e0 100644 --- a/panda/src/display/graphicsStateGuardian.h +++ b/panda/src/display/graphicsStateGuardian.h @@ -367,7 +367,6 @@ public: virtual void finish_decal(); virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force); virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader, @@ -496,9 +495,8 @@ protected: CPT(ShaderAttrib) _state_shader; CPT(ShaderAttrib) _target_shader; - // These are set by begin_draw_primitives(), and are only valid between + // This is set by begin_draw_primitives(), and are only valid between // begin_draw_primitives() and end_draw_primitives(). - CPT(GeomMunger) _munger; const GeomVertexDataPipelineReader *_data_reader; unsigned int _color_write_mask; diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 2f47afe6cf..4ad0250ee3 100644 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -1141,11 +1141,9 @@ end_frame(Thread *current_thread) { */ bool DXGraphicsStateGuardian9:: begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force) { - if (!GraphicsStateGuardian::begin_draw_primitives(geom_reader, munger, - data_reader, force)) { + if (!GraphicsStateGuardian::begin_draw_primitives(geom_reader, data_reader, force)) { return false; } nassertr(_data_reader != (GeomVertexDataPipelineReader *)NULL, false); diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.h b/panda/src/dxgsg9/dxGraphicsStateGuardian9.h index 21bb0d7265..fa31ac12fd 100644 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.h +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.h @@ -106,7 +106,6 @@ public: virtual void end_frame(Thread *current_thread); virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force); virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader, diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 233385237e..d8b10292ec 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -3934,7 +3934,6 @@ end_frame(Thread *current_thread) { */ bool CLP(GraphicsStateGuardian):: begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force) { #ifndef NDEBUG @@ -3953,7 +3952,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, } #endif - if (!GraphicsStateGuardian::begin_draw_primitives(geom_reader, munger, data_reader, force)) { + if (!GraphicsStateGuardian::begin_draw_primitives(geom_reader, data_reader, force)) { return false; } nassertr(_data_reader != (GeomVertexDataPipelineReader *)NULL, false); @@ -4018,10 +4017,10 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, GeomContext *gc = geom_reader->prepare_now(get_prepared_objects(), this); nassertr(gc != (GeomContext *)NULL, false); CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc); - const CLP(GeomMunger) *gmunger = DCAST(CLP(GeomMunger), _munger); + //const CLP(GeomMunger) *gmunger = DCAST(CLP(GeomMunger), _munger); UpdateSeq modified = max(geom_reader->get_modified(), _data_reader->get_modified()); - if (ggc->get_display_list(_geom_display_list, gmunger, modified)) { + if (ggc->get_display_list(_geom_display_list, nullptr, modified)) { // If it hasn't been modified, just play the display list again. if (GLCAT.is_spam()) { GLCAT.spam() diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.h b/panda/src/glstuff/glGraphicsStateGuardian_src.h index 5f7f382246..e4da7cade1 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.h +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.h @@ -284,7 +284,6 @@ public: virtual void end_frame(Thread *current_thread); virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force); virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader, diff --git a/panda/src/gobj/geom.cxx b/panda/src/gobj/geom.cxx index 2b16a915cd..cf9a3a49b1 100644 --- a/panda/src/gobj/geom.cxx +++ b/panda/src/gobj/geom.cxx @@ -1211,14 +1211,13 @@ prepare_now(PreparedGraphicsObjects *prepared_objects, * is passed true, it will wait for the data to become resident if necessary. */ bool Geom:: -draw(GraphicsStateGuardianBase *gsg, const GeomMunger *munger, - const GeomVertexData *vertex_data, bool force, - Thread *current_thread) const { +draw(GraphicsStateGuardianBase *gsg, const GeomVertexData *vertex_data, + bool force, Thread *current_thread) const { GeomPipelineReader geom_reader(this, current_thread); GeomVertexDataPipelineReader data_reader(vertex_data, current_thread); data_reader.check_array_readers(); - return geom_reader.draw(gsg, munger, &data_reader, force); + return geom_reader.draw(gsg, &data_reader, force); } /** @@ -1749,10 +1748,10 @@ check_valid(const GeomVertexDataPipelineReader *data_reader) const { * The implementation of Geom::draw(). */ bool GeomPipelineReader:: -draw(GraphicsStateGuardianBase *gsg, const GeomMunger *munger, +draw(GraphicsStateGuardianBase *gsg, const GeomVertexDataPipelineReader *data_reader, bool force) const { PStatTimer timer(Geom::_draw_primitive_setup_pcollector); - bool all_ok = gsg->begin_draw_primitives(this, munger, data_reader, force); + bool all_ok = gsg->begin_draw_primitives(this, data_reader, force); if (all_ok) { Geom::Primitives::const_iterator pi; for (pi = _cdata->_primitives.begin(); diff --git a/panda/src/gobj/geom.h b/panda/src/gobj/geom.h index a1408878d8..0c61e5ef84 100644 --- a/panda/src/gobj/geom.h +++ b/panda/src/gobj/geom.h @@ -153,7 +153,6 @@ PUBLISHED: public: bool draw(GraphicsStateGuardianBase *gsg, - const GeomMunger *munger, const GeomVertexData *vertex_data, bool force, Thread *current_thread) const; @@ -429,7 +428,7 @@ public: INLINE GeomContext *prepare_now(PreparedGraphicsObjects *prepared_objects, GraphicsStateGuardianBase *gsg) const; - bool draw(GraphicsStateGuardianBase *gsg, const GeomMunger *munger, + bool draw(GraphicsStateGuardianBase *gsg, const GeomVertexDataPipelineReader *data_reader, bool force) const; diff --git a/panda/src/gsgbase/graphicsStateGuardianBase.h b/panda/src/gsgbase/graphicsStateGuardianBase.h index c45f36aca0..361407ec6c 100644 --- a/panda/src/gsgbase/graphicsStateGuardianBase.h +++ b/panda/src/gsgbase/graphicsStateGuardianBase.h @@ -198,7 +198,6 @@ public: // friends of this class. virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force)=0; virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader, bool force)=0; diff --git a/panda/src/pgraph/cullableObject.I b/panda/src/pgraph/cullableObject.I index 2aae972296..e93e826a58 100644 --- a/panda/src/pgraph/cullableObject.I +++ b/panda/src/pgraph/cullableObject.I @@ -43,7 +43,6 @@ CullableObject(CPT(Geom) geom, CPT(RenderState) state, INLINE CullableObject:: CullableObject(const CullableObject ©) : _geom(copy._geom), - _munger(copy._munger), _munged_data(copy._munged_data), _state(copy._state), _internal_transform(copy._internal_transform) @@ -59,7 +58,6 @@ CullableObject(const CullableObject ©) : INLINE void CullableObject:: operator = (const CullableObject ©) { _geom = copy._geom; - _munger = copy._munger; _munged_data = copy._munged_data; _state = copy._state; _internal_transform = copy._internal_transform; @@ -132,7 +130,7 @@ flush_level() { */ INLINE void CullableObject:: draw_inline(GraphicsStateGuardianBase *gsg, bool force, Thread *current_thread) { - _geom->draw(gsg, _munger, _munged_data, force, current_thread); + _geom->draw(gsg, _munged_data, force, current_thread); } /** diff --git a/panda/src/pgraph/cullableObject.cxx b/panda/src/pgraph/cullableObject.cxx index 0bd7a0fe5f..3d18dc6748 100644 --- a/panda/src/pgraph/cullableObject.cxx +++ b/panda/src/pgraph/cullableObject.cxx @@ -50,15 +50,13 @@ TypeHandle CullableObject::_type_handle; * have to block while the vertex data is paged in. */ bool CullableObject:: -munge_geom(GraphicsStateGuardianBase *gsg, - GeomMunger *munger, const CullTraverser *traverser, - bool force) { - nassertr(munger != (GeomMunger *)NULL, false); +munge_geom(GraphicsStateGuardianBase *gsg, GeomMunger *munger, + const CullTraverser *traverser, bool force) { + nassertr(munger != nullptr, false); + Thread *current_thread = traverser->get_current_thread(); PStatTimer timer(_munge_geom_pcollector, current_thread); - if (_geom != (Geom *)NULL) { - _munger = munger; - + if (_geom != nullptr) { GraphicsStateGuardianBase *gsg = traverser->get_gsg(); int gsg_bits = gsg->get_supported_geom_rendering(); if (!hardware_point_sprites) { diff --git a/panda/src/pgraph/cullableObject.h b/panda/src/pgraph/cullableObject.h index aa4a3af3c2..1415052770 100644 --- a/panda/src/pgraph/cullableObject.h +++ b/panda/src/pgraph/cullableObject.h @@ -18,7 +18,6 @@ #include "geom.h" #include "geomVertexData.h" -#include "geomMunger.h" #include "renderState.h" #include "transformState.h" #include "pointerTo.h" @@ -34,6 +33,7 @@ #include "geomDrawCallbackData.h" class CullTraverser; +class GeomMunger; /** * The smallest atom of cull. This is normally just a Geom and its associated @@ -52,9 +52,8 @@ public: INLINE CullableObject(const CullableObject ©); INLINE void operator = (const CullableObject ©); - bool munge_geom(GraphicsStateGuardianBase *gsg, - GeomMunger *munger, const CullTraverser *traverser, - bool force); + bool munge_geom(GraphicsStateGuardianBase *gsg, GeomMunger *munger, + const CullTraverser *traverser, bool force); INLINE void draw(GraphicsStateGuardianBase *gsg, bool force, Thread *current_thread); @@ -75,7 +74,6 @@ public: public: CPT(Geom) _geom; - PT(GeomMunger) _munger; CPT(GeomVertexData) _munged_data; CPT(RenderState) _state; CPT(TransformState) _internal_transform; diff --git a/panda/src/pgraph/geomDrawCallbackData.cxx b/panda/src/pgraph/geomDrawCallbackData.cxx index 283fe9711c..1b6dc76082 100644 --- a/panda/src/pgraph/geomDrawCallbackData.cxx +++ b/panda/src/pgraph/geomDrawCallbackData.cxx @@ -39,13 +39,13 @@ output(ostream &out) const { void GeomDrawCallbackData:: upcall() { // Go ahead and draw the object, if we have one. - if (_obj->_geom != (Geom *)NULL) { + if (_obj->_geom != nullptr) { if (_lost_state) { // Tell the GSG to forget its state. _gsg->clear_state_and_transform(); } - _obj->_geom->draw(_gsg, _obj->_munger, _obj->_munged_data, _force, + _obj->_geom->draw(_gsg, _obj->_munged_data, _force, Thread::get_current_thread()); } } diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx index f757b35a22..9da9aa0fea 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx @@ -470,7 +470,6 @@ end_frame(Thread *current_thread) { */ bool TinyGraphicsStateGuardian:: begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force) { #ifndef NDEBUG @@ -479,7 +478,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, } #endif // NDEBUG - if (!GraphicsStateGuardian::begin_draw_primitives(geom_reader, munger, data_reader, force)) { + if (!GraphicsStateGuardian::begin_draw_primitives(geom_reader, data_reader, force)) { return false; } nassertr(_data_reader != (GeomVertexDataPipelineReader *)NULL, false); diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.h b/panda/src/tinydisplay/tinyGraphicsStateGuardian.h index 65e01d7fbc..c7aae852cd 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.h +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.h @@ -63,7 +63,6 @@ public: virtual void end_frame(Thread *current_thread); virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader, - const GeomMunger *munger, const GeomVertexDataPipelineReader *data_reader, bool force); virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader, From fa1c480508855a422b968a438606eaaf71b254e7 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 3 Jul 2017 12:56:23 +0200 Subject: [PATCH 138/254] general: clean up use of override keyword --- dtool/src/dtoolbase/dtoolbase_cc.h | 8 ----- panda/src/egg/eggLine.h | 10 +++--- panda/src/egg/eggNurbsCurve.h | 8 ++--- panda/src/egg/eggNurbsSurface.h | 10 +++--- panda/src/egg/eggPatch.h | 8 ++--- panda/src/egg/eggPoint.h | 10 +++--- panda/src/egg/eggPolygon.h | 10 +++--- panda/src/egg/eggTriangleFan.h | 14 ++++----- panda/src/egg/eggTriangleStrip.h | 12 +++---- panda/src/glstuff/glCgShaderContext_src.I | 34 -------------------- panda/src/glstuff/glCgShaderContext_src.cxx | 14 +++++++++ panda/src/glstuff/glCgShaderContext_src.h | 26 +++++++-------- panda/src/glstuff/glShaderContext_src.I | 35 --------------------- panda/src/glstuff/glShaderContext_src.cxx | 22 ++++++++++--- panda/src/glstuff/glShaderContext_src.h | 32 ++++++++++--------- 15 files changed, 104 insertions(+), 149 deletions(-) diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index 7ccca03e24..eb84f1fccd 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -37,7 +37,6 @@ using namespace std; #define ALWAYS_INLINE_CONSTEXPR constexpr #define NOEXCEPT noexcept #define FINAL final -#define OVERRIDE override #define MOVE(x) x #define DEFAULT_CTOR = default #define DEFAULT_DTOR = default @@ -167,7 +166,6 @@ template typename remove_reference::type &&move(T &&t) { # endif # if __has_extension(cxx_override_control) && (__cplusplus >= 201103L) # define FINAL final -# define OVERRIDE override # endif # if __has_extension(cxx_defaulted_functions) # define DEFAULT_CTOR = default @@ -198,7 +196,6 @@ template typename remove_reference::type &&move(T &&t) { // Starting at GCC 4.7 # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) # define FINAL final -# define OVERRIDE override # endif // GCC defines several macros which we can query. List of all supported @@ -212,11 +209,9 @@ template typename remove_reference::type &&move(T &&t) { # define NOEXCEPT noexcept # define USE_MOVE_SEMANTICS # define FINAL final -# define OVERRIDE override # define MOVE(x) move(x) #elif defined(_MSC_VER) && _MSC_VER >= 1600 // Visual Studio 2010 # define NOEXCEPT throw() -# define OVERRIDE override # define USE_MOVE_SEMANTICS # define FINAL sealed # define MOVE(x) move(x) @@ -245,9 +240,6 @@ template typename remove_reference::type &&move(T &&t) { #ifndef FINAL # define FINAL #endif -#ifndef OVERRIDE -# define OVERRIDE -#endif #ifndef DEFAULT_CTOR # define DEFAULT_CTOR {} #endif diff --git a/panda/src/egg/eggLine.h b/panda/src/egg/eggLine.h index 72ea411cdc..27ee84a785 100644 --- a/panda/src/egg/eggLine.h +++ b/panda/src/egg/eggLine.h @@ -29,9 +29,9 @@ PUBLISHED: INLINE EggLine &operator = (const EggLine ©); virtual ~EggLine(); - virtual EggLine *make_copy() const OVERRIDE; + virtual EggLine *make_copy() const override; - virtual void write(ostream &out, int indent_level) const OVERRIDE; + virtual void write(ostream &out, int indent_level) const override; INLINE bool has_thick() const; INLINE double get_thick() const; @@ -39,7 +39,7 @@ PUBLISHED: INLINE void clear_thick(); protected: - virtual int get_num_lead_vertices() const OVERRIDE; + virtual int get_num_lead_vertices() const override; private: double _thick; @@ -54,10 +54,10 @@ public: register_type(_type_handle, "EggLine", EggCompositePrimitive::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE { + virtual TypeHandle force_init_type() override { init_type(); return get_class_type(); } diff --git a/panda/src/egg/eggNurbsCurve.h b/panda/src/egg/eggNurbsCurve.h index 4225549736..bcd6f1de0c 100644 --- a/panda/src/egg/eggNurbsCurve.h +++ b/panda/src/egg/eggNurbsCurve.h @@ -29,7 +29,7 @@ PUBLISHED: INLINE EggNurbsCurve(const EggNurbsCurve ©); INLINE EggNurbsCurve &operator = (const EggNurbsCurve ©); - virtual EggNurbsCurve *make_copy() const OVERRIDE; + virtual EggNurbsCurve *make_copy() const override; void setup(int order, int num_knots); @@ -50,7 +50,7 @@ PUBLISHED: INLINE double get_knot(int k) const; MAKE_SEQ(get_knots, get_num_knots, get_knot); - virtual void write(ostream &out, int indent_level) const OVERRIDE; + virtual void write(ostream &out, int indent_level) const override; MAKE_PROPERTY(order, get_order, set_order); MAKE_PROPERTY(degree, get_degree); @@ -72,10 +72,10 @@ public: register_type(_type_handle, "EggNurbsCurve", EggCurve::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE { + virtual TypeHandle force_init_type() override { init_type(); return get_class_type(); } diff --git a/panda/src/egg/eggNurbsSurface.h b/panda/src/egg/eggNurbsSurface.h index 83900282f0..bc3d752307 100644 --- a/panda/src/egg/eggNurbsSurface.h +++ b/panda/src/egg/eggNurbsSurface.h @@ -36,7 +36,7 @@ PUBLISHED: INLINE EggNurbsSurface(const EggNurbsSurface ©); INLINE EggNurbsSurface &operator = (const EggNurbsSurface ©); - virtual EggNurbsSurface *make_copy() const OVERRIDE; + virtual EggNurbsSurface *make_copy() const override; void setup(int u_order, int v_order, int num_u_knots, int num_v_knots); @@ -75,14 +75,14 @@ PUBLISHED: MAKE_SEQ(get_v_knots, get_num_v_knots, get_v_knot); INLINE EggVertex *get_cv(int ui, int vi) const; - virtual void write(ostream &out, int indent_level) const OVERRIDE; + virtual void write(ostream &out, int indent_level) const override; public: Curves _curves_on_surface; Trims _trims; protected: - virtual void r_apply_texmats(EggTextureCollection &textures) OVERRIDE; + virtual void r_apply_texmats(EggTextureCollection &textures) override; private: typedef vector_double Knots; @@ -101,10 +101,10 @@ public: register_type(_type_handle, "EggNurbsSurface", EggSurface::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE { + virtual TypeHandle force_init_type() override { init_type(); return get_class_type(); } diff --git a/panda/src/egg/eggPatch.h b/panda/src/egg/eggPatch.h index 4358149131..9b31d6e91f 100644 --- a/panda/src/egg/eggPatch.h +++ b/panda/src/egg/eggPatch.h @@ -28,9 +28,9 @@ PUBLISHED: INLINE EggPatch(const EggPatch ©); INLINE EggPatch &operator = (const EggPatch ©); - virtual EggPatch *make_copy() const OVERRIDE; + virtual EggPatch *make_copy() const override; - virtual void write(ostream &out, int indent_level) const OVERRIDE; + virtual void write(ostream &out, int indent_level) const override; public: static TypeHandle get_class_type() { @@ -41,10 +41,10 @@ public: register_type(_type_handle, "EggPatch", EggPrimitive::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE { + virtual TypeHandle force_init_type() override { init_type(); return get_class_type(); } diff --git a/panda/src/egg/eggPoint.h b/panda/src/egg/eggPoint.h index 93ed683133..994727e32e 100644 --- a/panda/src/egg/eggPoint.h +++ b/panda/src/egg/eggPoint.h @@ -28,7 +28,7 @@ PUBLISHED: INLINE EggPoint(const EggPoint ©); INLINE EggPoint &operator = (const EggPoint ©); - virtual EggPoint *make_copy() const OVERRIDE; + virtual EggPoint *make_copy() const override; INLINE bool has_thick() const; INLINE double get_thick() const; @@ -40,9 +40,9 @@ PUBLISHED: INLINE void set_perspective(bool perspective); INLINE void clear_perspective(); - virtual bool cleanup() OVERRIDE; + virtual bool cleanup() override; - virtual void write(ostream &out, int indent_level) const OVERRIDE; + virtual void write(ostream &out, int indent_level) const override; private: enum Flags { @@ -64,10 +64,10 @@ public: register_type(_type_handle, "EggPoint", EggPrimitive::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE { + virtual TypeHandle force_init_type() override { init_type(); return get_class_type(); } diff --git a/panda/src/egg/eggPolygon.h b/panda/src/egg/eggPolygon.h index 5d25c554be..aacd677c13 100644 --- a/panda/src/egg/eggPolygon.h +++ b/panda/src/egg/eggPolygon.h @@ -27,9 +27,9 @@ PUBLISHED: INLINE EggPolygon(const EggPolygon ©); INLINE EggPolygon &operator = (const EggPolygon ©); - virtual EggPolygon *make_copy() const OVERRIDE; + virtual EggPolygon *make_copy() const override; - virtual bool cleanup() OVERRIDE; + virtual bool cleanup() override; bool calculate_normal(LNormald &result, CoordinateSystem cs = CS_default) const; bool is_planar() const; @@ -39,7 +39,7 @@ PUBLISHED: INLINE bool triangulate_into(EggGroupNode *container, bool convex_also) const; PT(EggPolygon) triangulate_in_place(bool convex_also); - virtual void write(ostream &out, int indent_level) const OVERRIDE; + virtual void write(ostream &out, int indent_level) const override; private: bool decomp_concave(EggGroupNode *container, int asum, int x, int y) const; @@ -55,10 +55,10 @@ public: register_type(_type_handle, "EggPolygon", EggPrimitive::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE { + virtual TypeHandle force_init_type() override { init_type(); return get_class_type(); } diff --git a/panda/src/egg/eggTriangleFan.h b/panda/src/egg/eggTriangleFan.h index f2ca8e32b5..31c8a9e4a4 100644 --- a/panda/src/egg/eggTriangleFan.h +++ b/panda/src/egg/eggTriangleFan.h @@ -29,14 +29,14 @@ PUBLISHED: INLINE EggTriangleFan &operator = (const EggTriangleFan ©); virtual ~EggTriangleFan(); - virtual EggTriangleFan *make_copy() const OVERRIDE; + virtual EggTriangleFan *make_copy() const override; - virtual void write(ostream &out, int indent_level) const OVERRIDE; - virtual void apply_first_attribute() OVERRIDE; + virtual void write(ostream &out, int indent_level) const override; + virtual void apply_first_attribute() override; protected: - virtual int get_num_lead_vertices() const OVERRIDE; - virtual bool do_triangulate(EggGroupNode *container) const OVERRIDE; + virtual int get_num_lead_vertices() const override; + virtual bool do_triangulate(EggGroupNode *container) const override; public: static TypeHandle get_class_type() { @@ -47,10 +47,10 @@ public: register_type(_type_handle, "EggTriangleFan", EggCompositePrimitive::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE { + virtual TypeHandle force_init_type() override { init_type(); return get_class_type(); } diff --git a/panda/src/egg/eggTriangleStrip.h b/panda/src/egg/eggTriangleStrip.h index a84d0cd751..e74f248c47 100644 --- a/panda/src/egg/eggTriangleStrip.h +++ b/panda/src/egg/eggTriangleStrip.h @@ -29,13 +29,13 @@ PUBLISHED: INLINE EggTriangleStrip &operator = (const EggTriangleStrip ©); virtual ~EggTriangleStrip(); - virtual EggTriangleStrip *make_copy() const OVERRIDE; + virtual EggTriangleStrip *make_copy() const override; - virtual void write(ostream &out, int indent_level) const OVERRIDE; + virtual void write(ostream &out, int indent_level) const override; protected: - virtual int get_num_lead_vertices() const OVERRIDE; - virtual bool do_triangulate(EggGroupNode *container) const OVERRIDE; + virtual int get_num_lead_vertices() const override; + virtual bool do_triangulate(EggGroupNode *container) const override; public: static TypeHandle get_class_type() { @@ -46,10 +46,10 @@ public: register_type(_type_handle, "EggTriangleStrip", EggCompositePrimitive::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE { + virtual TypeHandle force_init_type() override { init_type(); return get_class_type(); } diff --git a/panda/src/glstuff/glCgShaderContext_src.I b/panda/src/glstuff/glCgShaderContext_src.I index b2c176f7d1..08c947f0fb 100644 --- a/panda/src/glstuff/glCgShaderContext_src.I +++ b/panda/src/glstuff/glCgShaderContext_src.I @@ -10,37 +10,3 @@ * @author rdb * @date 2014-06-27 */ - -#ifndef OPENGLES_1 - -/** - * Returns true if the shader is "valid", ie, if the compilation was - * successful. The compilation could fail if there is a syntax error in the - * shader, or if the current video card isn't shader-capable, or if no shader - * languages are compiled into panda. - */ -INLINE bool CLP(CgShaderContext):: -valid() { - if (_shader->get_error_flag()) return false; - if (_shader->get_language() != Shader::SL_Cg) return false; - return (_cg_program != 0); -} - -/** - * Returns true if the shader may need to access standard vertex attributes as - * passed by glVertexPointer and the like. - */ -INLINE bool CLP(CgShaderContext):: -uses_standard_vertex_arrays() { - return false; -} - -/** - * Always true, for now. - */ -INLINE bool CLP(CgShaderContext):: -uses_custom_vertex_arrays() { - return true; -} - -#endif // OPENGLES_1 diff --git a/panda/src/glstuff/glCgShaderContext_src.cxx b/panda/src/glstuff/glCgShaderContext_src.cxx index d8f7231a34..9f6e242968 100644 --- a/panda/src/glstuff/glCgShaderContext_src.cxx +++ b/panda/src/glstuff/glCgShaderContext_src.cxx @@ -357,6 +357,20 @@ release_resources() { _glgsg->report_my_gl_errors(); } +/** + * Returns true if the shader is "valid", ie, if the compilation was + * successful. The compilation could fail if there is a syntax error in the + * shader, or if the current video card isn't shader-capable, or if no shader + * languages are compiled into panda. + */ +bool CLP(CgShaderContext):: +valid() { + if (_shader == nullptr || _shader->get_error_flag()) { + return false; + } + return (_cg_program != 0); +} + /** * This function is to be called to enable a new shader. It also initializes * all of the shader's input parameters. diff --git a/panda/src/glstuff/glCgShaderContext_src.h b/panda/src/glstuff/glCgShaderContext_src.h index 49d451d442..d5bc721e61 100644 --- a/panda/src/glstuff/glCgShaderContext_src.h +++ b/panda/src/glstuff/glCgShaderContext_src.h @@ -33,25 +33,25 @@ public: ~CLP(CgShaderContext)(); ALLOC_DELETED_CHAIN(CLP(CgShaderContext)); - INLINE bool valid(void); - void bind() OVERRIDE; - void unbind() OVERRIDE; + bool valid(void) override; + void bind() override; + void unbind() override; void set_state_and_transform(const RenderState *state, const TransformState *modelview_transform, const TransformState *camera_transform, - const TransformState *projection_transform) OVERRIDE; + const TransformState *projection_transform) override; - void issue_parameters(int altered) OVERRIDE; + void issue_parameters(int altered) override; void update_transform_table(const TransformTable *table); void update_slider_table(const SliderTable *table); - void disable_shader_vertex_arrays() OVERRIDE; - bool update_shader_vertex_arrays(ShaderContext *prev, bool force) OVERRIDE; - void disable_shader_texture_bindings() OVERRIDE; - void update_shader_texture_bindings(ShaderContext *prev) OVERRIDE; + void disable_shader_vertex_arrays() override; + bool update_shader_vertex_arrays(ShaderContext *prev, bool force) override; + void disable_shader_texture_bindings() override; + void update_shader_texture_bindings(ShaderContext *prev) override; - INLINE bool uses_standard_vertex_arrays(void); - INLINE bool uses_custom_vertex_arrays(void); + bool uses_standard_vertex_arrays(void) override { return false; } + bool uses_custom_vertex_arrays(void) override { return true; } // Special values for location to indicate conventional attrib slots. enum ConventionalAttrib { @@ -95,10 +95,10 @@ public: register_type(_type_handle, CLASSPREFIX_QUOTED "CgShaderContext", ShaderContext::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE {init_type(); return get_class_type();} + virtual TypeHandle force_init_type() override {init_type(); return get_class_type();} private: static TypeHandle _type_handle; diff --git a/panda/src/glstuff/glShaderContext_src.I b/panda/src/glstuff/glShaderContext_src.I index 00b8460ba8..aa14237510 100644 --- a/panda/src/glstuff/glShaderContext_src.I +++ b/panda/src/glstuff/glShaderContext_src.I @@ -10,38 +10,3 @@ * @author jyelon * @date 2005-09-01 */ - -/** - * Returns true if the shader is "valid", ie, if the compilation was - * successful. The compilation could fail if there is a syntax error in the - * shader, or if the current video card isn't shader-capable, or if no shader - * languages are compiled into panda. - */ -INLINE bool CLP(ShaderContext):: -valid() { - if (_shader->get_error_flag()) return false; - if (_shader->get_language() != Shader::SL_GLSL) { - return false; - } - if (_glsl_program != 0) { - return true; - } - return false; -} - -/** - * Returns true if the shader may need to access standard vertex attributes as - * passed by glVertexPointer and the like. - */ -INLINE bool CLP(ShaderContext):: -uses_standard_vertex_arrays() { - return _uses_standard_vertex_arrays; -} - -/** - * Always true, for now. - */ -INLINE bool CLP(ShaderContext):: -uses_custom_vertex_arrays() { - return true; -} diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index d81d86bfff..1afa11d2b8 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -1821,6 +1821,20 @@ release_resources() { _glgsg->report_my_gl_errors(); } +/** + * Returns true if the shader is "valid", ie, if the compilation was + * successful. The compilation could fail if there is a syntax error in the + * shader, or if the current video card isn't shader-capable, or if no shader + * languages are compiled into panda. + */ +bool CLP(ShaderContext):: +valid() { + if (_shader->get_error_flag()) { + return false; + } + return (_glsl_program != 0); +} + /** * This function is to be called to enable a new shader. It also initializes * all of the shader's input parameters. @@ -2177,7 +2191,7 @@ update_slider_table(const SliderTable *table) { */ void CLP(ShaderContext):: disable_shader_vertex_arrays() { - if (!valid()) { + if (_glsl_program == 0) { return; } @@ -2200,7 +2214,7 @@ disable_shader_vertex_arrays() { */ bool CLP(ShaderContext):: update_shader_vertex_arrays(ShaderContext *prev, bool force) { - if (!valid()) { + if (_glsl_program == 0) { return true; } @@ -2373,7 +2387,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { */ void CLP(ShaderContext):: disable_shader_texture_bindings() { - if (!valid()) { + if (_glsl_program == 0) { return; } @@ -2473,7 +2487,7 @@ void CLP(ShaderContext):: update_shader_texture_bindings(ShaderContext *prev) { // if (prev) { prev->disable_shader_texture_bindings(); } - if (!valid()) { + if (_glsl_program == 0) { return; } diff --git a/panda/src/glstuff/glShaderContext_src.h b/panda/src/glstuff/glShaderContext_src.h index 97c9b5940c..9ecfe9ed39 100644 --- a/panda/src/glstuff/glShaderContext_src.h +++ b/panda/src/glstuff/glShaderContext_src.h @@ -40,26 +40,30 @@ public: void reflect_uniform(int i, char *name_buffer, GLsizei name_buflen); bool get_sampler_texture_type(int &out, GLenum param_type); - INLINE bool valid(void); - void bind() OVERRIDE; - void unbind() OVERRIDE; + bool valid(void) override; + void bind() override; + void unbind() override; void set_state_and_transform(const RenderState *state, const TransformState *modelview_transform, const TransformState *camera_transform, - const TransformState *projection_transform) OVERRIDE; + const TransformState *projection_transform) override; - void issue_parameters(int altered) OVERRIDE; + void issue_parameters(int altered) override; void update_transform_table(const TransformTable *table); void update_slider_table(const SliderTable *table); - void disable_shader_vertex_arrays() OVERRIDE; - bool update_shader_vertex_arrays(ShaderContext *prev, bool force) OVERRIDE; - void disable_shader_texture_bindings() OVERRIDE; - void update_shader_texture_bindings(ShaderContext *prev) OVERRIDE; - void update_shader_buffer_bindings(ShaderContext *prev) OVERRIDE; + void disable_shader_vertex_arrays() override; + bool update_shader_vertex_arrays(ShaderContext *prev, bool force) override; + void disable_shader_texture_bindings() override; + void update_shader_texture_bindings(ShaderContext *prev) override; + void update_shader_buffer_bindings(ShaderContext *prev) override; - INLINE bool uses_standard_vertex_arrays(void); - INLINE bool uses_custom_vertex_arrays(void); + bool uses_standard_vertex_arrays(void) override { + return _uses_standard_vertex_arrays; + } + bool uses_custom_vertex_arrays(void) override { + return true; + } private: bool _validated; @@ -128,10 +132,10 @@ public: register_type(_type_handle, CLASSPREFIX_QUOTED "ShaderContext", ShaderContext::get_class_type()); } - virtual TypeHandle get_type() const OVERRIDE { + virtual TypeHandle get_type() const override { return get_class_type(); } - virtual TypeHandle force_init_type() OVERRIDE {init_type(); return get_class_type();} + virtual TypeHandle force_init_type() override {init_type(); return get_class_type();} private: static TypeHandle _type_handle; From 69eab74b779879524b1adc09299a6a92d931050c Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 3 Jul 2017 13:22:59 +0200 Subject: [PATCH 139/254] makepanda: changes to support static building better Fixes LP 1081784 --- makepanda/makepanda.py | 21 +++++++++++++++++++-- makepanda/makepandacore.py | 11 +++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 4c06fc4706..b707623ed4 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -1515,7 +1515,9 @@ def CompileLib(lib, obj, opts): if HasTargetArch(): cmd += " /MACHINE:" + GetTargetArch().upper() cmd += ' /OUT:' + BracketNameWithQuotes(lib) - for x in obj: cmd += ' ' + BracketNameWithQuotes(x) + for x in obj: + if not x.endswith('.lib'): + cmd += ' ' + BracketNameWithQuotes(x) oscmd(cmd) else: # Choose Intel linker; from Jean-Claude @@ -1568,6 +1570,21 @@ def CompileLink(dll, obj, opts): cmd += " /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO " cmd += ' /OUT:' + BracketNameWithQuotes(dll) + if not PkgSkip("PYTHON"): + # If we're building without Python, don't pick it up implicitly. + if "PYTHON" not in opts: + pythonv = SDK["PYTHONVERSION"].replace('.', '') + if optlevel <= 2: + cmd += ' /NOD:{}d.lib'.format(pythonv) + else: + cmd += ' /NOD:{}.lib'.format(pythonv) + + # Yes, we know we are importing "locally defined symbols". + for x in obj: + if x.endswith('libp3pystub.lib'): + cmd += ' /ignore:4049,4217' + break + # Set the subsystem. Specify that we want to target Windows XP. subsystem = GetValueOption(opts, "SUBSYSTEM:") or "CONSOLE" cmd += " /SUBSYSTEM:" + subsystem @@ -2691,7 +2708,7 @@ if GetTarget() == 'windows': import os bindir = os.path.join(os.path.dirname(__file__), '..', 'bin') -if os.path.isfile(os.path.join(bindir, 'libpanda.dll')): +if os.path.isdir(bindir): if not os.environ.get('PATH'): os.environ['PATH'] = bindir else: diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 0999b5a42f..9f42b92580 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -3157,6 +3157,17 @@ def TargetAdd(target, dummy=0, opts=[], input=[], dep=[], ipath=None, winrc=None for d in CxxCalcDependencies(fullinput, ipath, []): t.deps[d] = 1 + # If we are linking statically, add the source DLL's dynamic dependencies. + if GetLinkAllStatic() and ORIG_EXT[fullinput] == '.lib' and fullinput in TARGET_TABLE: + tdep = TARGET_TABLE[fullinput] + for y in tdep.inputs: + if ORIG_EXT[y] == '.lib': + t.inputs.append(y) + + for opt, _ in LIBNAMES + LIBDIRECTORIES + FRAMEWORKDIRECTORIES: + if opt in tdep.opts and opt not in t.opts: + t.opts.append(opt) + if x.endswith(".in"): # Mark the _igate.cxx file as a dependency also. outbase = os.path.basename(x)[:-3] From 2b537d2263d312672fe4a380fb6f49bda641cd48 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 3 Jul 2017 22:27:37 +0200 Subject: [PATCH 140/254] Use XDG basedir spec for model-cache-dir (now $XDG_CACHE_HOME/panda3d which is usually $HOME/.cache/panda3d) User appdata directory on posix is now $XDG_DATA_HOME (usually $HOME/.local/share). Common appdata dir is /usr/share (or /usr/local/share on FreeBSD) --- dtool/src/dtoolutil/executionEnvironment.cxx | 16 ++++++++++++++++ dtool/src/dtoolutil/filename.cxx | 15 +++++++++++---- makepanda/config.in | 2 +- makepanda/makepanda.py | 4 ++-- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/dtool/src/dtoolutil/executionEnvironment.cxx b/dtool/src/dtoolutil/executionEnvironment.cxx index cf7ecac50e..ad782b521e 100644 --- a/dtool/src/dtoolutil/executionEnvironment.cxx +++ b/dtool/src/dtoolutil/executionEnvironment.cxx @@ -341,6 +341,22 @@ ns_get_environment_variable(const string &var) const { } } +#elif !defined(__APPLE__) + // Similarly, we define fallbacks on POSIX systems for the variables defined + // in the XDG Base Directory specification, so that they can be safely used + // in Config.prc files. + if (var == "XDG_CONFIG_HOME") { + Filename home_dir = Filename::get_home_directory(); + return home_dir.get_fullpath() + "/.config"; + + } else if (var == "XDG_CACHE_HOME") { + Filename home_dir = Filename::get_home_directory(); + return home_dir.get_fullpath() + "/.cache"; + + } else if (var == "XDG_DATA_HOME") { + Filename home_dir = Filename::get_home_directory(); + return home_dir.get_fullpath() + "/.local/share"; + } #endif // _WIN32 return string(); diff --git a/dtool/src/dtoolutil/filename.cxx b/dtool/src/dtoolutil/filename.cxx index 169f4bee05..c862c0aabf 100644 --- a/dtool/src/dtoolutil/filename.cxx +++ b/dtool/src/dtoolutil/filename.cxx @@ -600,8 +600,14 @@ get_user_appdata_directory() { user_appdata_directory.set_basename("files"); #else - // Posix case. - user_appdata_directory = get_home_directory(); + // Posix case. We follow the XDG base directory spec. + struct stat st; + const char *datadir = getenv("XDG_DATA_HOME"); + if (datadir != nullptr && stat(datadir, &st) == 0 && S_ISDIR(st.st_mode)) { + user_appdata_directory = datadir; + } else { + user_appdata_directory = Filename(get_home_directory(), ".local/share"); + } #endif // WIN32 @@ -649,9 +655,10 @@ get_common_appdata_directory() { common_appdata_directory.set_dirname(_internal_data_dir); common_appdata_directory.set_basename("files"); +#elif defined(__FreeBSD__) + common_appdata_directory = "/usr/local/share"; #else - // Posix case. - common_appdata_directory = "/var"; + common_appdata_directory = "/usr/share"; #endif // WIN32 if (common_appdata_directory.empty()) { diff --git a/makepanda/config.in b/makepanda/config.in index e61f73f04b..1317517339 100755 --- a/makepanda/config.in +++ b/makepanda/config.in @@ -89,7 +89,7 @@ hardware-animated-vertices #f # Enable the model-cache, but only for models, not textures. -model-cache-dir $HOME/.panda3d/cache +model-cache-dir $XDG_CACHE_HOME/panda3d model-cache-textures #f # This option specifies the default profiles for Cg shaders. diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index b707623ed4..b578340d33 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -2797,12 +2797,12 @@ else: configprc = ReadFile("makepanda/config.in") if (GetTarget() == 'windows'): - configprc = configprc.replace("$HOME/.panda3d", "$USER_APPDATA/Panda3D-%s" % MAJOR_VERSION) + configprc = configprc.replace("$XDG_CACHE_HOME/panda3d", "$USER_APPDATA/Panda3D-%s" % MAJOR_VERSION) else: configprc = configprc.replace("aux-display pandadx9", "") if (GetTarget() == 'darwin'): - configprc = configprc.replace(".panda3d/cache", "Library/Caches/Panda3D-%s" % MAJOR_VERSION) + configprc = configprc.replace("$XDG_CACHE_HOME/panda3d", "Library/Caches/Panda3D-%s" % MAJOR_VERSION) # OpenAL is not yet working well on OSX for us, so let's do this for now. configprc = configprc.replace("p3openal_audio", "p3fmod_audio") From 86cbdddd76017f196bd18eca6a89d2da9b33403d Mon Sep 17 00:00:00 2001 From: The Cheaterman Date: Thu, 13 Aug 2015 02:30:31 +0200 Subject: [PATCH 141/254] Fix float precision issues in bulletHeightfieldShape Closes: #152 --- panda/src/bullet/bulletHeightfieldShape.I | 8 ++++---- panda/src/bullet/bulletHeightfieldShape.cxx | 10 +++++----- panda/src/bullet/bulletHeightfieldShape.h | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/panda/src/bullet/bulletHeightfieldShape.I b/panda/src/bullet/bulletHeightfieldShape.I index 6607443110..5b0b36f0c2 100644 --- a/panda/src/bullet/bulletHeightfieldShape.I +++ b/panda/src/bullet/bulletHeightfieldShape.I @@ -30,8 +30,8 @@ BulletHeightfieldShape(const BulletHeightfieldShape ©) : _num_rows(copy._num_rows), _num_cols(copy._num_cols) { - _data = new float[_num_rows * _num_cols]; - memcpy(_data, copy._data, _num_rows * _num_cols * sizeof(float)); + _data = new btScalar[_num_rows * _num_cols]; + memcpy(_data, copy._data, _num_rows * _num_cols * sizeof(btScalar)); } /** @@ -44,6 +44,6 @@ operator = (const BulletHeightfieldShape ©) { _num_rows = copy._num_rows; _num_cols = copy._num_cols; - _data = new float[_num_rows * _num_cols]; - memcpy(_data, copy._data, _num_rows * _num_cols * sizeof(float)); + _data = new btScalar[_num_rows * _num_cols]; + memcpy(_data, copy._data, _num_rows * _num_cols * sizeof(btScalar)); } diff --git a/panda/src/bullet/bulletHeightfieldShape.cxx b/panda/src/bullet/bulletHeightfieldShape.cxx index f6843d199b..65be739dc1 100644 --- a/panda/src/bullet/bulletHeightfieldShape.cxx +++ b/panda/src/bullet/bulletHeightfieldShape.cxx @@ -26,7 +26,7 @@ BulletHeightfieldShape(const PNMImage &image, PN_stdfloat max_height, BulletUpAx _num_rows = image.get_x_size(); _num_cols = image.get_y_size(); - _data = new float[_num_rows * _num_cols]; + _data = new btScalar[_num_rows * _num_cols]; for (int row=0; row < _num_rows; row++) { for (int column=0; column < _num_cols; column++) { @@ -75,10 +75,10 @@ BulletHeightfieldShape(Texture *tex, PN_stdfloat max_height, BulletUpAxis up) { _num_rows = tex->get_x_size() + 1; _num_cols = tex->get_y_size() + 1; - _data = new float[_num_rows * _num_cols]; + _data = new btScalar[_num_rows * _num_cols]; - PN_stdfloat step_x = 1.0 / (PN_stdfloat)tex->get_x_size(); - PN_stdfloat step_y = 1.0 / (PN_stdfloat)tex->get_y_size(); + btScalar step_x = 1.0 / (btScalar)tex->get_x_size(); + btScalar step_y = 1.0 / (btScalar)tex->get_y_size(); PT(TexturePeeker) peeker = tex->peek(); LColor sample; @@ -100,4 +100,4 @@ BulletHeightfieldShape(Texture *tex, PN_stdfloat max_height, BulletUpAxis up) { up, true, false); _shape->setUserPointer(this); -} \ No newline at end of file +} diff --git a/panda/src/bullet/bulletHeightfieldShape.h b/panda/src/bullet/bulletHeightfieldShape.h index c8bf6f7730..0b85972564 100644 --- a/panda/src/bullet/bulletHeightfieldShape.h +++ b/panda/src/bullet/bulletHeightfieldShape.h @@ -44,7 +44,7 @@ public: private: int _num_rows; int _num_cols; - float *_data; + btScalar *_data; btHeightfieldTerrainShape *_shape; public: From e07e5d02033eeb4306db11633d7e814bbe9fe938 Mon Sep 17 00:00:00 2001 From: Younguk Kim Date: Wed, 5 Jul 2017 19:49:46 +0900 Subject: [PATCH 142/254] Fix assert macros that cause a crash in non-debug --- panda/src/pgraph/renderAttrib.cxx | 2 +- panda/src/pgraph/renderState.cxx | 2 +- panda/src/pgraph/transformState.cxx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/panda/src/pgraph/renderAttrib.cxx b/panda/src/pgraph/renderAttrib.cxx index 3b8c68ad0c..10db3de16d 100644 --- a/panda/src/pgraph/renderAttrib.cxx +++ b/panda/src/pgraph/renderAttrib.cxx @@ -514,7 +514,7 @@ release_new() { if (_saved_entry != -1) { _saved_entry = -1; - nassertv(_attribs->remove(this)); + nassertv_always(_attribs->remove(this)); } } diff --git a/panda/src/pgraph/renderState.cxx b/panda/src/pgraph/renderState.cxx index 8faef8676c..43a81bf83e 100644 --- a/panda/src/pgraph/renderState.cxx +++ b/panda/src/pgraph/renderState.cxx @@ -1690,7 +1690,7 @@ release_new() { if (_saved_entry != -1) { _saved_entry = -1; - nassertv(_states->remove(this)); + nassertv_always(_states->remove(this)); } } diff --git a/panda/src/pgraph/transformState.cxx b/panda/src/pgraph/transformState.cxx index ae0d99b794..3c28e358bf 100644 --- a/panda/src/pgraph/transformState.cxx +++ b/panda/src/pgraph/transformState.cxx @@ -1900,7 +1900,7 @@ release_new() { if (_saved_entry != -1) { _saved_entry = -1; - nassertv(_states->remove(this)); + nassertv_always(_states->remove(this)); } } From 32eb9b9e9f26d287b5a1749f2eb2d21a40f83003 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 5 Jul 2017 14:24:09 +0200 Subject: [PATCH 143/254] makepanda: fix missing Python link for PhysX --- makepanda/makepanda.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index b578340d33..5912388cda 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -4886,7 +4886,7 @@ if (PkgSkip("BULLET")==0 and not RUNTIME): # if (PkgSkip("PHYSX")==0): - OPTS=['DIR:panda/src/physx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC'] + OPTS=['DIR:panda/src/physx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC', 'PYTHON'] TargetAdd('p3physx_composite.obj', opts=OPTS, input='p3physx_composite.cxx') OPTS=['DIR:panda/src/physx', 'PHYSX', 'NOARCH:PPC', 'PYTHON'] @@ -4906,7 +4906,7 @@ if (PkgSkip("PHYSX")==0): TargetAdd('libpandaphysx.dll', input='pandaphysx_pandaphysx.obj') TargetAdd('libpandaphysx.dll', input='p3physx_composite.obj') TargetAdd('libpandaphysx.dll', input=COMMON_PANDA_LIBS) - TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC']) + TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC', 'PYTHON']) OPTS=['DIR:panda/metalibs/pandaphysx', 'PHYSX', 'NOARCH:PPC', 'PYTHON'] TargetAdd('physx_module.obj', input='libpandaphysx.in') From e45af355ccaa5767a8f2d144a690707460cbe279 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 9 Jul 2017 15:31:34 +0200 Subject: [PATCH 144/254] glgsg: fix multisample FBO regression (on Intel Windows driver) --- panda/src/glstuff/glGraphicsStateGuardian_src.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index d8b10292ec..305f7e3aab 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -2135,7 +2135,7 @@ reset() { _glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) get_extension_func("glGenerateMipmap"); _glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) - get_extension_func("glRenderbufferStorageMultisampleEXT"); + get_extension_func("glRenderbufferStorageMultisample"); _glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) get_extension_func("glBlitFramebuffer"); From a866f9fbcbf8e46b73e8f77c17da0a038bbd3480 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 9 Jul 2017 15:46:37 +0200 Subject: [PATCH 145/254] audio: fix case of get_speaker_setup/set_speaker_setup methods --- panda/src/audio/audioManager.cxx | 4 ++-- panda/src/audio/audioManager.h | 4 ++-- panda/src/audiotraits/fmodAudioManager.cxx | 4 ++-- panda/src/audiotraits/fmodAudioManager.h | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/panda/src/audio/audioManager.cxx b/panda/src/audio/audioManager.cxx index 8dd52a8786..c09bbffc05 100644 --- a/panda/src/audio/audioManager.cxx +++ b/panda/src/audio/audioManager.cxx @@ -170,7 +170,7 @@ get_null_sound() { * */ int AudioManager:: -getSpeakerSetup() { +get_speaker_setup() { // intentionally blank return 0; } @@ -179,7 +179,7 @@ getSpeakerSetup() { * */ void AudioManager:: -setSpeakerSetup(SpeakerModeCategory cat) { +set_speaker_setup(SpeakerModeCategory cat) { // intentionally blank } diff --git a/panda/src/audio/audioManager.h b/panda/src/audio/audioManager.h index 262593a1d5..4ab88cc96b 100644 --- a/panda/src/audio/audioManager.h +++ b/panda/src/audio/audioManager.h @@ -62,8 +62,8 @@ PUBLISHED: SM_stream, }; - virtual int getSpeakerSetup(); - virtual void setSpeakerSetup(SpeakerModeCategory cat); + virtual int get_speaker_setup(); + virtual void set_speaker_setup(SpeakerModeCategory cat); virtual bool configure_filters(FilterProperties *config); // Create an AudioManager for each category of sounds you have. E.g. diff --git a/panda/src/audiotraits/fmodAudioManager.cxx b/panda/src/audiotraits/fmodAudioManager.cxx index dc98e76287..6dec5648f9 100644 --- a/panda/src/audiotraits/fmodAudioManager.cxx +++ b/panda/src/audiotraits/fmodAudioManager.cxx @@ -447,7 +447,7 @@ get_sound(MovieAudio *source, bool positional, int) { * This is to query if you are using a MultiChannel Setup. */ int FmodAudioManager:: -getSpeakerSetup() { +get_speaker_setup() { ReMutexHolder holder(_lock); FMOD_RESULT result; FMOD_SPEAKERMODE speakerMode; @@ -502,7 +502,7 @@ getSpeakerSetup() { * init or re-init the AudioManagers after Panda is running. */ void FmodAudioManager:: -setSpeakerSetup(AudioManager::SpeakerModeCategory cat) { +set_speaker_setup(AudioManager::SpeakerModeCategory cat) { ReMutexHolder holder(_lock); FMOD_RESULT result; FMOD_SPEAKERMODE speakerModeType = (FMOD_SPEAKERMODE)cat; diff --git a/panda/src/audiotraits/fmodAudioManager.h b/panda/src/audiotraits/fmodAudioManager.h index 9a5a9f3759..2508d36b8a 100644 --- a/panda/src/audiotraits/fmodAudioManager.h +++ b/panda/src/audiotraits/fmodAudioManager.h @@ -91,8 +91,8 @@ public: virtual PT(AudioSound) get_sound(const string&, bool positional = false, int mode=SM_heuristic); virtual PT(AudioSound) get_sound(MovieAudio *, bool positional = false, int mode=SM_heuristic); - virtual int getSpeakerSetup(); - virtual void setSpeakerSetup(SpeakerModeCategory cat); + virtual int get_speaker_setup(); + virtual void set_speaker_setup(SpeakerModeCategory cat); virtual void set_volume(PN_stdfloat); virtual PN_stdfloat get_volume() const; From 84520ce21c9123273656e8854bdc20c3ac1afcc2 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 9 Jul 2017 19:53:23 +0200 Subject: [PATCH 146/254] display: prefer 24-bit depth buffer on Intel over 16-bit --- panda/src/display/frameBufferProperties.cxx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/panda/src/display/frameBufferProperties.cxx b/panda/src/display/frameBufferProperties.cxx index 98b8341322..cd6177f42c 100644 --- a/panda/src/display/frameBufferProperties.cxx +++ b/panda/src/display/frameBufferProperties.cxx @@ -581,9 +581,13 @@ get_quality(const FrameBufferProperties &reqs) const { } } - // Bonus for each depth bit. Extra: 2 per bit. + // Bonus for each depth bit. Extra: 8 per bit. + // Please note that the Intel Windows driver only gives extra depth in + // combination with a stencil buffer, so we need 8 extra depth bits to + // outweigh the penalty of 50 for the unwanted stencil buffer, otherwise we + // will end up only getting 16-bit depth. if (reqs._property[FBP_depth_bits] != 0) { - quality += 2 * _property[FBP_depth_bits]; + quality += 8 * _property[FBP_depth_bits]; } // Bonus for each multisample. Extra: 2 per sample. From 1fd8af5acde06e2c3ba54bd8dfa624387c37fd59 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 9 Jul 2017 19:55:29 +0200 Subject: [PATCH 147/254] express: add C++11 methods to ordered_vector --- panda/src/express/ordered_vector.I | 98 ++++++++++++++++++++++++++++++ panda/src/express/ordered_vector.h | 12 ++++ 2 files changed, 110 insertions(+) diff --git a/panda/src/express/ordered_vector.I b/panda/src/express/ordered_vector.I index 24a74c6a45..287998b85c 100644 --- a/panda/src/express/ordered_vector.I +++ b/panda/src/express/ordered_vector.I @@ -109,6 +109,44 @@ rend() const { return _vector.rend(); } +/** + * Returns the iterator that marks the first element in the ordered vector. + */ +template +INLINE TYPENAME ordered_vector::CONST_ITERATOR ordered_vector:: +cbegin() const { + return _vector.begin(); +} + +/** + * Returns the iterator that marks the end of the ordered vector. + */ +template +INLINE TYPENAME ordered_vector::CONST_ITERATOR ordered_vector:: +cend() const { + return _vector.end(); +} + +/** + * Returns the iterator that marks the first element in the ordered vector, + * when viewed in reverse order. + */ +template +INLINE TYPENAME ordered_vector::CONST_REVERSE_ITERATOR ordered_vector:: +crbegin() const { + return _vector.rbegin(); +} + +/** + * Returns the iterator that marks the end of the ordered vector, when viewed + * in reverse order. + */ +template +INLINE TYPENAME ordered_vector::CONST_REVERSE_ITERATOR ordered_vector:: +crend() const { + return _vector.rend(); +} + /** * Returns the nth element. */ @@ -127,6 +165,54 @@ operator [] (TYPENAME ordered_vector::SIZE_TYPE n) const { return _vector[n]; } +/** + * Returns a reference to the first element. + */ +template +INLINE TYPENAME ordered_vector::REFERENCE ordered_vector:: +front() { +#ifdef _DEBUG + assert(!_vector.empty()); +#endif + return _vector[0]; +} + +/** + * Returns a const reference to the first element. + */ +template +INLINE TYPENAME ordered_vector::CONST_REFERENCE ordered_vector:: +front() const { +#ifdef _DEBUG + assert(!_vector.empty()); +#endif + return _vector[0]; +} + +/** + * Returns a reference to the first element. + */ +template +INLINE TYPENAME ordered_vector::REFERENCE ordered_vector:: +back() { +#ifdef _DEBUG + assert(!_vector.empty()); +#endif + return _vector[_vector.size() - 1]; +} + +/** + * Returns a const reference to the last element. + */ +template +INLINE TYPENAME ordered_vector::CONST_REFERENCE ordered_vector:: +back() const { +#ifdef _DEBUG + assert(!_vector.empty()); +#endif + return _vector[_vector.size() - 1]; +} + /** * Returns the number of elements in the ordered vector. */ @@ -530,6 +616,18 @@ push_back(const value_type &key) { _vector.push_back(key); } +/** + * Adds the new element to the end of the vector without regard for proper + * sorting. This is a bad idea to do except to populate the vector the first + * time; be sure to call sort() after you have added all the elements. + */ +template +INLINE void ordered_vector:: +push_back(value_type &&key) { + TAU_PROFILE("ordered_vector::push_back()", " ", TAU_USER); + _vector.push_back(move(key)); +} + /** * Removes the last element at the end of the vector. */ diff --git a/panda/src/express/ordered_vector.h b/panda/src/express/ordered_vector.h index 7eacfc375e..e9e3a03693 100644 --- a/panda/src/express/ordered_vector.h +++ b/panda/src/express/ordered_vector.h @@ -147,10 +147,21 @@ public: INLINE CONST_REVERSE_ITERATOR rbegin() const; INLINE CONST_REVERSE_ITERATOR rend() const; + INLINE CONST_ITERATOR cbegin() const; + INLINE CONST_ITERATOR cend() const; + INLINE CONST_REVERSE_ITERATOR crbegin() const; + INLINE CONST_REVERSE_ITERATOR crend() const; + // Random access. INLINE reference operator [] (SIZE_TYPE n); INLINE const_reference operator [] (SIZE_TYPE n) const; + INLINE reference front(); + INLINE const_reference front() const; + + INLINE reference back(); + INLINE const_reference back() const; + // Size information. INLINE SIZE_TYPE size() const; INLINE SIZE_TYPE max_size() const; @@ -201,6 +212,7 @@ public: bool verify_list_nonunique() const; INLINE void push_back(const VALUE_TYPE &key); + INLINE void push_back(VALUE_TYPE &&key); INLINE void pop_back(); INLINE void resize(SIZE_TYPE n); INLINE void resize(SIZE_TYPE n, const VALUE_TYPE &value); From 9a40febdb9ce40a0936d164a2ed3d72ddf7dcc8a Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 9 Jul 2017 20:33:45 +0200 Subject: [PATCH 148/254] shadows: fix light buffer not being destructed after light removal Fixes LP 1672089 --- panda/src/pgraph/light.cxx | 14 +++++ panda/src/pgraph/light.h | 3 + panda/src/pgraph/lightAttrib.I | 13 ----- panda/src/pgraph/lightAttrib.cxx | 74 ++++++++++++++++++++++--- panda/src/pgraph/lightAttrib.h | 3 +- panda/src/pgraphnodes/lightLensNode.cxx | 32 ++++++++++- panda/src/pgraphnodes/lightLensNode.h | 8 +++ 7 files changed, 124 insertions(+), 23 deletions(-) diff --git a/panda/src/pgraph/light.cxx b/panda/src/pgraph/light.cxx index b159450142..82b53f5757 100644 --- a/panda/src/pgraph/light.cxx +++ b/panda/src/pgraph/light.cxx @@ -157,6 +157,20 @@ get_attenuation() const { return no_atten; } +/** + * This is called when the light is added to a LightAttrib. + */ +void Light:: +attrib_ref() { +} + +/** + * This is called when the light is removed from a LightAttrib. + */ +void Light:: +attrib_unref() { +} + /** * Computes the vector from a particular vertex to this light. The exact * vector depends on the type of light (e.g. point lights return a different diff --git a/panda/src/pgraph/light.h b/panda/src/pgraph/light.h index eeca3409bd..ee6e906356 100644 --- a/panda/src/pgraph/light.h +++ b/panda/src/pgraph/light.h @@ -64,6 +64,9 @@ PUBLISHED: MAKE_PROPERTY(priority, get_priority, set_priority); public: + virtual void attrib_ref(); + virtual void attrib_unref(); + virtual void output(ostream &out) const=0; virtual void write(ostream &out, int indent_level) const=0; virtual void bind(GraphicsStateGuardianBase *gsg, const NodePath &light, diff --git a/panda/src/pgraph/lightAttrib.I b/panda/src/pgraph/lightAttrib.I index e876055642..0c6686181b 100644 --- a/panda/src/pgraph/lightAttrib.I +++ b/panda/src/pgraph/lightAttrib.I @@ -18,19 +18,6 @@ INLINE LightAttrib:: LightAttrib() : _off_all_lights(false), _num_non_ambient_lights(0) { } -/** - * Use LightAttrib::make() to construct a new LightAttrib object. The copy - * constructor is only defined to facilitate methods like add_on_light(). - */ -INLINE LightAttrib:: -LightAttrib(const LightAttrib ©) : - _on_lights(copy._on_lights), - _off_lights(copy._off_lights), - _off_all_lights(copy._off_all_lights), - _sort_seq(UpdateSeq::old()) -{ -} - /** * Returns the number of lights that are turned on by the attribute. */ diff --git a/panda/src/pgraph/lightAttrib.cxx b/panda/src/pgraph/lightAttrib.cxx index 8bb66bcec2..2fb58c106d 100644 --- a/panda/src/pgraph/lightAttrib.cxx +++ b/panda/src/pgraph/lightAttrib.cxx @@ -47,6 +47,44 @@ public: } }; +/** + * Use LightAttrib::make() to construct a new LightAttrib object. The copy + * constructor is only defined to facilitate methods like add_on_light(). + */ +LightAttrib:: +LightAttrib(const LightAttrib ©) : + _on_lights(copy._on_lights), + _off_lights(copy._off_lights), + _off_all_lights(copy._off_all_lights), + _sort_seq(UpdateSeq::old()) +{ + // Increase the attrib_ref of all the lights in this attribute. + Lights::const_iterator it; + for (it = _on_lights.begin(); it != _on_lights.end(); ++it) { + Light *lobj = (*it).node()->as_light(); + nassertd(lobj != nullptr) continue; + lobj->attrib_ref(); + } +} + +/** + * Destructor. + */ +LightAttrib:: +~LightAttrib() { + // Call attrib_unref() on all on lights. + Lights::const_iterator it; + for (it = _on_lights.begin(); it != _on_lights.end(); ++it) { + const NodePath &np = *it; + if (!np.is_empty()) { + Light *lobj = np.node()->as_light(); + if (lobj != nullptr) { + lobj->attrib_unref(); + } + } + } +} + /** * Constructs a new LightAttrib object that turns on (or off, according to op) * the indicated light(s). @@ -376,14 +414,17 @@ make_all_off() { */ CPT(RenderAttrib) LightAttrib:: add_on_light(const NodePath &light) const { - nassertr(!light.is_empty() && light.node()->as_light() != (Light *)NULL, this); + nassertr(!light.is_empty(), this); + Light *lobj = light.node()->as_light(); + nassertr(lobj != nullptr, this); + LightAttrib *attrib = new LightAttrib(*this); - attrib->_on_lights.insert(light); - attrib->_off_lights.erase(light); pair insert_result = attrib->_on_lights.insert(Lights::value_type(light)); if (insert_result.second) { + lobj->attrib_ref(); + // Also ensure it is removed from the off_lights list. attrib->_off_lights.erase(light); } @@ -397,9 +438,14 @@ add_on_light(const NodePath &light) const { */ CPT(RenderAttrib) LightAttrib:: remove_on_light(const NodePath &light) const { - nassertr(!light.is_empty() && light.node()->as_light() != (Light *)NULL, this); + nassertr(!light.is_empty(), this); + Light *lobj = light.node()->as_light(); + nassertr(lobj != nullptr, this); + LightAttrib *attrib = new LightAttrib(*this); - attrib->_on_lights.erase(light); + if (attrib->_on_lights.erase(light)) { + lobj->attrib_unref(); + } return return_new(attrib); } @@ -409,12 +455,17 @@ remove_on_light(const NodePath &light) const { */ CPT(RenderAttrib) LightAttrib:: add_off_light(const NodePath &light) const { - nassertr(!light.is_empty() && light.node()->as_light() != (Light *)NULL, this); + nassertr(!light.is_empty(), this); + Light *lobj = light.node()->as_light(); + nassertr(lobj != nullptr, this); + LightAttrib *attrib = new LightAttrib(*this); if (!_off_all_lights) { attrib->_off_lights.insert(light); } - attrib->_on_lights.erase(light); + if (attrib->_on_lights.erase(light)) { + lobj->attrib_unref(); + } return return_new(attrib); } @@ -960,6 +1011,10 @@ finalize(BamReader *manager) { // If it's in the registry, replace it. _on_lights[i] = areg->get_node(n); } + + Light *lobj = _on_lights[i].node()->as_light(); + nassertd(lobj != nullptr) continue; + lobj->attrib_ref(); } } else { @@ -992,10 +1047,15 @@ finalize(BamReader *manager) { if (n != -1) { // If it's in the registry, add that NodePath. _on_lights.push_back(areg->get_node(n)); + node = _on_lights.back().node(); } else { // Otherwise, add any arbitrary NodePath. Complain if it's ambiguous. _on_lights.push_back(NodePath(node)); } + + Light *lobj = node->as_light(); + nassertd(lobj != nullptr) continue; + lobj->attrib_ref(); } } diff --git a/panda/src/pgraph/lightAttrib.h b/panda/src/pgraph/lightAttrib.h index 1158531bc0..eaa86ff895 100644 --- a/panda/src/pgraph/lightAttrib.h +++ b/panda/src/pgraph/lightAttrib.h @@ -30,9 +30,10 @@ class EXPCL_PANDA_PGRAPH LightAttrib : public RenderAttrib { protected: INLINE LightAttrib(); - INLINE LightAttrib(const LightAttrib ©); + LightAttrib(const LightAttrib ©); PUBLISHED: + virtual ~LightAttrib(); // This is the old, deprecated interface to LightAttrib. Do not use any of // these methods for new code; these methods will be removed soon. diff --git a/panda/src/pgraphnodes/lightLensNode.cxx b/panda/src/pgraphnodes/lightLensNode.cxx index bc3e134116..a843123cff 100644 --- a/panda/src/pgraphnodes/lightLensNode.cxx +++ b/panda/src/pgraphnodes/lightLensNode.cxx @@ -27,7 +27,8 @@ TypeHandle LightLensNode::_type_handle; */ LightLensNode:: LightLensNode(const string &name, Lens *lens) : - Camera(name, lens) + Camera(name, lens), + _attrib_count(0) { set_active(false); _shadow_caster = false; @@ -46,6 +47,10 @@ LightLensNode:: ~LightLensNode() { set_active(false); clear_shadow_buffers(); + + // If this triggers, the number of attrib_ref() didn't match the number of + // attrib_unref() calls, probably indicating a bug in LightAttrib. + nassertv(AtomicAdjust::get(_attrib_count) == 0); } /** @@ -57,7 +62,8 @@ LightLensNode(const LightLensNode ©) : Camera(copy), _shadow_caster(copy._shadow_caster), _sb_size(copy._sb_size), - _sb_sort(-10) + _sb_sort(-10), + _attrib_count(0) { } @@ -81,6 +87,28 @@ clear_shadow_buffers() { _sbuffers.clear(); } + +/** + * This is called when the light is added to a LightAttrib. + */ +void LightLensNode:: +attrib_ref() { + AtomicAdjust::inc(_attrib_count); +} + +/** + * This is called when the light is removed from a LightAttrib. + */ +void LightLensNode:: +attrib_unref() { + // When it is removed from the last LightAttrib, destroy the shadow buffers. + // This is necessary to break the circular reference that the buffer holds + // on this node, via the display region's camera. + if (!AtomicAdjust::dec(_attrib_count)) { + clear_shadow_buffers(); + } +} + /** * Returns the Light object upcast to a PandaNode. */ diff --git a/panda/src/pgraphnodes/lightLensNode.h b/panda/src/pgraphnodes/lightLensNode.h index 0c4b329b16..11c259e5e5 100644 --- a/panda/src/pgraphnodes/lightLensNode.h +++ b/panda/src/pgraphnodes/lightLensNode.h @@ -20,6 +20,7 @@ #include "camera.h" #include "graphicsStateGuardianBase.h" #include "graphicsOutputBase.h" +#include "atomicAdjust.h" class ShaderGenerator; class GraphicsStateGuardian; @@ -59,7 +60,14 @@ protected: typedef pmap ShadowBuffers; ShadowBuffers _sbuffers; + // This counts how many LightAttribs in the world are referencing this + // LightLensNode object. + AtomicAdjust::Integer _attrib_count; + public: + virtual void attrib_ref(); + virtual void attrib_unref(); + virtual PandaNode *as_node(); virtual Light *as_light(); From 7228bc7e5fc846e575786c10cd8af6f09227bda4 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 10 Jul 2017 01:51:12 +0200 Subject: [PATCH 149/254] Fix NATIVE_WORDSIZE on 64-bit Windows (fixes memory alignment) --- dtool/src/dtoolbase/dtoolbase.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index ae74fd644f..a3cb5f0614 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -332,7 +332,7 @@ typedef struct _object PyObject; #ifdef __WORDSIZE #define NATIVE_WORDSIZE __WORDSIZE -#elif defined(_LP64) +#elif defined(_LP64) || defined(_WIN64) #define NATIVE_WORDSIZE 64 #else #define NATIVE_WORDSIZE 32 From 2e5051ac04b07e5f8618dfc186bb9d6c951e5088 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 10 Jul 2017 01:54:37 +0200 Subject: [PATCH 150/254] bullet: fix crash when adding non-indexed GeomTriangles to trimesh --- panda/src/bullet/bulletTriangleMesh.cxx | 38 ++++++++++++++++++++----- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/panda/src/bullet/bulletTriangleMesh.cxx b/panda/src/bullet/bulletTriangleMesh.cxx index 7dd5d00c69..8a74e61ff5 100644 --- a/panda/src/bullet/bulletTriangleMesh.cxx +++ b/panda/src/bullet/bulletTriangleMesh.cxx @@ -53,6 +53,10 @@ void BulletTriangleMesh:: preallocate(int num_verts, int num_indices) { _vertices.reserve(num_verts); _indices.reserve(num_indices); + + btIndexedMesh &mesh = _mesh.getIndexedMeshArray()[0]; + mesh.m_vertexBase = (unsigned char*)&_vertices[0]; + mesh.m_triangleIndexBase = (unsigned char *)&_indices[0]; } /** @@ -160,12 +164,22 @@ add_geom(const Geom *geom, bool remove_duplicate_vertices, const TransformState _indices.reserve(_indices.size() + num_vertices); mesh.m_numTriangles += num_vertices / 3; - GeomVertexReader index(prim->get_vertices(), 0); - while (!index.is_at_end()) { - _indices.push_back(index_offset + index.get_data1i()); + CPT(GeomVertexArrayData) vertices = prim->get_vertices(); + if (vertices != nullptr) { + GeomVertexReader index(move(vertices), 0); + while (!index.is_at_end()) { + _indices.push_back(index_offset + index.get_data1i()); + } + } else { + int index = index_offset + prim->get_first_vertex(); + int end_index = index + num_vertices; + while (index < end_index) { + _indices.push_back(index++); + } } } } + nassertv(mesh.m_numTriangles * 3 == _indices.size()); } else { // Collect points @@ -193,12 +207,22 @@ add_geom(const Geom *geom, bool remove_duplicate_vertices, const TransformState _indices.reserve(_indices.size() + num_vertices); mesh.m_numTriangles += num_vertices / 3; - GeomVertexReader index(prim->get_vertices(), 0); - while (!index.is_at_end()) { - _indices.push_back(find_or_add_vertex(points[index.get_data1i()])); + CPT(GeomVertexArrayData) vertices = prim->get_vertices(); + if (vertices != nullptr) { + GeomVertexReader index(move(vertices), 0); + while (!index.is_at_end()) { + _indices.push_back(find_or_add_vertex(points[index.get_data1i()])); + } + } else { + int index = prim->get_first_vertex(); + int end_index = index + num_vertices; + while (index < end_index) { + _indices.push_back(find_or_add_vertex(points[index])); + } } } } + nassertv(mesh.m_numTriangles * 3 == _indices.size()); } // Reset the pointers, since the vectors may have been reallocated. @@ -282,7 +306,7 @@ unsigned int BulletTriangleMesh:: find_or_add_vertex(const LVecBase3 &p) { btVector3 vertex = LVecBase3_to_btVector3(p); - for (unsigned int i = 0; i < _vertices.size(); ++i) { + for (int i = 0; i < _vertices.size(); ++i) { if ((_vertices[i] - vertex).length2() <= _welding_distance) { return i; } From 5fffbbce47c79992f74bbb11e22085fe124f61a7 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 10 Jul 2017 14:21:40 +0200 Subject: [PATCH 151/254] express: error if Windows-style path is used (LP 1429241) --- panda/src/express/virtualFileSystem.cxx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/panda/src/express/virtualFileSystem.cxx b/panda/src/express/virtualFileSystem.cxx index c331dd1055..da7797ec9d 100644 --- a/panda/src/express/virtualFileSystem.cxx +++ b/panda/src/express/virtualFileSystem.cxx @@ -1226,6 +1226,24 @@ do_get_file(const Filename &filename, int open_flags) const { } } +#if defined(_WIN32) && !defined(NDEBUG) + if (!found_file) { + // The file could not be found. Perhaps this is because the user passed + // in a Windows-style path where a Unix-style path was expected? + if (filename.length() > 2 && isalpha(filename[0]) && filename[1] == ':' && + (filename[2] == '\\' || filename[2] == '/')) { + + Filename corrected_fn = Filename::from_os_specific(filename); + if (corrected_fn.exists()) { + express_cat.warning() + << "Filename uses Windows-style path: " << filename << "\n"; + express_cat.warning() + << " expected Unix-style path: " << corrected_fn << "\n"; + } + } + } +#endif + return found_file; } From 925ce854d010ca2f872ad0788a22b9663ac91b53 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 10 Jul 2017 19:50:09 +0200 Subject: [PATCH 152/254] general: make DO_MEMORY_USAGE setting not change ABI compatibility --- dtool/src/dtoolbase/memoryHook.cxx | 25 +-- dtool/src/dtoolbase/memoryHook.h | 4 +- dtool/src/dtoolbase/typeRegistryNode.cxx | 2 - dtool/src/dtoolbase/typeRegistryNode.h | 2 - panda/src/express/memoryInfo.h | 3 + panda/src/express/memoryUsage.I | 104 +++++++++- panda/src/express/memoryUsage.cxx | 180 +++++++++++++++--- panda/src/express/memoryUsage.h | 22 ++- .../src/express/memoryUsagePointerCounts.cxx | 11 +- panda/src/express/memoryUsagePointerCounts.h | 4 - panda/src/express/memoryUsagePointers.cxx | 44 +++-- panda/src/express/memoryUsagePointers.h | 7 +- panda/src/express/pointerToBase.I | 5 +- panda/src/express/pointerToBase.h | 2 - panda/src/express/threadSafePointerToBase.I | 5 +- panda/src/express/threadSafePointerToBase.h | 2 - panda/src/gobj/internalName.h | 2 - panda/src/mathutil/geometricBoundingVolume.h | 2 - panda/src/pgraph/cullPlanes.h | 2 - panda/src/pgraph/cullableObject.I | 6 +- panda/src/pgraph/cullableObject.h | 13 +- panda/src/pgraph/nodePathComponent.h | 2 - panda/src/pgraph/pandaNode.h | 2 - panda/src/pgraph/renderState.h | 2 - panda/src/pgraph/transformState.h | 2 - panda/src/putil/copyOnWriteObject.h | 2 - panda/src/putil/typedWritableReferenceCount.h | 3 +- 27 files changed, 333 insertions(+), 127 deletions(-) diff --git a/dtool/src/dtoolbase/memoryHook.cxx b/dtool/src/dtoolbase/memoryHook.cxx index 224fd3107b..efc2fc4392 100644 --- a/dtool/src/dtoolbase/memoryHook.cxx +++ b/dtool/src/dtoolbase/memoryHook.cxx @@ -202,13 +202,11 @@ MemoryHook() { #endif // WIN32 -#ifdef DO_MEMORY_USAGE _total_heap_single_size = 0; _total_heap_array_size = 0; _requested_heap_size = 0; _total_mmap_size = 0; _max_heap_size = ~(size_t)0; -#endif } /** @@ -216,19 +214,16 @@ MemoryHook() { */ MemoryHook:: MemoryHook(const MemoryHook ©) : - _page_size(copy._page_size) -{ -#ifdef DO_MEMORY_USAGE - _total_heap_single_size = copy._total_heap_single_size; - _total_heap_array_size = copy._total_heap_array_size; - _requested_heap_size = copy._requested_heap_size; - _total_mmap_size = copy._total_mmap_size; - _max_heap_size = copy._max_heap_size; -#endif + _page_size(copy._page_size), + _total_heap_single_size(copy._total_heap_single_size), + _total_heap_array_size(copy._total_heap_array_size), + _requested_heap_size(copy._requested_heap_size), + _total_mmap_size(copy._total_mmap_size), + _max_heap_size(copy._max_heap_size) { - ((MutexImpl &)copy._lock).acquire(); + copy._lock.acquire(); _deleted_chains = copy._deleted_chains; - ((MutexImpl &)copy._lock).release(); + copy._lock.release(); } /** @@ -631,7 +626,6 @@ alloc_fail(size_t attempted_size) { abort(); } -#ifdef DO_MEMORY_USAGE /** * This callback method is called whenever the total allocated heap size * exceeds _max_heap_size. It's mainly intended for reporting memory leaks, @@ -642,6 +636,7 @@ alloc_fail(size_t attempted_size) { */ void MemoryHook:: overflow_heap_size() { +#ifdef DO_MEMORY_USAGE _max_heap_size = ~(size_t)0; -} #endif // DO_MEMORY_USAGE +} diff --git a/dtool/src/dtoolbase/memoryHook.h b/dtool/src/dtoolbase/memoryHook.h index 687e348aef..18ce70c0bb 100644 --- a/dtool/src/dtoolbase/memoryHook.h +++ b/dtool/src/dtoolbase/memoryHook.h @@ -67,7 +67,6 @@ public: INLINE static size_t get_ptr_size(void *ptr); -#ifdef DO_MEMORY_USAGE protected: TVOLATILE AtomicAdjust::Integer _total_heap_single_size; TVOLATILE AtomicAdjust::Integer _total_heap_array_size; @@ -79,7 +78,6 @@ protected: size_t _max_heap_size; virtual void overflow_heap_size(); -#endif // DO_MEMORY_USAGE private: size_t _page_size; @@ -87,7 +85,7 @@ private: typedef map DeletedChains; DeletedChains _deleted_chains; - MutexImpl _lock; + mutable MutexImpl _lock; }; #include "memoryHook.I" diff --git a/dtool/src/dtoolbase/typeRegistryNode.cxx b/dtool/src/dtoolbase/typeRegistryNode.cxx index cdc45d7beb..a88533a769 100644 --- a/dtool/src/dtoolbase/typeRegistryNode.cxx +++ b/dtool/src/dtoolbase/typeRegistryNode.cxx @@ -26,9 +26,7 @@ TypeRegistryNode(TypeHandle handle, const string &name, TypeHandle &ref) : _handle(handle), _name(name), _ref(ref) { clear_subtree(); -#ifdef DO_MEMORY_USAGE memset(_memory_usage, 0, sizeof(_memory_usage)); -#endif } /** diff --git a/dtool/src/dtoolbase/typeRegistryNode.h b/dtool/src/dtoolbase/typeRegistryNode.h index 7eb64f8a65..46e4b9f5a1 100644 --- a/dtool/src/dtoolbase/typeRegistryNode.h +++ b/dtool/src/dtoolbase/typeRegistryNode.h @@ -47,9 +47,7 @@ public: Classes _parent_classes; Classes _child_classes; -#ifdef DO_MEMORY_USAGE AtomicAdjust::Integer _memory_usage[TypeHandle::MC_limit]; -#endif static bool _paranoid_inheritance; diff --git a/panda/src/express/memoryInfo.h b/panda/src/express/memoryInfo.h index 238cec05e3..c65b890887 100644 --- a/panda/src/express/memoryInfo.h +++ b/panda/src/express/memoryInfo.h @@ -75,6 +75,9 @@ private: #include "memoryInfo.I" +#else +class MemoryInfo; + #endif // DO_MEMORY_USAGE #endif diff --git a/panda/src/express/memoryUsage.I b/panda/src/express/memoryUsage.I index f9de4f8c93..a4c2447189 100644 --- a/panda/src/express/memoryUsage.I +++ b/panda/src/express/memoryUsage.I @@ -16,9 +16,13 @@ * to true, indicating that this class will be in effect. If this returns * false, the user has indicated not to do any of this. */ -INLINE bool MemoryUsage:: +ALWAYS_INLINE bool MemoryUsage:: get_track_memory_usage() { +#ifdef DO_MEMORY_USAGE return get_global_ptr()->_track_memory_usage; +#else + return false; +#endif } /** @@ -26,7 +30,19 @@ get_track_memory_usage() { */ INLINE void MemoryUsage:: record_pointer(ReferenceCount *ptr) { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_record_pointer(ptr); +#endif +} + +/** + * Indicates that the given pointer has been recently allocated. + */ +INLINE void MemoryUsage:: +record_pointer(void *ptr, TypeHandle type) { +#ifdef DO_MEMORY_USAGE + get_global_ptr()->ns_record_pointer(ptr, type); +#endif } /** @@ -37,7 +53,9 @@ record_pointer(ReferenceCount *ptr) { */ INLINE void MemoryUsage:: update_type(ReferenceCount *ptr, TypeHandle type) { - get_global_ptr()->ns_update_type(ptr, type); +#ifdef DO_MEMORY_USAGE + get_global_ptr()->ns_update_type((void *)ptr, type); +#endif } /** @@ -48,7 +66,21 @@ update_type(ReferenceCount *ptr, TypeHandle type) { */ INLINE void MemoryUsage:: update_type(ReferenceCount *ptr, TypedObject *typed_ptr) { - get_global_ptr()->ns_update_type(ptr, typed_ptr); +#ifdef DO_MEMORY_USAGE + get_global_ptr()->ns_update_type((void *)ptr, typed_ptr); +#endif +} + +/** + * Associates the indicated type with the given pointer. This should be + * called by functions (e.g. the constructor) that know more specifically + * what type of thing we've got. + */ +INLINE void MemoryUsage:: +update_type(void *ptr, TypeHandle type) { +#ifdef DO_MEMORY_USAGE + get_global_ptr()->ns_update_type(ptr, type); +#endif } /** @@ -56,7 +88,9 @@ update_type(ReferenceCount *ptr, TypedObject *typed_ptr) { */ INLINE void MemoryUsage:: remove_pointer(ReferenceCount *ptr) { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_remove_pointer(ptr); +#endif } /** @@ -65,7 +99,11 @@ remove_pointer(ReferenceCount *ptr) { */ INLINE bool MemoryUsage:: is_tracking() { +#ifdef DO_MEMORY_USAGE return get_global_ptr()->_track_memory_usage; +#else + return false; +#endif } /** @@ -75,7 +113,11 @@ is_tracking() { */ INLINE bool MemoryUsage:: is_counting() { +#ifdef DO_MEMORY_USAGE return get_global_ptr()->_count_memory_usage; +#else + return false; +#endif } /** @@ -84,7 +126,11 @@ is_counting() { */ INLINE size_t MemoryUsage:: get_current_cpp_size() { +#ifdef DO_MEMORY_USAGE return get_global_ptr()->_current_cpp_size; +#else + return 0; +#endif } /** @@ -93,7 +139,11 @@ get_current_cpp_size() { */ INLINE size_t MemoryUsage:: get_total_cpp_size() { +#ifdef DO_MEMORY_USAGE return get_global_ptr()->_total_cpp_size; +#else + return 0; +#endif } /** @@ -102,7 +152,11 @@ get_total_cpp_size() { */ INLINE size_t MemoryUsage:: get_panda_heap_single_size() { +#ifdef DO_MEMORY_USAGE return (size_t)AtomicAdjust::get(get_global_ptr()->_total_heap_single_size); +#else + return 0; +#endif } /** @@ -111,7 +165,11 @@ get_panda_heap_single_size() { */ INLINE size_t MemoryUsage:: get_panda_heap_array_size() { +#ifdef DO_MEMORY_USAGE return (size_t)AtomicAdjust::get(get_global_ptr()->_total_heap_array_size); +#else + return 0; +#endif } /** @@ -121,7 +179,7 @@ get_panda_heap_array_size() { */ INLINE size_t MemoryUsage:: get_panda_heap_overhead() { -#if defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2) +#if defined(DO_MEMORY_USAGE) && (defined(USE_MEMORY_DLMALLOC) || defined(USE_MEMORY_PTMALLOC2)) MemoryUsage *mu = get_global_ptr(); return (size_t)(AtomicAdjust::get(mu->_requested_heap_size) - AtomicAdjust::get(mu->_total_heap_single_size) - AtomicAdjust::get(mu->_total_heap_array_size)); #else @@ -135,7 +193,11 @@ get_panda_heap_overhead() { */ INLINE size_t MemoryUsage:: get_panda_mmap_size() { +#ifdef DO_MEMORY_USAGE return (size_t)AtomicAdjust::get(get_global_ptr()->_total_mmap_size); +#else + return 0; +#endif } /** @@ -152,6 +214,7 @@ get_panda_mmap_size() { */ INLINE size_t MemoryUsage:: get_external_size() { +#ifdef DO_MEMORY_USAGE MemoryUsage *mu = get_global_ptr(); if (mu->_count_memory_usage) { // We can only possibly know this with memory counting, which tracks every @@ -169,6 +232,9 @@ get_external_size() { } else { return 0; } +#else + return 0; +#endif } /** @@ -177,6 +243,7 @@ get_external_size() { */ INLINE size_t MemoryUsage:: get_total_size() { +#ifdef DO_MEMORY_USAGE MemoryUsage *mu = get_global_ptr(); if (mu->_count_memory_usage) { return mu->_total_size + (size_t)mu->_requested_heap_size; @@ -187,6 +254,9 @@ get_total_size() { return (size_t)(AtomicAdjust::get(mu->_total_heap_single_size) + AtomicAdjust::get(mu->_total_heap_array_size)); #endif } +#else + return 0; +#endif } /** @@ -194,7 +264,11 @@ get_total_size() { */ INLINE int MemoryUsage:: get_num_pointers() { +#ifdef DO_MEMORY_USAGE return get_global_ptr()->ns_get_num_pointers(); +#else + return 0; +#endif } /** @@ -203,7 +277,9 @@ get_num_pointers() { */ INLINE void MemoryUsage:: get_pointers(MemoryUsagePointers &result) { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_get_pointers(result); +#endif } /** @@ -212,7 +288,9 @@ get_pointers(MemoryUsagePointers &result) { */ INLINE void MemoryUsage:: get_pointers_of_type(MemoryUsagePointers &result, TypeHandle type) { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_get_pointers_of_type(result, type); +#endif } /** @@ -221,7 +299,9 @@ get_pointers_of_type(MemoryUsagePointers &result, TypeHandle type) { */ INLINE void MemoryUsage:: get_pointers_of_age(MemoryUsagePointers &result, double from, double to) { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_get_pointers_of_age(result, from, to); +#endif } /** @@ -242,7 +322,9 @@ get_pointers_of_age(MemoryUsagePointers &result, double from, double to) { */ INLINE void MemoryUsage:: get_pointers_with_zero_count(MemoryUsagePointers &result) { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_get_pointers_with_zero_count(result); +#endif } /** @@ -253,7 +335,9 @@ get_pointers_with_zero_count(MemoryUsagePointers &result) { */ INLINE void MemoryUsage:: freeze() { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_freeze(); +#endif } /** @@ -261,7 +345,9 @@ freeze() { */ INLINE void MemoryUsage:: show_current_types() { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_show_current_types(); +#endif } /** @@ -270,7 +356,9 @@ show_current_types() { */ INLINE void MemoryUsage:: show_trend_types() { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_show_trend_types(); +#endif } /** @@ -278,7 +366,9 @@ show_trend_types() { */ INLINE void MemoryUsage:: show_current_ages() { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_show_current_ages(); +#endif } /** @@ -287,7 +377,9 @@ show_current_ages() { */ INLINE void MemoryUsage:: show_trend_ages() { +#ifdef DO_MEMORY_USAGE get_global_ptr()->ns_show_trend_ages(); +#endif } /** @@ -295,6 +387,7 @@ show_trend_ages() { */ INLINE MemoryUsage *MemoryUsage:: get_global_ptr() { +#ifdef DO_MEMORY_USAGE #ifdef __GNUC__ // Tell the compiler that this is an unlikely branch. if (__builtin_expect(_global_ptr == nullptr, 0)) { @@ -305,4 +398,7 @@ get_global_ptr() { } return _global_ptr; +#else + return nullptr; +#endif } diff --git a/panda/src/express/memoryUsage.cxx b/panda/src/express/memoryUsage.cxx index a834da9dad..178de476fa 100644 --- a/panda/src/express/memoryUsage.cxx +++ b/panda/src/express/memoryUsage.cxx @@ -12,9 +12,6 @@ */ #include "memoryUsage.h" - -#ifdef DO_MEMORY_USAGE - #include "memoryUsagePointers.h" #include "trueClock.h" #include "typedReferenceCount.h" @@ -45,16 +42,17 @@ double MemoryUsage::AgeHistogram::_cutoff[MemoryUsage::AgeHistogram::num_buckets 60.0, }; - /** * Adds a single entry to the histogram. */ void MemoryUsage::TypeHistogram:: add_info(TypeHandle type, MemoryInfo *info) { +#ifdef DO_MEMORY_USAGE _counts[type].add_info(info); +#endif } - +#ifdef DO_MEMORY_USAGE // This class is a temporary class used only in TypeHistogram::show(), below, // to sort the types in descending order by counts. class TypeHistogramCountSorter { @@ -71,12 +69,14 @@ public: MemoryUsagePointerCounts _count; TypeHandle _type; }; +#endif /** * Shows the contents of the histogram to nout. */ void MemoryUsage::TypeHistogram:: show() const { +#ifdef DO_MEMORY_USAGE // First, copy the relevant information to a vector so we can sort by // counts. Don't use a pvector. typedef vector CountSorter; @@ -99,6 +99,7 @@ show() const { } nout << " : " << (*vi)._count << "\n"; } +#endif } /** @@ -122,9 +123,11 @@ AgeHistogram() { */ void MemoryUsage::AgeHistogram:: add_info(double age, MemoryInfo *info) { +#ifdef DO_MEMORY_USAGE int bucket = choose_bucket(age); nassertv(bucket >= 0 && bucket < num_buckets); _counts[bucket].add_info(info); +#endif } /** @@ -132,6 +135,7 @@ add_info(double age, MemoryInfo *info) { */ void MemoryUsage::AgeHistogram:: show() const { +#ifdef DO_MEMORY_USAGE for (int i = 0; i < num_buckets - 1; i++) { nout << _cutoff[i] << " to " << _cutoff[i + 1] << " seconds old : "; _counts[i].output(nout); @@ -140,6 +144,7 @@ show() const { nout << _cutoff[num_buckets - 1] << " seconds old and up : "; _counts[num_buckets - 1].output(nout); nout << "\n"; +#endif } /** @@ -147,9 +152,11 @@ show() const { */ void MemoryUsage::AgeHistogram:: clear() { +#ifdef DO_MEMORY_USAGE for (int i = 0; i < num_buckets; i++) { _counts[i].clear(); } +#endif } /** @@ -157,6 +164,7 @@ clear() { */ int MemoryUsage::AgeHistogram:: choose_bucket(double age) const { +#ifdef DO_MEMORY_USAGE for (int i = num_buckets - 1; i >= 0; i--) { if (age >= _cutoff[i]) { return i; @@ -164,6 +172,7 @@ choose_bucket(double age) const { } express_cat.error() << "No suitable bucket for age " << age << "\n"; +#endif return 0; } @@ -173,6 +182,7 @@ choose_bucket(double age) const { */ void *MemoryUsage:: heap_alloc_single(size_t size) { +#ifdef DO_MEMORY_USAGE void *ptr; if (_recursion_protect) { @@ -202,6 +212,9 @@ heap_alloc_single(size_t size) { } return ptr; +#else + return MemoryHook::heap_alloc_single(size); +#endif } /** @@ -209,6 +222,7 @@ heap_alloc_single(size_t size) { */ void MemoryUsage:: heap_free_single(void *ptr) { +#ifdef DO_MEMORY_USAGE if (_recursion_protect) { if (express_cat.is_spam()) { express_cat.spam() @@ -231,6 +245,9 @@ heap_free_single(void *ptr) { MemoryHook::heap_free_single(ptr); } } +#else + MemoryHook::heap_free_single(ptr); +#endif } /** @@ -239,6 +256,7 @@ heap_free_single(void *ptr) { */ void *MemoryUsage:: heap_alloc_array(size_t size) { +#ifdef DO_MEMORY_USAGE void *ptr; if (_recursion_protect) { @@ -268,6 +286,9 @@ heap_alloc_array(size_t size) { } return ptr; +#else + return MemoryHook::heap_alloc_array(size); +#endif } /** @@ -275,6 +296,7 @@ heap_alloc_array(size_t size) { */ void *MemoryUsage:: heap_realloc_array(void *ptr, size_t size) { +#ifdef DO_MEMORY_USAGE if (_recursion_protect) { ptr = MemoryHook::heap_realloc_array(ptr, size); if (express_cat.is_spam()) { @@ -303,6 +325,9 @@ heap_realloc_array(void *ptr, size_t size) { } return ptr; +#else + return MemoryHook::heap_realloc_array(ptr, size); +#endif } /** @@ -310,6 +335,7 @@ heap_realloc_array(void *ptr, size_t size) { */ void MemoryUsage:: heap_free_array(void *ptr) { +#ifdef DO_MEMORY_USAGE if (_recursion_protect) { if (express_cat.is_spam()) { express_cat.spam() @@ -332,6 +358,9 @@ heap_free_array(void *ptr) { MemoryHook::heap_free_array(ptr); } } +#else + MemoryHook::heap_free_array(ptr); +#endif } /** @@ -343,6 +372,7 @@ heap_free_array(void *ptr) { */ void MemoryUsage:: mark_pointer(void *ptr, size_t size, ReferenceCount *ref_ptr) { +#ifdef DO_MEMORY_USAGE if (_recursion_protect || !_track_memory_usage) { return; } @@ -391,6 +421,7 @@ mark_pointer(void *ptr, size_t size, ReferenceCount *ref_ptr) { // We're removing this pointer from use. ns_remove_void_pointer(ptr); } +#endif } #if (defined(WIN32_VC) || defined (WIN64_VC))&& defined(_DEBUG) @@ -430,7 +461,23 @@ win32_malloc_hook(int alloc_type, void *ptr, * */ MemoryUsage:: -MemoryUsage(const MemoryHook ©) : MemoryHook(copy) { +MemoryUsage(const MemoryHook ©) : + MemoryHook(copy), + _info_set_dirty(false), + _freeze_index(0), + _count(0), + _current_cpp_size(0), + _total_cpp_size(0), + _total_size(0), + + _track_memory_usage(false), + _startup_track_memory_usage(false), + _count_memory_usage(false), + _report_memory_usage(false), + _report_memory_interval(0.0), + _last_report_time(0.0) { + +#ifdef DO_MEMORY_USAGE // We must get these variables here instead of in config_express.cxx, // because we need to know it at static init time, and who knows when the // code in config_express will be executed. @@ -456,9 +503,6 @@ MemoryUsage(const MemoryHook ©) : MemoryHook(copy) { ("report-memory-interval", 5.0, PRC_DESC("This is the interval, in seconds, for reports of currently allocated " "memory, when report-memory-usage is true.")); - _last_report_time = 0.0; - - _count_memory_usage = false; int64_t max_heap_size = ConfigVariableInt64 ("max-heap-size", 0, @@ -480,13 +524,7 @@ MemoryUsage(const MemoryHook ©) : MemoryHook(copy) { _CrtSetAllocHook(&win32_malloc_hook); _count_memory_usage = true; #endif - - _info_set_dirty = false; - _freeze_index = 0; - _count = 0; - _current_cpp_size = 0; - _total_cpp_size = 0; - _total_size = 0; +#endif // DO_MEMORY_USAGE } /** @@ -494,9 +532,16 @@ MemoryUsage(const MemoryHook ©) : MemoryHook(copy) { */ void MemoryUsage:: init_memory_usage() { +#ifdef DO_MEMORY_USAGE init_memory_hook(); _global_ptr = new MemoryUsage(*memory_hook); memory_hook = _global_ptr; +#else + // If this gets called, we still need to initialize the global_ptr with a + // stub even if we don't compile with memory usage tracking enabled, for ABI + // stability. However, we won't replace the memory hook. + _global_ptr = new MemoryUsage(*memory_hook); +#endif } /** @@ -507,6 +552,7 @@ init_memory_usage() { */ void MemoryUsage:: overflow_heap_size() { +#ifdef DO_MEMORY_USAGE MemoryHook::overflow_heap_size(); express_cat.error() @@ -524,6 +570,7 @@ overflow_heap_size() { // Turn on spamful debugging. _track_memory_usage = true; _report_memory_usage = true; +#endif } /** @@ -531,12 +578,13 @@ overflow_heap_size() { */ void MemoryUsage:: ns_record_pointer(ReferenceCount *ptr) { +#ifdef DO_MEMORY_USAGE if (_track_memory_usage) { // We have to protect modifications to the table from recursive calls by // toggling _recursion_protect while we adjust it. _recursion_protect = true; pair insert_result = - _table.insert(Table::value_type((void *)ptr, (MemoryInfo *)NULL)); + _table.insert(Table::value_type((void *)ptr, nullptr)); // This shouldn't fail. assert(insert_result.first != _table.end()); @@ -575,6 +623,61 @@ ns_record_pointer(ReferenceCount *ptr) { } } } +#endif +} + + +/** + * Indicates that the given pointer has been recently allocated. + */ +void MemoryUsage:: +ns_record_pointer(void *ptr, TypeHandle type) { +#ifdef DO_MEMORY_USAGE + if (_track_memory_usage) { + // We have to protect modifications to the table from recursive calls by + // toggling _recursion_protect while we adjust it. + _recursion_protect = true; + pair insert_result = + _table.insert(Table::value_type(ptr, nullptr)); + + // This shouldn't fail. + assert(insert_result.first != _table.end()); + + if (insert_result.second) { + (*insert_result.first).second = new MemoryInfo; + _info_set_dirty = true; + ++_count; + } + + MemoryInfo *info = (*insert_result.first).second; + + // We should already have a pointer, thanks to a previous call to + // mark_pointer(). + nassertv(info->_void_ptr == ptr && info->_ref_ptr == nullptr); + + info->_void_ptr = ptr; + info->_static_type = type; + info->_dynamic_type = type; + info->_time = TrueClock::get_global_ptr()->get_long_time(); + info->_freeze_index = _freeze_index; + info->_flags |= MemoryInfo::F_reconsider_dynamic_type; + + // We close the recursion_protect flag all the way down here, so that we + // also protect ourselves against a possible recursive call in + // TrueClock::get_global_ptr(). + _recursion_protect = false; + + if (_report_memory_usage) { + double now = TrueClock::get_global_ptr()->get_long_time(); + if (now - _last_report_time > _report_memory_interval) { + _last_report_time = now; + express_cat.info() + << "*** Current memory usage: " << get_total_size() << "\n"; + show_current_types(); + } + } + } +#endif } /** @@ -584,7 +687,8 @@ ns_record_pointer(ReferenceCount *ptr) { * only that it's a "ReferenceCount". */ void MemoryUsage:: -ns_update_type(ReferenceCount *ptr, TypeHandle type) { +ns_update_type(void *ptr, TypeHandle type) { +#ifdef DO_MEMORY_USAGE if (_track_memory_usage) { Table::iterator ti; ti = _table.find(ptr); @@ -592,7 +696,7 @@ ns_update_type(ReferenceCount *ptr, TypeHandle type) { if (_startup_track_memory_usage) { express_cat.error() << "Attempt to update type to " << type << " for unrecorded pointer " - << (void *)ptr << "!\n"; + << ptr << "!\n"; nassertv(false); } return; @@ -605,6 +709,7 @@ ns_update_type(ReferenceCount *ptr, TypeHandle type) { consolidate_void_ptr(info); } +#endif } /** @@ -614,7 +719,8 @@ ns_update_type(ReferenceCount *ptr, TypeHandle type) { * the pointer as a TypedObject it doesn't need any more help. */ void MemoryUsage:: -ns_update_type(ReferenceCount *ptr, TypedObject *typed_ptr) { +ns_update_type(void *ptr, TypedObject *typed_ptr) { +#ifdef DO_MEMORY_USAGE if (_track_memory_usage) { Table::iterator ti; ti = _table.find(ptr); @@ -623,7 +729,7 @@ ns_update_type(ReferenceCount *ptr, TypedObject *typed_ptr) { express_cat.error() << "Attempt to update type to " << typed_ptr->get_type() << " for unrecorded pointer " - << (void *)ptr << "!\n"; + << ptr << "!\n"; } return; } @@ -634,6 +740,7 @@ ns_update_type(ReferenceCount *ptr, TypedObject *typed_ptr) { consolidate_void_ptr(info); } +#endif } /** @@ -641,6 +748,7 @@ ns_update_type(ReferenceCount *ptr, TypedObject *typed_ptr) { */ void MemoryUsage:: ns_remove_pointer(ReferenceCount *ptr) { +#ifdef DO_MEMORY_USAGE if (_track_memory_usage) { Table::iterator ti; ti = _table.find(ptr); @@ -705,6 +813,7 @@ ns_remove_pointer(ReferenceCount *ptr) { } } } +#endif } /** @@ -713,6 +822,7 @@ ns_remove_pointer(ReferenceCount *ptr) { */ void MemoryUsage:: ns_record_void_pointer(void *ptr, size_t size) { +#ifdef DO_MEMORY_USAGE if (_track_memory_usage) { if (express_cat.is_spam()) { express_cat.spam() @@ -724,7 +834,7 @@ ns_record_void_pointer(void *ptr, size_t size) { _recursion_protect = true; pair insert_result = - _table.insert(Table::value_type((void *)ptr, (MemoryInfo *)NULL)); + _table.insert(Table::value_type((void *)ptr, nullptr)); assert(insert_result.first != _table.end()); @@ -761,6 +871,7 @@ ns_record_void_pointer(void *ptr, size_t size) { // TrueClock::get_global_ptr(). _recursion_protect = false; } +#endif } /** @@ -768,6 +879,7 @@ ns_record_void_pointer(void *ptr, size_t size) { */ void MemoryUsage:: ns_remove_void_pointer(void *ptr) { +#ifdef DO_MEMORY_USAGE if (_track_memory_usage) { if (express_cat.is_spam()) { express_cat.spam() @@ -823,6 +935,7 @@ ns_remove_void_pointer(void *ptr) { _info_set_dirty = true; delete info; } +#endif } /** @@ -830,8 +943,12 @@ ns_remove_void_pointer(void *ptr) { */ int MemoryUsage:: ns_get_num_pointers() { +#ifdef DO_MEMORY_USAGE nassertr(_track_memory_usage, 0); return _count; +#else + return 0; +#endif } /** @@ -840,6 +957,7 @@ ns_get_num_pointers() { */ void MemoryUsage:: ns_get_pointers(MemoryUsagePointers &result) { +#ifdef DO_MEMORY_USAGE nassertv(_track_memory_usage); result.clear(); @@ -857,6 +975,7 @@ ns_get_pointers(MemoryUsagePointers &result) { now - info->_time); } } +#endif } /** @@ -865,6 +984,7 @@ ns_get_pointers(MemoryUsagePointers &result) { */ void MemoryUsage:: ns_get_pointers_of_type(MemoryUsagePointers &result, TypeHandle type) { +#ifdef DO_MEMORY_USAGE nassertv(_track_memory_usage); result.clear(); @@ -886,6 +1006,7 @@ ns_get_pointers_of_type(MemoryUsagePointers &result, TypeHandle type) { } } } +#endif } /** @@ -895,6 +1016,7 @@ ns_get_pointers_of_type(MemoryUsagePointers &result, TypeHandle type) { void MemoryUsage:: ns_get_pointers_of_age(MemoryUsagePointers &result, double from, double to) { +#ifdef DO_MEMORY_USAGE nassertv(_track_memory_usage); result.clear(); @@ -915,6 +1037,7 @@ ns_get_pointers_of_age(MemoryUsagePointers &result, } } } +#endif } /** @@ -935,6 +1058,7 @@ ns_get_pointers_of_age(MemoryUsagePointers &result, */ void MemoryUsage:: ns_get_pointers_with_zero_count(MemoryUsagePointers &result) { +#ifdef DO_MEMORY_USAGE nassertv(_track_memory_usage); result.clear(); @@ -955,6 +1079,7 @@ ns_get_pointers_with_zero_count(MemoryUsagePointers &result) { } } } +#endif } /** @@ -965,11 +1090,13 @@ ns_get_pointers_with_zero_count(MemoryUsagePointers &result) { */ void MemoryUsage:: ns_freeze() { +#ifdef DO_MEMORY_USAGE _count = 0; _current_cpp_size = 0; _trend_types.clear(); _trend_ages.clear(); _freeze_index++; +#endif } /** @@ -977,6 +1104,7 @@ ns_freeze() { */ void MemoryUsage:: ns_show_current_types() { +#ifdef DO_MEMORY_USAGE nassertv(_track_memory_usage); TypeHistogram hist; @@ -994,6 +1122,7 @@ ns_show_current_types() { } hist.show(); _recursion_protect = false; +#endif } /** @@ -1002,7 +1131,9 @@ ns_show_current_types() { */ void MemoryUsage:: ns_show_trend_types() { +#ifdef DO_MEMORY_USAGE _trend_types.show(); +#endif } /** @@ -1010,6 +1141,7 @@ ns_show_trend_types() { */ void MemoryUsage:: ns_show_current_ages() { +#ifdef DO_MEMORY_USAGE nassertv(_track_memory_usage); AgeHistogram hist; @@ -1026,6 +1158,7 @@ ns_show_current_ages() { hist.show(); _recursion_protect = false; +#endif } /** @@ -1037,6 +1170,8 @@ ns_show_trend_ages() { _trend_ages.show(); } +#ifdef DO_MEMORY_USAGE + /** * If the size information has not yet been determined for this pointer, * checks to see if it has possibly been recorded under the TypedObject @@ -1126,5 +1261,4 @@ refresh_info_set() { _info_set_dirty = false; } - #endif // DO_MEMORY_USAGE diff --git a/panda/src/express/memoryUsage.h b/panda/src/express/memoryUsage.h index eb4cc6856e..87fc4f59d8 100644 --- a/panda/src/express/memoryUsage.h +++ b/panda/src/express/memoryUsage.h @@ -15,9 +15,6 @@ #define MEMORYUSAGE_H #include "pandabase.h" - -#ifdef DO_MEMORY_USAGE - #include "typedObject.h" #include "memoryInfo.h" #include "memoryUsagePointerCounts.h" @@ -33,18 +30,22 @@ class MemoryUsagePointers; * every such object currently allocated. * * When compiled with NDEBUG set, this entire class does nothing and compiles - * to nothing. + * to a stub. */ class EXPCL_PANDAEXPRESS MemoryUsage : public MemoryHook { public: - INLINE static bool get_track_memory_usage(); + ALWAYS_INLINE static bool get_track_memory_usage(); INLINE static void record_pointer(ReferenceCount *ptr); + INLINE static void record_pointer(void *ptr, TypeHandle type); INLINE static void update_type(ReferenceCount *ptr, TypeHandle type); INLINE static void update_type(ReferenceCount *ptr, TypedObject *typed_ptr); + INLINE static void update_type(void *ptr, TypeHandle type); INLINE static void remove_pointer(ReferenceCount *ptr); -public: +protected: + // These are not marked public, but they can be accessed via the MemoryHook + // base class. virtual void *heap_alloc_single(size_t size); virtual void heap_free_single(void *ptr); @@ -98,8 +99,9 @@ private: static void init_memory_usage(); void ns_record_pointer(ReferenceCount *ptr); - void ns_update_type(ReferenceCount *ptr, TypeHandle type); - void ns_update_type(ReferenceCount *ptr, TypedObject *typed_ptr); + void ns_record_pointer(void *ptr, TypeHandle type); + void ns_update_type(void *ptr, TypeHandle type); + void ns_update_type(void *ptr, TypedObject *typed_ptr); void ns_remove_pointer(ReferenceCount *ptr); void ns_record_void_pointer(void *ptr, size_t size); @@ -120,8 +122,10 @@ private: void ns_show_current_ages(); void ns_show_trend_ages(); +#ifdef DO_MEMORY_USAGE void consolidate_void_ptr(MemoryInfo *info); void refresh_info_set(); +#endif static MemoryUsage *_global_ptr; @@ -196,6 +200,4 @@ private: #include "memoryUsage.I" -#endif // DO_MEMORY_USAGE - #endif diff --git a/panda/src/express/memoryUsagePointerCounts.cxx b/panda/src/express/memoryUsagePointerCounts.cxx index d218d57589..b91be61bcc 100644 --- a/panda/src/express/memoryUsagePointerCounts.cxx +++ b/panda/src/express/memoryUsagePointerCounts.cxx @@ -12,9 +12,6 @@ */ #include "memoryUsagePointerCounts.h" - -#ifdef DO_MEMORY_USAGE - #include "memoryInfo.h" /** @@ -22,6 +19,7 @@ */ void MemoryUsagePointerCounts:: add_info(MemoryInfo *info) { +#ifdef DO_MEMORY_USAGE _count++; if (info->is_size_known()) { @@ -29,6 +27,7 @@ add_info(MemoryInfo *info) { } else { _unknown_size_count++; } +#endif } /** @@ -36,6 +35,7 @@ add_info(MemoryInfo *info) { */ void MemoryUsagePointerCounts:: output(ostream &out) const { +#ifdef DO_MEMORY_USAGE out << _count << " pointers"; if (_unknown_size_count < _count) { out << ", "; @@ -48,6 +48,7 @@ output(ostream &out) const { out << " (" << _unknown_size_count << " of unknown size)"; } } +#endif } /** @@ -56,6 +57,7 @@ output(ostream &out) const { */ void MemoryUsagePointerCounts:: output_bytes(ostream &out, size_t size) { +#ifdef DO_MEMORY_USAGE if (size < 4 * 1024) { out << size << " bytes"; @@ -65,6 +67,5 @@ output_bytes(ostream &out, size_t size) { } else { out << size / (1024 * 1024) << " Mb"; } +#endif } - -#endif // DO_MEMORY_USAGE diff --git a/panda/src/express/memoryUsagePointerCounts.h b/panda/src/express/memoryUsagePointerCounts.h index 935538fdee..2d95052ad8 100644 --- a/panda/src/express/memoryUsagePointerCounts.h +++ b/panda/src/express/memoryUsagePointerCounts.h @@ -16,8 +16,6 @@ #include "pandabase.h" -#ifdef DO_MEMORY_USAGE - class MemoryInfo; /** @@ -55,6 +53,4 @@ INLINE ostream &operator << (ostream &out, const MemoryUsagePointerCounts &c); #include "memoryUsagePointerCounts.I" -#endif // DO_MEMORY_USAGE - #endif diff --git a/panda/src/express/memoryUsagePointers.cxx b/panda/src/express/memoryUsagePointers.cxx index fff8199c5a..dd412958da 100644 --- a/panda/src/express/memoryUsagePointers.cxx +++ b/panda/src/express/memoryUsagePointers.cxx @@ -12,9 +12,6 @@ */ #include "memoryUsagePointers.h" - -#ifdef DO_MEMORY_USAGE - #include "config_express.h" #include "referenceCount.h" #include "typedReferenceCount.h" @@ -38,7 +35,11 @@ MemoryUsagePointers:: */ size_t MemoryUsagePointers:: get_num_pointers() const { +#ifdef DO_MEMORY_USAGE return _entries.size(); +#else + return 0; +#endif } /** @@ -46,21 +47,26 @@ get_num_pointers() const { */ ReferenceCount *MemoryUsagePointers:: get_pointer(size_t n) const { - nassertr(n < get_num_pointers(), NULL); +#ifdef DO_MEMORY_USAGE + nassertr(n < get_num_pointers(), nullptr); return _entries[n]._ref_ptr; +#else + return nullptr; +#endif } /** * Returns the nth pointer of the set, typecast to a TypedObject if possible. * If the pointer is not a TypedObject or if the cast cannot be made, returns - * NULL. + * nullptr. */ TypedObject *MemoryUsagePointers:: get_typed_pointer(size_t n) const { - nassertr(n < get_num_pointers(), NULL); +#ifdef DO_MEMORY_USAGE + nassertr(n < get_num_pointers(), nullptr); TypedObject *typed_ptr = _entries[n]._typed_ptr; - if (typed_ptr != (TypedObject *)NULL) { + if (typed_ptr != nullptr) { return typed_ptr; } @@ -85,7 +91,8 @@ get_typed_pointer(size_t n) const { type.is_derived_from(TypedReferenceCount::get_class_type())) { return (TypedReferenceCount *)ref_ptr; } - return NULL; +#endif + return nullptr; } /** @@ -93,8 +100,12 @@ get_typed_pointer(size_t n) const { */ TypeHandle MemoryUsagePointers:: get_type(size_t n) const { +#ifdef DO_MEMORY_USAGE nassertr(n < get_num_pointers(), TypeHandle::none()); return _entries[n]._type; +#else + return TypeHandle::none(); +#endif } /** @@ -102,8 +113,12 @@ get_type(size_t n) const { */ string MemoryUsagePointers:: get_type_name(size_t n) const { +#ifdef DO_MEMORY_USAGE nassertr(n < get_num_pointers(), ""); return get_type(n).get_name(); +#else + return ""; +#endif } /** @@ -113,8 +128,12 @@ get_type_name(size_t n) const { */ double MemoryUsagePointers:: get_age(size_t n) const { +#ifdef DO_MEMORY_USAGE nassertr(n < get_num_pointers(), 0.0); return _entries[n]._age; +#else + return 0.0; +#endif } /** @@ -122,7 +141,9 @@ get_age(size_t n) const { */ void MemoryUsagePointers:: clear() { +#ifdef DO_MEMORY_USAGE _entries.clear(); +#endif } /** @@ -130,7 +151,9 @@ clear() { */ void MemoryUsagePointers:: output(ostream &out) const { +#ifdef DO_MEMORY_USAGE out << _entries.size() << " pointers."; +#endif } /** @@ -139,13 +162,12 @@ output(ostream &out) const { void MemoryUsagePointers:: add_entry(ReferenceCount *ref_ptr, TypedObject *typed_ptr, TypeHandle type, double age) { +#ifdef DO_MEMORY_USAGE // We can't safely add pointers with a zero reference count. They might be // statically-allocated or something, and if we try to add them they'll try // to destruct when the PointerTo later goes away. if (ref_ptr->get_ref_count() != 0) { _entries.push_back(Entry(ref_ptr, typed_ptr, type, age)); } +#endif } - - -#endif // DO_MEMORY_USAGE diff --git a/panda/src/express/memoryUsagePointers.h b/panda/src/express/memoryUsagePointers.h index 317910760b..344c2edc6b 100644 --- a/panda/src/express/memoryUsagePointers.h +++ b/panda/src/express/memoryUsagePointers.h @@ -15,9 +15,6 @@ #define MEMORYUSAGEPOINTERS_H #include "pandabase.h" - -#ifdef DO_MEMORY_USAGE - #include "typedObject.h" #include "pointerTo.h" #include "referenceCount.h" @@ -53,7 +50,9 @@ PUBLISHED: string get_type_name(size_t n) const; double get_age(size_t n) const; +#ifdef DO_MEMORY_USAGE EXTENSION(PyObject *get_python_pointer(size_t n) const); +#endif void clear(); @@ -94,6 +93,4 @@ INLINE ostream &operator << (ostream &out, const MemoryUsagePointers &mup) { #include "memoryUsagePointers.I" -#endif // MEMORY_USAGE_POINTERS - #endif diff --git a/panda/src/express/pointerToBase.I b/panda/src/express/pointerToBase.I index d57064967b..bf4ff877f0 100644 --- a/panda/src/express/pointerToBase.I +++ b/panda/src/express/pointerToBase.I @@ -141,7 +141,6 @@ reassign(const PointerToBase ©) { } } -#ifdef DO_MEMORY_USAGE /** * Ensures that the MemoryUsage record for the pointer has the right type of * object, if we know the type ourselves. @@ -149,6 +148,7 @@ reassign(const PointerToBase ©) { template INLINE void PointerToBase:: update_type(To *ptr) { +#ifdef DO_MEMORY_USAGE if (MemoryUsage::get_track_memory_usage()) { TypeHandle type = get_type_handle(To); if (type == TypeHandle::none()) { @@ -159,9 +159,8 @@ update_type(To *ptr) { MemoryUsage::update_type(ptr, type); } } -} #endif // DO_MEMORY_USAGE - +} /** * A convenient way to set the PointerTo object to NULL. (Assignment to a NULL diff --git a/panda/src/express/pointerToBase.h b/panda/src/express/pointerToBase.h index 7d5524f2b9..919f596c33 100644 --- a/panda/src/express/pointerToBase.h +++ b/panda/src/express/pointerToBase.h @@ -44,9 +44,7 @@ protected: INLINE void reassign(To *ptr); INLINE void reassign(const PointerToBase ©); -#ifdef DO_MEMORY_USAGE INLINE void update_type(To *ptr); -#endif // DO_MEMORY_USAGE // No assignment or retrieval functions are declared in PointerToBase, // because we will have to specialize on const vs. non-const later. diff --git a/panda/src/express/threadSafePointerToBase.I b/panda/src/express/threadSafePointerToBase.I index db8166b78a..4d200a483a 100644 --- a/panda/src/express/threadSafePointerToBase.I +++ b/panda/src/express/threadSafePointerToBase.I @@ -89,7 +89,6 @@ reassign(const ThreadSafePointerToBase ©) { reassign((To *)copy._void_ptr); } -#ifdef DO_MEMORY_USAGE /** * Ensures that the MemoryUsage record for the pointer has the right type of * object, if we know the type ourselves. @@ -97,6 +96,7 @@ reassign(const ThreadSafePointerToBase ©) { template void ThreadSafePointerToBase:: update_type(To *ptr) { +#ifdef DO_MEMORY_USAGE TypeHandle type = get_type_handle(To); if (type == TypeHandle::none()) { do_init_type(To); @@ -105,9 +105,8 @@ update_type(To *ptr) { if (type != TypeHandle::none()) { MemoryUsage::update_type(ptr, type); } -} #endif // DO_MEMORY_USAGE - +} /** * A convenient way to set the ThreadSafePointerTo object to NULL. (Assignment diff --git a/panda/src/express/threadSafePointerToBase.h b/panda/src/express/threadSafePointerToBase.h index dedcfd08ab..78c6d75cca 100644 --- a/panda/src/express/threadSafePointerToBase.h +++ b/panda/src/express/threadSafePointerToBase.h @@ -40,9 +40,7 @@ protected: INLINE void reassign(To *ptr); INLINE void reassign(const ThreadSafePointerToBase ©); -#ifdef DO_MEMORY_USAGE void update_type(To *ptr); -#endif // DO_MEMORY_USAGE // No assignment or retrieval functions are declared in // ThreadSafePointerToBase, because we will have to specialize on const vs. diff --git a/panda/src/gobj/internalName.h b/panda/src/gobj/internalName.h index bc636eb1c9..eff928b668 100644 --- a/panda/src/gobj/internalName.h +++ b/panda/src/gobj/internalName.h @@ -178,11 +178,9 @@ private: static TypeHandle _texcoord_type_handle; }; -#ifdef DO_MEMORY_USAGE // We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif INLINE ostream &operator << (ostream &out, const InternalName &tcn); diff --git a/panda/src/mathutil/geometricBoundingVolume.h b/panda/src/mathutil/geometricBoundingVolume.h index cc48177f17..a27c19a724 100644 --- a/panda/src/mathutil/geometricBoundingVolume.h +++ b/panda/src/mathutil/geometricBoundingVolume.h @@ -83,11 +83,9 @@ private: static TypeHandle _type_handle; }; -#ifdef DO_MEMORY_USAGE // We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif #include "geometricBoundingVolume.I" diff --git a/panda/src/pgraph/cullPlanes.h b/panda/src/pgraph/cullPlanes.h index c091eebdc9..4b29fb7794 100644 --- a/panda/src/pgraph/cullPlanes.h +++ b/panda/src/pgraph/cullPlanes.h @@ -74,11 +74,9 @@ private: Occluders _occluders; }; -#ifdef DO_MEMORY_USAGE // We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif #include "cullPlanes.I" diff --git a/panda/src/pgraph/cullableObject.I b/panda/src/pgraph/cullableObject.I index e93e826a58..e5e7229d09 100644 --- a/panda/src/pgraph/cullableObject.I +++ b/panda/src/pgraph/cullableObject.I @@ -17,7 +17,7 @@ INLINE CullableObject:: CullableObject() { #ifdef DO_MEMORY_USAGE - MemoryUsage::update_type(this, get_class_type()); + MemoryUsage::record_pointer(this, get_class_type()); #endif } @@ -33,7 +33,7 @@ CullableObject(CPT(Geom) geom, CPT(RenderState) state, _internal_transform(move(internal_transform)) { #ifdef DO_MEMORY_USAGE - MemoryUsage::update_type(this, get_class_type()); + MemoryUsage::record_pointer(this, get_class_type()); #endif } @@ -48,7 +48,7 @@ CullableObject(const CullableObject ©) : _internal_transform(copy._internal_transform) { #ifdef DO_MEMORY_USAGE - MemoryUsage::update_type(this, get_class_type()); + MemoryUsage::record_pointer(this, get_class_type()); #endif } diff --git a/panda/src/pgraph/cullableObject.h b/panda/src/pgraph/cullableObject.h index 1415052770..a8595da9f5 100644 --- a/panda/src/pgraph/cullableObject.h +++ b/panda/src/pgraph/cullableObject.h @@ -21,7 +21,6 @@ #include "renderState.h" #include "transformState.h" #include "pointerTo.h" -#include "referenceCount.h" #include "geomNode.h" #include "cullTraverserData.h" #include "pStatCollector.h" @@ -39,11 +38,7 @@ class GeomMunger; * The smallest atom of cull. This is normally just a Geom and its associated * state, but it also contain a draw callback. */ -class EXPCL_PANDA_PGRAPH CullableObject -#ifdef DO_MEMORY_USAGE - : public ReferenceCount // We inherit from ReferenceCount just to get the memory type tracking that MemoryUsage provides. -#endif // DO_MEMORY_USAGE -{ +class EXPCL_PANDA_PGRAPH CullableObject { public: INLINE CullableObject(); INLINE CullableObject(CPT(Geom) geom, CPT(RenderState) state, @@ -124,13 +119,7 @@ public: return _type_handle; } static void init_type() { -#ifdef DO_MEMORY_USAGE - ReferenceCount::init_type(); - register_type(_type_handle, "CullableObject", - ReferenceCount::get_class_type()); -#else register_type(_type_handle, "CullableObject"); -#endif // DO_MEMORY_USAGE } private: diff --git a/panda/src/pgraph/nodePathComponent.h b/panda/src/pgraph/nodePathComponent.h index b0ed69a389..2106430b7d 100644 --- a/panda/src/pgraph/nodePathComponent.h +++ b/panda/src/pgraph/nodePathComponent.h @@ -125,11 +125,9 @@ private: friend class NodePath; }; -#ifdef DO_MEMORY_USAGE // We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif INLINE ostream &operator << (ostream &out, const NodePathComponent &comp); diff --git a/panda/src/pgraph/pandaNode.h b/panda/src/pgraph/pandaNode.h index b55f160588..a0a2d0f9a3 100644 --- a/panda/src/pgraph/pandaNode.h +++ b/panda/src/pgraph/pandaNode.h @@ -907,11 +907,9 @@ private: }; -#ifdef DO_MEMORY_USAGE // We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif INLINE ostream &operator << (ostream &out, const PandaNode &node) { node.output(out); diff --git a/panda/src/pgraph/renderState.h b/panda/src/pgraph/renderState.h index f91f02cd3e..a1b1813ea9 100644 --- a/panda/src/pgraph/renderState.h +++ b/panda/src/pgraph/renderState.h @@ -368,11 +368,9 @@ private: friend class Extension; }; -#ifdef DO_MEMORY_USAGE // We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif INLINE ostream &operator << (ostream &out, const RenderState &state) { state.output(out); diff --git a/panda/src/pgraph/transformState.h b/panda/src/pgraph/transformState.h index 3fd628be7c..b4efd5abf3 100644 --- a/panda/src/pgraph/transformState.h +++ b/panda/src/pgraph/transformState.h @@ -406,11 +406,9 @@ private: friend class Extension; }; -#ifdef DO_MEMORY_USAGE // We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif INLINE ostream &operator << (ostream &out, const TransformState &state) { state.output(out); diff --git a/panda/src/putil/copyOnWriteObject.h b/panda/src/putil/copyOnWriteObject.h index 37302ea44a..2f6b5cc9fc 100644 --- a/panda/src/putil/copyOnWriteObject.h +++ b/panda/src/putil/copyOnWriteObject.h @@ -161,11 +161,9 @@ private: static TypeHandle _type_handle; }; -#ifdef DO_MEMORY_USAGE // We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif #include "copyOnWriteObject.I" diff --git a/panda/src/putil/typedWritableReferenceCount.h b/panda/src/putil/typedWritableReferenceCount.h index 51803d7b36..69fabf86ee 100644 --- a/panda/src/putil/typedWritableReferenceCount.h +++ b/panda/src/putil/typedWritableReferenceCount.h @@ -61,10 +61,9 @@ private: static TypeHandle _type_handle; }; -#ifdef DO_MEMORY_USAGE +// We can safely redefine this as a no-op. template<> INLINE void PointerToBase::update_type(To *ptr) {} -#endif #include "typedWritableReferenceCount.I" From 8b3ad7348e41db4f63a9471bb32eff39376e6346 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 10 Jul 2017 19:53:53 +0200 Subject: [PATCH 153/254] cocoa: fix broken mouse events in fullscreen on macOS (LP 1500026) --- panda/src/cocoadisplay/cocoaGraphicsWindow.mm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/panda/src/cocoadisplay/cocoaGraphicsWindow.mm b/panda/src/cocoadisplay/cocoaGraphicsWindow.mm index 6de003d2aa..ebc9255d63 100644 --- a/panda/src/cocoadisplay/cocoaGraphicsWindow.mm +++ b/panda/src/cocoadisplay/cocoaGraphicsWindow.mm @@ -277,7 +277,21 @@ process_events() { break; } - [NSApp sendEvent: event]; + // If we're in fullscreen mode, send mouse events directly to the window. + NSEventType type = [event type]; + if (_properties.get_fullscreen() && ( + type == NSLeftMouseDown || type == NSLeftMouseUp || + type == NSRightMouseDown || type == NSRightMouseUp || + type == NSOtherMouseDown || type == NSOtherMouseUp || + type == NSLeftMouseDragged || + type == NSRightMouseDragged || + type == NSOtherMouseDragged || + type == NSMouseMoved || + type == NSScrollWheel)) { + [_window sendEvent: event]; + } else { + [NSApp sendEvent: event]; + } } if (_window != nil) { From 1b690e528fdea15c7290e015f3ec14fa03e69c6c Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 10 Jul 2017 21:10:47 +0200 Subject: [PATCH 154/254] vfs: don't crash if copy_file can't open output file (LP 1687283) --- panda/src/express/virtualFileSimple.cxx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/panda/src/express/virtualFileSimple.cxx b/panda/src/express/virtualFileSimple.cxx index a036c0df4b..1c521b6459 100644 --- a/panda/src/express/virtualFileSimple.cxx +++ b/panda/src/express/virtualFileSimple.cxx @@ -150,7 +150,16 @@ copy_file(VirtualFile *new_file) { // Different mount point, or the mount doesn't support copying. Do it by // hand. ostream *out = new_file->open_write_file(false, true); + if (out == nullptr) { + return false; + } + istream *in = open_read_file(false); + if (in == nullptr) { + new_file->close_write_file(out); + new_file->delete_file(); + return false; + } static const size_t buffer_size = 4096; char buffer[buffer_size]; From f79fbf25c3370554cf57451b12097a12356f7270 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 10 Jul 2017 21:54:43 +0200 Subject: [PATCH 155/254] ShaderGenerator: big overhaul, don't generate more shaders than needed --- panda/src/display/graphicsStateGuardian.cxx | 91 +- panda/src/display/standardMunger.cxx | 11 +- panda/src/gobj/material.I | 8 + panda/src/gobj/material.h | 4 +- panda/src/gobj/shader.cxx | 117 +- panda/src/gobj/shader.h | 11 + panda/src/pgraph/alphaTestAttrib.cxx | 16 - panda/src/pgraph/alphaTestAttrib.h | 1 - panda/src/pgraph/auxBitplaneAttrib.cxx | 8 - panda/src/pgraph/auxBitplaneAttrib.h | 1 - panda/src/pgraph/clipPlaneAttrib.cxx | 8 - panda/src/pgraph/clipPlaneAttrib.h | 1 - panda/src/pgraph/colorAttrib.cxx | 13 - panda/src/pgraph/colorAttrib.h | 1 - panda/src/pgraph/colorBlendAttrib.cxx | 8 - panda/src/pgraph/colorBlendAttrib.h | 1 - panda/src/pgraph/colorScaleAttrib.cxx | 11 - panda/src/pgraph/colorScaleAttrib.h | 1 - panda/src/pgraph/cullableObject.cxx | 10 +- panda/src/pgraph/cullableObject.h | 1 + panda/src/pgraph/fogAttrib.cxx | 8 - panda/src/pgraph/fogAttrib.h | 1 - panda/src/pgraph/lightAttrib.cxx | 8 - panda/src/pgraph/lightAttrib.h | 1 - panda/src/pgraph/lightRampAttrib.cxx | 8 - panda/src/pgraph/lightRampAttrib.h | 1 - panda/src/pgraph/logicOpAttrib.cxx | 8 - panda/src/pgraph/logicOpAttrib.h | 1 - panda/src/pgraph/materialAttrib.I | 12 +- panda/src/pgraph/materialAttrib.cxx | 57 +- panda/src/pgraph/materialAttrib.h | 5 - panda/src/pgraph/renderAttrib.I | 19 - panda/src/pgraph/renderAttrib.cxx | 8 - panda/src/pgraph/renderAttrib.h | 2 - panda/src/pgraph/renderState.cxx | 84 -- panda/src/pgraph/renderState.h | 6 - panda/src/pgraph/rescaleNormalAttrib.cxx | 16 - panda/src/pgraph/rescaleNormalAttrib.h | 1 - panda/src/pgraph/shaderAttrib.cxx | 20 - panda/src/pgraph/shaderAttrib.h | 1 - panda/src/pgraph/texGenAttrib.cxx | 8 - panda/src/pgraph/texGenAttrib.h | 1 - panda/src/pgraph/texMatrixAttrib.cxx | 22 - panda/src/pgraph/texMatrixAttrib.h | 1 - panda/src/pgraph/textureAttrib.I | 42 +- panda/src/pgraph/textureAttrib.cxx | 80 +- panda/src/pgraph/textureAttrib.h | 9 - panda/src/pgraph/transparencyAttrib.cxx | 15 - panda/src/pgraph/transparencyAttrib.h | 1 - panda/src/pgraphnodes/directionalLight.cxx | 5 +- panda/src/pgraphnodes/directionalLight.h | 2 - panda/src/pgraphnodes/lightLensNode.I | 9 + panda/src/pgraphnodes/lightLensNode.cxx | 2 + panda/src/pgraphnodes/lightLensNode.h | 3 + panda/src/pgraphnodes/pointLight.cxx | 5 +- panda/src/pgraphnodes/pointLight.h | 2 - panda/src/pgraphnodes/shaderGenerator.cxx | 1370 +++++++++++-------- panda/src/pgraphnodes/shaderGenerator.h | 106 +- panda/src/pgraphnodes/spotlight.cxx | 5 +- panda/src/pgraphnodes/spotlight.h | 2 - panda/src/pstatclient/pStatProperties.cxx | 2 +- 61 files changed, 1092 insertions(+), 1190 deletions(-) diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 05126797a1..0d337a803e 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -44,6 +44,7 @@ #include "ambientLight.h" #include "directionalLight.h" #include "pointLight.h" +#include "sphereLight.h" #include "spotlight.h" #include "textureReloadRequest.h" #include "shaderAttrib.h" @@ -1122,6 +1123,28 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, return &LMatrix4::ident_mat(); } } + case Shader::SMO_texscale_i: { + const TexMatrixAttrib *tma; + const TextureAttrib *ta; + if (_target_rs->get_attrib(ta) && _target_rs->get_attrib(tma) && + index < ta->get_num_on_stages()) { + LVecBase3 scale = tma->get_transform(ta->get_on_stage(index))->get_scale(); + t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,scale[0],scale[1],scale[2],0); + return &t; + } else { + return &LMatrix4::ident_mat(); + } + } + case Shader::SMO_texcolor_i: { + const TextureAttrib *ta; + if (_target_rs->get_attrib(ta) && index < ta->get_num_on_stages()) { + TextureStage *ts = ta->get_on_stage(index); + t.set_row(3, ts->get_color()); + return &t; + } else { + return &LMatrix4::zeros_mat(); + } + } case Shader::SMO_tex_is_alpha_i: { // This is a hack so we can support both F_alpha and other formats in the // default shader, to fix font rendering in GLES2 @@ -1156,9 +1179,14 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, nassertr(!np.is_empty(), &LMatrix4::zeros_mat()); const PlaneNode *plane_node; DCAST_INTO_R(plane_node, np.node(), &LMatrix4::zeros_mat()); - LPlane p (plane_node->get_plane()); - p.xform(np.get_net_transform()->get_mat()); // World-space - t = LMatrix4(0,0,0,0,0,0,0,0,0,0,0,0,p[0],p[1],p[2],p[3]); + + // Transform plane to world space + CPT(TransformState) transform = np.get_net_transform(); + LPlane plane = plane_node->get_plane(); + if (!transform->is_identity()) { + plane.xform(transform->get_mat()); + } + t.set_row(3, plane); return &t; } case Shader::SMO_apiview_clipplane_i: { @@ -1195,7 +1223,6 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, } case Shader::SMO_world_to_view: { return &(_scene_setup->get_world_transform()->get_mat()); - break; } case Shader::SMO_view_to_world: { return &(_scene_setup->get_camera_transform()->get_mat()); @@ -1387,6 +1414,62 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, } return fetch_specified_member(NodePath(), name, t); } + case Shader::SMO_light_source_i_packed: { + // The light matrix contains COLOR, ATTENUATION, POSITION, VIEWVECTOR + const LightAttrib *target_light; + _target_rs->get_attrib_def(target_light); + + // We don't count ambient lights, which would be pretty silly to handle + // via this mechanism. + size_t num_lights = target_light->get_num_non_ambient_lights(); + if (index >= 0 && (size_t)index < num_lights) { + NodePath np = target_light->get_on_light((size_t)index); + nassertr(!np.is_empty(), &LMatrix4::ident_mat()); + PandaNode *node = np.node(); + Light *light = node->as_light(); + nassertr(light != nullptr, &LMatrix4::zeros_mat()); + t.set_row(0, light->get_color()); + t.set_row(1, light->get_attenuation()); + + LMatrix4 mat = np.get_net_transform()->get_mat() * + _scene_setup->get_world_transform()->get_mat(); + + if (node->is_of_type(DirectionalLight::get_class_type())) { + LVecBase3 d = mat.xform_vec(((const DirectionalLight *)node)->get_direction()); + d.normalize(); + t.set_row(2, LVecBase4(d, 0)); + t.set_row(3, LVecBase4(-d, 0)); + + } else if (node->is_of_type(LightLensNode::get_class_type())) { + const Lens *lens = ((const LightLensNode *)node)->get_lens(); + + LPoint3 p = mat.xform_point(lens->get_nodal_point()); + t.set_row(3, LVecBase4(p)); + + // For shadowed point light we need to store near/far. + // For spotlight we need to store cutoff angle. + if (node->is_of_type(Spotlight::get_class_type())) { + PN_stdfloat cutoff = ccos(deg_2_rad(lens->get_hfov() * 0.5f)); + LVecBase3 d = -(mat.xform_vec(lens->get_view_vector())); + t.set_cell(1, 3, ((const Spotlight *)node)->get_exponent()); + t.set_row(2, LVecBase4(d, cutoff)); + + } else if (node->is_of_type(PointLight::get_class_type())) { + t.set_cell(1, 3, lens->get_near()); + t.set_cell(3, 3, lens->get_far()); + + if (node->is_of_type(SphereLight::get_class_type())) { + t.set_cell(2, 3, ((const SphereLight *)node)->get_radius()); + } + } + } + } else if (index == 0) { + // Apply the default OpenGL lights otherwise. + // Special exception for light 0, which defaults to white. + t.set_row(0, _light_color_scale); + } + return &t; + } default: nassertr(false /*should never get here*/, &LMatrix4::ident_mat()); return &LMatrix4::ident_mat(); diff --git a/panda/src/display/standardMunger.cxx b/panda/src/display/standardMunger.cxx index 4b6aa01f67..1cb64189da 100644 --- a/panda/src/display/standardMunger.cxx +++ b/panda/src/display/standardMunger.cxx @@ -343,28 +343,29 @@ munge_state_impl(const RenderState *state) { #ifdef HAVE_CG if (_auto_shader) { - CPT(RenderState) shader_state = munged_state->get_auto_shader_state(); GraphicsStateGuardian *gsg = get_gsg(); ShaderGenerator *shader_generator = gsg->get_shader_generator(); if (shader_generator == nullptr) { shader_generator = new ShaderGenerator(gsg); gsg->set_shader_generator(shader_generator); } - if (shader_state->_generated_shader == NULL) { + if (munged_state->_generated_shader == nullptr) { // Cache the generated ShaderAttrib on the shader state. GeomVertexAnimationSpec spec; // Currently we overload this flag to request vertex animation for the // shader generator. const ShaderAttrib *sattr; - shader_state->get_attrib_def(sattr); + munged_state->get_attrib_def(sattr); if (sattr->get_flag(ShaderAttrib::F_hardware_skinning)) { spec.set_hardware(4, true); } - shader_state->_generated_shader = shader_generator->synthesize_shader(shader_state, spec); + munged_state->_generated_shader = shader_generator->synthesize_shader(munged_state, spec); + } + if (munged_state->_generated_shader != nullptr) { + munged_state = munged_state->set_attrib(munged_state->_generated_shader); } - munged_state = munged_state->set_attrib(shader_state->_generated_shader); } #endif diff --git a/panda/src/gobj/material.I b/panda/src/gobj/material.I index a408f2a0e4..777a555200 100644 --- a/panda/src/gobj/material.I +++ b/panda/src/gobj/material.I @@ -327,3 +327,11 @@ INLINE void Material:: set_attrib_lock() { _flags |= F_attrib_lock; } + +/** + * + */ +INLINE int Material:: +get_flags() const { + return _flags; +} diff --git a/panda/src/gobj/material.h b/panda/src/gobj/material.h index eb1a36747e..17344df46a 100644 --- a/panda/src/gobj/material.h +++ b/panda/src/gobj/material.h @@ -128,6 +128,8 @@ PUBLISHED: MAKE_PROPERTY(twoside, get_twoside, set_twoside); public: + INLINE int get_flags() const; + enum Flags { F_ambient = 0x001, F_diffuse = 0x002, @@ -157,8 +159,6 @@ private: int _flags; - friend class MaterialAttrib; - public: static void register_with_read_factory(); virtual void write_datagram(BamWriter *manager, Datagram &me); diff --git a/panda/src/gobj/shader.cxx b/panda/src/gobj/shader.cxx index 7147a108c0..d60e51838f 100644 --- a/panda/src/gobj/shader.cxx +++ b/panda/src/gobj/shader.cxx @@ -450,9 +450,11 @@ cp_dependency(ShaderMatInput inp) { } } if ((inp == SMO_light_ambient) || - (inp == SMO_light_source_i_attrib)) { - dep |= SSD_light; - if (inp == SMO_light_source_i_attrib) { + (inp == SMO_light_source_i_attrib) || + (inp == SMO_light_source_i_packed)) { + dep |= SSD_light | SSD_frame; + if (inp == SMO_light_source_i_attrib || + inp == SMO_light_source_i_packed) { dep |= SSD_view_transform; } } @@ -465,7 +467,7 @@ cp_dependency(ShaderMatInput inp) { (inp == SMO_apiview_clipplane_i)) { dep |= SSD_clip_planes; } - if (inp == SMO_texmat_i || inp == SMO_inv_texmat_i) { + if (inp == SMO_texmat_i || inp == SMO_inv_texmat_i || inp == SMO_texscale_i) { dep |= SSD_tex_matrix; } if ((inp == SMO_window_size) || @@ -483,7 +485,7 @@ cp_dependency(ShaderMatInput inp) { (inp == SMO_apiclip_to_apiview)) { dep |= SSD_projection; } - if (inp == SMO_tex_is_alpha_i) { + if (inp == SMO_tex_is_alpha_i || inp == SMO_texcolor_i) { dep |= SSD_texture | SSD_frame; } @@ -734,6 +736,29 @@ compile_parameter(ShaderArgInfo &p, int *arg_dim) { return true; } + if (pieces[0] == "mat" && pieces[1] == "shadow") { + if ((!cp_errchk_parameter_words(p,3))|| + (!cp_errchk_parameter_in(p)) || + (!cp_errchk_parameter_uniform(p))|| + (!cp_errchk_parameter_float(p,16,16))) { + return false; + } + ShaderMatSpec bind; + bind._id = p._id; + bind._piece = SMP_whole; + bind._func = SMF_compose; + bind._part[1] = SMO_light_source_i_attrib; + bind._arg[1] = InternalName::make("shadowViewMatrix"); + bind._part[0] = SMO_view_to_apiview; + bind._arg[0] = NULL; + bind._index = atoi(pieces[2].c_str()); + + cp_optimize_mat_spec(bind); + _mat_spec.push_back(bind); + _mat_deps |= bind._dep[0] | bind._dep[1]; + return true; + } + // Implement some macros. Macros work by altering the contents of the // 'pieces' array, and then falling through. @@ -833,7 +858,13 @@ compile_parameter(ShaderArgInfo &p, int *arg_dim) { ShaderMatSpec bind; bind._id = p._id; + bind._piece = SMP_whole; bind._func = SMF_compose; + bind._part[1] = SMO_light_source_i_attrib; + bind._arg[1] = InternalName::make("shadowViewMatrix"); + bind._part[0] = SMO_view_to_apiview; + bind._arg[0] = NULL; + bind._index = atoi(pieces[2].c_str()); int next = 1; pieces.push_back(""); @@ -958,6 +989,30 @@ compile_parameter(ShaderArgInfo &p, int *arg_dim) { bind._arg[0] = NULL; bind._part[1] = SMO_identity; bind._arg[1] = NULL; + } else if (pieces[1].compare(0, 5, "light") == 0) { + if (!cp_errchk_parameter_float(p,16,16)) { + return false; + } + bind._id = p._id; + bind._piece = SMP_transpose; + bind._func = SMF_first; + bind._part[0] = SMO_light_source_i_packed; + bind._arg[0] = NULL; + bind._part[1] = SMO_identity; + bind._arg[1] = NULL; + bind._index = atoi(pieces[1].c_str() + 5); + } else if (pieces[1].compare(0, 5, "lspec") == 0) { + if (!cp_errchk_parameter_float(p,3,4)) { + return false; + } + bind._id = p._id; + bind._piece = SMP_row3; + bind._func = SMF_first; + bind._part[0] = SMO_light_source_i_attrib; + bind._arg[0] = InternalName::make("specular"); + bind._part[1] = SMO_identity; + bind._arg[1] = NULL; + bind._index = atoi(pieces[1].c_str() + 5); } else { cp_report_error(p,"Unknown attr parameter."); return false; @@ -1094,6 +1149,52 @@ compile_parameter(ShaderArgInfo &p, int *arg_dim) { return true; } + if (pieces[0] == "texscale") { + if ((!cp_errchk_parameter_words(p,2))|| + (!cp_errchk_parameter_in(p)) || + (!cp_errchk_parameter_uniform(p))|| + (!cp_errchk_parameter_float(p,3,4))) { + return false; + } + ShaderMatSpec bind; + bind._id = p._id; + bind._piece = SMP_row3; + bind._func = SMF_first; + bind._part[0] = SMO_texscale_i; + bind._arg[0] = NULL; + bind._part[1] = SMO_identity; + bind._arg[1] = NULL; + bind._index = atoi(pieces[1].c_str()); + + cp_optimize_mat_spec(bind); + _mat_spec.push_back(bind); + _mat_deps |= bind._dep[0] | bind._dep[1]; + return true; + } + + if (pieces[0] == "texcolor") { + if ((!cp_errchk_parameter_words(p,2))|| + (!cp_errchk_parameter_in(p)) || + (!cp_errchk_parameter_uniform(p))|| + (!cp_errchk_parameter_float(p,3,4))) { + return false; + } + ShaderMatSpec bind; + bind._id = p._id; + bind._piece = SMP_row3; + bind._func = SMF_first; + bind._part[0] = SMO_texcolor_i; + bind._arg[0] = NULL; + bind._part[1] = SMO_identity; + bind._arg[1] = NULL; + bind._index = atoi(pieces[1].c_str()); + + cp_optimize_mat_spec(bind); + _mat_spec.push_back(bind); + _mat_deps |= bind._dep[0] | bind._dep[1]; + return true; + } + if (pieces[0] == "plane") { if ((!cp_errchk_parameter_words(p,2))|| (!cp_errchk_parameter_in(p)) || @@ -1233,9 +1334,9 @@ compile_parameter(ShaderArgInfo &p, int *arg_dim) { } ShaderTexSpec bind; bind._id = p._id; - bind._name = InternalName::make(pieces[1])->append("shadowMap"); - bind._stage = -1; - bind._part = STO_named_input; + bind._name = nullptr; + bind._stage = atoi(pieces[1].c_str()); + bind._part = STO_light_i_shadow_map; switch (p._type) { case SAT_sampler2d: bind._desired_type = Texture::TT_2d_texture; break; case SAT_sampler_cube: bind._desired_type = Texture::TT_cube_map; break; diff --git a/panda/src/gobj/shader.h b/panda/src/gobj/shader.h index 2eb0bc910a..6226b02960 100644 --- a/panda/src/gobj/shader.h +++ b/panda/src/gobj/shader.h @@ -202,6 +202,17 @@ public: // Hack for text rendering. Don't use in user shaders. SMO_tex_is_alpha_i, + SMO_transform_i, + SMO_slider_i, + + SMO_light_source_i_packed, + + // Texture scale component of texture matrix. + SMO_texscale_i, + + // Color of an M_blend texture stage. + SMO_texcolor_i, + SMO_INVALID }; diff --git a/panda/src/pgraph/alphaTestAttrib.cxx b/panda/src/pgraph/alphaTestAttrib.cxx index 8d31c57b12..a302026623 100644 --- a/panda/src/pgraph/alphaTestAttrib.cxx +++ b/panda/src/pgraph/alphaTestAttrib.cxx @@ -94,22 +94,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) AlphaTestAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - // This is only important if the shader subsumes the alpha test, which only - // happens if there is an AuxBitplaneAttrib with ABO_glow. - const AuxBitplaneAttrib *aux; - if (!state->get_attrib(aux) || - (aux->get_outputs() & AuxBitplaneAttrib::ABO_glow) == 0) { - return nullptr; - } else { - return this; - } -} - /** * Tells the BamReader how to create objects of type AlphaTestAttrib. */ diff --git a/panda/src/pgraph/alphaTestAttrib.h b/panda/src/pgraph/alphaTestAttrib.h index 5c38727347..9b547ad2a7 100644 --- a/panda/src/pgraph/alphaTestAttrib.h +++ b/panda/src/pgraph/alphaTestAttrib.h @@ -46,7 +46,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: PandaCompareFunc _mode; diff --git a/panda/src/pgraph/auxBitplaneAttrib.cxx b/panda/src/pgraph/auxBitplaneAttrib.cxx index 1d8a5b3095..8f8e2d8a9f 100644 --- a/panda/src/pgraph/auxBitplaneAttrib.cxx +++ b/panda/src/pgraph/auxBitplaneAttrib.cxx @@ -97,14 +97,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) AuxBitplaneAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return this; -} - /** * Tells the BamReader how to create objects of type AuxBitplaneAttrib. */ diff --git a/panda/src/pgraph/auxBitplaneAttrib.h b/panda/src/pgraph/auxBitplaneAttrib.h index 4c5866c49c..56658f0aa2 100644 --- a/panda/src/pgraph/auxBitplaneAttrib.h +++ b/panda/src/pgraph/auxBitplaneAttrib.h @@ -72,7 +72,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: int _outputs; diff --git a/panda/src/pgraph/clipPlaneAttrib.cxx b/panda/src/pgraph/clipPlaneAttrib.cxx index c95f9437c4..102ddf6ad3 100644 --- a/panda/src/pgraph/clipPlaneAttrib.cxx +++ b/panda/src/pgraph/clipPlaneAttrib.cxx @@ -833,14 +833,6 @@ invert_compose_impl(const RenderAttrib *other) const { return other; } -/** - * - */ -CPT(RenderAttrib) ClipPlaneAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return this; -} - /** * This is patterned after TextureAttrib::sort_on_stages(), but since * planeNodes don't actually require sorting, this only empties the _filtered diff --git a/panda/src/pgraph/clipPlaneAttrib.h b/panda/src/pgraph/clipPlaneAttrib.h index c695e0391d..e62c57857a 100644 --- a/panda/src/pgraph/clipPlaneAttrib.h +++ b/panda/src/pgraph/clipPlaneAttrib.h @@ -98,7 +98,6 @@ protected: virtual size_t get_hash_impl() const; virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; virtual CPT(RenderAttrib) invert_compose_impl(const RenderAttrib *other) const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: INLINE void check_filtered() const; diff --git a/panda/src/pgraph/colorAttrib.cxx b/panda/src/pgraph/colorAttrib.cxx index 7e007851fb..42e7c5578d 100644 --- a/panda/src/pgraph/colorAttrib.cxx +++ b/panda/src/pgraph/colorAttrib.cxx @@ -132,19 +132,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) ColorAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - // For a ColorAttrib, the only relevant information is the type: is it flat- - // shaded or vertex-shaded? The actual color value is read by the shader - // from the graphics state. - - ColorAttrib *attrib = new ColorAttrib(_type, LColor(1.0f, 1.0f, 1.0f, 1.0f)); - return return_new(attrib); -} - /** * Quantizes the color color to the nearest multiple of 1000, just to prevent * runaway accumulation of only slightly-different ColorAttribs. diff --git a/panda/src/pgraph/colorAttrib.h b/panda/src/pgraph/colorAttrib.h index 54b57b8abb..9df0878559 100644 --- a/panda/src/pgraph/colorAttrib.h +++ b/panda/src/pgraph/colorAttrib.h @@ -52,7 +52,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: void quantize_color(); diff --git a/panda/src/pgraph/colorBlendAttrib.cxx b/panda/src/pgraph/colorBlendAttrib.cxx index 92fe98ab79..9341f2d808 100644 --- a/panda/src/pgraph/colorBlendAttrib.cxx +++ b/panda/src/pgraph/colorBlendAttrib.cxx @@ -148,14 +148,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) ColorBlendAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return this; -} - /** * Tells the BamReader how to create objects of type ColorBlendAttrib. */ diff --git a/panda/src/pgraph/colorBlendAttrib.h b/panda/src/pgraph/colorBlendAttrib.h index 6d66747218..0530d077ce 100644 --- a/panda/src/pgraph/colorBlendAttrib.h +++ b/panda/src/pgraph/colorBlendAttrib.h @@ -121,7 +121,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: Mode _mode; diff --git a/panda/src/pgraph/colorScaleAttrib.cxx b/panda/src/pgraph/colorScaleAttrib.cxx index 0975757604..79394a51f1 100644 --- a/panda/src/pgraph/colorScaleAttrib.cxx +++ b/panda/src/pgraph/colorScaleAttrib.cxx @@ -229,17 +229,6 @@ invert_compose_impl(const RenderAttrib *other) const { return return_new(attrib); } -/** - * - */ -CPT(RenderAttrib) ColorScaleAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - // A ColorScaleAttrib doesn't directly contribute to the auto-shader - // contents--instead, the shader is always written to query attr_colorscale - // at runtime. So the attrib itself means nothing to the shader. - return NULL; -} - /** * Quantizes the color scale to the nearest multiple of 1000, just to prevent * runaway accumulation of only slightly-different ColorScaleAttribs. diff --git a/panda/src/pgraph/colorScaleAttrib.h b/panda/src/pgraph/colorScaleAttrib.h index aa3ace8738..b5e986e239 100644 --- a/panda/src/pgraph/colorScaleAttrib.h +++ b/panda/src/pgraph/colorScaleAttrib.h @@ -55,7 +55,6 @@ protected: virtual size_t get_hash_impl() const; virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; virtual CPT(RenderAttrib) invert_compose_impl(const RenderAttrib *other) const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: void quantize_scale(); diff --git a/panda/src/pgraph/cullableObject.cxx b/panda/src/pgraph/cullableObject.cxx index 3d18dc6748..0630513696 100644 --- a/panda/src/pgraph/cullableObject.cxx +++ b/panda/src/pgraph/cullableObject.cxx @@ -34,6 +34,7 @@ CullableObject::FormatMap CullableObject::_format_map; LightMutex CullableObject::_format_lock; +PStatCollector CullableObject::_munge_pcollector("*:Munge"); PStatCollector CullableObject::_munge_geom_pcollector("*:Munge:Geom"); PStatCollector CullableObject::_munge_sprites_pcollector("*:Munge:Sprites"); PStatCollector CullableObject::_munge_sprites_verts_pcollector("*:Munge:Sprites:Verts"); @@ -55,7 +56,7 @@ munge_geom(GraphicsStateGuardianBase *gsg, GeomMunger *munger, nassertr(munger != nullptr, false); Thread *current_thread = traverser->get_current_thread(); - PStatTimer timer(_munge_geom_pcollector, current_thread); + PStatTimer timer(_munge_pcollector, current_thread); if (_geom != nullptr) { GraphicsStateGuardianBase *gsg = traverser->get_gsg(); int gsg_bits = gsg->get_supported_geom_rendering(); @@ -123,8 +124,11 @@ munge_geom(GraphicsStateGuardianBase *gsg, GeomMunger *munger, // Now invoke the munger to ensure the resulting geometry is in a GSG- // friendly form. - if (!munger->munge_geom(_geom, _munged_data, force, current_thread)) { - return false; + { + PStatTimer timer(_munge_geom_pcollector, current_thread); + if (!munger->munge_geom(_geom, _munged_data, force, current_thread)) { + return false; + } } // If we have prepared it for skinning via the shader generator, mark a diff --git a/panda/src/pgraph/cullableObject.h b/panda/src/pgraph/cullableObject.h index a8595da9f5..b02d7c79be 100644 --- a/panda/src/pgraph/cullableObject.h +++ b/panda/src/pgraph/cullableObject.h @@ -108,6 +108,7 @@ private: static FormatMap _format_map; static LightMutex _format_lock; + static PStatCollector _munge_pcollector; static PStatCollector _munge_geom_pcollector; static PStatCollector _munge_sprites_pcollector; static PStatCollector _munge_sprites_verts_pcollector; diff --git a/panda/src/pgraph/fogAttrib.cxx b/panda/src/pgraph/fogAttrib.cxx index 0606298fa4..87e12086d4 100644 --- a/panda/src/pgraph/fogAttrib.cxx +++ b/panda/src/pgraph/fogAttrib.cxx @@ -100,14 +100,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) FogAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return this; -} - /** * Tells the BamReader how to create objects of type FogAttrib. */ diff --git a/panda/src/pgraph/fogAttrib.h b/panda/src/pgraph/fogAttrib.h index 28a84600e0..0076ccfc82 100644 --- a/panda/src/pgraph/fogAttrib.h +++ b/panda/src/pgraph/fogAttrib.h @@ -43,7 +43,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: PT(Fog) _fog; diff --git a/panda/src/pgraph/lightAttrib.cxx b/panda/src/pgraph/lightAttrib.cxx index 2fb58c106d..21b5150dcc 100644 --- a/panda/src/pgraph/lightAttrib.cxx +++ b/panda/src/pgraph/lightAttrib.cxx @@ -850,14 +850,6 @@ invert_compose_impl(const RenderAttrib *other) const { return other; } -/** - * - */ -CPT(RenderAttrib) LightAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return this; -} - /** * Makes sure the lights are sorted in order of priority. Also counts the * number of non-ambient lights. diff --git a/panda/src/pgraph/lightAttrib.h b/panda/src/pgraph/lightAttrib.h index eaa86ff895..25fc1fa68a 100644 --- a/panda/src/pgraph/lightAttrib.h +++ b/panda/src/pgraph/lightAttrib.h @@ -103,7 +103,6 @@ protected: virtual size_t get_hash_impl() const; virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; virtual CPT(RenderAttrib) invert_compose_impl(const RenderAttrib *other) const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: INLINE void check_sorted() const; diff --git a/panda/src/pgraph/lightRampAttrib.cxx b/panda/src/pgraph/lightRampAttrib.cxx index 38ed81affe..7a7637a35f 100644 --- a/panda/src/pgraph/lightRampAttrib.cxx +++ b/panda/src/pgraph/lightRampAttrib.cxx @@ -254,14 +254,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) LightRampAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return this; -} - /** * Tells the BamReader how to create objects of type LightRampAttrib. */ diff --git a/panda/src/pgraph/lightRampAttrib.h b/panda/src/pgraph/lightRampAttrib.h index b1ac147376..ccba3501cd 100644 --- a/panda/src/pgraph/lightRampAttrib.h +++ b/panda/src/pgraph/lightRampAttrib.h @@ -61,7 +61,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: LightRampMode _mode; diff --git a/panda/src/pgraph/logicOpAttrib.cxx b/panda/src/pgraph/logicOpAttrib.cxx index b632bb1b45..28381dfc5b 100644 --- a/panda/src/pgraph/logicOpAttrib.cxx +++ b/panda/src/pgraph/logicOpAttrib.cxx @@ -88,14 +88,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) LogicOpAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return RenderAttribRegistry::quick_get_global_ptr()->get_slot_default(_attrib_slot); -} - /** * Tells the BamReader how to create objects of type LogicOpAttrib. */ diff --git a/panda/src/pgraph/logicOpAttrib.h b/panda/src/pgraph/logicOpAttrib.h index 988836f8d1..81621b51dc 100644 --- a/panda/src/pgraph/logicOpAttrib.h +++ b/panda/src/pgraph/logicOpAttrib.h @@ -64,7 +64,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: Operation _op; diff --git a/panda/src/pgraph/materialAttrib.I b/panda/src/pgraph/materialAttrib.I index 3cb7f9e6be..d0cfc1ad14 100644 --- a/panda/src/pgraph/materialAttrib.I +++ b/panda/src/pgraph/materialAttrib.I @@ -15,7 +15,7 @@ * Use MaterialAttrib::make() to construct a new MaterialAttrib object. */ INLINE MaterialAttrib:: -MaterialAttrib() : _flags(0) { +MaterialAttrib() { } /** @@ -24,7 +24,7 @@ MaterialAttrib() : _flags(0) { */ INLINE bool MaterialAttrib:: is_off() const { - return _flags == 0; + return _material == nullptr; } /** @@ -35,11 +35,3 @@ INLINE Material *MaterialAttrib:: get_material() const { return _material; } - -/** - * Equivalent to get_material()->get_flags(). - */ -INLINE int MaterialAttrib:: -get_material_flags() const { - return _flags; -} diff --git a/panda/src/pgraph/materialAttrib.cxx b/panda/src/pgraph/materialAttrib.cxx index d8eee605d7..baeac4dc38 100644 --- a/panda/src/pgraph/materialAttrib.cxx +++ b/panda/src/pgraph/materialAttrib.cxx @@ -30,8 +30,6 @@ make(Material *material) { MaterialAttrib *attrib = new MaterialAttrib; attrib->_material = material; material->set_attrib_lock(); - attrib->_flags = material->_flags; - nassertr(attrib->_flags & Material::F_attrib_lock, nullptr); return return_new(attrib); } @@ -64,30 +62,6 @@ output(ostream &out) const { out << *_material; } else if (is_off()) { out << "(off)"; - } else { - // This is a state returned from get_auto_shader_attrib(). - out << "(on"; -#ifndef NDEBUG - if (_flags & Material::F_ambient) { - out << " amb"; - } - if (_flags & Material::F_diffuse) { - out << " diff"; - } - if (_flags & Material::F_specular) { - out << " spec"; - } - if (_flags & Material::F_emission) { - out << " emit"; - } - if (_flags & Material::F_local) { - out << " local"; - } - if (_flags & Material::F_twoside) { - out << " twoside"; - } -#endif - out << ")"; } } @@ -113,7 +87,7 @@ compare_to_impl(const RenderAttrib *other) const { if (_material != ta->_material) { return _material < ta->_material ? -1 : 1; } - return _flags < ta->_flags; + return 0; } /** @@ -124,26 +98,7 @@ compare_to_impl(const RenderAttrib *other) const { */ size_t MaterialAttrib:: get_hash_impl() const { - size_t hash = 0; - hash = pointer_hash::add_hash(hash, _material); - hash = int_hash::add_hash(hash, _flags); - return hash; -} - -/** - * - */ -CPT(RenderAttrib) MaterialAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - if (_material == nullptr) { - return this; - } else { - // Make a copy, but only with the flags, not with the material itself. - MaterialAttrib *attrib = new MaterialAttrib(); - attrib->_material = nullptr; - attrib->_flags = _flags; - return return_new(attrib); - } + return pointer_hash::add_hash(0, _material); } /** @@ -174,13 +129,7 @@ complete_pointers(TypedWritable **p_list, BamReader *manager) { int pi = RenderAttrib::complete_pointers(p_list, manager); TypedWritable *material = p_list[pi++]; - if (material != nullptr) { - _material = DCAST(Material, material); - _flags = _material->_flags | Material::F_attrib_lock; - } else { - _material = nullptr; - _flags = 0; - } + _material = DCAST(Material, material); return pi; } diff --git a/panda/src/pgraph/materialAttrib.h b/panda/src/pgraph/materialAttrib.h index 28bd90f8bd..8da67c3ada 100644 --- a/panda/src/pgraph/materialAttrib.h +++ b/panda/src/pgraph/materialAttrib.h @@ -36,9 +36,6 @@ PUBLISHED: INLINE bool is_off() const; INLINE Material *get_material() const; -public: - INLINE int get_material_flags() const; - PUBLISHED: MAKE_PROPERTY(material, get_material); @@ -48,11 +45,9 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: PT(Material) _material; - int _flags; PUBLISHED: static int get_class_slot() { diff --git a/panda/src/pgraph/renderAttrib.I b/panda/src/pgraph/renderAttrib.I index 9e431d7d6a..5df0d0774e 100644 --- a/panda/src/pgraph/renderAttrib.I +++ b/panda/src/pgraph/renderAttrib.I @@ -82,25 +82,6 @@ get_unique() const { return return_unique((RenderAttrib *)this); } -/** - * Returns the variant of this RenderAttrib that's most relevant for - * associating with an auto-generated shader. This should be a new - * RenderAttrib of the same type as this one, with any superfluous data set to - * neutral. Only the parts of the attrib that contribute to the shader should - * be reflected in the returned attrib. The idea is to associate the auto- - * generated shader with the most neutral form of all states, to allow it to - * be shared across as many RenderState objects as possible. - * - * If this RenderAttrib is completely irrelevant to the auto-shader, this - * should return NULL to indicate that the attrib won't be assocaited with the - * shader at all. In this case the attrib does not contribute to the shader - * meaningfully. - */ -INLINE CPT(RenderAttrib) RenderAttrib:: -get_auto_shader_attrib(const RenderState *state) const { - return get_auto_shader_attrib_impl(state); -} - /** * Calculates a suitable hash value for phash_map. */ diff --git a/panda/src/pgraph/renderAttrib.cxx b/panda/src/pgraph/renderAttrib.cxx index 10db3de16d..37b65f3b2a 100644 --- a/panda/src/pgraph/renderAttrib.cxx +++ b/panda/src/pgraph/renderAttrib.cxx @@ -112,14 +112,6 @@ cull_callback(CullTraverser *, const CullTraverserData &) const { return true; } -/** - * - */ -CPT(RenderAttrib) RenderAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return NULL; -} - /** * This method overrides ReferenceCount::unref() to clear the pointer from the * global object pool when its reference count goes to zero. diff --git a/panda/src/pgraph/renderAttrib.h b/panda/src/pgraph/renderAttrib.h index 9d6ed83a1a..1ffda64a16 100644 --- a/panda/src/pgraph/renderAttrib.h +++ b/panda/src/pgraph/renderAttrib.h @@ -71,7 +71,6 @@ PUBLISHED: INLINE int compare_to(const RenderAttrib &other) const; INLINE size_t get_hash() const; INLINE CPT(RenderAttrib) get_unique() const; - INLINE CPT(RenderAttrib) get_auto_shader_attrib(const RenderState *state) const; virtual bool unref() const FINAL; @@ -170,7 +169,6 @@ protected: virtual size_t get_hash_impl() const; virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; virtual CPT(RenderAttrib) invert_compose_impl(const RenderAttrib *other) const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; void output_comparefunc(ostream &out, PandaCompareFunc fn) const; public: diff --git a/panda/src/pgraph/renderState.cxx b/panda/src/pgraph/renderState.cxx index 43a81bf83e..ee53a7d4a4 100644 --- a/panda/src/pgraph/renderState.cxx +++ b/panda/src/pgraph/renderState.cxx @@ -64,7 +64,6 @@ TypeHandle RenderState::_type_handle; RenderState:: RenderState() : _flags(0), - _auto_shader_state(NULL), _lock("RenderState") { if (_states == (States *)NULL) { @@ -88,7 +87,6 @@ RenderState:: RenderState(const RenderState ©) : _filled_slots(copy._filled_slots), _flags(0), - _auto_shader_state(NULL), _lock("RenderState") { // Copy over the attributes. @@ -131,14 +129,6 @@ RenderState:: nassertv(_saved_entry == -1); nassertv(_composition_cache.is_empty() && _invert_composition_cache.is_empty()); - // Make sure the _auto_shader_state cache pointer is cleared. - if (_auto_shader_state != (const RenderState *)NULL) { - if (_auto_shader_state != this) { - cache_unref_delete(_auto_shader_state); - } - _auto_shader_state = NULL; - } - // If this was true at the beginning of the destructor, but is no longer // true now, probably we've been double-deleted. nassertv(get_ref_count() == 0); @@ -665,24 +655,6 @@ unref() const { return false; } -/** - * Returns the base RenderState that should have the generated_shader stored - * within it, for generated shader states. The returned object might be the - * same as this object, or it might be a different RenderState with certain - * attributes removed, or set to their default values. - * - * The point is to avoid needless regeneration of the shader attrib by storing - * the generated shader on a common RenderState object, with all irrelevant - * attributes removed. - */ -const RenderState *RenderState:: -get_auto_shader_state() const { - if (_auto_shader_state == (const RenderState *)NULL) { - ((RenderState *)this)->assign_auto_shader_state(); - } - return _auto_shader_state; -} - /** * */ @@ -1259,54 +1231,6 @@ do_calc_hash() { _flags |= F_hash_known; } -/** - * Sets _auto_shader_state to the appropriate RenderState object pointer, - * either the same pointer as this object, or some other (simpler) - * RenderState. - */ -void RenderState:: -assign_auto_shader_state() { - CPT(RenderState) state = do_calc_auto_shader_state(); - - { - LightReMutexHolder holder(*_states_lock); - if (_auto_shader_state == (const RenderState *)NULL) { - _auto_shader_state = state; - if (_auto_shader_state != this) { - _auto_shader_state->cache_ref(); - } - } - } -} - -/** - * Returns the appropriate RenderState that should be used to store the auto - * shader pointer for nodes that shader this RenderState. - */ -CPT(RenderState) RenderState:: -do_calc_auto_shader_state() { - RenderState *state = new RenderState; - - SlotMask mask = _filled_slots; - int slot = mask.get_lowest_on_bit(); - while (slot >= 0) { - const Attribute &attrib = _attributes[slot]; - nassertr(attrib._attrib != (RenderAttrib *)NULL, this); - CPT(RenderAttrib) new_attrib = attrib._attrib->get_auto_shader_attrib(this); - if (new_attrib != NULL) { - nassertr(new_attrib->get_slot() == slot, this); - state->_attributes[slot].set(new_attrib, 0); - state->_filled_slots.set_bit(slot); - } - - mask.clear_bit(slot); - slot = mask.get_lowest_on_bit(); - } - - return return_new(state); -} - - /** * This function is used to share a common RenderState pointer for all * equivalent RenderState objects. @@ -1705,14 +1629,6 @@ void RenderState:: remove_cache_pointers() { nassertv(_states_lock->debug_is_locked()); - // First, make sure the _auto_shader_state cache pointer is cleared. - if (_auto_shader_state != (const RenderState *)NULL) { - if (_auto_shader_state != this) { - cache_unref_delete(_auto_shader_state); - } - _auto_shader_state = NULL; - } - // Fortunately, since we added CompositionCache records in pairs, we know // exactly the set of RenderState objects that have us in their cache: it's // the same set of RenderState objects that we have in our own cache. diff --git a/panda/src/pgraph/renderState.h b/panda/src/pgraph/renderState.h index a1b1813ea9..0cdcca07a1 100644 --- a/panda/src/pgraph/renderState.h +++ b/panda/src/pgraph/renderState.h @@ -130,8 +130,6 @@ PUBLISHED: EXTENSION(PyObject *get_composition_cache() const); EXTENSION(PyObject *get_invert_composition_cache() const); - const RenderState *get_auto_shader_state() const; - void output(ostream &out) const; void write(ostream &out, int indent_level) const; @@ -173,8 +171,6 @@ private: INLINE bool do_node_unref() const; INLINE void calc_hash(); void do_calc_hash(); - void assign_auto_shader_state(); - CPT(RenderState) do_calc_auto_shader_state(); class CompositionCycleDescEntry { public: @@ -317,8 +313,6 @@ private: int _draw_order; size_t _hash; - const RenderState *_auto_shader_state; - enum Flags { F_checked_bin_index = 0x000001, F_checked_cull_callback = 0x000002, diff --git a/panda/src/pgraph/rescaleNormalAttrib.cxx b/panda/src/pgraph/rescaleNormalAttrib.cxx index e9d081e43c..fbc4d59274 100644 --- a/panda/src/pgraph/rescaleNormalAttrib.cxx +++ b/panda/src/pgraph/rescaleNormalAttrib.cxx @@ -80,22 +80,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) RescaleNormalAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - // We currently only support M_normalize in the ShaderGenerator. - /*if (_mode == M_none || _mode == M_normalize) { - return this; - } else { - return RescaleNormalAttrib::make(M_normalize); - }*/ - // Actually, we currently ignore this attribute in the shader generator, - // and always normalize the normals. It's too much of a bother. - return nullptr; -} - /** * Tells the BamReader how to create objects of type RescaleNormalAttrib. */ diff --git a/panda/src/pgraph/rescaleNormalAttrib.h b/panda/src/pgraph/rescaleNormalAttrib.h index d76d51e6de..746db42717 100644 --- a/panda/src/pgraph/rescaleNormalAttrib.h +++ b/panda/src/pgraph/rescaleNormalAttrib.h @@ -57,7 +57,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: Mode _mode; diff --git a/panda/src/pgraph/shaderAttrib.cxx b/panda/src/pgraph/shaderAttrib.cxx index 04d6196aa2..67bba2d196 100644 --- a/panda/src/pgraph/shaderAttrib.cxx +++ b/panda/src/pgraph/shaderAttrib.cxx @@ -695,26 +695,6 @@ compose_impl(const RenderAttrib *other) const { return return_new(attr); } -/** - * - */ -CPT(RenderAttrib) ShaderAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - // For a ShaderAttrib, we only need to preserve the auto-shader flags. - // Custom shaders, and custom shader inputs, aren't relevant to the shader - // generator. - ShaderAttrib *attrib = new ShaderAttrib; - attrib->_auto_shader = _auto_shader; - attrib->_has_shader = _has_shader; - attrib->_auto_normal_on = _auto_normal_on; - attrib->_auto_glow_on = _auto_glow_on; - attrib->_auto_gloss_on = _auto_gloss_on; - attrib->_auto_ramp_on = _auto_ramp_on; - attrib->_auto_shadow_on = _auto_shadow_on; - attrib->_flags = _flags; - return return_new(attrib); -} - /** * Factory method to generate a Shader object */ diff --git a/panda/src/pgraph/shaderAttrib.h b/panda/src/pgraph/shaderAttrib.h index 719106c0b6..c719ce1791 100644 --- a/panda/src/pgraph/shaderAttrib.h +++ b/panda/src/pgraph/shaderAttrib.h @@ -127,7 +127,6 @@ protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: diff --git a/panda/src/pgraph/texGenAttrib.cxx b/panda/src/pgraph/texGenAttrib.cxx index c7ace978c0..451eacab83 100644 --- a/panda/src/pgraph/texGenAttrib.cxx +++ b/panda/src/pgraph/texGenAttrib.cxx @@ -432,14 +432,6 @@ invert_compose_impl(const RenderAttrib *other) const { return return_new(attrib); } -/** - * - */ -CPT(RenderAttrib) TexGenAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - return this; -} - /** * This method is to be called after the _stages map has been built up * internally through some artificial means; it copies the appropriate diff --git a/panda/src/pgraph/texGenAttrib.h b/panda/src/pgraph/texGenAttrib.h index c2b0e87132..3cf0323edc 100644 --- a/panda/src/pgraph/texGenAttrib.h +++ b/panda/src/pgraph/texGenAttrib.h @@ -68,7 +68,6 @@ protected: virtual size_t get_hash_impl() const; virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; virtual CPT(RenderAttrib) invert_compose_impl(const RenderAttrib *other) const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: class ModeDef; diff --git a/panda/src/pgraph/texMatrixAttrib.cxx b/panda/src/pgraph/texMatrixAttrib.cxx index 84538033fd..4e2e1adba8 100644 --- a/panda/src/pgraph/texMatrixAttrib.cxx +++ b/panda/src/pgraph/texMatrixAttrib.cxx @@ -415,28 +415,6 @@ invert_compose_impl(const RenderAttrib *other) const { return return_new(attrib); } -/** - * - */ -CPT(RenderAttrib) TexMatrixAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - // For a TexMatrixAttrib, the particular matrix per TextureStage isn't - // important, just whether there is a matrix at all. So we create a new - // state with an identity matrix everywhere there is a matrix at all in the - // original. - - TexMatrixAttrib *attrib = new TexMatrixAttrib; - - Stages::const_iterator ai; - for (ai = _stages.begin(); ai != _stages.end(); ++ai) { - StageNode sn((*ai)._stage); - sn._transform = TransformState::make_identity(); - attrib->_stages.insert(attrib->_stages.end(), sn); - } - - return return_new(attrib); -} - /** * Tells the BamReader how to create objects of type TexMatrixAttrib. */ diff --git a/panda/src/pgraph/texMatrixAttrib.h b/panda/src/pgraph/texMatrixAttrib.h index b0b7790851..36e06b1549 100644 --- a/panda/src/pgraph/texMatrixAttrib.h +++ b/panda/src/pgraph/texMatrixAttrib.h @@ -67,7 +67,6 @@ protected: virtual size_t get_hash_impl() const; virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; virtual CPT(RenderAttrib) invert_compose_impl(const RenderAttrib *other) const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: INLINE void check_stage_list() const; diff --git a/panda/src/pgraph/textureAttrib.I b/panda/src/pgraph/textureAttrib.I index 6649c8d87a..da1feca0be 100644 --- a/panda/src/pgraph/textureAttrib.I +++ b/panda/src/pgraph/textureAttrib.I @@ -140,26 +140,6 @@ get_on_texture(TextureStage *stage) const { return NULL; } -/** - * Returns the type of the texture associated with the indicated stage. It is - * an error to call this if has_on_stage(stage) returns false. - * - * This method is no different than get_on_texture(stage)->get_texture_type(); - * it merely exists to address a corner case for the shader generator. - */ -INLINE Texture::TextureType TextureAttrib:: -get_on_texture_type(TextureStage *stage) const { - Stages::const_iterator si; - si = _on_stages.find(StageNode(stage)); - nassertr(si != _on_stages.end(), Texture::TT_2d_texture); - - if ((*si)._texture == nullptr) { - return (*si)._texture_type; - } else { - return (*si)._texture->get_texture_type(); - } -} - /** * Returns the sampler associated with the indicated stage, or the one * associated with its texture if no custom stage has been specified. It is @@ -235,26 +215,6 @@ is_identity() const { return _on_stages.empty() && _off_stages.empty() && !_off_all_stages; } -/** - * Call only on a state returned by get_auto_shader_attrib. - */ -bool TextureAttrib:: -on_stage_affects_rgb(size_t n) const { - nassertr(n < _render_stages.size(), false); - StageNode *stage = _render_stages[n]; - return stage->_texture_affects_rgb; -} - -/** - * Call only on a state returned by get_auto_shader_attrib. - */ -bool TextureAttrib:: -on_stage_affects_alpha(size_t n) const { - nassertr(n < _render_stages.size(), false); - StageNode *stage = _render_stages[n]; - return stage->_texture_affects_alpha; -} - /** * Confirms whether the _on_stages list is still sorted. It will become * unsorted if someone calls TextureStage::set_sort(). @@ -263,7 +223,7 @@ on_stage_affects_alpha(size_t n) const { */ INLINE void TextureAttrib:: check_sorted() const { - if (_sort_seq != TextureStage::get_sort_seq() && !_sort_seq.is_fresh()) { + if (_sort_seq != TextureStage::get_sort_seq()) { ((TextureAttrib *)this)->sort_on_stages(); } } diff --git a/panda/src/pgraph/textureAttrib.cxx b/panda/src/pgraph/textureAttrib.cxx index 8c1b4833ff..9b30906e1f 100644 --- a/panda/src/pgraph/textureAttrib.cxx +++ b/panda/src/pgraph/textureAttrib.cxx @@ -385,19 +385,9 @@ output(ostream &out) const { const StageNode &sn = *(*ri); TextureStage *stage = sn._stage; Texture *tex = sn._texture; + out << " " << stage->get_name(); if (tex != nullptr) { - out << " " << stage->get_name() << ":" << tex->get_name(); - } else { - out << " " << stage->get_name() << ":(" << sn._texture_type; - if (sn._texture_affects_rgb) { - out << " rgb"; - if (sn._texture_affects_alpha) { - out << "a"; - } - } else if (sn._texture_affects_alpha) { - out << " alpha"; - } - out << ")"; + out << ":" << tex->get_name(); } if (sn._override != 0) { out << "^" << sn._override; @@ -513,19 +503,6 @@ compare_to_impl(const RenderAttrib *other) const { } } - if (texture == nullptr) { - // This is an attribute returned by get_auto_shader_attrib_impl. - if ((*si)._texture_type != (*osi)._texture_type) { - return (*si)._texture_type < (*osi)._texture_type ? -1 : 1; - } - if ((*si)._texture_affects_rgb != (*osi)._texture_affects_rgb) { - return (*si)._texture_affects_rgb < (*osi)._texture_affects_rgb ? -1 : 1; - } - if ((*si)._texture_affects_alpha != (*osi)._texture_affects_alpha) { - return (*si)._texture_affects_alpha < (*osi)._texture_affects_alpha ? -1 : 1; - } - } - ++si; ++osi; } @@ -589,13 +566,6 @@ get_hash_impl() const { hash = pointer_hash::add_hash(hash, sn._texture); hash = int_hash::add_hash(hash, (int)sn._implicit_sort); hash = int_hash::add_hash(hash, sn._override); - - if (sn._texture == nullptr) { - // This is an attribute returned by get_auto_shader_attrib_impl. - hash = int_hash::add_hash(hash, (int)sn._texture_type); - hash = int_hash::add_hash(hash, (int)sn._texture_affects_rgb); - hash = int_hash::add_hash(hash, (int)sn._texture_affects_alpha); - } } // This bool value goes here, between the two lists, to differentiate @@ -767,52 +737,6 @@ invert_compose_impl(const RenderAttrib *other) const { return other; } -/** - * - */ -CPT(RenderAttrib) TextureAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - if (_on_stages.empty()) { - // Having no stages is the same as not applying a texture attribute. - return nullptr; - } - - // We make a texture attribute that does not store the texture and sampler, - // so that we don't have to generate a shader for every possible texture. - // We do have to store the few texture properties that do affect the - // generated shader. - PT(TextureAttrib) attrib = new TextureAttrib; - attrib->_on_stages = _on_stages; - attrib->sort_on_stages(); - - Stages::iterator si; - for (si = attrib->_on_stages.begin(); si != attrib->_on_stages.end(); ++si) { - Texture::Format format = (*si)._texture->get_format(); - (*si)._texture_type = (*si)._texture->get_texture_type(); - (*si)._texture_affects_rgb = (format != Texture::F_alpha); - (*si)._texture_affects_alpha = Texture::has_alpha(format); - (*si)._texture = nullptr; - (*si)._has_sampler = false; - - // We will no longer be composing or sorting this state so we can get rid - // of these values. - (*si)._override = 0; - (*si)._implicit_sort = 0; - - // Exception to optimize a common case: if the first texture is an RGB - // texture, we don't care about whether it affects the alpha channel. - if (attrib->_render_stages[0] == &(*si) && - (*si)._texture_affects_rgb && !(*si)._texture_affects_alpha) { - (*si)._texture_affects_alpha = true; - } - } - - // Prevent check_sorted() from being called on this state. - attrib->_sort_seq = UpdateSeq::fresh(); - - return return_new(attrib); -} - /** * Tells the BamReader how to create objects of type TextureAttrib. */ diff --git a/panda/src/pgraph/textureAttrib.h b/panda/src/pgraph/textureAttrib.h index 9f1c13e3c8..efb1ad786d 100644 --- a/panda/src/pgraph/textureAttrib.h +++ b/panda/src/pgraph/textureAttrib.h @@ -59,7 +59,6 @@ PUBLISHED: INLINE int get_ff_tc_index(int n) const; INLINE bool has_on_stage(TextureStage *stage) const; INLINE Texture *get_on_texture(TextureStage *stage) const; - INLINE Texture::TextureType get_on_texture_type(TextureStage *stage) const; INLINE const SamplerState &get_on_sampler(TextureStage *stage) const; INLINE int get_on_stage_override(TextureStage *stage) const; @@ -82,8 +81,6 @@ PUBLISHED: CPT(RenderAttrib) unify_texture_stages(TextureStage *stage) const; public: - INLINE bool on_stage_affects_rgb(size_t n) const; - INLINE bool on_stage_affects_alpha(size_t n) const; CPT(TextureAttrib) filter_to_max(int max_texture_stages) const; virtual bool lower_attrib_can_override() const; @@ -97,7 +94,6 @@ protected: virtual size_t get_hash_impl() const; virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const; virtual CPT(RenderAttrib) invert_compose_impl(const RenderAttrib *other) const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: INLINE void check_sorted() const; @@ -117,11 +113,6 @@ private: int _ff_tc_index; unsigned int _implicit_sort; int _override; - - // These fields are used by the shader generator. - Texture::TextureType _texture_type : 16; - bool _texture_affects_rgb : 8; - bool _texture_affects_alpha : 8; }; class CompareTextureStagePriorities { diff --git a/panda/src/pgraph/transparencyAttrib.cxx b/panda/src/pgraph/transparencyAttrib.cxx index d998004f09..ad105f3214 100644 --- a/panda/src/pgraph/transparencyAttrib.cxx +++ b/panda/src/pgraph/transparencyAttrib.cxx @@ -109,21 +109,6 @@ get_hash_impl() const { return hash; } -/** - * - */ -CPT(RenderAttrib) TransparencyAttrib:: -get_auto_shader_attrib_impl(const RenderState *state) const { - if (_mode == TransparencyAttrib::M_alpha) { - return this; - } else if (_mode == TransparencyAttrib::M_premultiplied_alpha || - _mode == TransparencyAttrib::M_dual) { - return return_new(new TransparencyAttrib(M_alpha)); - } else { - return nullptr; - } -} - /** * Tells the BamReader how to create objects of type TransparencyAttrib. */ diff --git a/panda/src/pgraph/transparencyAttrib.h b/panda/src/pgraph/transparencyAttrib.h index ebd7f4f157..ef890aa158 100644 --- a/panda/src/pgraph/transparencyAttrib.h +++ b/panda/src/pgraph/transparencyAttrib.h @@ -59,7 +59,6 @@ public: protected: virtual int compare_to_impl(const RenderAttrib *other) const; virtual size_t get_hash_impl() const; - virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const; private: Mode _mode; diff --git a/panda/src/pgraphnodes/directionalLight.cxx b/panda/src/pgraphnodes/directionalLight.cxx index f0d84ffb9a..9d198fac6f 100644 --- a/panda/src/pgraphnodes/directionalLight.cxx +++ b/panda/src/pgraphnodes/directionalLight.cxx @@ -56,9 +56,7 @@ fillin(DatagramIterator &scan, BamReader *) { */ DirectionalLight:: DirectionalLight(const string &name) : - LightLensNode(name, new OrthographicLens()), - _has_specular_color(false) -{ + LightLensNode(name, new OrthographicLens()) { _lenses[0]._lens->set_interocular_distance(0); } @@ -69,7 +67,6 @@ DirectionalLight(const string &name) : DirectionalLight:: DirectionalLight(const DirectionalLight ©) : LightLensNode(copy), - _has_specular_color(copy._has_specular_color), _cycler(copy._cycler) { } diff --git a/panda/src/pgraphnodes/directionalLight.h b/panda/src/pgraphnodes/directionalLight.h index 5f0404b9a8..ea09627bd7 100644 --- a/panda/src/pgraphnodes/directionalLight.h +++ b/panda/src/pgraphnodes/directionalLight.h @@ -59,8 +59,6 @@ public: int light_id); private: - bool _has_specular_color; - // This is the data that must be cycled between pipeline stages. class EXPCL_PANDA_PGRAPHNODES CData : public CycleData { public: diff --git a/panda/src/pgraphnodes/lightLensNode.I b/panda/src/pgraphnodes/lightLensNode.I index 8fff5b2533..eb2b192f97 100644 --- a/panda/src/pgraphnodes/lightLensNode.I +++ b/panda/src/pgraphnodes/lightLensNode.I @@ -11,6 +11,15 @@ * @date 2002-03-26 */ +/** + * Returns true if this light defines a specular color, false if the specular + * color is derived automatically from the light color. + */ +INLINE bool LightLensNode:: +has_specular_color() const { + return _has_specular_color; +} + /** * Returns whether this light is configured to cast shadows or not. */ diff --git a/panda/src/pgraphnodes/lightLensNode.cxx b/panda/src/pgraphnodes/lightLensNode.cxx index a843123cff..f68b7084ec 100644 --- a/panda/src/pgraphnodes/lightLensNode.cxx +++ b/panda/src/pgraphnodes/lightLensNode.cxx @@ -28,6 +28,7 @@ TypeHandle LightLensNode::_type_handle; LightLensNode:: LightLensNode(const string &name, Lens *lens) : Camera(name, lens), + _has_specular_color(false), _attrib_count(0) { set_active(false); @@ -63,6 +64,7 @@ LightLensNode(const LightLensNode ©) : _shadow_caster(copy._shadow_caster), _sb_size(copy._sb_size), _sb_sort(-10), + _has_specular_color(copy._has_specular_color), _attrib_count(0) { } diff --git a/panda/src/pgraphnodes/lightLensNode.h b/panda/src/pgraphnodes/lightLensNode.h index 11c259e5e5..02dcd9bbff 100644 --- a/panda/src/pgraphnodes/lightLensNode.h +++ b/panda/src/pgraphnodes/lightLensNode.h @@ -35,6 +35,8 @@ PUBLISHED: LightLensNode(const string &name, Lens *lens = new PerspectiveLens()); virtual ~LightLensNode(); + INLINE bool has_specular_color() const; + INLINE bool is_shadow_caster() const; INLINE void set_shadow_caster(bool caster); INLINE void set_shadow_caster(bool caster, int buffer_xsize, int buffer_ysize, int sort = -10); @@ -54,6 +56,7 @@ protected: LVecBase2i _sb_size; bool _shadow_caster; + bool _has_specular_color; int _sb_sort; // This is really a map of GSG -> GraphicsOutput. diff --git a/panda/src/pgraphnodes/pointLight.cxx b/panda/src/pgraphnodes/pointLight.cxx index d3f7192248..caa8d86261 100644 --- a/panda/src/pgraphnodes/pointLight.cxx +++ b/panda/src/pgraphnodes/pointLight.cxx @@ -61,9 +61,7 @@ fillin(DatagramIterator &scan, BamReader *manager) { */ PointLight:: PointLight(const string &name) : - LightLensNode(name), - _has_specular_color(false) -{ + LightLensNode(name) { PT(Lens) lens; lens = new PerspectiveLens(90, 90); lens->set_interocular_distance(0); @@ -98,7 +96,6 @@ PointLight(const string &name) : PointLight:: PointLight(const PointLight ©) : LightLensNode(copy), - _has_specular_color(copy._has_specular_color), _cycler(copy._cycler) { } diff --git a/panda/src/pgraphnodes/pointLight.h b/panda/src/pgraphnodes/pointLight.h index c0907dba01..1029e1d41d 100644 --- a/panda/src/pgraphnodes/pointLight.h +++ b/panda/src/pgraphnodes/pointLight.h @@ -63,8 +63,6 @@ public: int light_id); private: - bool _has_specular_color; - // This is the data that must be cycled between pipeline stages. class EXPCL_PANDA_PGRAPHNODES CData : public CycleData { public: diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index e78ac65f3a..62206f1d69 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -40,24 +40,27 @@ #include "directionalLight.h" #include "rescaleNormalAttrib.h" #include "pointLight.h" +#include "sphereLight.h" #include "spotlight.h" #include "lightLensNode.h" #include "lvector4.h" #include "config_pgraphnodes.h" +#include "pStatTimer.h" TypeHandle ShaderGenerator::_type_handle; #ifdef HAVE_CG +static PStatCollector lookup_collector("*:Munge:ShaderGen:Lookup"); +static PStatCollector synthesize_collector("*:Munge:ShaderGen:Synthesize"); + /** * Create a ShaderGenerator. This has no state, except possibly to cache * certain results. The parameter that must be passed is the GSG to which the * shader generator belongs. */ ShaderGenerator:: -ShaderGenerator(GraphicsStateGuardianBase *gsg) : - _gsg(gsg) { - +ShaderGenerator(GraphicsStateGuardianBase *gsg) { // The ATTR# input semantics seem to map to generic vertex attributes in // both arbvp1 and glslv, which behave more consistently. However, they // don't exist in Direct3D 9. Use this silly little check for now. @@ -66,6 +69,10 @@ ShaderGenerator(GraphicsStateGuardianBase *gsg) : #else _use_generic_attr = false; #endif + + // Do we want to use the ARB_shadow extension? This also allows us to use + // hardware shadows PCF. + _use_shadow_filter = gsg->get_supports_shadow_filter(); } /** @@ -159,13 +166,8 @@ alloc_freg() { case 6: _ftregs_used += 1; return "TEXCOORD6"; case 7: _ftregs_used += 1; return "TEXCOORD7"; } -/* - * We really shouldn't rely on COLOR fregs, since the clamping can have - * unexpected side-effects. switch (_fcregs_used) { case 0: _fcregs_used += - * 1; return "COLOR0"; case 1: _fcregs_used += 1; return "COLOR1"; } These - * don't exist in arbvp1arbfp1, though they're reportedly supported by other - * profiles. - */ + // NB. We really shouldn't use the COLOR fregs, since the clamping can have + // unexpected side-effects. switch (_ftregs_used) { case 8: _ftregs_used += 1; return "TEXCOORD8"; case 9: _ftregs_used += 1; return "TEXCOORD9"; @@ -184,340 +186,334 @@ alloc_freg() { * analysis are stored in instance variables of the Shader Generator. */ void ShaderGenerator:: -analyze_renderstate(const RenderState *rs) { - clear_analysis(); +analyze_renderstate(ShaderKey &key, const RenderState *rs) { + const ShaderAttrib *shader_attrib; + rs->get_attrib_def(shader_attrib); + nassertv(shader_attrib->auto_shader()); // verify_enforce_attrib_lock(); - _state = rs; const AuxBitplaneAttrib *aux_bitplane; rs->get_attrib_def(aux_bitplane); - int outputs = aux_bitplane->get_outputs(); + key._outputs = aux_bitplane->get_outputs(); // Decide whether or not we need alpha testing or alpha blending. - + bool have_alpha_test = false; + bool have_alpha_blend = false; const AlphaTestAttrib *alpha_test; rs->get_attrib_def(alpha_test); - if ((alpha_test->get_mode() != RenderAttrib::M_none)&& - (alpha_test->get_mode() != RenderAttrib::M_always)) { - _have_alpha_test = true; + if (alpha_test->get_mode() != RenderAttrib::M_none && + alpha_test->get_mode() != RenderAttrib::M_always) { + have_alpha_test = true; } const ColorBlendAttrib *color_blend; rs->get_attrib_def(color_blend); if (color_blend->get_mode() != ColorBlendAttrib::M_none) { - _have_alpha_blend = true; + have_alpha_blend = true; } const TransparencyAttrib *transparency; rs->get_attrib_def(transparency); - if ((transparency->get_mode() == TransparencyAttrib::M_alpha)|| - (transparency->get_mode() == TransparencyAttrib::M_premultiplied_alpha)|| - (transparency->get_mode() == TransparencyAttrib::M_dual)) { - _have_alpha_blend = true; + if (transparency->get_mode() == TransparencyAttrib::M_alpha || + transparency->get_mode() == TransparencyAttrib::M_premultiplied_alpha || + transparency->get_mode() == TransparencyAttrib::M_dual) { + have_alpha_blend = true; } // Decide what to send to the framebuffer alpha, if anything. - - if (outputs & AuxBitplaneAttrib::ABO_glow) { - if (_have_alpha_blend) { - _calc_primary_alpha = true; - _out_primary_glow = false; - _disable_alpha_write = true; - } else if (_have_alpha_test) { - _calc_primary_alpha = true; - _out_primary_glow = true; - _subsume_alpha_test = true; - } else { - _calc_primary_alpha = false; - _out_primary_glow = true; - } - } else { - if (_have_alpha_blend || _have_alpha_test) { - _calc_primary_alpha = true; + if (key._outputs & AuxBitplaneAttrib::ABO_glow) { + if (have_alpha_blend) { + key._outputs &= ~AuxBitplaneAttrib::ABO_glow; + key._disable_alpha_write = true; + } else if (have_alpha_test) { + // Subsume the alpha test in our shader. + key._alpha_test_mode = alpha_test->get_mode(); + key._alpha_test_ref = alpha_test->get_reference_alpha(); } } - // Determine what to put into the aux bitplane. - - _out_aux_normal = (outputs & AuxBitplaneAttrib::ABO_aux_normal) ? true:false; - _out_aux_glow = (outputs & AuxBitplaneAttrib::ABO_aux_glow) ? true:false; - _out_aux_any = (_out_aux_normal || _out_aux_glow); - - if (_out_aux_normal) { - _need_eye_normal = true; + if (have_alpha_blend || have_alpha_test) { + key._calc_primary_alpha = true; } - // Count number of textures. - - const TextureAttrib *texture; - rs->get_attrib_def(texture); - _num_textures = texture->get_num_on_stages(); - // Determine whether or not vertex colors or flat colors are present. - const ColorAttrib *color; rs->get_attrib_def(color); - if (color->get_color_type() == ColorAttrib::T_vertex) { - _vertex_colors = true; - } else if (color->get_color_type() == ColorAttrib::T_flat) { - _flat_colors = true; - } - - // Find the material. + key._color_type = color->get_color_type(); + // Store the material flags (not the material values itself). const MaterialAttrib *material; rs->get_attrib_def(material); - _material_flags = material->get_material_flags(); + if (material->get_material() != nullptr) { + key._material_flags = material->get_material()->get_flags(); + } // Break out the lights by type. - - _shadows = false; const LightAttrib *la; rs->get_attrib_def(la); + bool have_ambient = false; for (int i = 0; i < la->get_num_on_lights(); ++i) { - NodePath light = la->get_on_light(i); - nassertv(!light.is_empty()); - PandaNode *light_obj = light.node(); - nassertv(light_obj != (PandaNode *)NULL); + NodePath np = la->get_on_light(i); + nassertv(!np.is_empty()); + PandaNode *node = np.node(); + nassertv(node != nullptr); - if (light_obj->is_ambient_light()) { - _have_ambient = true; - _lighting = true; + if (node->is_ambient_light()) { + have_ambient = true; + key._lighting = true; + } else { + ShaderKey::LightInfo info; + info._type = node->get_type(); + info._flags = 0; - } else if (light_obj->is_of_type(LightLensNode::get_class_type())) { - _lights_np.push_back(light); - _lights.push_back((LightLensNode *)light_obj); - if (((const LightLensNode *)light_obj)->is_shadow_caster()) { - _shadows = true; + if (node->is_of_type(LightLensNode::get_class_type())) { + const LightLensNode *llnode = (const LightLensNode *)node; + if (shader_attrib->auto_shadow_on() && llnode->is_shadow_caster()) { + info._flags |= ShaderKey::LF_has_shadows; + } + if (llnode->has_specular_color()) { + info._flags |= ShaderKey::LF_has_specular_color; + } } - _lighting = true; - _need_eye_normal = true; + + key._lights.push_back(info); + key._lighting = true; } } + bool normal_mapping = key._lighting && shader_attrib->auto_normal_on(); + // See if there is a normal map, height map, gloss map, or glow map. Also // check if anything has TexGen. + const TextureAttrib *texture; + rs->get_attrib_def(texture); const TexGenAttrib *tex_gen; rs->get_attrib_def(tex_gen); - for (int i = 0; i < _num_textures; ++i) { + const TexMatrixAttrib *tex_matrix; + rs->get_attrib_def(tex_matrix); + + size_t num_textures = texture->get_num_on_stages(); + for (size_t i = 0; i < num_textures; ++i) { TextureStage *stage = texture->get_on_stage(i); - TextureStage::Mode mode = stage->get_mode(); - if ((mode == TextureStage::M_normal)|| - (mode == TextureStage::M_normal_height)|| - (mode == TextureStage::M_normal_gloss)) { - _map_index_normal = i; + Texture *tex = texture->get_on_texture(stage); + nassertd(tex != nullptr) continue; + + ShaderKey::TextureInfo info; + info._type = tex->get_texture_type(); + info._mode = stage->get_mode(); + info._flags = 0; + + // While we look at the mode, determine whether we need to change the mode + // in order to reflect disabled features. + switch (info._mode) { + case TextureStage::M_modulate: + { + Texture::Format format = tex->get_format(); + if (format != Texture::F_alpha) { + info._flags |= ShaderKey::TF_has_rgb; + } + if (Texture::has_alpha(format)) { + info._flags |= ShaderKey::TF_has_alpha; + } + } + break; + + case TextureStage::M_modulate_glow: + if (shader_attrib->auto_glow_on()) { + info._flags = ShaderKey::TF_map_glow; + } else { + info._mode = TextureStage::M_modulate; + info._flags = ShaderKey::TF_has_rgb; + } + break; + + case TextureStage::M_modulate_gloss: + if (shader_attrib->auto_gloss_on()) { + info._flags = ShaderKey::TF_map_glow; + } else { + info._mode = TextureStage::M_modulate; + info._flags = ShaderKey::TF_has_rgb; + } + break; + + case TextureStage::M_normal_height: + if (parallax_mapping_samples == 0) { + info._mode = TextureStage::M_normal; + } else if (!shader_attrib->auto_normal_on() || + (!key._lighting && (key._outputs & AuxBitplaneAttrib::ABO_aux_normal) == 0)) { + info._mode = TextureStage::M_height; + info._flags = ShaderKey::TF_has_alpha; + } else { + info._flags = ShaderKey::TF_map_normal | ShaderKey::TF_map_height; + } + break; + + case TextureStage::M_normal_gloss: + if (!shader_attrib->auto_gloss_on() || !key._lighting) { + info._mode = TextureStage::M_normal; + } else if (!shader_attrib->auto_normal_on()) { + info._mode = TextureStage::M_gloss; + } else { + info._flags = ShaderKey::TF_map_normal | ShaderKey::TF_map_gloss; + } + break; } - if ((mode == TextureStage::M_height)||(mode == TextureStage::M_normal_height)) { - _map_index_height = i; + + // In fact, perhaps this stage should be disabled altogether? + switch (info._mode) { + case TextureStage::M_normal: + if (!shader_attrib->auto_normal_on() || + (!key._lighting && (key._outputs & AuxBitplaneAttrib::ABO_aux_normal) == 0)) { + continue; + } else { + info._flags = ShaderKey::TF_map_normal; + } + break; + case TextureStage::M_glow: + if (shader_attrib->auto_glow_on()) { + info._flags = ShaderKey::TF_map_glow; + } else { + continue; + } + break; + case TextureStage::M_gloss: + if (key._lighting && shader_attrib->auto_gloss_on()) { + info._flags = ShaderKey::TF_map_gloss; + } else { + continue; + } + break; + case TextureStage::M_height: + if (parallax_mapping_samples > 0) { + info._flags = ShaderKey::TF_map_height; + } else { + continue; + } + break; } - if ((mode == TextureStage::M_glow)||(mode == TextureStage::M_modulate_glow)) { - _map_index_glow = i; - } - if ((mode == TextureStage::M_gloss)|| - (mode == TextureStage::M_modulate_gloss)|| - (mode == TextureStage::M_normal_gloss)) { - _map_index_gloss = i; - } - if (mode == TextureStage::M_height) { - _map_height_in_alpha = false; - } - if (mode == TextureStage::M_normal_height) { - _map_height_in_alpha = true; - } - if (tex_gen->has_stage(stage)) { - switch (tex_gen->get_mode(stage)) { - case TexGenAttrib::M_world_position: - _need_world_position = true; - break; - case TexGenAttrib::M_world_normal: - _need_world_normal = true; - break; - case TexGenAttrib::M_eye_position: - _need_eye_position = true; - break; - case TexGenAttrib::M_eye_normal: - _need_eye_normal = true; - break; - default: - break; + + // Check if this state has a texture matrix to transform the texture + // coordinates. + if (tex_matrix->has_stage(stage)) { + CPT(TransformState) transform = tex_matrix->get_transform(stage); + if (!transform->is_identity()) { + // Optimize for common case: if we only have a scale component, we + // can get away with fewer shader inputs and operations. + if (transform->has_components() && !transform->has_nonzero_shear() && + transform->get_pos() == LPoint3::zero() && + transform->get_hpr() == LVecBase3::zero()) { + info._flags |= ShaderKey::TF_has_texscale; + } else { + info._flags |= ShaderKey::TF_has_texmat; + } } } - } - // Determine whether we should normalize the normals. - /*const RescaleNormalAttrib *rescale; - rs->get_attrib_def(rescale); - - _normalize_normals = (rescale->get_mode() != RescaleNormalAttrib::M_none); - */ - // Actually, let's always normalize the normals for now. This helps to - // reduce combinatoric explosion of shaders. - _normalize_normals = true; - - // Decide which material modes need to be calculated. - - if (_lighting) { - _have_diffuse = true; - } - - if (_lighting && (_material_flags & Material::F_emission) != 0) { - _have_emission = true; - } - - if (_lighting) { - if (_material_flags & Material::F_specular) { - _have_specular = true; - } else if (_map_index_gloss >= 0) { - _have_specular = true; + if (tex_gen->has_stage(stage)) { + info._texcoord_name = nullptr; + info._gen_mode = tex_gen->get_mode(stage); + } else { + info._texcoord_name = stage->get_texcoord_name(); + info._gen_mode = TexGenAttrib::M_off; } - _need_eye_position = true; + // If we have this rare, special mode, just include a pointer to the + // TextureStage object, because I can't be bothered to bloat the shader + // key with all these extra relevant properties. + if (stage->get_mode() == TextureStage::M_combine) { + info._stage = stage; + } + + key._textures.push_back(info); + key._texture_flags |= info._flags; } // Decide whether to separate ambient and diffuse calculations. - - if (_have_ambient && _have_diffuse) { - if (_material_flags & Material::F_ambient) { - _separate_ambient_diffuse = true; + if (have_ambient) { + if (key._material_flags & Material::F_ambient) { + key._have_separate_ambient = true; } else { - if (_material_flags & Material::F_diffuse) { - _separate_ambient_diffuse = true; + if (key._material_flags & Material::F_diffuse) { + key._have_separate_ambient = true; } else { - _separate_ambient_diffuse = false; + key._have_separate_ambient = false; } } } - const LightRampAttrib *light_ramp; - if (_lighting && rs->get_attrib(light_ramp) && - (light_ramp->get_mode() != LightRampAttrib::LRT_identity)) { - _separate_ambient_diffuse = true; + if (shader_attrib->auto_ramp_on()) { + const LightRampAttrib *light_ramp; + if (rs->get_attrib(light_ramp)) { + key._light_ramp = light_ramp; + if (key._lighting) { + key._have_separate_ambient = true; + } + } } - // Do we want to use the ARB_shadow extension? This also allows us to use - // hardware shadows PCF. - - _use_shadow_filter = _gsg->get_supports_shadow_filter(); - - // Does the shader need material properties as input? - - _need_material_props = - (_have_ambient && (_material_flags & Material::F_ambient) != 0) || - (_have_diffuse && (_material_flags & Material::F_diffuse) != 0) || - (_have_emission && (_material_flags & Material::F_emission) != 0) || - (_have_specular && (_material_flags & Material::F_specular) != 0); - // Check for clip planes. - const ClipPlaneAttrib *clip_plane; rs->get_attrib_def(clip_plane); - _num_clip_planes = clip_plane->get_num_on_planes(); - if (_num_clip_planes > 0) { - _need_world_position = true; - } - - const ShaderAttrib *shader_attrib; - rs->get_attrib_def(shader_attrib); - if (shader_attrib->auto_shader()) { - _auto_normal_on = shader_attrib->auto_normal_on(); - _auto_glow_on = shader_attrib->auto_glow_on(); - _auto_gloss_on = shader_attrib->auto_gloss_on(); - _auto_ramp_on = shader_attrib->auto_ramp_on(); - _auto_shadow_on = shader_attrib->auto_shadow_on(); - } + key._num_clip_planes = clip_plane->get_num_on_planes(); // Check for fog. const FogAttrib *fog; if (rs->get_attrib(fog) && !fog->is_off()) { - _fog = true; + key._fog_mode = (int)fog->get_fog()->get_mode() + 1; } } -/** - * Called after analyze_renderstate to discard all the results of the - * analysis. This is generally done after shader generation is complete. - */ -void ShaderGenerator:: -clear_analysis() { - _vertex_colors = false; - _flat_colors = false; - _lighting = false; - _shadows = false; - _fog = false; - _have_ambient = false; - _have_diffuse = false; - _have_emission = false; - _have_specular = false; - _separate_ambient_diffuse = false; - _map_index_normal = -1; - _map_index_glow = -1; - _map_index_gloss = -1; - _map_index_height = -1; - _map_height_in_alpha = false; - _calc_primary_alpha = false; - _have_alpha_test = false; - _have_alpha_blend = false; - _subsume_alpha_test = false; - _disable_alpha_write = false; - _num_clip_planes = 0; - _use_shadow_filter = false; - _out_primary_glow = false; - _out_aux_normal = false; - _out_aux_glow = false; - _out_aux_any = false; - _material_flags = 0; - _need_material_props = false; - _need_world_position = false; - _need_world_normal = false; - _need_eye_position = false; - _need_eye_normal = false; - _normalize_normals = false; - _auto_normal_on = false; - _auto_glow_on = false; - _auto_gloss_on = false; - _auto_ramp_on = false; - _auto_shadow_on = false; - - _lights.clear(); - _lights_np.clear(); -} - -/** - * Creates a ShaderAttrib given a generated shader's body. Also inserts the - * lights into the shader attrib. - */ -CPT(RenderAttrib) ShaderGenerator:: -create_shader_attrib(const string &txt) { - PT(Shader) shader = Shader::make(txt, Shader::SL_Cg); - CPT(RenderAttrib) shattr = ShaderAttrib::make(shader); - - for (size_t i = 0; i < _lights.size(); ++i) { - shattr = DCAST(ShaderAttrib, shattr)->set_shader_input(InternalName::make("light", i), _lights_np[i]); - } - return shattr; -} - /** * This is the routine that implements the next-gen fixed function pipeline by * synthesizing a shader. It also takes care of setting up any buffers needed * to produce the requested effects. * - * Currently supports: - flat colors - vertex colors - lighting - normal maps, - * but not multiple - gloss maps, but not multiple - glow maps, but not - * multiple - materials, but not updates to materials - 2D textures - all - * texture stage modes, including combine modes - color scale attrib - light - * ramps (for cartoon shading) - shadow mapping - most texgen modes - - * texmatrix - 1D/2D/3D textures, cube textures, 2D tex arrays - - * linear/exp/exp2 fog - animation + * Currently supports: + * - flat colors + * - vertex colors + * - lighting + * - normal maps, but not multiple + * - gloss maps, but not multiple + * - glow maps, but not multiple + * - materials, but not updates to materials + * - 2D textures + * - all texture stage modes, including combine modes + * - color scale attrib + * - light ramps (for cartoon shading) + * - shadow mapping + * - most texgen modes + * - texmatrix + * - 1D/2D/3D textures, cube textures, 2D tex arrays + * - linear/exp/exp2 fog + * - animation * - * Not yet supported: - dot3_rgb and dot3_rgba combine modes + * Not yet supported: + * - dot3_rgb and dot3_rgba combine modes * - * Potential optimizations - omit attenuation calculations if attenuation off + * Potential optimizations + * - omit attenuation calculations if attenuation off * */ CPT(ShaderAttrib) ShaderGenerator:: synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { - analyze_renderstate(rs); + ShaderKey key; + + // First look up the state key in the table of already generated shaders. + { + PStatTimer timer(lookup_collector); + key._anim_spec = anim; + analyze_renderstate(key, rs); + + GeneratedShaders::const_iterator si; + si = _generated_shaders.find(key); + if (si != _generated_shaders.end()) { + // We've already generated a shader for this state. + return si->second; + } + } + + PStatTimer timer(synthesize_collector); + reset_register_allocator(); if (pgraphnodes_cat.is_debug()) { @@ -556,7 +552,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { normal_vreg = "NORMAL"; } - if (_vertex_colors) { + if (key._color_type == ColorAttrib::T_vertex) { // Reserve COLOR0 color_vreg = _use_generic_attr ? "ATTR3" : "COLOR0"; _vcregs_used = 1; @@ -573,32 +569,65 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { rs->write(text, 2); text << "*/\n"; + int map_index_normal = -1; + int map_index_glow = -1; + int map_index_gloss = -1; + + // Figure out whether we need to calculate any of these variables. + bool need_world_position = (key._num_clip_planes > 0); + bool need_world_normal = false; + bool need_eye_position = key._lighting; + bool need_eye_normal = !key._lights.empty() || ((key._outputs & AuxBitplaneAttrib::ABO_aux_normal) != 0); + + bool have_specular = false; + if (key._lighting) { + if (key._material_flags & Material::F_specular) { + have_specular = true; + } else if ((key._texture_flags & ShaderKey::TF_map_gloss) != 0) { + have_specular = true; + } + } + text << "void vshader(\n"; - const TextureAttrib *texture = DCAST(TextureAttrib, rs->get_attrib_def(TextureAttrib::get_class_slot())); - const TexGenAttrib *tex_gen = DCAST(TexGenAttrib, rs->get_attrib_def(TexGenAttrib::get_class_slot())); - for (int i = 0; i < _num_textures; ++i) { - TextureStage *stage = texture->get_on_stage(i); - if (!tex_gen->has_stage(stage)) { - const InternalName *texcoord_name = stage->get_texcoord_name(); + for (size_t i = 0; i < key._textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = key._textures[i]; - if (texcoord_fregs.count(texcoord_name) == 0) { + switch (tex._gen_mode) { + case TexGenAttrib::M_world_position: + need_world_position = true; + break; + case TexGenAttrib::M_world_normal: + need_world_normal = true; + break; + case TexGenAttrib::M_eye_position: + need_eye_position = true; + break; + case TexGenAttrib::M_eye_normal: + need_eye_normal = true; + break; + default: + break; + } + + if (tex._texcoord_name != nullptr) { + if (texcoord_fregs.count(tex._texcoord_name) == 0) { const char *freg = alloc_freg(); - string tcname = texcoord_name->join("_"); - texcoord_fregs[texcoord_name] = freg; + texcoord_fregs[tex._texcoord_name] = freg; + string tcname = tex._texcoord_name->join("_"); text << "\t in float4 vtx_" << tcname << " : " << alloc_vreg() << ",\n"; text << "\t out float4 l_" << tcname << " : " << freg << ",\n"; } } - if ((_map_index_normal == i && (_lighting || _out_aux_normal) && _auto_normal_on) || _map_index_height == i) { - const InternalName *texcoord_name = stage->get_texcoord_name(); + if (tex._flags & (ShaderKey::TF_map_normal | ShaderKey::TF_map_height)) { PT(InternalName) tangent_name = InternalName::get_tangent(); PT(InternalName) binormal_name = InternalName::get_binormal(); - if (texcoord_name != InternalName::get_texcoord()) { - tangent_name = tangent_name->append(texcoord_name->get_basename()); - binormal_name = binormal_name->append(texcoord_name->get_basename()); + if (tex._texcoord_name != nullptr && + tex._texcoord_name != InternalName::get_texcoord()) { + tangent_name = tangent_name->append(tex._texcoord_name->get_basename()); + binormal_name = binormal_name->append(tex._texcoord_name->get_basename()); } tangent_input = tangent_name->join("_"); binormal_input = binormal_name->join("_"); @@ -606,84 +635,87 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t in float4 vtx_" << tangent_input << " : " << alloc_vreg() << ",\n"; text << "\t in float4 vtx_" << binormal_input << " : " << alloc_vreg() << ",\n"; - if (_map_index_normal == i && (_lighting || _out_aux_normal) && _auto_normal_on) { + if (tex._flags & ShaderKey::TF_map_normal) { + map_index_normal = i; tangent_freg = alloc_freg(); binormal_freg = alloc_freg(); text << "\t out float4 l_tangent : " << tangent_freg << ",\n"; text << "\t out float4 l_binormal : " << binormal_freg << ",\n"; } } + + if (tex._flags & ShaderKey::TF_map_glow) { + map_index_glow = i; + } + if (tex._flags & ShaderKey::TF_map_gloss) { + map_index_gloss = i; + } } - if (_vertex_colors) { + if (key._color_type == ColorAttrib::T_vertex) { text << "\t in float4 vtx_color : " << color_vreg << ",\n"; text << "\t out float4 l_color : COLOR0,\n"; } - if (_need_world_position || _need_world_normal) { + if (need_world_position || need_world_normal) { text << "\t uniform float4x4 trans_model_to_world,\n"; } - if (_need_world_position) { + if (need_world_position) { world_position_freg = alloc_freg(); text << "\t out float4 l_world_position : " << world_position_freg << ",\n"; } - if (_need_world_normal) { + if (need_world_normal) { world_normal_freg = alloc_freg(); text << "\t out float4 l_world_normal : " << world_normal_freg << ",\n"; } - if (_need_eye_position) { + if (need_eye_position) { text << "\t uniform float4x4 trans_model_to_view,\n"; eye_position_freg = alloc_freg(); text << "\t out float4 l_eye_position : " << eye_position_freg << ",\n"; - } else if ((_lighting || _out_aux_normal) && (_map_index_normal >= 0 && _auto_normal_on)) { + } else if (key._texture_flags & ShaderKey::TF_map_normal) { text << "\t uniform float4x4 trans_model_to_view,\n"; } - if (_need_eye_normal) { + if (need_eye_normal) { eye_normal_freg = alloc_freg(); text << "\t uniform float4x4 tpose_view_to_model,\n"; text << "\t out float4 l_eye_normal : " << eye_normal_freg << ",\n"; } - if (_map_index_height >= 0 || _need_world_normal || _need_eye_normal) { + if ((key._texture_flags & ShaderKey::TF_map_height) != 0 || need_world_normal || need_eye_normal) { text << "\t in float3 vtx_normal : " << normal_vreg << ",\n"; } - if (_map_index_height >= 0) { + if (key._texture_flags & ShaderKey::TF_map_height) { text << "\t uniform float4 mspos_view,\n"; text << "\t out float3 l_eyevec,\n"; } - if (_lighting && _shadows && _auto_shadow_on) { - for (size_t i = 0; i < _lights.size(); ++i) { - if (_lights[i]->_shadow_caster) { - lightcoord_fregs.push_back(alloc_freg()); - if (_lights[i]->is_of_type(PointLight::get_class_type())) { - text << "\t uniform float4x4 trans_model_to_light" << i << ",\n"; - } else { - text << "\t uniform float4x4 trans_model_to_clip_of_light" << i << ",\n"; - } - text << "\t out float4 l_lightcoord" << i << " : " << lightcoord_fregs[i] << ",\n"; - } else { - lightcoord_fregs.push_back(NULL); - } + for (size_t i = 0; i < key._lights.size(); ++i) { + const ShaderKey::LightInfo &light = key._lights[i]; + if (light._flags & ShaderKey::LF_has_shadows) { + lightcoord_fregs.push_back(alloc_freg()); + text << "\t uniform float4x4 mat_shadow_" << i << ",\n"; + text << "\t out float4 l_lightcoord" << i << " : " << lightcoord_fregs[i] << ",\n"; + } else { + lightcoord_fregs.push_back(nullptr); } } - if (_fog) { + if (key._fog_mode != 0) { hpos_freg = alloc_freg(); text << "\t out float4 l_hpos : " << hpos_freg << ",\n"; } - if (anim.get_animation_type() == GeomEnums::AT_hardware && - anim.get_num_transforms() > 0) { + if (key._anim_spec.get_animation_type() == GeomEnums::AT_hardware && + key._anim_spec.get_num_transforms() > 0) { int num_transforms; - if (anim.get_indexed_transforms()) { + if (key._anim_spec.get_indexed_transforms()) { num_transforms = 120; } else { - num_transforms = anim.get_num_transforms(); + num_transforms = key._anim_spec.get_num_transforms(); } - if (transform_weight_vreg == NULL) { + if (transform_weight_vreg == nullptr) { transform_weight_vreg = alloc_vreg(); } - if (transform_index_vreg == NULL) { + if (transform_index_vreg == nullptr) { transform_index_vreg = alloc_vreg(); } text << "\t uniform float4x4 tbl_transforms[" << num_transforms << "],\n"; text << "\t in float4 vtx_transform_weight : " << transform_weight_vreg << ",\n"; - if (anim.get_indexed_transforms()) { + if (key._anim_spec.get_indexed_transforms()) { text << "\t in uint4 vtx_transform_index : " << transform_index_vreg << ",\n"; } } @@ -692,50 +724,46 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t uniform float4x4 mat_modelproj\n"; text << ") {\n"; - if (anim.get_animation_type() == GeomEnums::AT_hardware && - anim.get_num_transforms() > 0) { + if (key._anim_spec.get_animation_type() == GeomEnums::AT_hardware && + key._anim_spec.get_num_transforms() > 0) { - if (!anim.get_indexed_transforms()) { + if (!key._anim_spec.get_indexed_transforms()) { text << "\t const uint4 vtx_transform_index = uint4(0, 1, 2, 3);\n"; } text << "\t float4x4 matrix = tbl_transforms[vtx_transform_index.x] * vtx_transform_weight.x"; - if (anim.get_num_transforms() > 1) { + if (key._anim_spec.get_num_transforms() > 1) { text << "\n\t + tbl_transforms[vtx_transform_index.y] * vtx_transform_weight.y"; } - if (anim.get_num_transforms() > 2) { + if (key._anim_spec.get_num_transforms() > 2) { text << "\n\t + tbl_transforms[vtx_transform_index.z] * vtx_transform_weight.z"; } - if (anim.get_num_transforms() > 3) { + if (key._anim_spec.get_num_transforms() > 3) { text << "\n\t + tbl_transforms[vtx_transform_index.w] * vtx_transform_weight.w"; } text << ";\n"; text << "\t vtx_position = mul(matrix, vtx_position);\n"; - if (_need_world_normal || _need_eye_normal) { + if (need_world_normal || need_eye_normal) { text << "\t vtx_normal = mul((float3x3)matrix, vtx_normal);\n"; } } text << "\t l_position = mul(mat_modelproj, vtx_position);\n"; - if (_fog) { + if (key._fog_mode != 0) { text << "\t l_hpos = l_position;\n"; } - if (_need_world_position) { + if (need_world_position) { text << "\t l_world_position = mul(trans_model_to_world, vtx_position);\n"; } - if (_need_world_normal) { + if (need_world_normal) { text << "\t l_world_normal = mul(trans_model_to_world, float4(vtx_normal, 0));\n"; } - if (_need_eye_position) { + if (need_eye_position) { text << "\t l_eye_position = mul(trans_model_to_view, vtx_position);\n"; } - if (_need_eye_normal) { - if (_normalize_normals) { - text << "\t l_eye_normal.xyz = normalize(mul((float3x3)tpose_view_to_model, vtx_normal));\n"; - } else { - text << "\t l_eye_normal.xyz = mul((float3x3)tpose_view_to_model, vtx_normal);\n"; - } + if (need_eye_normal) { + text << "\t l_eye_normal.xyz = normalize(mul((float3x3)tpose_view_to_model, vtx_normal));\n"; text << "\t l_eye_normal.w = 0;\n"; } pmap::const_iterator it; @@ -744,28 +772,21 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { string tcname = it->first->join("_"); text << "\t l_" << tcname << " = vtx_" << tcname << ";\n"; } - if (_vertex_colors) { + if (key._color_type == ColorAttrib::T_vertex) { text << "\t l_color = vtx_color;\n"; } - if ((_lighting || _out_aux_normal) && (_map_index_normal >= 0 && _auto_normal_on)) { + if (key._texture_flags & ShaderKey::TF_map_normal) { text << "\t l_tangent.xyz = normalize(mul((float3x3)trans_model_to_view, vtx_" << tangent_input << ".xyz));\n"; text << "\t l_tangent.w = 0;\n"; text << "\t l_binormal.xyz = normalize(mul((float3x3)trans_model_to_view, -vtx_" << binormal_input << ".xyz));\n"; text << "\t l_binormal.w = 0;\n"; } - if (_shadows && _auto_shadow_on) { - text << "\t float4x4 biasmat = {0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.5f, 0.0f, 0.5f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f};\n"; - for (size_t i = 0; i < _lights.size(); ++i) { - if (_lights[i]->_shadow_caster) { - if (_lights[i]->is_of_type(PointLight::get_class_type())) { - text << "\t l_lightcoord" << i << " = mul(trans_model_to_light" << i << ", vtx_position);\n"; - } else { - text << "\t l_lightcoord" << i << " = mul(biasmat, mul(trans_model_to_clip_of_light" << i << ", vtx_position));\n"; - } - } + for (size_t i = 0; i < key._lights.size(); ++i) { + if (key._lights[i]._flags & ShaderKey::LF_has_shadows) { + text << "\t l_lightcoord" << i << " = mul(mat_shadow_" << i << ", l_eye_position);\n"; } } - if (_map_index_height >= 0) { + if (key._texture_flags & ShaderKey::TF_map_height) { text << "\t float3 eyedir = mspos_view.xyz - vtx_position.xyz;\n"; text << "\t l_eyevec.x = dot(vtx_" << tangent_input << ".xyz, eyedir);\n"; text << "\t l_eyevec.y = dot(vtx_" << binormal_input << ".xyz, eyedir);\n"; @@ -777,142 +798,144 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { // Fragment shader text << "void fshader(\n"; - if (_fog) { + if (key._fog_mode != 0) { text << "\t in float4 l_hpos : " << hpos_freg << ",\n"; text << "\t in uniform float4 attr_fog,\n"; text << "\t in uniform float4 attr_fogcolor,\n"; } - if (_need_world_position) { + if (need_world_position) { text << "\t in float4 l_world_position : " << world_position_freg << ",\n"; } - if (_need_world_normal) { + if (need_world_normal) { text << "\t in float4 l_world_normal : " << world_normal_freg << ",\n"; } - if (_need_eye_position) { + if (need_eye_position) { text << "\t in float4 l_eye_position : " << eye_position_freg << ",\n"; } - if (_need_eye_normal) { + if (need_eye_normal) { text << "\t in float4 l_eye_normal : " << eye_normal_freg << ",\n"; } for (it = texcoord_fregs.begin(); it != texcoord_fregs.end(); ++it) { text << "\t in float4 l_" << it->first->join("_") << " : " << it->second << ",\n"; } - const TexMatrixAttrib *tex_matrix = DCAST(TexMatrixAttrib, rs->get_attrib_def(TexMatrixAttrib::get_class_slot())); - for (int i = 0; i < _num_textures; ++i) { - TextureStage *stage = texture->get_on_stage(i); - Texture::TextureType type = texture->get_on_texture_type(stage); - text << "\t uniform sampler" << texture_type_as_string(type) << " tex_" << i << ",\n"; - if (tex_matrix->has_stage(stage)) { + for (size_t i = 0; i < key._textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = key._textures[i]; + text << "\t uniform sampler" << texture_type_as_string(tex._type) << " tex_" << i << ",\n"; + + if (tex._flags & ShaderKey::TF_has_texscale) { + text << "\t uniform float3 texscale_" << i << ",\n"; + } else if (tex._flags & ShaderKey::TF_has_texmat) { text << "\t uniform float4x4 texmat_" << i << ",\n"; } + + if (tex._mode == TextureStage::M_blend) { + text << "\t uniform float4 texcolor_" << i << ",\n"; + } } - if ((_lighting || _out_aux_normal) && (_map_index_normal >= 0 && _auto_normal_on)) { + if (key._texture_flags & ShaderKey::TF_map_normal) { text << "\t in float3 l_tangent : " << tangent_freg << ",\n"; text << "\t in float3 l_binormal : " << binormal_freg << ",\n"; } - if (_lighting) { - for (size_t i = 0; i < _lights.size(); ++i) { - if (_lights[i]->is_of_type(DirectionalLight::get_class_type())) { - text << "\t uniform float4x4 dlight_light" << i << "_rel_view,\n"; + for (size_t i = 0; i < key._lights.size(); ++i) { + text << "\t uniform float4x4 attr_light" << i << ",\n"; - } else if (_lights[i]->is_of_type(PointLight::get_class_type())) { - text << "\t uniform float4x4 plight_light" << i << "_rel_view,\n"; - - } else if (_lights[i]->is_of_type(Spotlight::get_class_type())) { - text << "\t uniform float4x4 slight_light" << i << "_rel_view,\n"; - text << "\t uniform float4 satten_light" << i << ",\n"; - } - - if (_shadows && _lights[i]->_shadow_caster && _auto_shadow_on) { - if (_lights[i]->is_of_type(PointLight::get_class_type())) { - text << "\t uniform samplerCUBE shadow_light" << i << ",\n"; - } else if (_use_shadow_filter) { - text << "\t uniform sampler2DShadow shadow_light" << i << ",\n"; - } else { - text << "\t uniform sampler2D shadow_light" << i << ",\n"; - } - text << "\t in float4 l_lightcoord" << i << " : " << lightcoord_fregs[i] << ",\n"; - } - } - if (_need_material_props) { - text << "\t uniform float4x4 attr_material,\n"; - } - if (_have_specular) { - if (_material_flags & Material::F_local) { - text << "\t uniform float4 mspos_view,\n"; + const ShaderKey::LightInfo &light = key._lights[i]; + if (light._flags & ShaderKey::LF_has_shadows) { + if (light._type.is_derived_from(PointLight::get_class_type())) { + text << "\t uniform samplerCUBE shadow_" << i << ",\n"; + } else if (_use_shadow_filter) { + text << "\t uniform sampler2DShadow shadow_" << i << ",\n"; } else { - text << "\t uniform float4 row1_view_to_model,\n"; + text << "\t uniform sampler2D shadow_" << i << ",\n"; } + text << "\t in float4 l_lightcoord" << i << " : " << lightcoord_fregs[i] << ",\n"; + } + if (light._flags & ShaderKey::LF_has_specular_color) { + text << "\t uniform float4 attr_lspec" << i << ",\n"; } } - if (_map_index_height >= 0) { + + // Does the shader need material properties as input? + if (key._material_flags & (Material::F_ambient | Material::F_diffuse | Material::F_emission | Material::F_specular)) { + text << "\t uniform float4x4 attr_material,\n"; + } + if (key._texture_flags & ShaderKey::TF_map_height) { text << "\t float3 l_eyevec,\n"; } - if (_out_aux_any) { + if (key._outputs & (AuxBitplaneAttrib::ABO_aux_normal | AuxBitplaneAttrib::ABO_aux_glow)) { text << "\t out float4 o_aux : COLOR1,\n"; } text << "\t out float4 o_color : COLOR0,\n"; - if (_vertex_colors) { + + if (key._color_type == ColorAttrib::T_vertex) { text << "\t in float4 l_color : COLOR0,\n"; - } else { + } else if (key._color_type == ColorAttrib::T_flat) { text << "\t uniform float4 attr_color,\n"; } - for (int i=0; i<_num_clip_planes; ++i) { + + for (int i = 0; i < key._num_clip_planes; ++i) { text << "\t uniform float4 clipplane_" << i << ",\n"; } + text << "\t uniform float4 attr_ambient,\n"; text << "\t uniform float4 attr_colorscale\n"; text << ") {\n"; + // Clipping first! - for (int i=0; i<_num_clip_planes; ++i) { + for (int i = 0; i < key._num_clip_planes; ++i) { text << "\t if (l_world_position.x * clipplane_" << i << ".x + l_world_position.y "; text << "* clipplane_" << i << ".y + l_world_position.z * clipplane_" << i << ".z + clipplane_" << i << ".w <= 0) {\n"; text << "\t discard;\n"; text << "\t }\n"; } text << "\t float4 result;\n"; - if (_out_aux_any) { + if (key._outputs & (AuxBitplaneAttrib::ABO_aux_normal | AuxBitplaneAttrib::ABO_aux_glow)) { text << "\t o_aux = float4(0, 0, 0, 0);\n"; } // Now generate any texture coordinates according to TexGenAttrib. If it // has a TexMatrixAttrib, also transform them. - for (int i=0; i<_num_textures; i++) { - TextureStage *stage = texture->get_on_stage(i); - if (tex_gen != NULL && tex_gen->has_stage(stage)) { - switch (tex_gen->get_mode(stage)) { - case TexGenAttrib::M_world_position: - text << "\t float4 texcoord" << i << " = l_world_position;\n"; - break; - case TexGenAttrib::M_world_normal: - text << "\t float4 texcoord" << i << " = l_world_normal;\n"; - break; - case TexGenAttrib::M_eye_position: - text << "\t float4 texcoord" << i << " = l_eye_position;\n"; - break; - case TexGenAttrib::M_eye_normal: - text << "\t float4 texcoord" << i << " = l_eye_normal;\n"; - text << "\t texcoord" << i << ".w = 1.0f;\n"; - break; - default: - pgraphnodes_cat.error() << "Unsupported TexGenAttrib mode\n"; - text << "\t float4 texcoord" << i << " = float4(0, 0, 0, 0);\n"; - } - } else { + for (size_t i = 0; i < key._textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = key._textures[i]; + switch (tex._gen_mode) { + case TexGenAttrib::M_off: // Cg seems to be able to optimize this temporary away when appropriate. - const InternalName *texcoord_name = stage->get_texcoord_name(); - text << "\t float4 texcoord" << i << " = l_" << texcoord_name->join("_") << ";\n"; + text << "\t float4 texcoord" << i << " = l_" << tex._texcoord_name->join("_") << ";\n"; + break; + case TexGenAttrib::M_world_position: + text << "\t float4 texcoord" << i << " = l_world_position;\n"; + break; + case TexGenAttrib::M_world_normal: + text << "\t float4 texcoord" << i << " = l_world_normal;\n"; + break; + case TexGenAttrib::M_eye_position: + text << "\t float4 texcoord" << i << " = l_eye_position;\n"; + break; + case TexGenAttrib::M_eye_normal: + text << "\t float4 texcoord" << i << " = l_eye_normal;\n"; + text << "\t texcoord" << i << ".w = 1.0f;\n"; + break; + default: + text << "\t float4 texcoord" << i << " = float4(0, 0, 0, 0);\n"; + pgraphnodes_cat.error() + << "Unsupported TexGenAttrib mode: " << tex._gen_mode << "\n"; } - if (tex_matrix != NULL && tex_matrix->has_stage(stage)) { + if (tex._flags & ShaderKey::TF_has_texscale) { + text << "\t texcoord" << i << ".xyz *= texscale_" << i << ";\n"; + } else if (tex._flags & ShaderKey::TF_has_texmat) { text << "\t texcoord" << i << " = mul(texmat_" << i << ", texcoord" << i << ");\n"; text << "\t texcoord" << i << ".xyz /= texcoord" << i << ".w;\n"; } } text << "\t // Fetch all textures.\n"; - if (_map_index_height >= 0 && parallax_mapping_samples > 0) { - Texture::TextureType type = texture->get_on_texture_type(texture->get_on_stage(_map_index_height)); - text << "\t float4 tex" << _map_index_height << " = tex" << texture_type_as_string(type); - text << "(tex_" << _map_index_height << ", texcoord" << _map_index_height << "."; - switch (type) { + for (size_t i = 0; i < key._textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = key._textures[i]; + if ((tex._flags & ShaderKey::TF_map_height) == 0) { + continue; + } + + text << "\t float4 tex" << i << " = tex" << texture_type_as_string(tex._type); + text << "(tex_" << i << ", texcoord" << i << "."; + switch (tex._type) { case Texture::TT_cube_map: case Texture::TT_3d_texture: case Texture::TT_2d_texture_array: @@ -927,17 +950,19 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { default: break; } - text << ");\n\t float3 parallax_offset = l_eyevec.xyz * (tex" << _map_index_height; - if (_map_height_in_alpha) { + text << ");\n\t float3 parallax_offset = l_eyevec.xyz * (tex" << i; + if (tex._mode == TextureStage::M_normal_height || + (tex._flags & ShaderKey::TF_has_alpha) != 0) { text << ".aaa"; } else { text << ".rgb"; } text << " * 2.0 - 1.0) * " << parallax_mapping_scale << ";\n"; // Additional samples - for (int i=0; iget_on_texture_type(texture->get_on_stage(i)); + for (size_t i = 0; i < key._textures.size(); ++i) { + ShaderKey::TextureInfo &tex = key._textures[i]; + if ((tex._flags & ShaderKey::TF_map_height) == 0) { // Parallax mapping pushes the texture coordinates of the other textures // away from the camera. - if (_map_index_height >= 0 && parallax_mapping_samples > 0) { + if (key._texture_flags & ShaderKey::TF_map_height) { text << "\t texcoord" << i << ".xyz -= parallax_offset;\n"; } - text << "\t float4 tex" << i << " = tex" << texture_type_as_string(type); + text << "\t float4 tex" << i << " = tex" << texture_type_as_string(tex._type); text << "(tex_" << i << ", texcoord" << i << "."; - switch (type) { + switch (tex._type) { case Texture::TT_cube_map: case Texture::TT_3d_texture: case Texture::TT_2d_texture_array: @@ -973,108 +998,103 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << ");\n"; } } - if (_lighting || _out_aux_normal) { - if (_map_index_normal >= 0 && _auto_normal_on) { - text << "\t // Translate tangent-space normal in map to view-space.\n"; - text << "\t float3 tsnormal = ((float3)tex" << _map_index_normal << " * 2) - 1;\n"; - text << "\t l_eye_normal.xyz *= tsnormal.z;\n"; - text << "\t l_eye_normal.xyz += l_tangent * tsnormal.x;\n"; - text << "\t l_eye_normal.xyz += l_binormal * tsnormal.y;\n"; - } + if (key._texture_flags & ShaderKey::TF_map_normal) { + text << "\t // Translate tangent-space normal in map to view-space.\n"; + text << "\t float3 tsnormal = ((float3)tex" << map_index_normal << " * 2) - 1;\n"; + text << "\t l_eye_normal.xyz *= tsnormal.z;\n"; + text << "\t l_eye_normal.xyz += l_tangent * tsnormal.x;\n"; + text << "\t l_eye_normal.xyz += l_binormal * tsnormal.y;\n"; } - if (_need_eye_normal) { + if (need_eye_normal) { text << "\t // Correct the surface normal for interpolation effects\n"; text << "\t l_eye_normal.xyz = normalize(l_eye_normal.xyz);\n"; } - if (_out_aux_normal) { + if (key._outputs & AuxBitplaneAttrib::ABO_aux_normal) { text << "\t // Output the camera-space surface normal\n"; text << "\t o_aux.rgb = (l_eye_normal.xyz*0.5) + float3(0.5,0.5,0.5);\n"; } - if (_lighting) { + if (key._lighting) { text << "\t // Begin view-space light calculations\n"; - text << "\t float ldist,lattenv,langle;\n"; + text << "\t float ldist,lattenv,langle,lshad;\n"; text << "\t float4 lcolor,lspec,lpoint,latten,ldir,leye;\n"; text << "\t float3 lvec,lhalf;\n"; - if (_shadows && _auto_shadow_on) { - text << "\t float lshad;\n"; + if (key._have_separate_ambient) { + text << "\t float4 tot_ambient = float4(0,0,0,0);\n"; } - if (_separate_ambient_diffuse) { - if (_have_ambient) { - text << "\t float4 tot_ambient = float4(0,0,0,0);\n"; - } - if (_have_diffuse) { - text << "\t float4 tot_diffuse = float4(0,0,0,0);\n"; - } - } else { - if (_have_ambient || _have_diffuse) { - text << "\t float4 tot_diffuse = float4(0,0,0,0);\n"; - } - } - if (_have_specular) { + text << "\t float4 tot_diffuse = float4(0,0,0,0);\n"; + if (have_specular) { text << "\t float4 tot_specular = float4(0,0,0,0);\n"; - if (_material_flags & Material::F_specular) { + if (key._material_flags & Material::F_specular) { text << "\t float shininess = attr_material[3].w;\n"; } else { text << "\t float shininess = 50; // no shininess specified, using default\n"; } } - if (_separate_ambient_diffuse && _have_ambient) { + if (key._have_separate_ambient) { text << "\t tot_ambient += attr_ambient;\n"; - } else if(_have_diffuse) { + } else { text << "\t tot_diffuse += attr_ambient;\n"; } } - for (size_t i = 0; i < _lights.size(); ++i) { - if (_lights[i]->is_of_type(DirectionalLight::get_class_type())) { + for (size_t i = 0; i < key._lights.size(); ++i) { + const ShaderKey::LightInfo &light = key._lights[i]; + if (light._type.is_derived_from(DirectionalLight::get_class_type())) { text << "\t // Directional Light " << i << "\n"; - text << "\t lcolor = dlight_light" << i << "_rel_view[0];\n"; - text << "\t lspec = dlight_light" << i << "_rel_view[1];\n"; - text << "\t lvec = dlight_light" << i << "_rel_view[2].xyz;\n"; + text << "\t lcolor = attr_light" << i << "[0];\n"; + if (light._flags & ShaderKey::LF_has_specular_color) { + text << "\t lspec = attr_lspec" << i << ";\n"; + } else { + text << "\t lspec = lcolor;\n"; + } + text << "\t lvec = attr_light" << i << "[3].xyz;\n"; text << "\t lcolor *= saturate(dot(l_eye_normal.xyz, lvec.xyz));\n"; - if (_shadows && _lights[i]->_shadow_caster && _auto_shadow_on) { + if (light._flags & ShaderKey::LF_has_shadows) { if (_use_shadow_filter) { - text << "\t lshad = shadow2DProj(shadow_light" << i << ", l_lightcoord" << i << ").r;\n"; + text << "\t lshad = shadow2DProj(shadow_" << i << ", l_lightcoord" << i << ").r;\n"; } else { - text << "\t lshad = tex2Dproj(shadow_light" << i << ", l_lightcoord" << i << ").r > l_lightcoord" << i << ".z / l_lightcoord" << i << ".w;\n"; + text << "\t lshad = tex2Dproj(shadow_" << i << ", l_lightcoord" << i << ").r > l_lightcoord" << i << ".z / l_lightcoord" << i << ".w;\n"; } text << "\t lcolor *= lshad;\n"; text << "\t lspec *= lshad;\n"; } - if (_have_diffuse) { - text << "\t tot_diffuse += lcolor;\n"; - } - if (_have_specular) { - if (_material_flags & Material::F_local) { + text << "\t tot_diffuse += lcolor;\n"; + if (have_specular) { + if (key._material_flags & Material::F_local) { text << "\t lhalf = normalize(lvec - normalize(l_eye_position.xyz));\n"; } else { - text << "\t lhalf = dlight_light" << i << "_rel_view[3].xyz;\n"; + text << "\t lhalf = normalize(lvec - float3(0, 1, 0));\n"; } text << "\t lspec *= pow(saturate(dot(l_eye_normal.xyz, lhalf)), shininess);\n"; text << "\t tot_specular += lspec;\n"; } - } else if (_lights[i]->is_of_type(PointLight::get_class_type())) { + } else if (light._type.is_derived_from(PointLight::get_class_type())) { text << "\t // Point Light " << i << "\n"; - text << "\t lcolor = plight_light" << i << "_rel_view[0];\n"; - text << "\t lspec = plight_light" << i << "_rel_view[1];\n"; - text << "\t lpoint = plight_light" << i << "_rel_view[2];\n"; - text << "\t latten = plight_light" << i << "_rel_view[3];\n"; + text << "\t lcolor = attr_light" << i << "[0];\n"; + if (light._flags & ShaderKey::LF_has_specular_color) { + text << "\t lspec = attr_lspec" << i << ";\n"; + } else { + text << "\t lspec = lcolor;\n"; + } + text << "\t latten = attr_light" << i << "[1];\n"; + text << "\t lpoint = attr_light" << i << "[3];\n"; text << "\t lvec = lpoint.xyz - l_eye_position.xyz;\n"; text << "\t ldist = length(lvec);\n"; text << "\t lvec /= ldist;\n"; + if (light._type.is_derived_from(SphereLight::get_class_type())) { + text << "\t ldist = max(ldist, attr_light" << i << "[2].w);\n"; + } text << "\t lattenv = 1/(latten.x + latten.y*ldist + latten.z*ldist*ldist);\n"; text << "\t lcolor *= lattenv * saturate(dot(l_eye_normal.xyz, lvec));\n"; - if (_shadows && _lights[i]->_shadow_caster && _auto_shadow_on) { + if (light._flags & ShaderKey::LF_has_shadows) { text << "\t ldist = max(abs(l_lightcoord" << i << ".x), max(abs(l_lightcoord" << i << ".y), abs(l_lightcoord" << i << ".z)));\n"; text << "\t ldist = ((latten.w+lpoint.w)/(latten.w-lpoint.w))+((-2*latten.w*lpoint.w)/(ldist * (latten.w-lpoint.w)));\n"; - text << "\t lshad = texCUBE(shadow_light" << i << ", l_lightcoord" << i << ".xyz).r >= ldist * 0.5 + 0.5;\n"; + text << "\t lshad = texCUBE(shadow_" << i << ", l_lightcoord" << i << ".xyz).r >= ldist * 0.5 + 0.5;\n"; text << "\t lcolor *= lshad;\n"; text << "\t lspec *= lshad;\n"; } - if (_have_diffuse) { - text << "\t tot_diffuse += lcolor;\n"; - } - if (_have_specular) { - if (_material_flags & Material::F_local) { + text << "\t tot_diffuse += lcolor;\n"; + if (have_specular) { + if (key._material_flags & Material::F_local) { text << "\t lhalf = normalize(lvec - normalize(l_eye_position.xyz));\n"; } else { text << "\t lhalf = normalize(lvec - float3(0, 1, 0));\n"; @@ -1083,13 +1103,17 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t lspec *= pow(saturate(dot(l_eye_normal.xyz, lhalf)), shininess);\n"; text << "\t tot_specular += lspec;\n"; } - } else if (_lights[i]->is_of_type(Spotlight::get_class_type())) { + } else if (light._type.is_derived_from(Spotlight::get_class_type())) { text << "\t // Spot Light " << i << "\n"; - text << "\t lcolor = slight_light" << i << "_rel_view[0];\n"; - text << "\t lspec = slight_light" << i << "_rel_view[1];\n"; - text << "\t lpoint = slight_light" << i << "_rel_view[2];\n"; - text << "\t ldir = slight_light" << i << "_rel_view[3];\n"; - text << "\t latten = satten_light" << i << ";\n"; + text << "\t lcolor = attr_light" << i << "[0];\n"; + if (light._flags & ShaderKey::LF_has_specular_color) { + text << "\t lspec = attr_lspec" << i << ";\n"; + } else { + text << "\t lspec = lcolor;\n"; + } + text << "\t latten = attr_light" << i << "[1];\n"; + text << "\t ldir = attr_light" << i << "[2];\n"; + text << "\t lpoint = attr_light" << i << "[3];\n"; text << "\t lvec = lpoint.xyz - l_eye_position.xyz;\n"; text << "\t ldist = length(lvec);\n"; text << "\t lvec /= ldist;\n"; @@ -1098,21 +1122,19 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t lattenv *= pow(langle, latten.w);\n"; text << "\t if (langle < ldir.w) lattenv = 0;\n"; text << "\t lcolor *= lattenv * saturate(dot(l_eye_normal.xyz, lvec));\n"; - if (_shadows && _lights[i]->_shadow_caster && _auto_shadow_on) { + if (light._flags & ShaderKey::LF_has_shadows) { if (_use_shadow_filter) { - text << "\t lshad = shadow2DProj(shadow_light" << i << ", l_lightcoord" << i << ").r;\n"; + text << "\t lshad = shadow2DProj(shadow_" << i << ", l_lightcoord" << i << ").r;\n"; } else { - text << "\t lshad = tex2Dproj(shadow_light" << i << ", l_lightcoord" << i << ").r > l_lightcoord" << i << ".z / l_lightcoord" << i << ".w;\n"; + text << "\t lshad = tex2Dproj(shadow_" << i << ", l_lightcoord" << i << ").r > l_lightcoord" << i << ".z / l_lightcoord" << i << ".w;\n"; } text << "\t lcolor *= lshad;\n"; text << "\t lspec *= lshad;\n"; } - if (_have_diffuse) { - text << "\t tot_diffuse += lcolor;\n"; - } - if (_have_specular) { - if (_material_flags & Material::F_local) { + text << "\t tot_diffuse += lcolor;\n"; + if (have_specular) { + if (key._material_flags & Material::F_local) { text << "\t lhalf = normalize(lvec - normalize(l_eye_position.xyz));\n"; } else { text << "\t lhalf = normalize(lvec - float3(0,1,0));\n"; @@ -1123,14 +1145,13 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } } } - if (_lighting) { - const LightRampAttrib *light_ramp = DCAST(LightRampAttrib, rs->get_attrib_def(LightRampAttrib::get_class_slot())); - if (_auto_ramp_on && _have_diffuse) { - switch (light_ramp->get_mode()) { + if (key._lighting) { + if (key._light_ramp != nullptr) { + switch (key._light_ramp->get_mode()) { case LightRampAttrib::LRT_single_threshold: { - PN_stdfloat t = light_ramp->get_threshold(0); - PN_stdfloat l0 = light_ramp->get_level(0); + PN_stdfloat t = key._light_ramp->get_threshold(0); + PN_stdfloat l0 = key._light_ramp->get_level(0); text << "\t // Single-threshold light ramp\n"; text << "\t float lr_in = dot(tot_diffuse.rgb, float3(0.33,0.34,0.33));\n"; text << "\t float lr_scale = (lr_in < " << t << ") ? 0.0 : (" << l0 << "/lr_in);\n"; @@ -1139,10 +1160,10 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } case LightRampAttrib::LRT_double_threshold: { - PN_stdfloat t0 = light_ramp->get_threshold(0); - PN_stdfloat t1 = light_ramp->get_threshold(1); - PN_stdfloat l0 = light_ramp->get_level(0); - PN_stdfloat l1 = light_ramp->get_level(1); + PN_stdfloat t0 = key._light_ramp->get_threshold(0); + PN_stdfloat t1 = key._light_ramp->get_threshold(1); + PN_stdfloat l0 = key._light_ramp->get_level(0); + PN_stdfloat l1 = key._light_ramp->get_level(1); text << "\t // Double-threshold light ramp\n"; text << "\t float lr_in = dot(tot_diffuse.rgb, float3(0.33,0.34,0.33));\n"; text << "\t float lr_out = 0.0;\n"; @@ -1156,61 +1177,60 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } } text << "\t // Begin view-space light summation\n"; - if (_have_emission) { - if (_map_index_glow >= 0 && _auto_glow_on) { - text << "\t result = attr_material[2] * saturate(2 * (tex" << _map_index_glow << ".a - 0.5));\n"; + if (key._material_flags & Material::F_emission) { + if (key._texture_flags & ShaderKey::TF_map_glow) { + text << "\t result = attr_material[2] * saturate(2 * (tex" << map_index_glow << ".a - 0.5));\n"; } else { text << "\t result = attr_material[2];\n"; } } else { - if (_map_index_glow >= 0 && _auto_glow_on) { - text << "\t result = saturate(2 * (tex" << _map_index_glow << ".a - 0.5));\n"; + if (key._texture_flags & ShaderKey::TF_map_glow) { + text << "\t result = saturate(2 * (tex" << map_index_glow << ".a - 0.5));\n"; } else { text << "\t result = float4(0,0,0,0);\n"; } } - if ((_have_ambient)&&(_separate_ambient_diffuse)) { - if (_material_flags & Material::F_ambient) { + if (key._have_separate_ambient) { + if (key._material_flags & Material::F_ambient) { text << "\t result += tot_ambient * attr_material[0];\n"; - } else if (_vertex_colors) { + } else if (key._color_type == ColorAttrib::T_vertex) { text << "\t result += tot_ambient * l_color;\n"; - } else if (_flat_colors) { + } else if (key._color_type == ColorAttrib::T_flat) { text << "\t result += tot_ambient * attr_color;\n"; } else { text << "\t result += tot_ambient;\n"; } } - if (_have_diffuse) { - if (_material_flags & Material::F_diffuse) { - text << "\t result += tot_diffuse * attr_material[1];\n"; - } else if (_vertex_colors) { - text << "\t result += tot_diffuse * l_color;\n"; - } else if (_flat_colors) { - text << "\t result += tot_diffuse * attr_color;\n"; - } else { - text << "\t result += tot_diffuse;\n"; - } + if (key._material_flags & Material::F_diffuse) { + text << "\t result += tot_diffuse * attr_material[1];\n"; + } else if (key._color_type == ColorAttrib::T_vertex) { + text << "\t result += tot_diffuse * l_color;\n"; + } else if (key._color_type == ColorAttrib::T_flat) { + text << "\t result += tot_diffuse * attr_color;\n"; + } else { + text << "\t result += tot_diffuse;\n"; } - if (light_ramp->get_mode() == LightRampAttrib::LRT_default) { + if (key._light_ramp == nullptr || + key._light_ramp->get_mode() == LightRampAttrib::LRT_default) { text << "\t result = saturate(result);\n"; } text << "\t // End view-space light calculations\n"; // Combine in alpha, which bypasses lighting calculations. Use of lerp // here is a workaround for a radeon driver bug. - if (_calc_primary_alpha) { - if (_vertex_colors) { + if (key._calc_primary_alpha) { + if (key._color_type == ColorAttrib::T_vertex) { text << "\t result.a = l_color.a;\n"; - } else if (_flat_colors) { + } else if (key._color_type == ColorAttrib::T_flat) { text << "\t result.a = attr_color.a;\n"; } else { text << "\t result.a = 1;\n"; } } } else { - if (_vertex_colors) { + if (key._color_type == ColorAttrib::T_vertex) { text << "\t result = l_color;\n"; - } else if (_flat_colors) { + } else if (key._color_type == ColorAttrib::T_flat) { text << "\t result = attr_color;\n"; } else { text << "\t result = float4(1, 1, 1, 1);\n"; @@ -1221,35 +1241,36 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { // last_saved_result. bool have_saved_result = false; bool have_primary_color = false; - for (int i=0; i<_num_textures; i++) { - TextureStage *stage = texture->get_on_stage(i); - if (stage->get_mode() != TextureStage::M_combine) continue; - if (stage->uses_primary_color() && !have_primary_color) { + for (size_t i = 0; i < key._textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = key._textures[i]; + if (tex._stage == nullptr) { + continue; + } + + if (tex._stage->uses_primary_color() && !have_primary_color) { text << "\t float4 primary_color = result;\n"; have_primary_color = true; } - if (stage->uses_last_saved_result() && !have_saved_result) { + if (tex._stage->uses_last_saved_result() && !have_saved_result) { text << "\t float4 last_saved_result = result;\n"; have_saved_result = true; } } // Now loop through the textures to compose our magic blending formulas. - for (int i = 0; i < _num_textures; ++i) { - TextureStage *stage = texture->get_on_stage(i); - switch (stage->get_mode()) { - case TextureStage::M_modulate: { - bool affects_rgb = texture->on_stage_affects_rgb(i); - bool affects_alpha = texture->on_stage_affects_alpha(i); - - if (affects_rgb && affects_alpha) { + for (size_t i = 0; i < key._textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = key._textures[i]; + switch (tex._mode) { + case TextureStage::M_modulate: + if ((tex._flags & ShaderKey::TF_has_rgb) != 0 && + (tex._flags & ShaderKey::TF_has_alpha) != 0) { text << "\t result.rgba *= tex" << i << ".rgba;\n"; - } else if (affects_alpha) { + } else if (tex._flags & ShaderKey::TF_has_alpha) { text << "\t result.a *= tex" << i << ".a;\n"; - } else if (affects_rgb) { + } else if (tex._flags & ShaderKey::TF_has_rgb) { text << "\t result.rgb *= tex" << i << ".rgb;\n"; } - break; } + break; case TextureStage::M_modulate_glow: case TextureStage::M_modulate_gloss: // in the case of glow or spec we currently see the specularity evenly @@ -1262,38 +1283,37 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { case TextureStage::M_decal: text << "\t result.rgb = lerp(result, tex" << i << ", tex" << i << ".a).rgb;\n"; break; - case TextureStage::M_blend: { - LVecBase4 c = stage->get_color(); - text << "\t result.rgb = lerp(result, tex" << i << " * float4(" - << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << "), tex" << i << ".r).rgb;\n"; - break; } + case TextureStage::M_blend: + text << "\t result.rgb = lerp(result, tex" << i << " * texcolor_" << i << ", tex" << i << ".r).rgb;\n"; + break; case TextureStage::M_replace: text << "\t result = tex" << i << ";\n"; break; case TextureStage::M_add: text << "\t result.rgb += tex" << i << ".rgb;\n"; - if (_calc_primary_alpha) { + if (key._calc_primary_alpha) { text << "\t result.a *= tex" << i << ".a;\n"; } break; case TextureStage::M_combine: + // Only in the case of M_combine have we filled in the _stage pointer. text << "\t result.rgb = "; - if (stage->get_combine_rgb_mode() != TextureStage::CM_undefined) { - text << combine_mode_as_string(stage, stage->get_combine_rgb_mode(), false, i); + if (tex._stage->get_combine_rgb_mode() != TextureStage::CM_undefined) { + text << combine_mode_as_string(tex._stage, tex._stage->get_combine_rgb_mode(), false, i); } else { text << "tex" << i << ".rgb"; } - if (stage->get_rgb_scale() != 1) { - text << " * " << stage->get_rgb_scale(); + if (tex._stage->get_rgb_scale() != 1) { + text << " * " << tex._stage->get_rgb_scale(); } text << ";\n\t result.a = "; - if (stage->get_combine_alpha_mode() != TextureStage::CM_undefined) { - text << combine_mode_as_string(stage, stage->get_combine_alpha_mode(), true, i); + if (tex._stage->get_combine_alpha_mode() != TextureStage::CM_undefined) { + text << combine_mode_as_string(tex._stage, tex._stage->get_combine_alpha_mode(), true, i); } else { text << "tex" << i << ".a"; } - if (stage->get_alpha_scale() != 1) { - text << " * " << stage->get_alpha_scale(); + if (tex._stage->get_alpha_scale() != 1) { + text << " * " << tex._stage->get_alpha_scale(); } text << ";\n"; break; @@ -1303,18 +1323,17 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { default: break; } - if (stage->get_saved_result() && have_saved_result) { + if ((tex._flags & ShaderKey::TF_saved_result) != 0 && have_saved_result) { text << "\t last_saved_result = result;\n"; } } // Apply the color scale. text << "\t result *= attr_colorscale;\n"; - if (_subsume_alpha_test) { - const AlphaTestAttrib *alpha_test = DCAST(AlphaTestAttrib, rs->get_attrib_def(AlphaTestAttrib::get_class_slot())); + if (key._alpha_test_mode != RenderAttrib::M_none) { text << "\t // Shader includes alpha test:\n"; - double ref = alpha_test->get_reference_alpha(); - switch (alpha_test->get_mode()) { + double ref = key._alpha_test_ref; + switch (key._alpha_test_mode) { case RenderAttrib::M_never: text << "\t discard;\n"; break; @@ -1338,40 +1357,36 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { break; case RenderAttrib::M_none: case RenderAttrib::M_always: - default: break; } } - if (_out_primary_glow) { - if (_map_index_glow >= 0 && _auto_glow_on) { - text << "\t result.a = tex" << _map_index_glow << ".a;\n"; + if (key._outputs & AuxBitplaneAttrib::ABO_glow) { + if (key._texture_flags & ShaderKey::TF_map_glow) { + text << "\t result.a = tex" << map_index_glow << ".a;\n"; } else { text << "\t result.a = 0.5;\n"; } } - if (_out_aux_glow) { - if (_map_index_glow >= 0 && _auto_glow_on) { - text << "\t o_aux.a = tex" << _map_index_glow << ".a;\n"; + if (key._outputs & AuxBitplaneAttrib::ABO_aux_glow) { + if (key._texture_flags & ShaderKey::TF_map_glow) { + text << "\t o_aux.a = tex" << map_index_glow << ".a;\n"; } else { text << "\t o_aux.a = 0.5;\n"; } } - if (_lighting) { - if (_have_specular) { - if (_material_flags & Material::F_specular) { - text << "\t tot_specular *= attr_material[3];\n"; - } - if (_map_index_gloss >= 0 && _auto_gloss_on) { - text << "\t tot_specular *= tex" << _map_index_gloss << ".a;\n"; - } - text << "\t result.rgb = result.rgb + tot_specular.rgb;\n"; + if (have_specular) { + if (key._material_flags & Material::F_specular) { + text << "\t tot_specular *= attr_material[3];\n"; } + if (key._texture_flags & ShaderKey::TF_map_gloss) { + text << "\t tot_specular *= tex" << map_index_gloss << ".a;\n"; + } + text << "\t result.rgb = result.rgb + tot_specular.rgb;\n"; } - if (_auto_ramp_on) { - const LightRampAttrib *light_ramp = DCAST(LightRampAttrib, rs->get_attrib_def(LightRampAttrib::get_class_slot())); - switch (light_ramp->get_mode()) { + if (key._light_ramp != nullptr) { + switch (key._light_ramp->get_mode()) { case LightRampAttrib::LRT_hdr0: text << "\t result.rgb = (result*result*result + result*result + result) / (result*result*result + result*result + result + 1);\n"; break; @@ -1386,11 +1401,9 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } // Apply fog. - if (_fog) { - const FogAttrib *fog_attr = DCAST(FogAttrib, rs->get_attrib_def(FogAttrib::get_class_slot())); - Fog *fog = fog_attr->get_fog(); - - switch (fog->get_mode()) { + if (key._fog_mode != 0) { + Fog::Mode fog_mode = (Fog::Mode)(key._fog_mode - 1); + switch (fog_mode) { case Fog::M_linear: text << "\t result.rgb = lerp(attr_fogcolor.rgb, result.rgb, saturate((attr_fog.z - l_hpos.z) * attr_fog.w));\n"; break; @@ -1406,25 +1419,31 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { // The multiply is a workaround for a radeon driver bug. It's annoying as // heck, since it produces an extra instruction. text << "\t o_color = result * 1.000001;\n"; - if (_subsume_alpha_test) { + if (key._alpha_test_mode != RenderAttrib::M_none) { text << "\t // Shader subsumes normal alpha test.\n"; } - if (_disable_alpha_write) { + if (key._disable_alpha_write) { text << "\t // Shader disables alpha write.\n"; } text << "}\n"; // Insert the shader into the shader attrib. - CPT(RenderAttrib) shattr = create_shader_attrib(text.str()); - if (_subsume_alpha_test) { + PT(Shader) shader = Shader::make(text.str(), Shader::SL_Cg); + nassertr(shader != nullptr, nullptr); + + CPT(RenderAttrib) shattr = ShaderAttrib::make(shader); + if (key._alpha_test_mode != RenderAttrib::M_none) { shattr = DCAST(ShaderAttrib, shattr)->set_flag(ShaderAttrib::F_subsume_alpha_test, true); } - if (_disable_alpha_write) { + if (key._disable_alpha_write) { shattr = DCAST(ShaderAttrib, shattr)->set_flag(ShaderAttrib::F_disable_alpha_write, true); } - clear_analysis(); + reset_register_allocator(); - return DCAST(ShaderAttrib, shattr); + + CPT(ShaderAttrib) attr = DCAST(ShaderAttrib, shattr); + _generated_shaders[key] = attr; + return attr; } /** @@ -1592,4 +1611,165 @@ texture_type_as_string(Texture::TextureType ttype) { } } +/** + * Initializes the ShaderKey to the empty state. + */ +ShaderGenerator::ShaderKey:: +ShaderKey() : + _color_type(ColorAttrib::T_vertex), + _material_flags(0), + _texture_flags(0), + _lighting(false), + _have_separate_ambient(false), + _fog_mode(0), + _outputs(0), + _calc_primary_alpha(false), + _disable_alpha_write(false), + _alpha_test_mode(RenderAttrib::M_none), + _alpha_test_ref(0.0), + _num_clip_planes(0), + _light_ramp(nullptr) { +} + +/** + * Returns true if this ShaderKey sorts less than the other one. This is an + * arbitrary, but consistent ordering. + */ +bool ShaderGenerator::ShaderKey:: +operator < (const ShaderKey &other) const { + if (_anim_spec != other._anim_spec) { + return _anim_spec < other._anim_spec; + } + if (_color_type != other._color_type) { + return _color_type < other._color_type; + } + if (_material_flags != other._material_flags) { + return _material_flags < other._material_flags; + } + if (_texture_flags != other._texture_flags) { + return _texture_flags < other._texture_flags; + } + if (_textures.size() != other._textures.size()) { + return _textures.size() < other._textures.size(); + } + for (size_t i = 0; i < _textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = _textures[i]; + const ShaderKey::TextureInfo &other_tex = other._textures[i]; + if (tex._texcoord_name != other_tex._texcoord_name) { + return tex._texcoord_name < other_tex._texcoord_name; + } + if (tex._type != other_tex._type) { + return tex._type < other_tex._type; + } + if (tex._mode != other_tex._mode) { + return tex._mode < other_tex._mode; + } + if (tex._gen_mode != other_tex._gen_mode) { + return tex._gen_mode < other_tex._gen_mode; + } + if (tex._flags != other_tex._flags) { + return tex._flags < other_tex._flags; + } + if (tex._stage != other_tex._stage) { + return tex._stage < other_tex._stage; + } + } + if (_lights.size() != other._lights.size()) { + return _lights.size() < other._lights.size(); + } + for (size_t i = 0; i < _lights.size(); ++i) { + const ShaderKey::LightInfo &light = _lights[i]; + const ShaderKey::LightInfo &other_light = other._lights[i]; + if (light._type != other_light._type) { + return light._type < other_light._type; + } + if (light._flags != other_light._flags) { + return light._flags < other_light._flags; + } + } + if (_lighting != other._lighting) { + return _lighting < other._lighting; + } + if (_have_separate_ambient != other._have_separate_ambient) { + return _have_separate_ambient < other._have_separate_ambient; + } + if (_fog_mode != other._fog_mode) { + return _fog_mode < other._fog_mode; + } + if (_outputs != other._outputs) { + return _outputs < other._outputs; + } + if (_calc_primary_alpha != other._calc_primary_alpha) { + return _calc_primary_alpha < other._calc_primary_alpha; + } + if (_disable_alpha_write != other._disable_alpha_write) { + return _disable_alpha_write < other._disable_alpha_write; + } + if (_alpha_test_mode != other._alpha_test_mode) { + return _alpha_test_mode < other._alpha_test_mode; + } + if (_alpha_test_ref != other._alpha_test_ref) { + return _alpha_test_ref < other._alpha_test_ref; + } + if (_num_clip_planes != other._num_clip_planes) { + return _num_clip_planes < other._num_clip_planes; + } + return _light_ramp < other._light_ramp; +} + +/** + * Returns true if this ShaderKey is equal to the other one. + */ +bool ShaderGenerator::ShaderKey:: +operator == (const ShaderKey &other) const { + if (_anim_spec != other._anim_spec) { + return false; + } + if (_color_type != other._color_type) { + return false; + } + if (_material_flags != other._material_flags) { + return false; + } + if (_texture_flags != other._texture_flags) { + return false; + } + if (_textures.size() != other._textures.size()) { + return false; + } + for (size_t i = 0; i < _textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = _textures[i]; + const ShaderKey::TextureInfo &other_tex = other._textures[i]; + if (tex._texcoord_name != other_tex._texcoord_name || + tex._type != other_tex._type || + tex._mode != other_tex._mode || + tex._gen_mode != other_tex._gen_mode || + tex._flags != other_tex._flags || + tex._stage != other_tex._stage) { + return false; + } + } + if (_lights.size() != other._lights.size()) { + return false; + } + for (size_t i = 0; i < _lights.size(); ++i) { + const ShaderKey::LightInfo &light = _lights[i]; + const ShaderKey::LightInfo &other_light = other._lights[i]; + if (light._type != other_light._type || + light._flags != other_light._flags) { + return false; + } + } + return _lighting == other._lighting + && _have_separate_ambient == other._have_separate_ambient + && _fog_mode == other._fog_mode + && _outputs == other._outputs + && _calc_primary_alpha == other._calc_primary_alpha + && _disable_alpha_write == other._disable_alpha_write + && _alpha_test_mode == other._alpha_test_mode + && _alpha_test_ref == other._alpha_test_ref + && _num_clip_planes == other._num_clip_planes + && _light_ramp == other._light_ramp; +} + #endif // HAVE_CG diff --git a/panda/src/pgraphnodes/shaderGenerator.h b/panda/src/pgraphnodes/shaderGenerator.h index 9042291631..ba2619bef7 100644 --- a/panda/src/pgraphnodes/shaderGenerator.h +++ b/panda/src/pgraphnodes/shaderGenerator.h @@ -28,6 +28,11 @@ #include "renderState.h" #include "renderAttrib.h" +#include "colorAttrib.h" +#include "lightRampAttrib.h" +#include "texGenAttrib.h" +#include "textureAttrib.h" + class AmbientLight; class DirectionalLight; class PointLight; @@ -66,7 +71,6 @@ PUBLISHED: const GeomVertexAnimationSpec &anim); protected: - CPT(RenderAttrib) create_shader_attrib(const string &txt); static const string combine_mode_as_string(CPT(TextureStage) stage, TextureStage::CombineMode c_mode, bool alpha, short texindex); static const string combine_source_as_string(CPT(TextureStage) stage, @@ -84,66 +88,76 @@ protected: const char *alloc_vreg(); const char *alloc_freg(); + bool _use_shadow_filter; + // RenderState analysis information. Created by analyze_renderstate: CPT(RenderState) _state; - int _material_flags; - int _num_textures; + struct ShaderKey { + ShaderKey(); + bool operator < (const ShaderKey &other) const; + bool operator == (const ShaderKey &other) const; + bool operator != (const ShaderKey &other) const { return !operator ==(other); } - pvector _lights; - pvector _lights_np; + GeomVertexAnimationSpec _anim_spec; + enum TextureFlags { + TF_has_rgb = 1, + TF_has_alpha = 2, + TF_has_texscale = 4, + TF_has_texmat = 8, + TF_saved_result = 16, + TF_map_normal = 32, + TF_map_height = 64, + TF_map_glow = 128, + TF_map_gloss = 256, + }; - bool _vertex_colors; - bool _flat_colors; + ColorAttrib::Type _color_type; + int _material_flags; + int _texture_flags; - bool _lighting; - bool _shadows; - bool _fog; + struct TextureInfo { + CPT_InternalName _texcoord_name; + Texture::TextureType _type; + TextureStage::Mode _mode; + TexGenAttrib::Mode _gen_mode; + int _flags; - bool _have_ambient; - bool _have_diffuse; - bool _have_emission; - bool _have_specular; + // Stored only if combine modes / blend color is used + CPT(TextureStage) _stage; + }; + pvector _textures; - bool _separate_ambient_diffuse; + enum LightFlags { + LF_has_shadows = 1, + LF_has_specular_color = 2, + }; - int _map_index_normal; - int _map_index_height; - int _map_index_glow; - int _map_index_gloss; - bool _map_height_in_alpha; + struct LightInfo { + TypeHandle _type; + int _flags; + }; + pvector _lights; + bool _lighting; + bool _have_separate_ambient; - bool _out_primary_glow; - bool _out_aux_normal; - bool _out_aux_glow; - bool _out_aux_any; + int _fog_mode; - bool _have_alpha_test; - bool _have_alpha_blend; - bool _calc_primary_alpha; - bool _subsume_alpha_test; - bool _disable_alpha_write; + int _outputs; + bool _calc_primary_alpha; + bool _disable_alpha_write; + RenderAttrib::PandaCompareFunc _alpha_test_mode; + PN_stdfloat _alpha_test_ref; - int _num_clip_planes; - bool _use_shadow_filter; + int _num_clip_planes; - bool _need_material_props; - bool _need_world_position; - bool _need_world_normal; - bool _need_eye_position; - bool _need_eye_normal; - bool _normalize_normals; - bool _auto_normal_on; - bool _auto_glow_on; - bool _auto_gloss_on; - bool _auto_ramp_on; - bool _auto_shadow_on; + CPT(LightRampAttrib) _light_ramp; + }; - void analyze_renderstate(const RenderState *rs); - void clear_analysis(); + typedef phash_map GeneratedShaders; + GeneratedShaders _generated_shaders; - // This is not a PT() to prevent a circular reference. - GraphicsStateGuardianBase *_gsg; + void analyze_renderstate(ShaderKey &key, const RenderState *rs); public: static TypeHandle get_class_type() { diff --git a/panda/src/pgraphnodes/spotlight.cxx b/panda/src/pgraphnodes/spotlight.cxx index badf4544d9..99432a904b 100644 --- a/panda/src/pgraphnodes/spotlight.cxx +++ b/panda/src/pgraphnodes/spotlight.cxx @@ -65,9 +65,7 @@ fillin(DatagramIterator &scan, BamReader *manager) { */ Spotlight:: Spotlight(const string &name) : - LightLensNode(name), - _has_specular_color(false) -{ + LightLensNode(name) { _lenses[0]._lens->set_interocular_distance(0); } @@ -78,7 +76,6 @@ Spotlight(const string &name) : Spotlight:: Spotlight(const Spotlight ©) : LightLensNode(copy), - _has_specular_color(copy._has_specular_color), _cycler(copy._cycler) { } diff --git a/panda/src/pgraphnodes/spotlight.h b/panda/src/pgraphnodes/spotlight.h index 6cc175fe61..c9a6962b07 100644 --- a/panda/src/pgraphnodes/spotlight.h +++ b/panda/src/pgraphnodes/spotlight.h @@ -79,8 +79,6 @@ private: CPT(RenderState) get_viz_state(); private: - bool _has_specular_color; - // This is the data that must be cycled between pipeline stages. class EXPCL_PANDA_PGRAPHNODES CData : public CycleData { public: diff --git a/panda/src/pstatclient/pStatProperties.cxx b/panda/src/pstatclient/pStatProperties.cxx index 7b14891daa..25d2bfd591 100644 --- a/panda/src/pstatclient/pStatProperties.cxx +++ b/panda/src/pstatclient/pStatProperties.cxx @@ -119,7 +119,7 @@ static TimeCollectorProperties time_properties[] = { { 1, "Cull:Sort", { 0.3, 0.3, 0.6 } }, { 1, "*", { 0.1, 0.1, 0.5 } }, { 1, "*:Show fps", { 0.5, 0.8, 1.0 } }, - { 0, "*:Munge", { 0.3, 0.3, 0.9 } }, + { 1, "*:Munge", { 0.3, 0.3, 0.9 } }, { 1, "*:Munge:Geom", { 0.4, 0.2, 0.8 } }, { 1, "*:Munge:Sprites", { 0.2, 0.8, 0.4 } }, { 0, "*:Munge:Data", { 0.7, 0.5, 0.2 } }, From 65ae1e16bcc16b292564b8974ebb6f5d5c546ee0 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 15 Jul 2017 20:17:29 +0200 Subject: [PATCH 156/254] ShaderGenerator: support multiple normal maps Uses Reoriented Normal Mapping to blend additional normal maps. Fixes #156 --- panda/src/pgraphnodes/shaderGenerator.cxx | 38 ++++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index 62206f1d69..b58ce1e777 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -472,7 +472,7 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { * - flat colors * - vertex colors * - lighting - * - normal maps, but not multiple + * - normal maps, even multiple * - gloss maps, but not multiple * - glow maps, but not multiple * - materials, but not updates to materials @@ -569,7 +569,6 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { rs->write(text, 2); text << "*/\n"; - int map_index_normal = -1; int map_index_glow = -1; int map_index_gloss = -1; @@ -620,7 +619,8 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } } - if (tex._flags & (ShaderKey::TF_map_normal | ShaderKey::TF_map_height)) { + if (tangent_input.empty() && + (tex._flags & (ShaderKey::TF_map_normal | ShaderKey::TF_map_height)) != 0) { PT(InternalName) tangent_name = InternalName::get_tangent(); PT(InternalName) binormal_name = InternalName::get_binormal(); @@ -629,19 +629,12 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { tangent_name = tangent_name->append(tex._texcoord_name->get_basename()); binormal_name = binormal_name->append(tex._texcoord_name->get_basename()); } + tangent_input = tangent_name->join("_"); binormal_input = binormal_name->join("_"); text << "\t in float4 vtx_" << tangent_input << " : " << alloc_vreg() << ",\n"; text << "\t in float4 vtx_" << binormal_input << " : " << alloc_vreg() << ",\n"; - - if (tex._flags & ShaderKey::TF_map_normal) { - map_index_normal = i; - tangent_freg = alloc_freg(); - binormal_freg = alloc_freg(); - text << "\t out float4 l_tangent : " << tangent_freg << ",\n"; - text << "\t out float4 l_binormal : " << binormal_freg << ",\n"; - } } if (tex._flags & ShaderKey::TF_map_glow) { @@ -651,6 +644,12 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { map_index_gloss = i; } } + if (key._texture_flags & ShaderKey::TF_map_normal) { + tangent_freg = alloc_freg(); + binormal_freg = alloc_freg(); + text << "\t out float4 l_tangent : " << tangent_freg << ",\n"; + text << "\t out float4 l_binormal : " << binormal_freg << ",\n"; + } if (key._color_type == ColorAttrib::T_vertex) { text << "\t in float4 vtx_color : " << color_vreg << ",\n"; text << "\t out float4 l_color : COLOR0,\n"; @@ -1000,7 +999,22 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } if (key._texture_flags & ShaderKey::TF_map_normal) { text << "\t // Translate tangent-space normal in map to view-space.\n"; - text << "\t float3 tsnormal = ((float3)tex" << map_index_normal << " * 2) - 1;\n"; + + // Use Reoriented Normal Mapping to blend additional normal maps. + bool is_first = true; + for (size_t i = 0; i < key._textures.size(); ++i) { + const ShaderKey::TextureInfo &tex = key._textures[i]; + if (tex._flags & ShaderKey::TF_map_normal) { + if (is_first) { + text << "\t float3 tsnormal = (tex" << i << ".xyz * 2) - 1;\n"; + is_first = false; + continue; + } + text << "\t tsnormal.z += 1;\n"; + text << "\t float3 tmp" << i << " = tex" << i << ".xyz * float3(-2, -2, 2) + float3(1, 1, -1);\n"; + text << "\t tsnormal = normalize(tsnormal * dot(tsnormal, tmp" << i << ") - tmp" << i << " * tsnormal.z);\n"; + } + } text << "\t l_eye_normal.xyz *= tsnormal.z;\n"; text << "\t l_eye_normal.xyz += l_tangent * tsnormal.x;\n"; text << "\t l_eye_normal.xyz += l_binormal * tsnormal.y;\n"; From d1c34c33601cefdee50d323964cd11901149dc5d Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 7 Aug 2017 21:29:10 +0200 Subject: [PATCH 157/254] interrogate: support static properties --- dtool/src/cppparser/cppBison.cxx.prebuilt | 4474 +++++++++-------- dtool/src/cppparser/cppBison.yxx | 4 + dtool/src/dtoolutil/executionEnvironment.h | 5 + dtool/src/dtoolutil/pandaSystem.h | 15 + dtool/src/dtoolutil/textEncoder.h | 1 + dtool/src/interrogate/interfaceMaker.cxx | 3 +- dtool/src/interrogate/interfaceMaker.h | 1 + .../interfaceMakerPythonNative.cxx | 168 +- dtool/src/interrogatedb/py_panda.cxx | 139 +- dtool/src/interrogatedb/py_panda.h | 3 + dtool/src/pystub/pystub.cxx | 4 + panda/src/audio/audioManager.h | 1 + panda/src/collide/collisionNode.h | 1 + panda/src/display/windowProperties.h | 2 + panda/src/express/memoryUsage.h | 13 + panda/src/express/multifile.h | 1 + panda/src/gobj/textureStage.h | 2 + panda/src/gobj/textureStagePool.h | 1 + panda/src/gobj/vertexDataPage.h | 1 + panda/src/parametrics/ropeNode.h | 17 + panda/src/pgraph/alphaTestAttrib.h | 1 + panda/src/pgraph/antialiasAttrib.h | 1 + panda/src/pgraph/audioVolumeAttrib.h | 1 + panda/src/pgraph/auxBitplaneAttrib.h | 1 + panda/src/pgraph/clipPlaneAttrib.h | 1 + panda/src/pgraph/colorAttrib.h | 1 + panda/src/pgraph/colorBlendAttrib.h | 1 + panda/src/pgraph/colorScaleAttrib.h | 1 + panda/src/pgraph/colorWriteAttrib.h | 1 + panda/src/pgraph/cullBinAttrib.h | 1 + panda/src/pgraph/cullFaceAttrib.h | 1 + panda/src/pgraph/depthOffsetAttrib.h | 1 + panda/src/pgraph/depthTestAttrib.h | 1 + panda/src/pgraph/depthWriteAttrib.h | 1 + panda/src/pgraph/fogAttrib.h | 1 + panda/src/pgraph/geomNode.h | 1 + panda/src/pgraph/lightAttrib.h | 1 + panda/src/pgraph/lightRampAttrib.h | 1 + panda/src/pgraph/logicOpAttrib.h | 1 + panda/src/pgraph/materialAttrib.h | 1 + panda/src/pgraph/pandaNode.h | 2 + panda/src/pgraph/renderAttrib.h | 1 + panda/src/pgraph/renderModeAttrib.h | 1 + panda/src/pgraph/rescaleNormalAttrib.h | 1 + panda/src/pgraph/scissorAttrib.h | 1 + panda/src/pgraph/shadeModelAttrib.h | 1 + panda/src/pgraph/shaderAttrib.h | 1 + panda/src/pgraph/stencilAttrib.h | 1 + panda/src/pgraph/texGenAttrib.h | 1 + panda/src/pgraph/texMatrixAttrib.h | 1 + panda/src/pgraph/textureAttrib.h | 1 + panda/src/pgraph/transparencyAttrib.h | 1 + panda/src/pgui/pgButton.h | 1 + panda/src/pipeline/thread.h | 10 + panda/src/speedtree/speedTreeNode.h | 3 + panda/src/vision/webcamVideo.h | 1 + 56 files changed, 2631 insertions(+), 2273 deletions(-) diff --git a/dtool/src/cppparser/cppBison.cxx.prebuilt b/dtool/src/cppparser/cppBison.cxx.prebuilt index 692194fa8a..a0d5622887 100644 --- a/dtool/src/cppparser/cppBison.cxx.prebuilt +++ b/dtool/src/cppparser/cppBison.cxx.prebuilt @@ -857,16 +857,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 104 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 6950 +#define YYLAST 7000 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 170 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 109 /* YYNRULES -- Number of rules. */ -#define YYNRULES 756 +#define YYNRULES 757 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 1538 +#define YYNSTATES 1539 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ @@ -1001,8 +1001,8 @@ static const yytype_uint16 yyrline[] = 3833, 3837, 3841, 3845, 3849, 3856, 3860, 3864, 3868, 3872, 3876, 3880, 3884, 3888, 3894, 3900, 3908, 3912, 3916, 3920, 3927, 3937, 3943, 3949, 3959, 3971, 3979, 3983, 4013, 4017, - 4021, 4025, 4029, 4033, 4039, 4043, 4047, 4051, 4062, 4066, - 4070, 4074, 4082, 4086, 4090, 4096, 4107 + 4021, 4025, 4029, 4033, 4039, 4043, 4047, 4051, 4055, 4066, + 4070, 4074, 4078, 4086, 4090, 4094, 4100, 4111 }; #endif @@ -1106,12 +1106,12 @@ static const yytype_uint16 yytoknum[] = }; # endif -#define YYPACT_NINF -913 +#define YYPACT_NINF -918 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-913))) + (!!((Yystate) == (-918))) -#define YYTABLE_NINF -752 +#define YYTABLE_NINF -753 #define yytable_value_is_error(Yytable_value) \ 0 @@ -1120,160 +1120,160 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 152, -913, 3620, 5734, 47, 4886, -913, -913, -913, -913, - -913, -913, -913, -913, 85, -45, -38, 3, 36, 41, - -72, 45, 71, -913, -913, 58, 99, 122, 125, 127, - 134, 144, 169, 178, 187, 189, 195, 200, 204, 207, - 214, 218, 221, 223, 5219, -913, -913, 93, 225, 240, - 30, 244, -913, 243, 253, 255, 3620, 3620, 3620, 3620, - 3620, 1760, 474, 3620, 4671, -913, 150, -913, -913, -913, - -913, -913, -913, -913, -913, 5844, 262, -913, 27, -913, - -913, 4115, 4506, 4506, -913, 3087, 266, -913, 4506, -913, - -913, 403, 403, -913, -913, -913, -913, 123, 105, -913, - -913, -913, -913, -913, -913, 4249, 268, -913, 6810, 6810, - 6810, -913, 6810, 5208, 6810, -40, -913, 6801, 310, 316, - 323, 327, 6810, 1955, 347, 349, 350, 6810, 6810, 336, - 6637, 6810, 6810, 1562, 6810, 6810, -913, -913, -913, -913, - 4254, -913, -913, -913, -913, -913, 3620, 3620, 5734, 3620, - 3620, 3620, 3620, 5734, 3620, 5734, 3620, 5734, 3620, 5734, - 5734, 5734, 5734, 5734, 5734, 5734, 5734, 5734, 5734, 5734, - 5734, 5734, 5734, 5734, 3620, -913, -913, 337, 3087, 339, - 341, 3087, -913, -913, 5734, 3620, 3620, 342, 5330, 5734, - 1760, 3620, 3620, 80, 80, 80, 80, 80, 85, -38, - 3, 36, 41, 45, 58, 122, 6587, 5383, 5831, 5990, - 255, 163, -81, 4671, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, 3087, 3087, -92, 363, -913, - -913, 80, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, - 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, - 3620, 3620, 3620, 2682, 3620, -913, -913, 403, 403, 2816, - -913, -913, -913, 4506, -913, -913, -913, -913, 5734, -913, - 355, 1016, 343, 403, 403, 343, 343, 4999, 351, -913, - 353, -913, -913, -913, -913, -913, -913, 1292, 359, 5187, - -913, 3087, 467, 372, 364, 2409, 5245, 6810, -913, -913, - -913, -913, 6810, -913, -913, -913, -913, 6729, 2685, -913, - 3087, 3087, 3087, 3087, -913, -913, 376, -913, -913, -913, - -913, -913, 3620, -913, 4347, -913, 368, -913, 4433, -913, - 3087, 135, -913, -913, -10, 366, -913, 369, 5930, 3087, - 370, -913, 3087, -913, 180, 379, -913, -913, -913, -913, - 1828, -913, -913, 375, 388, -913, 378, 380, 381, 382, - 386, 387, 402, 394, 405, 398, 399, 400, 407, 421, - 408, -73, 422, 410, 411, 412, 413, 418, 419, 424, - 425, 429, 433, 435, 3620, -913, 5734, 3620, -913, 5730, - 415, 436, 440, 3087, 441, 444, 455, 456, 4118, 457, - 459, 3620, 3620, -913, 530, -913, 1232, 465, 3620, -913, - -913, 1430, 1843, 960, 960, 878, 878, 277, 277, -913, - 2972, 4083, 4884, 2005, 878, 878, 142, 142, 80, 80, - 80, -913, -913, -59, 1639, -913, -913, 466, 4502, 468, - 343, 470, 462, 3087, 343, 343, 343, 343, 343, 471, - -913, 351, -913, 351, -913, 471, 471, -913, 343, 4249, - 5820, 5705, 343, 343, 472, 18, -913, 1096, 416, -913, - 3620, 3087, 477, -913, -913, -913, -913, 1292, -46, -44, - -28, 4249, 473, -12, -913, -913, -913, 496, 6810, 4249, - 3754, 85, 480, 4559, -913, -913, -913, 503, 504, 505, - 506, 509, 6122, -913, 3773, 5479, 188, 486, 180, -913, - -913, 511, -913, 5734, -913, 15, 2950, 6045, 662, -913, - 5734, -913, 493, 175, -913, -913, 2548, -913, -913, 1043, - -913, 512, 5187, -913, -913, -913, -913, -913, -913, -913, - 507, -913, 513, -913, -913, -913, -913, 5734, -913, 5734, - -913, 5734, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, 4580, 494, 501, -913, 514, -913, -913, - 516, -913, -913, 519, -913, -913, -913, -913, 80, 4671, - -913, 3087, 363, 5585, 4402, -913, 4671, 3620, -913, -913, - -913, -913, -913, 471, 343, -913, 471, 471, 471, 471, - 471, 3620, 174, 621, 5844, 1096, 416, -913, 210, 226, - -913, -913, 5614, 525, 1096, 1096, 1096, 1096, 1096, 1096, - -68, -913, -913, 526, 3087, 416, 416, 416, 416, 416, - 416, -66, 518, 4671, -913, 19, -913, 543, 642, 2409, - -913, 615, 4249, -913, -913, -913, -913, -913, -913, -913, - -913, 533, 546, 548, -913, -913, 5219, -913, -913, 549, - 34, 551, -913, 534, 3620, 3620, 3620, 3620, 1760, 3620, - 542, 29, -913, -913, 4767, -913, 150, -913, 6810, 6810, - 6194, -913, 702, 714, 715, 717, -913, -913, 162, 580, - -913, -913, -913, -913, 5547, -913, 573, 587, 2953, -913, - 1270, -913, -913, 15, -913, 1043, -913, 589, 5585, 579, - 1043, 5585, 574, 4598, 662, 583, 662, 662, 662, 662, - 662, -34, -913, -913, 577, 6266, -913, -913, -913, 3087, - 357, -913, 572, -913, 596, 597, 3084, 3240, 591, 1043, - 1043, 4187, 1043, 1043, 1043, 1043, -913, 54, 233, -913, - 1292, -913, 3620, 3620, 582, 598, 599, -913, -913, -913, - 3620, -913, 3620, -913, 603, -913, 5959, 4249, -913, -913, - -913, -913, -913, -913, 593, -913, -913, 609, -913, 4671, - 471, 601, 607, 5705, 1096, 416, -68, -66, 612, 613, - 4402, -913, -913, 1096, 608, 608, 608, 608, 608, 288, - 3620, -913, 416, -913, 614, 614, 614, 614, 614, 299, - 3620, -913, 617, -913, 3620, -913, 618, 4616, 6338, -913, - 629, -913, -913, 5734, 5734, 5734, 623, 5734, 624, 5359, - 5734, 1760, 80, 80, 80, 80, 625, -58, 80, -913, - -913, 3894, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, - 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, - 3620, 3620, 3620, 3218, 3620, -913, -913, -913, -913, -55, - 646, 649, 651, 6410, 35, -913, 1270, 6689, 5479, 3087, - 650, 647, 1270, 1270, 1270, 1270, 1270, 1270, -30, 614, - -913, 233, -913, 635, 1043, 236, 639, -913, -913, 303, - 662, 643, 643, 643, 643, 643, -913, 3620, -913, -913, - 5585, 640, 331, -913, 116, 663, 664, -913, 2242, -913, - -913, -913, 3084, 648, 667, 4671, -913, -913, 1043, 329, - 329, 807, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, 673, 675, - -913, -913, 329, 329, 329, 286, 838, -913, 3620, -913, - 2548, 704, -913, 543, -41, -37, -913, -913, -913, -33, - -25, -913, 5219, 403, 802, 84, -913, -913, 5585, -913, - -68, -66, -913, -913, 5585, 5585, -913, 608, 688, 690, - 614, 696, 692, 3508, -913, -913, -913, 3955, 718, 716, - -913, 700, 712, 713, 3620, 720, 3087, 705, 706, 721, - 707, 4653, 3620, -913, -913, -913, 1430, 1843, 960, 960, - 878, 878, 277, 277, -913, 3828, 4083, 4884, 2005, 878, - 878, 142, 142, 80, 80, 80, -913, -913, -24, 1890, - 6482, 860, 730, 870, 881, 882, -913, 746, -30, 614, - -913, -913, -913, -913, -913, -913, 5734, 1270, 4033, -913, - -913, 748, -913, -913, 294, 732, -913, -913, 643, 5585, - 729, 736, -913, -913, 3087, 3620, 3620, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, -913, - -913, -913, -913, -913, -913, -913, -913, -913, -913, 737, - -913, 3352, 329, -913, -913, -913, -913, -913, 3754, 739, - 3240, 1043, -913, -913, -913, -913, 4402, 403, -913, -913, - -913, 20, 743, 749, -913, -913, 750, 751, 5585, -913, - 5585, -913, -913, 5069, 5804, 6029, 3087, 358, -913, -913, - 888, -913, 3955, -913, 754, 755, 756, 759, 758, -913, - -913, 762, -913, -913, 80, 3620, -913, -913, -913, -23, - -913, -3, 761, 66, -913, -913, -913, 765, 757, 775, - 776, 43, 777, 4033, 4033, 4033, 4033, 4033, 1760, 4033, - 4821, -913, 1043, 734, 770, -913, 734, 5585, 797, -913, - -913, 798, -913, 800, 803, 2075, -913, 3084, 4671, 805, - -913, -913, 818, -913, 806, -913, -913, -913, -913, -913, - 809, 810, 4428, -913, 4428, -913, 4428, -913, -913, 4428, - 4428, 4428, -913, 6554, -913, 3620, 3620, -913, 3620, -913, - 3620, 4671, 958, 825, 975, 843, 848, 976, 853, 5734, - 5734, 5734, 5734, 830, 5450, 5734, 114, 114, 114, 114, - 114, 836, 67, 114, 4033, 4033, 4033, 4033, 4033, 4033, - 4033, 4033, 4033, 4033, 4033, 4033, 4033, 4033, 4033, 4033, - 4033, 4033, 4033, 3486, 3620, -913, -913, 5585, 842, -913, - 734, -913, -913, 997, -913, 847, -913, -913, -913, 4402, - 4402, 4402, -913, -913, -913, -913, -913, -913, -913, -913, - -913, 69, 76, 89, 100, 854, -913, 866, -913, -913, - 104, -913, 855, 868, 873, 874, 3087, 856, 865, 876, - 4033, -913, 2700, 5052, 1489, 1489, 1366, 1366, 1320, 1320, - -913, 4269, 5068, 5084, 1341, 846, 846, 114, 114, 114, - -913, -913, 143, 2428, 5585, 867, -913, 734, -913, -913, - 734, 877, -913, -913, -913, 734, 734, -913, -913, -913, - -913, 886, 1030, 1035, 898, -913, 884, 885, 893, 892, - -913, -913, 897, 114, 4033, -913, -913, 899, -913, 734, - -913, -913, 904, 905, -913, 3620, 3620, 3620, -913, 3620, - 4821, -913, 4402, 902, 915, 147, 153, 165, 171, 4402, - -913, -913, -913, -913, -913, -913, -913, -913 + 328, -918, 3448, 5658, 36, 4726, -918, -918, -918, -918, + -918, -918, -918, -918, -50, -112, -100, -83, -71, -51, + -98, -22, -52, -918, -918, 11, 56, 78, 95, 116, + 121, 154, 162, 167, 174, 178, 185, 195, 198, 207, + 215, 231, 259, 267, 5969, -918, -918, 13, 269, 285, + 10, 296, -918, 290, 292, 295, 3448, 3448, 3448, 3448, + 3448, 1577, 1319, 3448, 4528, -918, 81, -918, -918, -918, + -918, -918, -918, -918, -918, 5768, 321, -918, -30, -918, + -918, 3803, 4177, 4177, -918, 5453, 325, -918, 4177, -918, + -918, 87, 87, -918, -918, -918, -918, 163, 111, -918, + -918, -918, -918, -918, -918, 6089, 342, -918, 6860, 6860, + 6860, -918, 6860, 5109, 6860, -101, -918, 6851, 347, 348, + 350, 351, 6860, 1165, 237, 368, 373, 6860, 6860, 360, + 6687, 6860, 6860, 5777, 6860, 6860, -918, -918, -918, -918, + 3942, -918, -918, -918, -918, -918, 3448, 3448, 5658, 3448, + 3448, 3448, 3448, 5658, 3448, 5658, 3448, 5658, 3448, 5658, + 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, + 5658, 5658, 5658, 5658, 3448, -918, -918, 364, 5453, 366, + 370, 5453, -918, -918, 5658, 3448, 3448, 372, 5197, 5658, + 1577, 3448, 3448, 50, 50, 50, 50, 50, -50, -100, + -83, -71, -51, -22, 11, 78, 4083, 5386, 5645, 6631, + 295, 371, -110, 4528, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, 5453, 5453, -116, 390, + -918, -918, 50, 3448, 3448, 3448, 3448, 3448, 3448, 3448, + 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, + 3448, 3448, 3448, 3448, 2510, 3448, -918, -918, 87, 87, + 2644, -918, -918, -918, 4177, -918, -918, -918, -918, 5658, + -918, 384, 1154, 401, 87, 87, 401, 401, 4839, 377, + -918, 385, -918, -918, -918, -918, -918, -918, 867, 404, + 4526, -918, 5453, 510, 419, 403, 2237, 5112, 6860, -918, + -918, -918, -918, 6860, -918, -918, -918, -918, 6779, 1693, + -918, 5453, 5453, 5453, 5453, -918, -918, 435, -918, -918, + -918, -918, -918, 3448, -918, 4035, -918, 424, -918, 4121, + -918, 5453, 4, -918, -918, 439, 422, -918, 426, 5854, + 5453, 427, -918, 5453, -918, -9, 440, -918, -918, -918, + -918, 2568, -918, -918, 428, 446, -918, 434, 436, 438, + 441, 442, 447, 468, 459, 470, 462, 463, 464, 466, + 486, 471, -72, 487, 472, 473, 477, 478, 479, 480, + 481, 483, 484, 488, 489, 3448, -918, 5658, 3448, -918, + 6665, 497, 491, 492, 5453, 493, 494, 506, 498, 4247, + 499, 500, 3448, 3448, -918, 621, -918, 2434, 503, 3448, + -918, -918, 3772, 4892, 1052, 1052, 1444, 1444, 1031, 1031, + -918, 2800, 4908, 4924, 4964, 1444, 1444, 75, 75, 50, + 50, 50, -918, -918, -67, 2256, -918, -918, 502, 4268, + 504, 401, 509, 520, 5453, 401, 401, 401, 401, 401, + 515, -918, 377, -918, 377, -918, 515, 515, -918, 401, + 6089, 5744, 5627, 401, 401, 523, 20, -918, 392, 532, + -918, 3448, 5453, 496, -918, -918, -918, -918, 867, -13, + 153, 161, 6089, 526, 232, -918, -918, -918, 546, 6860, + 6089, 1717, -50, 531, 4286, -918, -918, -918, 535, 551, + 552, 555, 557, 6163, -918, 4190, 5400, 383, 542, -9, + -918, -918, 561, -918, 5658, -918, 17, 2778, 5993, 1081, + -918, 5658, -918, 548, 278, -918, -918, 2376, -918, -918, + 310, -918, 564, 4526, -918, -918, -918, -918, -918, -918, + -918, 558, -918, 560, -918, -918, -918, -918, 5658, -918, + 5658, -918, 5658, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, 4305, 544, 549, -918, 562, -918, + -918, 559, -918, -918, 565, -918, -918, -918, -918, 50, + 4528, -918, 5453, 390, 5501, 978, -918, 4528, 3448, -918, + -918, -918, -918, -918, 515, 401, -918, 515, 515, 515, + 515, 515, 3448, -39, 680, 5768, 392, 532, -918, 38, + 66, -918, -918, 5532, 571, 392, 392, 392, 392, 392, + 392, -126, -918, -918, 573, 5453, 532, 532, 532, 532, + 532, 532, -77, 566, 4528, -918, 189, -918, 591, 690, + 2237, -918, 663, 6089, -918, -918, -918, -918, -918, -918, + -918, -918, 576, 586, 587, -918, -918, 5969, -918, -918, + 590, 18, 594, -918, 582, 3448, 3448, 3448, 3448, 1577, + 3448, 608, 59, -918, -918, 4546, -918, 81, -918, 6860, + 6860, 6235, -918, 781, 782, 784, 785, -918, -918, 218, + 648, -918, -918, -918, -918, 5415, -918, 641, 652, 4476, + -918, 1139, -918, -918, 17, -918, 310, -918, 653, 5501, + 643, 310, 5501, 639, 4341, 1081, 649, 1081, 1081, 1081, + 1081, 1081, 0, -918, -918, 645, 6307, -918, -918, -918, + 5453, 183, -918, 640, -918, 661, 664, 2912, 3068, 655, + 310, 310, 3875, 310, 310, 310, 310, -918, -5, 411, + -918, 867, -918, 3448, 3448, 650, 651, 656, -918, -918, + -918, 3448, -918, 3448, -918, 657, -918, 5883, 6089, -918, + -918, -918, -918, -918, -918, 660, -918, -918, 673, -918, + 4528, 515, 662, 666, 5627, 392, 532, -126, -77, 668, + 670, 978, -918, -918, 392, 671, 671, 671, 671, 671, + 148, 3448, -918, 532, -918, 672, 672, 672, 672, 672, + 200, 3448, -918, 676, -918, 3448, -918, 669, 4359, 6379, + -918, 689, -918, -918, 5658, 5658, 5658, 678, 5658, 679, + 5283, 5658, 1577, 50, 50, 50, 50, 681, -65, 50, + -918, -918, 3582, 3448, 3448, 3448, 3448, 3448, 3448, 3448, + 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, + 3448, 3448, 3448, 3448, 3046, 3448, -918, -918, -918, -918, + -23, 674, 697, 698, 6451, 12, -918, 1139, 6739, 5400, + 5453, 696, 692, 1139, 1139, 1139, 1139, 1139, 1139, -25, + 672, -918, 411, -918, 682, 310, 316, 683, -918, -918, + 301, 1081, 687, 687, 687, 687, 687, -918, 3448, -918, + -918, 5501, 686, 354, -918, 52, 707, 708, -918, 2070, + -918, -918, -918, 2912, 693, 710, 4528, -918, -918, 310, + 344, 344, 849, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, 695, + 705, -918, -918, 344, 344, 344, 398, 858, -918, 3448, + -918, 2376, 718, -918, 591, 53, 97, -918, -918, -918, + 132, 150, -918, 5969, 87, 818, 1059, -918, -918, 5501, + -918, -126, -77, -918, -918, 5501, 5501, -918, 671, 711, + 712, 672, 713, 720, 3336, -918, -918, -918, 5165, 733, + 743, -918, 714, 738, 745, 3448, 747, 5453, 739, 742, + 748, 746, 4456, 3448, -918, -918, -918, 3772, 4892, 1052, + 1052, 1444, 1444, 1031, 1031, -918, 4510, 4908, 4924, 4964, + 1444, 1444, 75, 75, 50, 50, 50, -918, -918, 216, + 3601, 6523, 889, 761, 901, 903, 904, -918, 767, -25, + 672, -918, -918, -918, -918, -918, -918, 5658, 1139, 3721, + -918, -918, 769, -918, -918, 433, 753, -918, -918, 687, + 5501, 759, 764, -918, -918, 5453, 3448, 3448, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, + 765, -918, 3180, 344, -918, -918, -918, -918, -918, 1717, + 762, 3068, 310, -918, -918, -918, -918, 978, 87, -918, + -918, -918, -4, 768, 770, -918, -918, 771, 773, 5501, + -918, 5501, -918, -918, 6002, 6061, 6075, 5453, 508, -918, + -918, 919, -918, 5165, -918, 776, 778, 777, 783, 803, + -918, -918, 806, -918, -918, 50, 3448, -918, -918, -918, + 217, -918, 222, 805, 225, -918, -918, -918, 808, 819, + 820, 821, 19, 824, 3721, 3721, 3721, 3721, 3721, 1577, + 3721, 4607, -918, 310, 1275, 809, -918, 1275, 5501, 826, + -918, -918, 817, -918, 827, 831, 1890, -918, 2912, 4528, + 833, -918, -918, 839, -918, 836, -918, -918, -918, -918, + -918, 840, 841, 5618, -918, 5618, -918, 5618, -918, -918, + 5618, 5618, 5618, -918, 6595, -918, 3448, 3448, -918, 3448, + -918, 3448, 4528, 1000, 864, 1005, 868, 869, 1008, 872, + 5658, 5658, 5658, 5658, 859, 5314, 5658, 105, 105, 105, + 105, 105, 856, 228, 105, 3721, 3721, 3721, 3721, 3721, + 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, + 3721, 3721, 3721, 3721, 3314, 3448, -918, -918, 5501, 860, + -918, 1275, -918, -918, 1018, -918, 870, -918, -918, -918, + 978, 978, 978, -918, -918, -918, -918, -918, -918, -918, + -918, -918, 233, 242, 246, 249, 874, -918, 888, -918, + -918, 251, -918, 876, 880, 887, 890, 5453, 879, 883, + 894, 3721, -918, 4718, 4948, 3957, 3957, 1821, 1821, 1352, + 1352, -918, 4564, 334, 4981, 4990, 169, 169, 105, 105, + 105, -918, -918, 272, 3806, 5501, 885, -918, 1275, -918, + -918, 1275, 891, -918, -918, -918, 1275, 1275, -918, -918, + -918, -918, 907, 1042, 1046, 909, -918, 895, 896, 897, + 899, -918, -918, 902, 105, 3721, -918, -918, 910, -918, + 1275, -918, -918, 912, 913, -918, 3448, 3448, 3448, -918, + 3448, 4607, -918, 978, 915, 932, 273, 287, 289, 294, + 978, -918, -918, -918, -918, -918, -918, -918, -918 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1281,192 +1281,192 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 0, 756, 0, 0, 0, 756, 5, 645, 641, 644, - 752, 753, 647, 648, 0, 0, 0, 0, 0, 0, + 0, 757, 0, 0, 0, 757, 5, 645, 641, 644, + 753, 754, 647, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 650, 0, 0, 0, 0, 0, 642, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 756, 0, 3, 582, 646, 292, 303, 302, + 0, 0, 757, 0, 3, 582, 646, 292, 303, 302, 386, 387, 389, 390, 371, 0, 0, 401, 368, 400, 395, 392, 391, 394, 372, 0, 0, 373, 393, 403, - 388, 756, 756, 4, 294, 295, 296, 0, 357, 756, - 291, 383, 384, 385, 1, 0, 0, 21, 756, 756, - 756, 22, 756, 756, 756, 0, 38, 756, 0, 0, - 0, 0, 756, 0, 0, 0, 0, 756, 756, 0, - 756, 756, 756, 0, 756, 756, 6, 17, 7, 19, - 0, 15, 16, 18, 69, 40, 756, 756, 0, 756, - 756, 756, 756, 0, 756, 0, 756, 0, 756, 0, + 388, 757, 757, 4, 294, 295, 296, 0, 357, 757, + 291, 383, 384, 385, 1, 0, 0, 21, 757, 757, + 757, 22, 757, 757, 757, 0, 38, 757, 0, 0, + 0, 0, 757, 0, 0, 0, 0, 757, 757, 0, + 757, 757, 757, 0, 757, 757, 6, 17, 7, 19, + 0, 15, 16, 18, 69, 40, 757, 757, 0, 757, + 757, 757, 757, 0, 757, 0, 757, 0, 757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 756, 318, 324, 0, 0, 0, - 606, 0, 756, 317, 0, 756, 756, 0, 0, 0, - 0, 756, 756, 615, 613, 612, 614, 611, 292, 386, + 0, 0, 0, 0, 757, 318, 324, 0, 0, 0, + 606, 0, 757, 317, 0, 757, 757, 0, 0, 0, + 0, 757, 757, 615, 613, 612, 614, 611, 292, 386, 387, 389, 390, 401, 400, 395, 392, 391, 394, 393, - 388, 0, 0, 541, 738, 739, 740, 741, 744, 742, - 746, 745, 743, 747, 727, 728, 0, 0, 756, 733, - 726, 610, 0, 0, 0, 0, 0, 0, 0, 0, + 388, 0, 0, 541, 738, 739, 740, 748, 741, 744, + 742, 746, 745, 743, 747, 727, 728, 0, 0, 757, + 733, 726, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 754, 755, 756, 756, 0, - 369, 370, 402, 392, 397, 396, 399, 293, 0, 398, - 0, 278, 756, 756, 756, 756, 756, 756, 0, 327, - 277, 329, 756, 748, 749, 750, 751, 0, 359, 0, - 331, 0, 0, 58, 60, 0, 756, 756, 52, 41, - 51, 53, 756, 42, 148, 47, 23, 756, 0, 45, - 0, 0, 0, 0, 50, 756, 0, 26, 25, 24, - 48, 44, 0, 152, 0, 151, 0, 54, 0, 20, - 0, 0, 46, 49, 326, 305, 316, 0, 0, 0, - 0, 13, 0, 66, 0, 325, 63, 307, 308, 309, - 357, 756, 304, 0, 540, 539, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 755, 756, 757, 757, + 0, 369, 370, 402, 392, 397, 396, 399, 293, 0, + 398, 0, 278, 757, 757, 757, 757, 757, 757, 0, + 327, 277, 329, 757, 749, 750, 751, 752, 0, 359, + 0, 331, 0, 0, 58, 60, 0, 757, 757, 52, + 41, 51, 53, 757, 42, 148, 47, 23, 757, 0, + 45, 0, 0, 0, 0, 50, 757, 0, 26, 25, + 24, 48, 44, 0, 152, 0, 151, 0, 54, 0, + 20, 0, 0, 46, 49, 326, 305, 316, 0, 0, + 0, 0, 13, 0, 66, 0, 325, 63, 307, 308, + 309, 357, 757, 304, 0, 540, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 319, 0, 756, 321, 0, + 0, 0, 0, 0, 0, 0, 319, 0, 757, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 640, 731, 734, 0, 756, 0, 729, - 206, 624, 625, 626, 627, 628, 629, 632, 633, 639, - 0, 621, 622, 623, 630, 631, 619, 620, 616, 617, - 618, 638, 637, 0, 0, 328, 330, 0, 0, 0, - 756, 279, 0, 268, 756, 756, 756, 756, 756, 284, - 267, 0, 280, 0, 281, 283, 282, 191, 756, 0, - 0, 0, 756, 756, 0, 192, 195, 756, 0, 190, - 756, 365, 0, 362, 361, 356, 360, 0, 738, 739, - 740, 0, 0, 742, 335, 297, 337, 0, 756, 0, - 756, 305, 0, 0, 43, 39, 756, 0, 0, 0, - 0, 0, 756, 374, 0, 756, 326, 305, 0, 325, - 72, 0, 380, 0, 77, 79, 0, 0, 756, 306, - 0, 756, 0, 0, 404, 213, 0, 68, 65, 0, - 312, 359, 0, 589, 588, 605, 595, 591, 593, 594, - 0, 601, 0, 600, 654, 590, 655, 0, 657, 0, - 658, 0, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 597, 0, 0, 0, 320, 0, 596, 599, - 0, 603, 602, 0, 608, 609, 598, 592, 583, 542, - 732, 0, 756, 756, 756, 92, 207, 0, 636, 635, - 300, 299, 301, 285, 756, 269, 274, 270, 271, 273, - 272, 756, 0, 0, 0, 756, 0, 232, 0, 0, - 756, 194, 0, 0, 756, 756, 756, 756, 756, 756, - 756, 246, 245, 0, 256, 0, 0, 0, 0, 0, - 0, 756, 0, 538, 537, 366, 355, 298, 0, 0, - 756, 756, 0, 55, 59, 719, 715, 718, 721, 722, - 198, 0, 0, 0, 717, 723, 0, 725, 724, 0, - 0, 0, 716, 0, 0, 0, 0, 0, 0, 0, - 0, 199, 234, 202, 235, 671, 720, 197, 756, 756, - 756, 376, 0, 0, 0, 0, 378, 756, 0, 0, - 169, 170, 171, 157, 0, 158, 0, 154, 159, 155, - 756, 168, 153, 0, 74, 0, 382, 0, 756, 0, - 0, 756, 0, 0, 756, 0, 756, 756, 756, 756, - 756, 0, 237, 236, 0, 756, 81, 404, 208, 0, - 0, 67, 0, 756, 0, 0, 756, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 756, 756, 172, - 0, 310, 0, 0, 0, 0, 0, 322, 323, 607, - 0, 604, 0, 730, 0, 99, 0, 0, 93, 101, - 96, 100, 95, 97, 0, 94, 98, 0, 187, 634, - 275, 0, 0, 0, 756, 0, 756, 756, 0, 0, - 756, 193, 196, 756, 251, 247, 248, 250, 249, 0, - 756, 226, 0, 257, 262, 258, 259, 261, 260, 0, - 756, 229, 286, 363, 0, 332, 0, 0, 756, 340, - 756, 339, 62, 0, 0, 0, 681, 0, 0, 0, - 0, 0, 689, 688, 687, 686, 0, 0, 685, 61, - 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 640, 731, 734, 0, 757, 0, + 729, 206, 624, 625, 626, 627, 628, 629, 632, 633, + 639, 0, 621, 622, 623, 630, 631, 619, 620, 616, + 617, 618, 638, 637, 0, 0, 328, 330, 0, 0, + 0, 757, 279, 0, 268, 757, 757, 757, 757, 757, + 284, 267, 0, 280, 0, 281, 283, 282, 191, 757, + 0, 0, 0, 757, 757, 0, 192, 195, 757, 0, + 190, 757, 365, 0, 362, 361, 356, 360, 0, 738, + 739, 740, 0, 0, 742, 335, 297, 337, 0, 757, + 0, 757, 305, 0, 0, 43, 39, 757, 0, 0, + 0, 0, 0, 757, 374, 0, 757, 326, 305, 0, + 325, 72, 0, 380, 0, 77, 79, 0, 0, 757, + 306, 0, 757, 0, 0, 404, 213, 0, 68, 65, + 0, 312, 359, 0, 589, 588, 605, 595, 591, 593, + 594, 0, 601, 0, 600, 654, 590, 655, 0, 657, + 0, 658, 0, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 597, 0, 0, 0, 320, 0, 596, + 599, 0, 603, 602, 0, 608, 609, 598, 592, 583, + 542, 732, 0, 757, 757, 757, 92, 207, 0, 636, + 635, 300, 299, 301, 285, 757, 269, 274, 270, 271, + 273, 272, 757, 0, 0, 0, 757, 0, 232, 0, + 0, 757, 194, 0, 0, 757, 757, 757, 757, 757, + 757, 757, 246, 245, 0, 256, 0, 0, 0, 0, + 0, 0, 757, 0, 538, 537, 366, 355, 298, 0, + 0, 757, 757, 0, 55, 59, 719, 715, 718, 721, + 722, 198, 0, 0, 0, 717, 723, 0, 725, 724, + 0, 0, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 199, 234, 202, 235, 671, 720, 197, 757, + 757, 757, 376, 0, 0, 0, 0, 378, 757, 0, + 0, 169, 170, 171, 157, 0, 158, 0, 154, 159, + 155, 757, 168, 153, 0, 74, 0, 382, 0, 757, + 0, 0, 757, 0, 0, 757, 0, 757, 757, 757, + 757, 757, 0, 237, 236, 0, 757, 81, 404, 208, + 0, 0, 67, 0, 757, 0, 0, 757, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 757, 757, + 172, 0, 310, 0, 0, 0, 0, 0, 322, 323, + 607, 0, 604, 0, 730, 0, 99, 0, 0, 93, + 101, 96, 100, 95, 97, 0, 94, 98, 0, 187, + 634, 275, 0, 0, 0, 757, 0, 757, 757, 0, + 0, 757, 193, 196, 757, 251, 247, 248, 250, 249, + 0, 757, 226, 0, 257, 262, 258, 259, 261, 260, + 0, 757, 229, 286, 363, 0, 332, 0, 0, 757, + 340, 757, 339, 62, 0, 0, 0, 681, 0, 0, + 0, 0, 0, 689, 688, 687, 686, 0, 0, 685, + 61, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 57, 56, 379, 756, 0, - 0, 0, 0, 756, 0, 37, 756, 756, 0, 162, - 160, 0, 756, 756, 756, 756, 756, 756, 756, 166, - 73, 756, 381, 0, 0, 0, 0, 314, 313, 0, - 756, 242, 238, 239, 241, 240, 87, 756, 315, 14, - 756, 0, 0, 8, 0, 0, 0, 214, 405, 406, - 216, 217, 756, 0, 220, 222, 219, 215, 0, 179, - 175, 0, 116, 117, 118, 119, 120, 121, 124, 125, - 140, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 144, 143, 127, 126, 113, 115, 114, - 122, 123, 111, 112, 108, 109, 110, 107, 0, 0, - 106, 173, 176, 178, 177, 0, 0, 183, 756, 185, - 0, 0, 70, 311, 0, 0, 656, 659, 660, 0, - 0, 756, 0, 756, 0, 0, 404, 276, 756, 233, - 756, 756, 227, 230, 756, 756, 287, 252, 255, 0, - 263, 266, 0, 367, 334, 333, 336, 0, 0, 342, - 341, 0, 0, 0, 756, 0, 0, 0, 0, 0, - 0, 0, 0, 714, 200, 203, 698, 699, 700, 701, - 702, 703, 706, 707, 713, 0, 695, 696, 697, 704, - 705, 693, 694, 690, 691, 692, 712, 711, 0, 0, - 756, 0, 0, 0, 0, 0, 375, 0, 756, 167, - 147, 145, 150, 146, 156, 163, 0, 756, 0, 164, - 204, 0, 75, 756, 0, 0, 756, 89, 243, 756, - 0, 0, 209, 404, 0, 756, 756, 211, 212, 408, - 409, 413, 410, 418, 411, 412, 414, 415, 416, 417, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 486, 467, - 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 511, 512, 513, 756, 530, 531, 532, 523, - 535, 519, 520, 518, 525, 526, 514, 515, 516, 517, - 524, 522, 529, 527, 533, 528, 521, 534, 407, 0, - 218, 221, 180, 174, 142, 141, 182, 186, 756, 0, - 207, 0, 586, 585, 587, 584, 756, 756, 188, 105, - 102, 0, 0, 0, 228, 231, 0, 0, 756, 253, - 756, 264, 364, 746, 0, 745, 0, 0, 343, 345, - 735, 756, 0, 680, 0, 0, 0, 0, 0, 678, - 677, 0, 683, 684, 672, 0, 710, 709, 377, 0, - 27, 0, 0, 0, 36, 165, 161, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 57, 56, 379, 757, + 0, 0, 0, 0, 757, 0, 37, 757, 757, 0, + 162, 160, 0, 757, 757, 757, 757, 757, 757, 757, + 166, 73, 757, 381, 0, 0, 0, 0, 314, 313, + 0, 757, 242, 238, 239, 241, 240, 87, 757, 315, + 14, 757, 0, 0, 8, 0, 0, 0, 214, 405, + 406, 216, 217, 757, 0, 220, 222, 219, 215, 0, + 179, 175, 0, 116, 117, 118, 119, 120, 121, 124, + 125, 140, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 144, 143, 127, 126, 113, 115, + 114, 122, 123, 111, 112, 108, 109, 110, 107, 0, + 0, 106, 173, 176, 178, 177, 0, 0, 183, 757, + 185, 0, 0, 70, 311, 0, 0, 656, 659, 660, + 0, 0, 757, 0, 757, 0, 0, 404, 276, 757, + 233, 757, 757, 227, 230, 757, 757, 287, 252, 255, + 0, 263, 266, 0, 367, 334, 333, 336, 0, 0, + 342, 341, 0, 0, 0, 757, 0, 0, 0, 0, + 0, 0, 0, 0, 714, 200, 203, 698, 699, 700, + 701, 702, 703, 706, 707, 713, 0, 695, 696, 697, + 704, 705, 693, 694, 690, 691, 692, 712, 711, 0, + 0, 757, 0, 0, 0, 0, 0, 375, 0, 757, + 167, 147, 145, 150, 146, 156, 163, 0, 757, 0, + 164, 204, 0, 75, 757, 0, 0, 757, 89, 243, + 757, 0, 0, 209, 404, 0, 757, 757, 211, 212, + 408, 409, 413, 410, 418, 411, 412, 414, 415, 416, + 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 486, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 757, 530, 531, 532, + 523, 535, 519, 520, 518, 525, 526, 514, 515, 516, + 517, 524, 522, 529, 527, 533, 528, 521, 534, 407, + 0, 218, 221, 180, 174, 142, 141, 182, 186, 757, + 0, 207, 0, 586, 585, 587, 584, 757, 757, 188, + 105, 102, 0, 0, 0, 228, 231, 0, 0, 757, + 253, 757, 264, 364, 746, 0, 745, 0, 0, 343, + 345, 735, 757, 0, 680, 0, 0, 0, 0, 0, + 678, 677, 0, 683, 684, 672, 0, 710, 709, 377, + 0, 27, 0, 0, 0, 36, 165, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 205, 543, 0, 78, 0, 83, 80, 756, 0, 244, - 756, 0, 9, 0, 0, 0, 223, 756, 224, 0, - 181, 71, 0, 189, 0, 103, 652, 756, 756, 756, - 0, 0, 0, 348, 0, 347, 0, 346, 736, 0, - 0, 0, 737, 756, 344, 0, 0, 682, 0, 679, - 0, 708, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 558, 556, 555, 557, - 554, 0, 0, 553, 0, 0, 0, 0, 0, 0, + 0, 205, 543, 0, 78, 0, 83, 80, 757, 0, + 244, 757, 0, 9, 0, 0, 0, 223, 757, 224, + 0, 181, 71, 0, 189, 0, 103, 652, 757, 757, + 757, 0, 0, 0, 348, 0, 347, 0, 346, 736, + 0, 0, 0, 737, 757, 344, 0, 0, 682, 0, + 679, 0, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 558, 556, 555, + 557, 554, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 76, 85, 756, 0, 756, - 82, 210, 12, 10, 536, 0, 756, 404, 104, 756, - 756, 756, 756, 756, 354, 353, 352, 351, 350, 349, - 338, 0, 0, 0, 0, 0, 28, 0, 33, 35, - 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 581, 567, 568, 569, 570, 571, 572, 573, 574, - 580, 0, 564, 565, 566, 562, 563, 559, 560, 561, - 579, 578, 0, 0, 756, 0, 756, 88, 11, 225, - 184, 0, 290, 289, 288, 254, 265, 675, 674, 676, - 673, 0, 0, 0, 0, 552, 0, 0, 0, 0, - 550, 549, 0, 544, 0, 577, 576, 0, 756, 90, - 653, 29, 0, 0, 31, 0, 0, 0, 551, 0, - 575, 756, 756, 0, 0, 0, 0, 0, 0, 756, - 84, 34, 32, 547, 546, 548, 545, 86 + 0, 0, 0, 0, 0, 0, 76, 85, 757, 0, + 757, 82, 210, 12, 10, 536, 0, 757, 404, 104, + 757, 757, 757, 757, 757, 354, 353, 352, 351, 350, + 349, 338, 0, 0, 0, 0, 0, 28, 0, 33, + 35, 0, 30, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 581, 567, 568, 569, 570, 571, 572, 573, + 574, 580, 0, 564, 565, 566, 562, 563, 559, 560, + 561, 579, 578, 0, 0, 757, 0, 757, 88, 11, + 225, 184, 0, 290, 289, 288, 254, 265, 675, 674, + 676, 673, 0, 0, 0, 0, 552, 0, 0, 0, + 0, 550, 549, 0, 544, 0, 577, 576, 0, 757, + 90, 653, 29, 0, 0, 31, 0, 0, 0, 551, + 0, 575, 757, 757, 0, 0, 0, 0, 0, 0, + 757, 84, 34, 32, 547, 546, 548, 545, 86 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -913, -913, -313, -913, -42, -913, -913, 767, -123, -913, - 235, -421, 437, -121, -913, -913, -177, -913, -913, -237, - -913, -913, -913, 752, -913, -913, -913, -913, -913, -350, - -913, -913, -110, -913, -913, -913, -913, 203, 383, -664, - -913, -700, -725, -549, -913, -155, -913, 16, -519, -913, - -483, -912, -913, -448, 245, -647, -221, 389, -35, -86, - 137, 64, -266, -638, 763, 665, -162, -113, -913, -103, - -913, -913, -913, -913, -182, -100, -913, -451, -913, -913, - -36, -8, -913, -913, -913, -913, -13, -29, -913, -913, - -703, -913, -109, -913, -590, -135, -60, 328, 703, 309, - -913, -913, -913, 691, -88, 199, 861, -486, -1 + -918, -918, -304, -918, -28, -918, -918, 774, -103, -918, + 1012, -428, 445, -89, -918, -918, -145, -918, -918, -214, + -918, -918, -918, 772, -918, -918, -918, -918, -918, -308, + -918, -918, -105, -918, -918, -918, -918, 221, 408, -634, + -918, -701, -745, -479, -918, -135, -918, 39, -463, -918, + -500, -917, -918, -436, 265, -649, -409, -59, -158, -88, + -61, 22, -279, -635, 788, 793, -163, -133, -918, -130, + -918, -918, -918, -918, -162, -124, -918, -457, -918, -918, + 16, 21, -918, -918, -918, -918, 48, 47, -918, -918, + -726, -918, -96, -918, -589, -107, -60, 175, 517, 145, + -918, -918, -918, 706, 206, -47, 152, -468, -1 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 4, 5, 912, 913, 137, 521, 138, 139, 307, - 140, 292, 293, 141, 529, 523, 746, 329, 705, 890, - 343, 708, 711, 344, 910, 1407, 1474, 1089, 1317, 584, - 971, 1072, 142, 326, 696, 697, 698, 699, 700, 747, - 1238, 748, 777, 464, 465, 670, 671, 1079, 409, 731, - 527, 923, 924, 466, 673, 721, 794, 804, 278, 279, - 91, 92, 345, 180, 346, 93, 289, 94, 640, 95, - 641, 820, 1018, 1019, 1268, 96, 97, 475, 471, 472, - 98, 99, 143, 687, 868, 144, 100, 101, 102, 103, - 732, 733, 918, 1228, 632, 353, 354, 1310, 213, 65, - 674, 675, 227, 228, 1269, 1270, 621, 66, 145 + -1, 4, 5, 913, 914, 137, 522, 138, 139, 308, + 140, 293, 294, 141, 530, 524, 747, 330, 706, 891, + 344, 709, 712, 345, 911, 1408, 1475, 1090, 1318, 585, + 972, 1073, 142, 327, 697, 698, 699, 700, 701, 748, + 1239, 749, 778, 465, 466, 671, 672, 1080, 410, 732, + 528, 924, 925, 467, 674, 722, 795, 805, 279, 280, + 91, 92, 346, 180, 347, 93, 290, 94, 641, 95, + 642, 821, 1019, 1020, 1269, 96, 97, 476, 472, 473, + 98, 99, 143, 688, 869, 144, 100, 101, 102, 103, + 733, 734, 919, 1229, 633, 354, 355, 1311, 213, 65, + 675, 676, 228, 229, 1270, 1271, 622, 66, 145 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1474,334 +1474,290 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 6, 212, 502, 304, 676, 891, 281, 323, 181, 325, - 1229, 781, 356, 607, 358, 359, 360, 361, 826, 363, - 389, 365, 979, 367, 911, 704, 637, 347, 709, 492, - -748, 183, -749, 611, 764, 1334, 182, 348, 603, 383, - 349, 255, 672, 256, 840, 187, 895, 104, -750, 828, - 391, 392, 264, 265, 266, 406, 399, 400, 1373, 269, - 638, 230, 509, 763, -751, 1006, 402, 899, 644, 901, - 902, 903, 904, 905, 549, 929, 930, 407, 972, 973, - 974, 975, 408, 153, 408, 403, 260, 766, 402, 402, - 280, 280, 1061, 550, 214, 215, 216, 800, 290, 810, - -748, 801, -749, -748, 350, -749, 402, 588, 1033, 306, - 402, 1062, 811, 240, 402, 283, 284, 285, -750, 148, - 1078, -750, 402, 402, 1362, 1242, 149, 352, 993, 1243, - 906, 907, 351, 1244, -751, 800, -91, -751, -91, 258, - -91, 1245, 1286, 1363, 1364, 355, 355, 1392, 355, 355, - 355, 355, 261, 355, 514, 355, 255, 355, 256, 893, - 217, 218, 896, 1365, 792, 612, 813, 150, 10, 814, - 11, 435, 436, 355, 710, 240, 841, 264, 265, 266, - 269, 290, 347, 680, 355, 355, 1335, 452, 454, 532, - 355, 355, 348, 433, 188, 349, 219, 220, 829, 221, - 151, 1067, 874, 976, 222, 152, 223, 1374, 725, 154, - 1009, 347, 257, 1367, 402, 347, 402, 286, 977, 978, - 1012, 348, 156, 402, 349, 348, 155, 410, 349, 981, - 1084, 146, 1368, 1451, 264, 1487, 402, 449, 451, 453, - 455, 456, 1488, 252, 253, 254, 620, 402, 184, 147, - 1250, 1493, 565, 1088, 287, 1489, 280, 280, 476, 350, - 790, 229, 1095, 157, 1232, 982, 1490, 1002, 1003, 282, - 1494, 450, 280, 280, 450, 450, 469, 1402, 1403, 1404, - 1096, 473, 352, 512, 267, 513, 158, 351, 350, 159, - 402, 160, 350, 1252, 402, 1, 2, 3, 161, 983, - 402, 249, 250, 251, 294, 252, 253, 254, 162, 1505, - 240, 352, 402, 1533, 6, 352, 351, 1090, 402, 1534, - 351, 727, 316, 728, 729, 730, 524, 818, 525, 401, - 526, 1535, 331, 163, -91, 999, -91, 1536, -91, 601, - 782, 468, 164, 298, 299, 300, 994, 301, 303, 305, - 290, 165, 309, 166, 1247, 676, 442, 314, 443, 167, - 444, 1091, 320, 321, 168, 324, 327, 328, 169, 332, - 333, 170, 1081, 816, 873, 601, 788, 385, 171, 524, - 388, 525, 172, 980, 786, 173, 355, 174, 1239, 185, - 1321, 601, 789, 672, 795, 796, 797, 798, 799, 189, - 977, 978, 1085, 445, 186, 593, 585, 190, 1082, 596, - 597, 598, 599, 600, 467, 1415, 270, 191, 271, 192, - 272, 915, 916, 602, 404, 405, 259, 608, 609, 623, - 268, 624, 295, 625, 247, 248, 249, 250, 251, 450, - 252, 253, 254, 450, 450, 450, 450, 450, 476, 1253, - 977, 978, 1236, 800, 1008, 1256, 1257, 450, 977, 978, - 1314, 450, 450, 273, 810, 1011, 622, 1087, 907, 634, - 441, 1349, 1350, 1351, 310, 518, 626, 1093, 1094, 888, - 311, 1254, 1255, 446, 214, 215, 216, 312, 485, 677, - 487, 313, 701, 977, 978, 6, 317, 447, 318, 319, - 322, 384, 448, 386, 702, 387, 393, 497, 477, 498, - 499, 500, 501, 408, 440, 488, 470, 723, -267, 489, - 6, 1332, 503, 505, 606, 468, 347, 528, 490, 511, - 515, 303, 309, 516, 520, 402, 348, 494, 519, 349, - 1318, 522, 533, 274, 534, 580, 535, 536, 537, 530, - 217, 218, 538, 539, 468, 1060, 627, 275, 540, 780, - 541, 542, 276, 1000, 543, 544, 545, 277, 547, 551, - 628, 567, 1007, 546, 548, 629, 552, 553, 554, 555, - 630, 410, 469, 778, 556, 557, 219, 220, 566, 221, - 558, 559, 570, 450, 222, 560, 223, 605, 467, 561, - 634, 562, 568, 350, 622, 229, 569, 571, 837, 585, - 572, 573, 891, 622, 622, 622, 622, 622, 622, 410, - 181, 594, 574, 576, 224, 577, 352, 467, 225, 583, - 410, 351, 590, 226, 592, -269, 601, 639, 610, 6, - 821, 1246, 595, 183, 636, 642, 678, 468, 182, 681, - 703, 682, 683, 684, 714, 1068, 685, 726, 294, 706, - 758, 750, 795, 796, 797, 798, 799, 759, 785, 783, - 635, 752, 283, 284, 285, 715, 468, 753, 760, 716, - 294, 701, 761, 762, 793, 802, 6, 812, 294, -358, - 815, 819, 984, 985, 1482, 1483, 1484, 823, 831, 622, - 989, 824, 990, 825, 827, 64, 830, 469, 839, 1340, - 469, 1341, 869, 723, 1481, 723, 723, 723, 723, 723, - 467, 476, 717, 643, 870, 871, 211, 872, 875, 877, - 181, 751, 919, 1313, 878, 926, 1316, 892, 894, 917, - 897, 784, 900, 908, 920, 921, 778, 410, 986, 467, - 928, 765, 676, 183, 1070, 996, 1071, 995, 182, 193, - 194, 195, 196, 197, 987, 988, 231, 1073, 1408, 991, - 997, 998, 468, 800, 286, 468, 1004, 1005, 1017, 810, - 404, 767, -276, 622, 1014, 410, 410, 1024, 1026, 778, - 672, 1032, 622, 1063, 768, 769, 1064, 1530, 1065, 634, - 1076, 1083, 718, 1058, 1537, 1086, 1077, 1092, 907, 634, - 770, 1097, 1098, 357, 1231, 1230, 719, 1233, 362, 1020, - 364, 720, 366, 803, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 1234, - 771, 294, 1237, 772, 1235, 467, 773, 468, 467, 390, - 1249, 1241, 1258, 395, 396, 397, 1007, 631, 1475, 1259, - 1260, 1261, 774, 1272, 1271, 701, 1273, 6, 1274, 1275, - 1289, 1279, 1280, 1282, 775, 622, 1277, 1281, 1290, 1392, - 1291, 622, 622, 622, 622, 622, 622, 1080, 776, 1276, - 410, 1292, 1293, 398, 1294, 1312, 1315, 880, 1319, 723, - 238, 239, 1320, 1352, 1326, 468, 634, 1248, 1330, 469, - 1336, 240, 1370, 865, 866, 1337, 1338, 1339, 1355, 1356, - 467, 926, 1357, 1358, 1359, 1507, 1360, 1366, 914, 1369, - 1371, 1372, 1375, 439, 1406, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 181, 434, 1353, 288, - 1323, 1324, 438, 1409, 1417, 1411, 294, 1412, 1435, 1413, - 1410, 1416, 1418, 1436, 468, 1422, 1423, 634, 467, 183, - 236, 237, 238, 239, 182, 1437, 1440, 1419, 1420, 1421, - 585, 1438, 280, 240, 1446, 787, 1439, 469, 493, 410, - 410, 1441, 1450, 469, 469, 1399, 1400, 1401, 1476, 1402, - 1403, 1404, 1478, 1492, 1479, 805, 806, 807, 808, 809, - 1491, 1495, 1500, 355, 1496, 504, 214, 215, 216, 1497, - 1498, 1501, 1502, 1508, 1511, 247, 248, 249, 250, 251, - 1512, 252, 253, 254, 1510, 1513, 1514, 467, 1515, 1516, - 1531, 564, 1322, 283, 284, 285, 738, 1517, 1518, 1477, - 739, 1519, 468, 1532, 1331, 1521, 1480, 1080, 468, 468, - 1523, 1524, 1485, 1486, 495, 1405, 622, 876, 1075, 822, - 508, 1074, 585, 1329, 1295, 585, 1035, 563, 469, 889, - 1354, 510, 217, 218, 355, 355, 1325, 582, 0, 0, - 0, 0, 0, 740, 578, 579, 283, 284, 285, 613, - 0, 586, 324, 614, 0, 245, 246, 247, 248, 249, - 250, 251, 0, 252, 253, 254, 1509, 0, 219, 220, - 0, 221, 0, 0, 0, 467, 222, 0, 223, 0, - 0, 467, 467, 0, 0, 0, 0, 0, 0, 0, - 486, 0, 0, 468, 741, 286, 615, 0, 1522, 0, - 0, 1333, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1529, 0, 633, 1001, 1343, 1345, 1347, 707, 0, - 0, -268, 0, 742, 0, 724, 0, 0, 0, 0, - 0, 1010, 0, 0, 1251, 0, 0, 743, 0, 0, - 0, 0, 744, 0, 919, 0, 0, 745, 286, 0, - 0, 531, 754, 0, 755, 0, 756, 0, 0, 713, - 0, 0, 0, 0, 0, 1278, 467, 0, 0, 737, - 0, 0, 0, 0, 0, 0, 616, 677, 0, 0, - 0, 0, 214, 215, 216, 778, 280, 0, 1382, 0, - 617, 0, 0, 0, 1424, 618, 1425, 469, 1426, 469, - 619, 1427, 1428, 1429, 0, 1069, 0, 0, 0, 0, - 6, 0, 805, 806, 807, 808, 809, 0, 0, 0, - 283, 284, 285, 881, 0, 624, 0, 882, 0, 0, - 779, 0, 0, 914, 0, 1431, 1432, 0, 1433, 0, - 1434, 0, 468, 474, 633, 0, 0, 0, 217, 218, - 0, 0, 0, 0, 0, 0, 469, 0, 0, 585, - 0, 0, 468, 0, 468, 0, 926, 0, 0, 0, - 883, 0, 0, 836, 0, 0, 585, 585, 585, 0, - 0, 0, 817, 1472, 219, 220, 70, 221, 71, 72, - 73, 0, 222, 1392, 223, 0, 0, 0, 0, 1386, - 1387, 1388, 1389, 1390, 1391, 0, 0, 832, 833, 834, - 835, 0, 838, 0, 1392, 467, 80, 0, 0, 722, - 0, 468, 286, 0, 0, 0, 581, 1311, 1390, 1391, - 749, 226, 263, 486, 0, 467, 0, 467, 0, 1392, - 0, 0, 0, 0, 0, 0, 469, 0, 585, 0, - 884, 82, 83, 0, 0, 585, 0, 0, 778, 778, - 778, 585, 585, 0, 885, 0, 0, 0, 88, 886, - 0, 0, 0, 90, 887, 0, 0, 0, 0, 925, - 0, 0, 0, 0, 0, 0, 0, 233, 234, 235, - 236, 237, 238, 239, 467, 1525, 1526, 1527, 0, 1528, - 0, 0, 0, 240, 0, 1348, 1010, 0, 0, 0, - 0, 468, 0, 469, 0, 585, 0, 1397, 1398, 1399, - 1400, 1401, 0, 1402, 1403, 1404, 0, 0, 1021, 1022, - 1023, 0, 1025, 0, 1028, 1029, 1030, 0, 1397, 1398, - 1399, 1400, 1401, 633, 1402, 1403, 1404, 585, 0, 1388, - 1389, 1390, 1391, 633, 0, 0, 0, 1013, 0, 0, - 585, 778, 1392, 1397, 1398, 1399, 1400, 1401, 778, 1402, - 1403, 1404, 0, 0, 1031, 0, 0, 0, 468, 0, - 0, 0, 0, 0, 467, 1036, 1037, 1038, 1039, 1040, - 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, - 1051, 1052, 1053, 1054, 1055, 1056, 749, 1059, 0, 0, - 0, 749, 214, 215, 216, 722, 0, 722, 722, 722, - 722, 722, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 0, 252, 253, 254, 0, 0, 0, 0, - 749, 749, 0, 749, 749, 749, 749, 0, 0, 0, - 633, 467, 1311, 1311, 1311, 1311, 1311, 0, 1311, 0, - 0, 0, 0, 0, 0, 925, 0, 0, 0, 0, - 0, 1376, 1377, 1378, 1379, 1380, 0, 1383, 217, 218, - 0, 0, 0, 0, 0, 1499, 1397, 1398, 1399, 1400, - 1401, 0, 1402, 1403, 1404, 232, 233, 234, 235, 236, - 237, 238, 239, 0, 0, 0, 0, 0, 0, 330, - 0, 0, 240, 0, 219, 220, 0, 221, 0, 0, - 0, 633, 222, 1240, 223, 0, 0, 0, 0, 0, - 0, 0, 0, 1311, 1311, 1311, 1311, 1311, 1311, 1311, - 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, - 1311, 1311, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, - 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, - 1470, 0, 0, 0, 0, 1284, 0, 0, 0, 0, - 0, 1296, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 749, 0, 0, 0, 1311, - 0, 722, 0, 7, 8, 9, 10, 0, 11, 12, - 13, 198, 68, 0, 0, 0, 0, 0, 1503, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 749, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 0, 252, 253, 254, 0, 0, 0, 589, 0, - 15, 69, 0, 1311, 199, 0, 200, 201, 202, 74, - 75, 0, 20, 76, 0, 0, 203, 22, 0, 0, - 78, 0, 1520, 0, 0, 23, 24, 204, 478, 479, - 480, 26, 0, 0, 205, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 206, 234, 235, 236, 237, 238, 239, 0, 44, 0, - 45, 0, 46, 0, 0, 0, 240, 47, 0, 207, - 208, 50, 0, 0, 51, 84, 0, 0, 0, 52, - 0, 0, 53, 85, 86, 87, 209, 0, 0, 89, - 0, 210, 0, 0, 217, 218, 232, 233, 234, 235, - 236, 237, 238, 239, 56, 0, 0, 57, 58, 59, - 0, 0, 60, 240, 61, 62, 0, 0, 63, 0, - 0, 0, 0, 0, 1328, 0, 0, 0, 0, 0, - 483, 220, 0, 221, 0, 0, 0, 0, 222, 0, - 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 214, 215, 216, 0, 0, - 0, 0, 0, 1381, 0, 0, 0, 287, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1361, 0, - 0, 0, 0, 0, 0, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 0, + 6, 212, 912, 980, 282, 892, 1230, 348, 305, 705, + 349, 1335, 503, 782, 258, 230, 350, 493, 256, 390, + 257, 638, 827, 677, 409, 187, 608, 324, 767, 261, + 710, 407, 604, 829, 1374, 612, 104, 403, 268, 801, + 357, 326, 359, 360, 361, 362, 1007, 364, 307, 366, + 510, 368, 148, 408, 639, 673, 404, 153, 295, 621, + 181, 231, 645, -749, 149, 182, 900, 384, 902, 903, + 904, 905, 906, 409, 841, 550, 317, 896, 392, 393, + 403, 150, 403, 241, 400, 401, 332, 256, 811, 257, + 281, 281, 183, 151, 551, 262, 146, 259, 291, 589, + 271, 1034, 272, 155, 273, 765, 930, 931, 241, 973, + 974, 975, 976, 152, 147, 450, 452, 454, 456, 457, + 764, 284, 285, 286, 1062, 1079, 602, 783, 265, 266, + 267, 386, 994, -749, 389, 270, -749, 525, 1393, 526, + 801, 527, 154, 1063, 977, 356, 356, 274, 356, 356, + 356, 356, 513, 356, 514, 356, 351, 356, 802, 978, + 979, 352, 1336, 348, 907, 908, 349, 613, 184, 812, + 436, 437, 350, 356, 188, 156, 711, 793, 1068, 405, + 406, 291, 830, 1375, 356, 356, 453, 455, 353, 533, + 356, 356, 348, 681, 434, 349, 348, 787, 1096, 349, + 403, 350, 1393, 602, 789, 350, 842, 796, 797, 798, + 799, 800, 1010, 253, 254, 255, 1097, 468, 726, 1243, + 157, 875, 1013, 287, 10, 442, 11, 275, 411, -750, + 894, 602, 790, 897, 250, 251, 252, -751, 253, 254, + 255, 276, 158, 486, 403, 488, 277, 916, 917, 983, + 289, 278, 1089, 265, 266, 267, 270, 281, 281, 159, + 288, 1085, 498, 1244, 499, 500, 501, 502, 1403, 1404, + 1405, 1253, 451, 281, 281, 451, 451, 470, 519, 403, + 160, 566, 474, 594, 512, 161, 982, 597, 598, 599, + 600, 601, 889, 520, 984, 1233, 523, 403, 1245, -750, + 469, 603, -750, 791, 531, 609, 610, -751, -752, 283, + -751, 265, 351, 801, 1009, 6, 1246, 352, 162, 1091, + 284, 285, 286, 739, 1003, 1004, 163, 740, 1400, 1401, + 1402, 164, 1403, 1404, 1405, 477, 814, 819, 165, 815, + 995, 351, 166, 567, 353, 351, 352, 571, 1000, 167, + 352, 291, 1387, 1388, 1389, 1390, 1391, 1392, 1248, 168, + 230, 817, 169, 403, 1363, 811, 1012, 1393, 1322, 1365, + 741, 170, 1368, 353, 677, 403, 1001, 353, -752, 171, + 403, -752, 1287, 1364, 874, 1008, 318, 356, 1366, 403, + 1240, 1369, 1083, 403, 1452, 172, 403, 596, 1494, 1488, + 606, 468, 284, 285, 286, 614, 673, 586, 1489, 615, + 632, 1416, 1490, 295, 443, 1491, 444, 1495, 445, 403, + 403, 742, 287, 173, 728, 636, 729, 730, 731, 1082, + 468, 174, 1092, 185, 403, 295, 403, 781, 1506, 1534, + 451, 403, 487, 295, 451, 451, 451, 451, 451, 186, + 743, 189, 616, 1535, 190, 1536, 191, 715, 451, 192, + 1537, 446, 451, 451, 744, 1088, 908, 623, 1069, 745, + 635, 1, 2, 3, 746, 796, 797, 798, 799, 800, + 978, 979, 1086, 607, 469, 260, 752, 1396, 1397, 269, + 678, 1398, 1399, 1400, 1401, 1402, 6, 1403, 1404, 1405, + 1094, 1095, 1333, 532, 287, 703, 296, 348, 978, 979, + 349, 311, 312, 469, 313, 314, 350, 319, 724, 64, + 1254, 6, 320, 468, 323, 477, 1257, 1258, 385, -91, + 387, -91, 617, -91, 388, 405, 394, 402, 1255, 1256, + 409, 447, 471, 441, 785, 624, 618, 625, 788, 626, + -267, 619, 468, 478, 702, 448, 620, 525, 489, 526, + 449, 981, 978, 979, 1237, 1061, 490, 491, 806, 807, + 808, 809, 810, 193, 194, 195, 196, 197, 804, 506, + 232, 504, 411, 470, 779, -91, 516, -91, 529, -91, + 517, 521, 627, 403, 451, 534, 295, 978, 979, 1315, + 535, 635, 536, 515, 537, 623, 469, 538, 539, 838, + 586, 1319, 892, 540, 623, 623, 623, 623, 623, 623, + 411, 1350, 1351, 1352, 541, 542, 543, 786, 544, 545, + 546, 411, 547, 548, 552, 469, 581, 549, 553, 554, + 6, 822, 890, 555, 556, 557, 558, 559, 468, 560, + 561, 468, 881, 568, 562, 563, 351, 569, 570, 572, + 573, 352, 574, 637, 575, 577, 578, 584, 591, 1008, + 593, 723, 628, 181, -269, 1483, 1484, 1485, 182, 595, + 602, 682, 750, 915, 1247, 487, 629, 6, 353, 611, + 640, 630, 1482, 985, 986, 643, 631, 679, 683, 684, + 623, 990, 685, 991, 686, 183, 704, 399, 470, 707, + 759, 470, 727, 751, 724, 760, 724, 724, 724, 724, + 724, 295, 753, 468, 754, 762, 761, 1002, 784, 763, + 794, 469, 803, 920, 469, 813, 927, -358, 816, 820, + 824, 825, 826, 702, 1011, 828, 832, 779, 411, 831, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 677, 435, 1074, 840, 1071, 1314, 439, 1531, 1317, + 1341, 468, 1342, 181, 623, 1538, 411, 411, 182, 1072, + 779, 870, 871, 623, 872, 873, 876, 878, 477, 879, + 635, 893, 895, 673, 1059, 898, 469, 918, 901, 921, + 635, 909, 922, 494, 929, 183, 987, 988, 1070, 997, + 1021, 1064, 989, 992, 996, 806, 807, 808, 809, 810, + 999, 998, 1005, 1076, 1006, 1015, 801, 811, 1018, 1409, + 505, -276, 1025, 1027, 1065, 1066, 1077, 1033, 1084, 1087, + 468, 1078, 908, 1093, 211, 1098, 1099, 1232, 750, 1234, + 1231, 1235, 1238, 750, 469, 1242, 1250, 723, 6, 723, + 723, 723, 723, 723, 1236, 1259, 623, 1261, 475, 1272, + 1274, 1260, 623, 623, 623, 623, 623, 623, 1081, 1262, + 1273, 411, 750, 750, 1275, 750, 750, 750, 750, 1290, + 724, 1276, 564, 1278, 1282, 1280, 1249, 635, 1281, 1291, + 470, 1292, 1283, 1293, 1294, 1295, 1313, 1316, 1277, 579, + 580, 70, 927, 71, 72, 73, 587, 702, 1320, 1476, + 1321, 1331, 1327, 469, 1353, 1337, 1338, 1339, 468, 1340, + 1356, 358, 1357, 1358, 468, 468, 363, 1359, 365, 1252, + 367, 80, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 264, 1354, 1360, + 1361, 1367, 1370, 1407, 1371, 1372, 1373, 391, 635, 1376, + 1279, 396, 397, 398, 1412, 1418, 82, 83, 634, 1324, + 1325, 586, 1410, 281, 1413, 766, 1508, 1414, 470, 1417, + 411, 411, 1419, 88, 470, 470, 1423, 1424, 90, 181, + 1436, 767, 1437, 1411, 182, 1438, 1439, 1440, 1441, 1011, + 1442, 469, 1451, 1447, 356, 768, 1477, 469, 469, 468, + 1420, 1421, 1422, 1479, 714, 1493, 1497, 1480, 769, 770, + 1492, 183, 1496, 1498, 738, 1501, 1499, 750, 915, 1502, + 1503, 1509, 1513, 723, 771, 1512, 1514, 1515, 1511, 1516, + 1517, 1518, 440, 1532, 241, 1519, 1520, 1323, 1081, 214, + 215, 216, 237, 238, 239, 240, 1522, 623, 1524, 1525, + 1533, 750, 496, 586, 772, 241, 586, 773, 823, 470, + 774, 284, 285, 286, 716, 356, 356, 1332, 717, 1406, + 1075, 509, 1478, 877, 1330, 780, 775, 1036, 1296, 1481, + 1326, 1355, 469, 583, 0, 1486, 1487, 511, 776, 634, + 299, 300, 301, 217, 302, 304, 306, 0, 0, 310, + 0, 0, 777, 0, 315, 218, 219, 0, 0, 321, + 322, 718, 325, 328, 329, 0, 333, 334, 0, 284, + 285, 286, 882, 0, 625, 0, 883, 818, 0, 0, + 1334, 0, 0, 0, 214, 215, 216, 0, 0, 1510, + 0, 220, 221, 0, 222, 214, 215, 216, 468, 223, + 565, 224, 833, 834, 835, 836, 0, 839, 248, 249, + 250, 251, 252, 287, 253, 254, 255, 0, 468, 884, + 468, 1523, 0, 0, 0, 920, 0, 246, 247, 248, + 249, 250, 251, 252, 1530, 253, 254, 255, 217, 0, + 1349, 719, 0, 0, 1312, 1251, 0, 0, 0, 217, + 218, 219, 0, 0, 0, 720, 0, 0, 678, 0, + 721, 218, 219, 0, 0, 0, 779, 281, 0, 1383, + 0, 287, 0, 0, 926, 0, 0, 468, 470, 0, + 470, 469, 0, 0, 0, 0, 220, 221, 0, 222, + 0, 6, 0, 0, 223, 0, 224, 220, 221, 885, + 222, 469, 0, 469, 0, 223, 0, 224, 0, 0, + 0, 0, 766, 886, 0, 0, 1432, 1433, 887, 1434, + 0, 1435, 0, 888, 0, 0, 0, 708, 0, 304, + 310, 316, 0, 0, 725, 495, 0, 470, 634, -268, + 586, 0, 768, 0, 0, 0, 0, 927, 634, 214, + 215, 216, 1014, 0, 0, 769, 770, 586, 586, 586, + 469, 755, 0, 756, 1473, 757, 0, 468, 0, 1032, + 0, 771, 0, 0, 0, 0, 0, 0, 0, 0, + 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, + 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, + 1057, 772, 1060, 217, 773, 1393, 0, 774, 0, 0, + 0, 0, 0, 0, 750, 218, 219, 0, 0, 0, + 1500, 0, 0, 775, 0, 0, 0, 470, 0, 586, + 0, 0, 0, 0, 468, 776, 586, 0, 0, 779, + 779, 779, 586, 586, 0, 634, 0, 0, 0, 777, + 469, 220, 221, 0, 222, 0, 0, 0, 0, 223, + 926, 224, 0, 0, 0, 0, 0, 0, 0, 1312, + 1312, 1312, 1312, 1312, 0, 1312, 1526, 1527, 1528, 0, + 1529, 0, 837, 0, 0, 750, 239, 240, 0, 225, + 1344, 1346, 1348, 226, 470, 0, 586, 241, 227, 1377, + 1378, 1379, 1380, 1381, 0, 1384, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 634, 469, 1241, 0, + 0, 644, 0, 0, 0, 0, 0, 0, 586, 1398, + 1399, 1400, 1401, 1402, 0, 1403, 1404, 1405, 0, 0, + 0, 586, 779, 0, 0, 0, 0, 0, 0, 779, + 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, + 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1425, + 1285, 1426, 0, 1427, 0, 0, 1428, 1429, 1430, 0, + 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, + 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 0, + 7, 8, 9, 10, 0, 11, 12, 13, 198, 68, + 0, 0, 0, 0, 0, 0, 1312, 0, 0, 0, + 0, 248, 249, 250, 251, 252, 0, 253, 254, 255, + 0, 0, 0, 0, 0, 0, 0, 1022, 1023, 1024, + 0, 1026, 0, 1029, 1030, 1031, 1504, 15, 69, 0, + 0, 199, 0, 200, 201, 202, 74, 75, 0, 20, + 76, 0, 0, 203, 22, 0, 0, 78, 0, 0, + 1312, 0, 23, 24, 204, 0, 0, 0, 26, 0, + 0, 205, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 206, 0, 0, + 1521, 0, 0, 0, 0, 44, 0, 45, 0, 46, + 0, 866, 867, 0, 47, 0, 207, 208, 50, 0, + 0, 51, 84, 214, 215, 216, 52, 0, 0, 53, + 85, 86, 87, 209, 0, 0, 89, 0, 210, 0, + 646, 647, 648, 10, 0, 11, 649, 650, 67, 68, + 0, 56, 651, 0, 57, 58, 59, 0, 0, 60, + 0, 61, 62, 0, 0, 63, 0, 0, 0, 1329, + 0, 0, 0, 0, 0, 0, 0, 217, 0, 0, + 0, 0, 0, 0, 460, 0, 0, 652, 69, 218, + 219, 70, 0, 71, 72, 73, 74, 461, 0, 653, + 76, 0, 0, 77, 654, 0, 0, 78, 0, 0, + 0, 0, 655, 656, 79, 0, 0, 0, 0, 0, + 0, 80, 0, 1362, 0, 220, 221, 0, 222, 0, + 0, 0, 0, 223, 0, 224, 0, 81, 0, 0, + 0, 0, 0, 0, 0, 657, 0, 658, 0, 659, + 0, 0, 0, 462, 660, 0, 82, 83, 661, 497, + 0, 662, 84, 1391, 1392, 926, 663, 0, 0, 664, + 85, 86, 87, 88, 1393, 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 234, 235, 236, 237, 238, 239, 0, - 925, 217, 218, 0, 1442, 1443, 1444, 1445, 240, 1448, - 1449, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 0, 252, 253, 254, 0, 0, 0, 1287, - 0, 0, 0, 0, 0, 0, 0, 219, 220, 0, - 221, 0, 0, 0, 0, 222, 0, 223, 1099, 1100, - 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 0, - 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, - 1120, 315, 749, 0, 0, 0, 0, 1473, 1121, 1122, - 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, - 1133, 1134, 1135, 1136, 1137, 1138, 1139, 0, 0, 1140, - 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, - 1151, 1152, 1153, 1154, 0, 1155, 0, 1156, 1157, 1158, - 1159, 1160, 1161, 1162, 1163, 1164, 0, 1165, 1166, 1167, - 245, 246, 247, 248, 249, 250, 251, 0, 252, 253, - 254, 0, 0, 749, 0, 1168, 0, 0, 0, 0, - 0, 1169, 1170, 1171, 0, 1172, 1173, 1174, 1175, 1176, - 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, - 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, - 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 0, 0, - 0, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, - 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, - 1224, 1225, 1414, 1226, 1227, 1099, 1100, 1101, 1102, 1103, - 1104, 1105, 1106, 1107, 1108, 1109, 0, 1110, 1111, 1112, - 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 0, 0, - 0, 0, 0, 0, 0, 1121, 1122, 1123, 1124, 1125, - 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, - 1136, 1137, 1138, 1139, 0, 0, 1140, 1141, 1142, 1143, - 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, - 1154, 0, 1155, 0, 1156, 1157, 1158, 1159, 1160, 1161, - 1162, 1163, 1164, 0, 1165, 1166, 1167, 0, 0, 0, + 1297, 665, 0, 0, 666, 667, 0, 0, 0, 668, + 0, 669, 0, 0, 0, 670, 0, 0, 0, 0, + 325, 0, 0, 1100, 1101, 1102, 1103, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 0, 1111, 1112, 1113, 1114, 1115, + 1116, 1117, 1118, 1119, 1120, 1121, 0, 0, 0, 0, + 0, 0, 1474, 1122, 1123, 1124, 1125, 1126, 1127, 1128, + 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, + 1139, 1140, 0, 0, 1141, 1142, 1143, 1144, 1145, 1146, + 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 0, + 1156, 0, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, + 1165, 0, 1166, 1167, 1168, 0, 0, 0, 1398, 1399, + 1400, 1401, 1402, 0, 1403, 1404, 1405, 0, 0, 0, + 1169, 0, 0, 0, 0, 0, 1170, 1171, 1172, 0, + 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, + 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, + 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, + 1203, 1204, 1205, 0, 0, 0, 1206, 1207, 1208, 1209, + 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, + 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1415, 1227, 1228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1168, 0, 0, 0, 0, 0, 1169, 1170, - 1171, 0, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, - 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, - 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, - 1200, 1201, 1202, 1203, 1204, 0, 0, 0, 1205, 1206, - 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, - 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 0, - 1226, 1227, 7, 8, 9, 10, 0, 11, 12, 13, - 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1100, 1101, 1102, 1103, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 0, 1111, 1112, 1113, 1114, 1115, + 1116, 1117, 1118, 1119, 1120, 1121, 0, 0, 0, 0, + 0, 0, 1382, 1122, 1123, 1124, 1125, 1126, 1127, 1128, + 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, + 1139, 1140, 0, 0, 1141, 1142, 1143, 1144, 1145, 1146, + 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 0, + 1156, 0, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, + 1165, 0, 1166, 1167, 1168, 0, 0, 0, 0, 0, + 0, 0, 0, 1443, 1444, 1445, 1446, 0, 1449, 1450, + 1169, 0, 0, 0, 0, 0, 1170, 1171, 1172, 0, + 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, + 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, + 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, + 1203, 1204, 1205, 0, 0, 0, 1206, 1207, 1208, 1209, + 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, + 1220, 1221, 1222, 1223, 1224, 1225, 1226, 0, 1227, 1228, + 7, 8, 9, 10, 0, 11, 12, 13, 492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 232, 233, 234, 235, 236, 237, - 238, 239, 0, 0, 0, 0, 0, 0, 0, 15, - 336, 240, 0, 199, 0, 200, 201, 202, 74, 0, - 0, 20, 337, 0, 0, 203, 22, 0, 0, 78, - 0, 0, 0, 0, 23, 24, 204, 0, 0, 0, - 26, 0, 0, 205, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 206, - 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, - 0, 46, 0, 0, 0, 0, 47, 0, 207, 208, - 50, 0, 0, 51, 84, 0, 0, 0, 52, 0, - 0, 53, 339, 340, 87, 209, 0, 0, 89, 0, - 210, 7, 8, 9, 10, 0, 11, 12, 13, 14, - 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, - 0, 60, 0, 61, 62, 0, 0, 63, 0, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 0, 252, 253, 254, 0, 0, 0, 1506, 15, 0, - 0, 0, 16, 0, 17, 18, 19, 0, 0, 0, - 20, 0, 734, 735, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, - 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, - 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, - 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, - 0, 0, 51, 0, 0, 0, 0, 52, 0, 0, - 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, - 11, 12, 13, 14, 736, 214, 215, 216, 0, 0, - 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, - 60, 0, 61, 62, 0, 0, 63, 1385, 1386, 1387, - 1388, 1389, 1390, 1391, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 1392, 0, 0, 16, 0, 17, 18, - 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, - 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, - 0, 217, 218, 26, 0, 0, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, - 44, 0, 45, 0, 46, 0, 0, 219, 220, 47, - 221, 48, 49, 50, 0, 222, 51, 223, 0, 0, - 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, - 8, 9, 10, 55, 11, 12, 13, 14, 0, 0, - 0, 496, 0, 0, 0, 0, 56, 0, 0, 57, - 58, 59, 0, 0, 60, 0, 61, 62, 432, 0, - 63, 0, 1394, 1395, 1396, 0, 0, 1397, 1398, 1399, - 1400, 1401, 0, 1402, 1403, 1404, 15, 437, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 233, 234, 235, 236, 237, 238, 239, 240, + 0, 0, 0, 0, 0, 0, 0, 15, 337, 241, + 0, 199, 0, 200, 201, 202, 74, 0, 0, 20, + 338, 0, 0, 203, 22, 0, 0, 78, 0, 0, + 0, 0, 23, 24, 204, 0, 0, 0, 26, 0, + 0, 205, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 206, 0, 0, + 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, + 0, 0, 0, 0, 47, 0, 207, 208, 50, 0, + 0, 51, 84, 0, 0, 0, 52, 0, 0, 53, + 340, 341, 87, 209, 0, 0, 89, 0, 210, 7, + 8, 9, 10, 0, 11, 12, 13, 14, 0, 0, + 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, + 0, 61, 62, 0, 0, 63, 0, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 0, 253, + 254, 255, 0, 0, 0, 590, 15, 0, 0, 0, 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, - 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, + 735, 736, 21, 22, 214, 215, 216, 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, - 0, 0, 0, 47, 0, 48, 49, 50, 0, 0, + 0, 0, 0, 47, 0, 48, 49, 50, 217, 0, 51, 0, 0, 0, 0, 52, 0, 0, 53, 0, - 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, - 13, 14, 0, 214, 215, 216, 0, 0, 879, 0, + 218, 219, 54, 7, 8, 9, 10, 55, 11, 12, + 13, 14, 737, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, - 61, 62, 0, 0, 63, 0, 0, 0, 232, 233, - 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, - 15, 712, 0, 0, 16, 240, 17, 18, 19, 0, - 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, - 0, 0, 0, 0, 0, 23, 24, 25, 0, 217, - 218, 26, 0, 0, 27, 28, 29, 30, 31, 32, + 61, 62, 0, 0, 63, 0, 220, 221, 0, 222, + 0, 0, 0, 0, 223, 0, 224, 0, 0, 0, + 15, 0, 0, 0, 16, 0, 17, 18, 19, 0, + 0, 0, 20, 0, 0, 0, 21, 22, 479, 480, + 481, 0, 0, 0, 0, 23, 24, 25, 582, 0, + 0, 26, 0, 227, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, - 45, 0, 46, 0, 0, 219, 220, 47, 221, 48, - 49, 50, 0, 222, 51, 223, 0, 0, 0, 52, - 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, - 10, 55, 11, 12, 13, 14, 0, 214, 215, 216, + 45, 0, 46, 0, 0, 0, 0, 47, 0, 48, + 49, 50, 217, 0, 51, 0, 0, 0, 0, 52, + 0, 0, 53, 0, 218, 219, 54, 7, 8, 9, + 10, 55, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, - 0, 0, 60, 0, 61, 62, 0, 0, 63, 0, - 0, 587, 0, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 15, 252, 253, 254, 16, 0, + 0, 0, 60, 0, 61, 62, 433, 0, 63, 0, + 484, 221, 0, 222, 0, 0, 0, 0, 223, 0, + 224, 0, 0, 0, 15, 438, 0, 0, 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, - 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, - 24, 25, 0, 217, 218, 26, 0, 0, 27, 28, + 21, 22, 0, 0, 0, 0, 0, 288, 0, 23, + 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 45, 0, 46, 0, 0, 219, - 220, 47, 221, 48, 49, 50, 0, 222, 51, 223, + 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, + 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, - 922, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, - 0, 0, 63, 0, 0, 0, 232, 233, 234, 235, - 236, 237, 238, 239, 0, 0, 0, 0, 15, 0, - 0, 0, 16, 240, 17, 18, 19, 0, 0, 0, + 0, 0, 63, 0, 0, 0, 233, 234, 235, 236, + 237, 238, 239, 240, 0, 0, 0, 0, 15, 713, + 0, 0, 16, 241, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, @@ -1812,9 +1768,9 @@ static const yytype_int16 yytable[] = 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, - 60, 0, 61, 62, 1057, 0, 63, 0, 927, 0, - 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 15, 252, 253, 254, 16, 0, 17, 18, + 60, 0, 61, 62, 0, 0, 63, 0, 0, 588, + 0, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 15, 253, 254, 255, 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, @@ -1823,12 +1779,12 @@ static const yytype_int16 yytable[] = 44, 0, 45, 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, - 8, 9, 10, 55, 11, 12, 13, 14, 1327, 0, + 8, 9, 10, 55, 11, 12, 13, 14, 923, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, 0, 0, - 63, 0, 0, 0, 232, 233, 234, 235, 236, 237, - 238, 239, 0, 0, 0, 0, 15, 0, 0, 0, - 16, 240, 17, 18, 19, 0, 0, 0, 20, 0, + 63, 0, 0, 0, 233, 234, 235, 236, 237, 238, + 239, 240, 0, 0, 0, 0, 15, 0, 0, 0, + 16, 241, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, @@ -1839,9 +1795,9 @@ static const yytype_int16 yytable[] = 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, - 61, 62, 1471, 0, 63, 1262, 0, 0, 0, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 15, 252, 253, 254, 16, 0, 17, 18, 19, 0, + 61, 62, 1058, 0, 63, 0, 928, 0, 0, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 15, 253, 254, 255, 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, @@ -1849,309 +1805,358 @@ static const yytype_int16 yytable[] = 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, 0, 0, 52, - 0, 0, 53, 0, 0, 0, 54, 645, 646, 647, - 10, 55, 11, 648, 649, 67, 68, 0, 0, 650, + 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, + 10, 55, 11, 12, 13, 14, 1328, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, - 0, 0, 60, 0, 61, 62, 0, 0, 63, 232, - 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, - 0, 459, 0, 0, 651, 69, 240, 0, 70, 0, - 71, 72, 73, 74, 460, 0, 652, 76, 0, 0, - 77, 653, 0, 0, 78, 0, 0, 0, 0, 654, - 655, 79, 0, 0, 0, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 232, 233, 234, 235, 236, 237, - 238, 239, 0, 0, 81, 0, 0, 0, 0, 0, - 0, 240, 656, 0, 657, 0, 658, 0, 0, 0, - 461, 659, 0, 82, 83, 660, 0, 0, 661, 84, - 0, 0, 0, 662, 0, 0, 663, 85, 86, 87, - 88, 0, 0, 89, 0, 90, 0, 645, 646, 647, - 10, 0, 11, 648, 649, 67, 68, 0, 664, 1034, - 0, 665, 666, 0, 0, 0, 667, 0, 668, 0, - 688, 0, 669, 0, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 689, - 0, 459, 0, 0, 651, 69, 0, 0, 70, 0, - 71, 72, 73, 74, 460, 0, 652, 76, 0, 0, - 77, 653, 0, 0, 78, 214, 215, 216, 0, 654, - 655, 79, 0, 0, 0, 0, 0, 1285, 80, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 0, 252, 253, 254, 81, 0, 0, 0, 0, 0, - 0, 0, 656, 0, 657, 0, 658, 0, 0, 0, - 461, 659, 0, 82, 83, 660, 0, 0, 661, 84, - 0, 0, 0, 662, 0, 0, 663, 85, 86, 87, - 88, 217, 218, 89, 0, 90, 7, 8, 9, 10, - 0, 11, 12, 13, 0, 0, 0, 0, 664, 0, - 0, 665, 666, 0, 0, 0, 667, 0, 668, 0, - 0, 0, 669, 0, 0, 0, 0, 219, 1263, 1264, - 1265, 0, 0, 0, 0, 222, 0, 223, 0, 0, - 0, 0, 0, 1297, 0, 0, 0, 0, 1266, 0, - 0, 0, 0, 1267, 0, 1298, 0, 0, 0, 0, - 1299, 234, 235, 236, 237, 238, 239, 0, 23, 24, - 0, 0, 0, 0, 26, 0, 240, 0, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 0, 232, 233, 234, 235, 236, 237, - 238, 239, 0, 45, 0, 46, 0, 0, 0, 0, - 1300, 240, 0, 0, 1301, 0, 0, 1302, 0, 0, - 0, 0, 52, 0, 0, 0, 0, 0, 0, 70, - 0, 71, 72, 73, 0, 0, 0, 0, 0, 0, - 0, 262, 0, 0, 0, 0, 0, 1303, 0, 0, - 1304, 1305, 1306, 931, 0, 1307, 0, 1308, 62, 80, - 0, 1309, 0, 932, 933, 934, 935, 936, 937, 938, - 939, 0, 0, 0, 0, 263, 0, 0, 0, 0, - 940, 0, 941, 942, 943, 944, 945, 946, 947, 948, - 949, 950, 951, 952, 82, 83, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 0, - 0, 88, 953, 0, 0, 0, 90, 0, 0, 214, - 215, 216, 0, 0, 334, 335, 0, 0, 0, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 0, 252, 253, 254, 575, 1384, 1385, 1386, 1387, 1388, - 1389, 1390, 1391, 0, 0, 954, 0, 0, 0, 0, - 0, 0, 1392, 0, 0, 336, 0, 0, 70, 0, - 71, 72, 73, 74, 0, 0, 0, 337, 0, 0, - 77, 0, 0, 0, 78, 217, 218, 0, 0, 0, - 0, 79, 0, 0, 955, 0, 0, 956, 80, 957, - 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 0, 968, 969, 0, 81, 970, 0, 334, 335, 0, - 0, 219, 220, 0, 221, 338, 0, 0, 0, 222, - 0, 223, 0, 82, 83, 0, 0, 0, 0, 84, - 0, 0, 0, 0, 0, 0, 291, 339, 340, 87, - 88, 0, 0, 89, 0, 90, 0, 0, 336, 0, - 341, 70, 0, 71, 72, 73, 74, 0, 0, 0, - 337, 0, 0, 77, 0, 0, 342, 78, 1504, 765, - 1393, 1394, 1395, 1396, 79, 0, 1397, 1398, 1399, 1400, - 1401, 80, 1402, 1403, 1404, 766, 0, 0, 214, 215, - 216, 0, 0, 506, 507, 0, 0, 81, 0, 767, - 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, - 0, 0, 768, 769, 0, 0, 82, 83, 0, 0, - 0, 0, 84, 0, 0, 0, 0, 0, 770, 0, - 339, 340, 87, 88, 336, 0, 89, 70, 90, 71, - 72, 73, 74, 0, 0, 0, 337, 0, 0, 77, - 0, 0, 0, 78, 217, 218, 0, 0, 771, 342, - 79, 772, 0, 0, 773, 0, 0, 80, 232, 233, - 234, 235, 236, 237, 238, 239, 0, 0, 0, 0, - 774, 0, 0, 81, 0, 240, 0, 0, 0, 0, - 219, 220, 775, 221, 338, 0, 0, 0, 222, 0, - 223, 0, 82, 83, 0, 0, 776, 0, 84, 0, - 70, 1266, 71, 72, 73, 0, 339, 340, 87, 88, - 0, 0, 89, 0, 90, 232, 233, 234, 235, 236, - 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, - 80, 0, 240, 0, 0, 342, 232, 233, 234, 235, - 236, 237, 238, 239, 0, 0, 263, 0, 0, 0, - 0, 0, 0, 240, 232, 233, 234, 235, 236, 237, - 238, 239, 0, 0, 0, 82, 83, 0, 0, 0, - 0, 240, 232, 233, 234, 235, 236, 237, 238, 239, - 0, 0, 88, 0, 0, 0, 0, 90, 0, 240, - 0, 0, 0, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 0, 252, 253, 254, 591, 232, - 233, 234, 235, 236, 237, 238, 239, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 240, 232, 233, 234, - 235, 236, 237, 238, 239, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 0, 252, 253, 254, 679, 0, 0, 0, 0, - 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 0, 252, 253, 254, 757, 0, 0, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 0, 252, 253, 254, 898, 0, 0, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 0, 252, - 253, 254, 1015, 842, 843, 844, 845, 846, 847, 848, - 849, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 850, 0, 0, 0, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 0, 252, 253, 254, 1283, - 0, 0, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 0, 252, 253, 254, 1384, 1385, 1386, - 1387, 1388, 1389, 1390, 1391, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1392, 0, 0, 0, 0, 0, + 0, 0, 60, 0, 61, 62, 0, 0, 63, 0, + 0, 0, 233, 234, 235, 236, 237, 238, 239, 240, + 0, 0, 0, 0, 15, 0, 0, 0, 16, 241, + 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, + 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, + 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, + 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, + 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, + 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, + 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, + 1472, 0, 63, 1263, 0, 0, 0, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 15, 253, + 254, 255, 16, 0, 17, 18, 19, 0, 0, 0, + 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, + 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, + 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, + 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, + 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, + 0, 0, 51, 0, 0, 0, 0, 52, 0, 0, + 53, 0, 0, 0, 54, 646, 647, 648, 10, 55, + 11, 649, 650, 67, 68, 0, 0, 1035, 0, 0, + 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, + 60, 0, 61, 62, 0, 0, 63, 233, 234, 235, + 236, 237, 238, 239, 240, 0, 0, 0, 0, 460, + 0, 0, 652, 69, 241, 0, 70, 0, 71, 72, + 73, 74, 461, 0, 653, 76, 0, 0, 77, 654, + 0, 0, 78, 0, 0, 0, 0, 655, 656, 79, + 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 234, 235, 236, 237, 238, 239, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 240, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 861, 0, - 862, 863, 864, 105, 0, 106, 0, 0, 107, 108, + 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, + 657, 0, 658, 0, 659, 0, 0, 0, 462, 660, + 0, 82, 83, 661, 0, 0, 662, 84, 0, 0, + 0, 663, 0, 0, 664, 85, 86, 87, 88, 0, + 0, 89, 0, 90, 7, 8, 9, 10, 0, 11, + 12, 13, 0, 0, 0, 0, 665, 0, 0, 666, + 667, 0, 0, 0, 668, 0, 669, 0, 0, 0, + 670, 0, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 0, 253, 254, 255, 0, 0, 0, + 1288, 1298, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1299, 0, 0, 0, 0, 1300, 234, + 235, 236, 237, 238, 239, 240, 23, 24, 0, 0, + 0, 0, 26, 0, 0, 241, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 0, 233, 234, 235, 236, 237, 238, 239, 240, + 0, 45, 0, 46, 0, 0, 0, 0, 1301, 241, + 0, 0, 1302, 0, 0, 1303, 0, 0, 0, 0, + 52, 0, 0, 0, 0, 0, 0, 70, 0, 71, + 72, 73, 0, 0, 0, 0, 0, 0, 0, 263, + 0, 0, 0, 0, 0, 1304, 0, 0, 1305, 1306, + 1307, 932, 0, 1308, 0, 1309, 62, 80, 0, 1310, + 0, 933, 934, 935, 936, 937, 938, 939, 940, 0, + 0, 0, 0, 264, 0, 0, 0, 0, 941, 0, + 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, + 952, 953, 82, 83, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 0, 253, 254, 255, 0, 88, + 954, 0, 0, 0, 90, 0, 0, 0, 0, 0, + 0, 0, 335, 336, 0, 0, 0, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 0, 253, + 254, 255, 0, 0, 0, 1507, 0, 1389, 1390, 1391, + 1392, 0, 0, 955, 0, 0, 0, 0, 0, 0, + 1393, 0, 0, 337, 0, 0, 70, 0, 71, 72, + 73, 74, 0, 0, 0, 338, 0, 0, 77, 0, + 0, 0, 78, 0, 0, 0, 0, 0, 0, 79, + 0, 0, 956, 0, 0, 957, 80, 958, 959, 960, + 961, 962, 963, 964, 965, 966, 967, 968, 0, 969, + 970, 0, 81, 971, 0, 335, 336, 0, 0, 0, + 0, 0, 0, 339, 0, 0, 0, 0, 0, 0, + 0, 82, 83, 0, 0, 0, 0, 84, 0, 0, + 0, 0, 0, 0, 0, 340, 341, 87, 88, 0, + 0, 89, 0, 90, 0, 0, 337, 0, 342, 70, + 0, 71, 72, 73, 74, 0, 0, 0, 338, 0, + 0, 77, 0, 0, 343, 78, 0, 0, 0, 0, + 0, 0, 79, 0, 1398, 1399, 1400, 1401, 1402, 80, + 1403, 1404, 1405, 0, 0, 0, 0, 0, 0, 0, + 0, 507, 508, 0, 0, 81, 0, 70, 0, 71, + 72, 73, 0, 0, 0, 0, 339, 0, 0, 263, + 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, + 84, 0, 0, 0, 0, 0, 0, 80, 340, 341, + 87, 88, 337, 0, 89, 70, 90, 71, 72, 73, + 74, 0, 0, 264, 338, 0, 0, 77, 0, 0, + 0, 78, 0, 0, 0, 0, 0, 343, 79, 0, + 0, 0, 82, 83, 0, 80, 233, 234, 235, 236, + 237, 238, 239, 240, 0, 0, 0, 0, 0, 88, + 0, 81, 0, 241, 90, 0, 0, 0, 0, 0, + 0, 70, 339, 71, 72, 73, 0, 0, 0, 0, + 82, 83, 0, 0, 0, 0, 84, 174, 0, 0, + 0, 0, 0, 0, 340, 341, 87, 88, 0, 0, + 89, 80, 90, 233, 234, 235, 236, 237, 238, 239, + 240, 0, 0, 0, 0, 0, 0, 264, 0, 0, + 241, 0, 0, 343, 233, 234, 235, 236, 237, 238, + 239, 240, 0, 0, 0, 0, 82, 83, 0, 0, + 0, 241, 233, 234, 235, 236, 237, 238, 239, 240, + 0, 0, 0, 88, 0, 0, 0, 0, 90, 241, + 0, 233, 234, 235, 236, 237, 238, 239, 240, 0, + 0, 0, 0, 0, 0, 0, 0, 689, 241, 0, + 0, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 0, 253, 254, 255, 690, 233, 234, 235, + 236, 237, 238, 239, 240, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 241, 233, 234, 235, 236, 237, + 238, 239, 240, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 241, 0, 0, 0, 0, 0, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 0, + 253, 254, 255, 576, 0, 0, 0, 0, 0, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 0, 253, 254, 255, 592, 0, 0, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 0, 253, + 254, 255, 680, 0, 0, 0, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 0, 253, 254, + 255, 758, 233, 234, 235, 236, 237, 238, 239, 240, + 0, 0, 0, 0, 0, 0, 214, 215, 216, 241, + 0, 880, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 0, 253, 254, 255, 899, 0, 0, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 0, 253, 254, 255, 1016, 233, 234, 235, 236, + 237, 238, 239, 240, 0, 0, 479, 480, 481, 0, + 217, 0, 0, 241, 233, 234, 235, 236, 237, 238, + 239, 240, 218, 219, 0, 0, 0, 0, 0, 0, + 0, 241, 843, 844, 845, 846, 847, 848, 849, 850, + 0, 0, 0, 482, 0, 483, 0, 0, 0, 851, + 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 220, 221, + 217, 222, 0, 0, 0, 0, 223, 1393, 224, 0, + 0, 0, 218, 219, 0, 0, 0, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 0, 253, + 254, 255, 1284, 1385, 1386, 1387, 1388, 1389, 1390, 1391, + 1392, 0, 0, 0, 0, 0, 0, 0, 484, 221, + 1393, 222, 0, 0, 0, 0, 223, 0, 224, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1286, + 0, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 485, 253, 254, 255, 0, 0, 0, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 0, 253, 254, 255, 0, 0, 0, 852, 853, 854, + 855, 856, 857, 858, 859, 860, 861, 862, 0, 863, + 864, 865, 0, 1505, 0, 1394, 1395, 1396, 1397, 0, + 0, 1398, 1399, 1400, 1401, 1402, -2, 1403, 1404, 1405, + 0, 0, 0, 0, 0, 1386, 1387, 1388, 1389, 1390, + 1391, 1392, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1393, 0, 0, 0, 0, 0, 0, 1394, 1395, + 1396, 1397, 0, 0, 1398, 1399, 1400, 1401, 1402, 0, + 1403, 1404, 1405, 105, 0, 106, 0, 0, 107, 108, 0, 0, 0, 0, 0, 0, 109, 110, 0, 0, 0, 0, 0, 0, 0, 111, 0, 112, 113, 114, 115, 0, 0, 0, 116, 0, 0, 0, 0, 117, - 0, 0, 1393, 1394, 1395, 1396, 0, 0, 1397, 1398, - 1399, 1400, 1401, 0, 1402, 1403, 1404, 0, 118, 119, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, 129, - 67, 68, 130, 131, 457, 0, 458, 132, 0, 0, + 67, 68, 130, 131, 458, 0, 459, 132, 0, 0, 0, 0, 0, 133, 134, 0, 135, 0, 0, 0, - 0, 0, 0, 0, 136, 0, 0, 0, 244, 245, - 246, 247, 248, 249, 250, 251, 459, 252, 253, 254, - 69, 0, 0, 70, 0, 71, 72, 73, 74, 460, + 1395, 1396, 1397, 0, 136, 1398, 1399, 1400, 1401, 1402, + 0, 1403, 1404, 1405, 0, 0, 460, 0, 0, 0, + 69, 0, 0, 70, 0, 71, 72, 73, 74, 461, 0, 0, 76, 0, 0, 77, 0, 0, 0, 78, - 1386, 1387, 1388, 1389, 1390, 1391, 79, 0, 0, 214, - 215, 216, 0, 80, 0, 1392, 1386, 1387, 1388, 1389, - 1390, 1391, 0, 0, 0, 0, 0, 0, 0, 81, - 0, 1392, 1386, 1387, 1388, 1389, 1390, 1391, 0, 0, - 0, 0, 0, 0, 0, 461, 0, 1392, 82, 83, - 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, - 0, 0, 85, 86, 87, 88, 0, 0, 89, 0, - 90, 0, 0, 0, 0, 217, 218, 0, 0, 0, - 0, 0, 0, 462, 0, 0, 0, 0, 463, 0, + 235, 236, 237, 238, 239, 240, 79, 0, 0, 0, + 0, 0, 0, 80, 0, 241, 235, 236, 237, 238, + 239, 240, 0, 0, 0, 0, 0, 0, 0, 81, + 0, 241, 235, 236, 237, 238, 239, 240, 0, 0, + 0, 0, 0, 0, 0, 462, 0, 241, 82, 83, + 0, 0, 0, 0, 84, 0, 1387, 1388, 1389, 1390, + 1391, 1392, 85, 86, 87, 88, 0, 0, 89, 0, + 90, 1393, 235, 236, 237, 238, 239, 240, 0, 0, + 0, 0, 0, 463, 0, 0, 0, 241, 464, 1387, + 1388, 1389, 1390, 1391, 1392, 0, 0, 0, 1387, 1388, + 1389, 1390, 1391, 1392, 1393, 0, 0, 0, 0, 0, + 0, 0, 0, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 0, 253, 254, 255, 0, 0, + 0, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 0, 253, 254, 255, 0, 0, 0, 0, 245, 246, + 247, 248, 249, 250, 251, 252, 0, 253, 254, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 219, 220, 0, 221, 0, 0, 0, 0, 222, - 0, 223, 0, 0, 0, 0, 0, 478, 479, 480, - 0, 0, 1266, 0, 1394, 1395, 1396, 1342, 0, 1397, - 1398, 1399, 1400, 1401, 302, 1402, 1403, 1404, 0, 0, - 0, 1395, 1396, 0, 0, 1397, 1398, 1399, 1400, 1401, - 175, 1402, 1403, 1404, 481, 0, 482, 0, 1396, 0, - 0, 1397, 1398, 1399, 1400, 1401, 0, 1402, 1403, 1404, - 0, 302, 0, 0, 0, 105, 0, 106, 0, 0, - 0, 108, 0, 217, 218, 0, 0, 0, 109, 110, - 176, 0, 0, 70, 0, 71, 72, 73, 74, 112, - 113, 114, 177, 0, 0, 77, 0, 0, 0, 78, - 0, 297, 105, 0, 106, 0, 79, 0, 108, 483, - 220, 0, 221, 80, 0, 109, 110, 222, 0, 223, - 0, 0, 0, 0, 122, 0, 112, 296, 114, 81, - 0, 0, 0, 0, 127, 0, 0, 0, 297, 0, - 128, 0, 0, 484, 130, 131, 0, 0, 82, 83, - 394, 67, 68, 0, 84, 0, 134, 0, 135, 0, - 0, 122, 178, 179, 87, 88, 0, 0, 89, 0, - 90, 127, 0, 0, 0, 0, 0, 128, 0, 1027, - 67, 68, 131, 0, 0, 0, 0, 0, 0, 0, - 0, 69, 0, 134, 70, 135, 71, 72, 73, 74, - 75, 0, 0, 76, 0, 0, 77, 0, 0, 0, - 78, 0, 0, 0, 0, 0, 0, 79, 0, 0, - 69, 0, 0, 70, 80, 71, 72, 73, 74, 75, - 0, 0, 76, 0, 0, 77, 0, 0, 0, 78, - 81, 0, 0, 0, 0, 0, 79, 70, 0, 71, - 72, 73, 0, 80, 0, 0, 0, 0, 0, 82, - 83, 0, 0, 0, 0, 84, 0, 0, 0, 81, - 1447, 67, 68, 85, 86, 87, 88, 80, 0, 89, - 0, 90, 0, 0, 0, 0, 0, 0, 82, 83, - 0, 0, 0, 263, 84, 0, 0, 0, 0, 690, - 691, 692, 85, 86, 87, 88, 0, 0, 89, 0, - 90, 69, 82, 83, 70, 0, 71, 72, 73, 74, - 75, 0, 0, 76, 0, 0, 77, 0, 0, 88, - 78, 0, 0, 0, 90, 0, 0, 79, 0, 0, - 0, 0, 0, 70, 80, 71, 72, 73, 693, 694, - 0, 0, 0, 0, 0, 77, 0, 185, 0, 0, - 81, 0, 0, 0, 0, 0, 79, 690, 691, 692, - 0, 0, 0, 80, 0, 0, 0, 0, 0, 82, - 83, 0, 0, 0, 0, 84, 0, 0, 0, 81, - 0, 0, 0, 85, 86, 87, 88, 0, 0, 89, - 0, 90, 0, 0, 0, 0, 67, 68, 82, 83, - 457, 70, 0, 71, 72, 73, 0, 0, 0, 0, - 0, 0, 695, 77, 0, 88, 0, 0, 89, 0, - 90, 0, 0, 0, 79, 67, 68, 0, 0, 791, - 0, 80, 459, 0, 0, 0, 69, 0, 0, 70, - 0, 71, 72, 73, 74, 460, 0, 81, 76, 0, - 0, 77, 0, 0, 0, 78, 0, 0, 0, 0, - 0, 459, 79, 0, 0, 69, 82, 83, 70, 80, - 71, 72, 73, 74, 460, 0, 0, 76, 0, 0, - 77, 0, 0, 88, 78, 81, 89, 0, 90, 0, - 0, 79, 0, 0, 0, 0, 0, 0, 80, 0, - 0, 461, 0, 0, 82, 83, 0, 0, 0, 0, - 84, 0, 0, 0, 81, 0, 67, 68, 85, 86, - 87, 88, 0, 0, 89, 0, 90, 0, 0, 0, - 461, 0, 0, 82, 83, 0, 0, 0, 0, 84, - 214, 215, 216, 0, 0, 67, 68, 85, 86, 87, - 88, 0, 459, 89, 0, 90, 69, 0, 0, 70, - 0, 71, 72, 73, 74, 460, 0, 0, 76, 0, - 0, 77, 0, 0, 0, 78, 0, 481, 0, 482, - 0, 0, 79, 0, 0, 69, 0, 0, 70, 80, + 1395, 1396, 1397, 0, 0, 1398, 1399, 1400, 1401, 1402, + 0, 1403, 1404, 1405, 0, 303, 0, 0, 303, 246, + 247, 248, 249, 250, 251, 252, 0, 253, 254, 255, + 0, 0, 0, 0, 0, 1397, 0, 0, 1398, 1399, + 1400, 1401, 1402, 0, 1403, 1404, 1405, 1398, 1399, 1400, + 1401, 1402, 0, 1403, 1404, 1405, 105, 0, 106, 105, + 0, 106, 108, 0, 0, 108, 0, 0, 0, 109, + 110, 0, 109, 110, 0, 214, 215, 216, 0, 0, + 112, 113, 114, 112, 297, 114, 0, 0, 0, 0, + 0, 0, 298, 0, 0, 298, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 395, 67, 68, + 0, 0, 0, 0, 0, 122, 0, 0, 122, 0, + 0, 0, 0, 0, 0, 127, 0, 0, 127, 217, + 0, 128, 0, 0, 128, 130, 131, 0, 0, 131, + 0, 218, 219, 0, 0, 0, 0, 134, 69, 135, + 134, 70, 135, 71, 72, 73, 74, 75, 0, 0, + 76, 0, 0, 77, 0, 0, 0, 78, 0, 0, + 0, 0, 0, 0, 79, 0, 0, 220, 1264, 1265, + 1266, 80, 0, 0, 0, 223, 0, 224, 0, 0, + 0, 0, 0, 1028, 67, 68, 0, 81, 1267, 0, + 0, 0, 0, 1268, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 82, 83, 0, 0, + 0, 0, 84, 0, 1448, 67, 68, 0, 0, 0, + 85, 86, 87, 88, 69, 0, 89, 70, 90, 71, + 72, 73, 74, 75, 0, 0, 76, 0, 0, 77, + 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, + 79, 0, 0, 0, 0, 69, 0, 80, 70, 0, 71, 72, 73, 74, 75, 0, 0, 76, 0, 0, - 77, 0, 0, 0, 78, 81, 217, 218, 0, 0, - 0, 79, 0, 0, 214, 215, 216, 0, 80, 0, - 0, 461, 0, 0, 82, 83, 0, 0, 0, 0, - 84, 67, 68, 0, 81, 0, 0, 0, 85, 86, - 87, 88, 219, 220, 89, 221, 90, 0, 0, 0, - 222, 0, 223, 82, 83, 67, 68, 0, 0, 84, + 77, 0, 0, 81, 78, 0, 0, 0, 0, 0, + 0, 79, 0, 0, 0, 0, 0, 0, 80, 0, + 0, 0, 82, 83, 0, 0, 0, 0, 84, 0, + 691, 692, 693, 0, 81, 0, 85, 86, 87, 88, + 0, 0, 89, 0, 90, 691, 692, 693, 0, 0, + 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, + 70, 0, 71, 72, 73, 0, 0, 85, 86, 87, + 88, 0, 0, 89, 70, 90, 71, 72, 73, 694, + 695, 0, 0, 214, 215, 216, 77, 0, 0, 70, + 80, 71, 72, 73, 0, 0, 0, 79, 0, 0, + 0, 77, 0, 0, 80, 0, 264, 0, 0, 0, + 0, 0, 79, 0, 0, 0, 0, 0, 0, 80, + 81, 0, 0, 0, 0, 82, 83, 0, 0, 0, + 0, 0, 67, 68, 0, 81, 458, 217, 0, 82, + 83, 0, 88, 0, 0, 0, 0, 90, 0, 218, + 219, 0, 0, 696, 82, 83, 88, 0, 0, 89, + 0, 90, 0, 67, 68, 0, 0, 792, 460, 0, + 185, 88, 69, 0, 89, 70, 90, 71, 72, 73, + 74, 461, 0, 0, 76, 220, 221, 77, 222, 0, + 0, 78, 0, 223, 0, 224, 0, 0, 79, 460, + 0, 0, 0, 69, 0, 80, 70, 0, 71, 72, + 73, 74, 461, 0, 0, 76, 0, 0, 77, 0, + 0, 81, 78, 0, 0, 0, 0, 0, 0, 79, + 0, 0, 0, 0, 0, 0, 80, 462, 0, 0, + 82, 83, 0, 0, 0, 0, 84, 0, 214, 215, + 216, 0, 81, 0, 85, 86, 87, 88, 67, 68, + 89, 0, 90, 0, 0, 0, 0, 0, 462, 0, + 0, 82, 83, 0, 0, 0, 0, 84, 0, 0, + 0, 0, 0, 0, 0, 85, 86, 87, 88, 67, + 68, 89, 0, 90, 460, 0, 0, 0, 69, 0, + 0, 70, 217, 71, 72, 73, 74, 461, 0, 0, + 76, 0, 0, 77, 218, 219, 0, 78, 0, 70, + 0, 71, 72, 73, 79, 0, 0, 0, 0, 69, + 0, 80, 70, 0, 71, 72, 73, 74, 75, 0, + 0, 76, 0, 0, 77, 0, 0, 81, 78, 80, + 220, 221, 0, 222, 0, 79, 0, 0, 223, 0, + 224, 0, 80, 462, 0, 264, 82, 83, 0, 0, + 0, 1267, 84, 0, 0, 67, 68, 0, 81, 0, + 85, 86, 87, 88, 82, 83, 89, 0, 90, 0, + 0, 0, 0, 0, 0, 0, 0, 82, 83, 67, + 68, 88, 0, 84, 0, 0, 90, 214, 215, 216, + 0, 85, 86, 87, 88, 69, 0, 89, 70, 90, + 71, 72, 73, 74, 0, 0, 0, 76, 0, 186, + 77, 0, 0, 0, 78, 0, 0, 0, 0, 69, + 0, 79, 70, 0, 71, 72, 73, 74, 80, 0, + 0, 76, 0, 0, 77, 0, 0, 0, 78, 0, + 0, 217, 0, 0, 81, 79, 0, 0, 0, 0, + 0, 0, 80, 218, 219, 0, 0, 0, 0, 0, + 605, 0, 0, 82, 83, 67, 0, 0, 81, 84, 0, 0, 0, 0, 0, 0, 0, 85, 86, 87, - 88, 69, 0, 89, 70, 90, 71, 72, 73, 74, - 217, 218, 0, 76, 0, 70, 77, 71, 72, 73, - 78, 0, 0, 0, 0, 69, 0, 79, 70, 0, - 71, 72, 73, 74, 80, 0, 0, 76, 0, 0, - 77, 0, 0, 0, 78, 80, 219, 220, 0, 221, - 81, 79, 0, 0, 222, 0, 223, 0, 80, 0, - 0, 263, 0, 0, 0, 0, 604, 1266, 0, 82, - 83, 67, 1344, 0, 81, 84, 0, 0, 0, 0, - 82, 83, 0, 85, 86, 87, 88, 0, 0, 89, - 0, 90, 0, 82, 83, 0, 0, 88, 0, 84, - 175, 0, 90, 0, 0, 0, 0, 85, 86, 87, - 88, 69, 0, 89, 70, 90, 71, 72, 73, 74, - 517, 0, 0, 76, 0, 186, 77, 0, 0, 0, - 78, 0, 0, 0, 0, 0, 0, 79, 0, 0, - 176, 0, 0, 70, 80, 71, 72, 73, 74, 992, + 88, 0, 0, 89, 331, 90, 0, 82, 83, 220, + 221, 0, 222, 84, 175, 0, 0, 223, 0, 224, + 0, 85, 86, 87, 88, 69, 0, 89, 70, 90, + 71, 72, 73, 74, 518, 0, 0, 76, 0, 0, + 77, 0, 0, 0, 78, 0, 0, 0, 0, 0, + 0, 79, 0, 0, 176, 0, 0, 70, 80, 71, + 72, 73, 74, 993, 0, 0, 177, 0, 0, 77, + 0, 0, 0, 78, 81, 0, 0, 0, 0, 0, + 79, 0, 0, 0, 0, 0, 0, 80, 0, 0, + 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, + 175, 0, 0, 81, 0, 0, 0, 85, 86, 87, + 88, 0, 0, 89, 0, 90, 0, 0, 0, 0, + 0, 0, 82, 83, 67, 0, 0, 0, 84, 0, + 0, 0, 214, 215, 216, 0, 178, 179, 87, 88, + 176, 0, 89, 70, 90, 71, 72, 73, 74, 0, 0, 0, 177, 0, 0, 77, 0, 0, 0, 78, - 81, 0, 0, 0, 0, 0, 79, 0, 0, 214, - 215, 216, 0, 80, 70, 0, 71, 72, 73, 82, - 83, 0, 0, 0, 0, 84, 67, 0, 0, 81, - 0, 0, 0, 85, 86, 87, 88, 0, 0, 89, - 0, 90, 0, 0, 80, 0, 0, 0, 82, 83, - 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, - 263, 0, 178, 179, 87, 88, 69, 0, 89, 70, - 90, 71, 72, 73, 74, 217, 218, 0, 76, 82, - 83, 77, 0, 0, 0, 78, 0, 0, 0, 0, - 0, 0, 79, 0, 0, 0, 88, 0, 0, 80, - 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 219, 220, 0, 221, 81, 0, 0, 0, 222, - 0, 223, 0, 0, 191, 0, 0, 0, 0, 0, - 0, 0, 1266, 0, 82, 83, 0, 1346, 0, 105, - 84, 106, 0, 0, 107, 108, 0, 0, 85, 86, - 87, 88, 109, 110, 89, 0, 90, 0, 0, 0, - 0, 111, 0, 112, 113, 114, 115, 0, 0, 0, - 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 0, 79, 70, 0, 71, + 72, 73, 74, 80, 0, 0, 76, 0, 0, 77, + 0, 0, 0, 78, 0, 0, 217, 0, 0, 81, + 79, 214, 215, 216, 0, 0, 0, 80, 218, 219, + 0, 0, 0, 0, 0, 214, 215, 216, 82, 83, + 0, 0, 0, 81, 84, 0, 0, 0, 0, 214, + 215, 216, 178, 179, 87, 88, 0, 0, 89, 0, + 90, 0, 82, 83, 220, 221, 0, 222, 84, 0, + 0, 0, 223, 0, 224, 217, 85, 86, 87, 88, + 0, 0, 89, 0, 90, 1267, 0, 218, 219, 217, + 1343, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 218, 219, 217, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 218, 219, 0, 0, 0, + 0, 0, 0, 220, 221, 0, 222, 0, 0, 0, + 0, 223, 0, 224, 0, 0, 0, 220, 221, 0, + 222, 0, 0, 0, 1267, 223, 0, 224, 0, 1345, + 0, 220, 221, 0, 222, 0, 0, 0, 1267, 223, + 105, 224, 106, 1347, 0, 107, 108, 0, 0, 0, + 0, 0, 0, 109, 110, 0, 292, 0, 0, 0, + 0, 0, 111, 0, 112, 113, 114, 115, 0, 0, + 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, - 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, - 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, - 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, - 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, - 0, 0, 0, 0, 0, 0, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, - 127, 0, 0, 105, 0, 106, 128, 129, 107, 108, - 130, 131, 0, 0, 0, 132, 109, 110, 0, 0, - 0, 133, 134, 0, 135, 111, 0, 112, 113, 114, - 115, 0, 136, 0, 116, 0, 0, 0, 0, 117, + 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, + 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, + 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, + 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, + 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, + 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 867, 0, 0, 0, 0, 0, 0, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, - 107, 108, 130, 131, 0, 0, 0, 132, 109, 110, - 0, 0, 0, 133, 134, 0, 135, 111, 0, 112, - 113, 114, 115, 0, 136, 0, 116, 0, 0, 0, - 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 909, 0, 0, 0, 0, 0, 0, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, - 128, 129, 107, 108, 130, 131, 0, 0, 0, 132, - 109, 110, 0, 0, 0, 133, 134, 0, 135, 111, - 0, 112, 113, 114, 115, 0, 136, 0, 116, 0, - 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1016, 0, 0, 0, 0, - 0, 0, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 126, 127, 0, 0, 105, - 0, 106, 128, 129, 107, 108, 130, 131, 0, 0, - 0, 132, 109, 110, 0, 0, 0, 133, 134, 0, - 135, 111, 0, 112, 113, 114, 115, 0, 136, 0, - 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1066, 0, 0, - 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 126, 127, 0, - 0, 105, 0, 106, 128, 129, 107, 108, 130, 131, - 0, 0, 0, 132, 109, 110, 0, 0, 0, 133, - 134, 0, 135, 111, 0, 112, 113, 114, 115, 0, - 136, 0, 116, 0, 0, 0, 0, 117, 0, 0, - 0, 70, 0, 71, 72, 73, 0, 0, 0, 1288, - 0, 0, 0, 262, 0, 0, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 126, - 127, 80, 0, 0, 0, 0, 128, 129, 0, 0, - 130, 131, 0, 0, 105, 132, 106, 263, 0, 0, - 108, 133, 134, 0, 135, 0, 0, 109, 110, 0, - 0, 0, 136, 0, 0, 0, 82, 83, 112, 296, - 114, 0, 0, 0, 0, 116, 0, 0, 0, 0, - 297, 1430, 0, 88, 0, 0, 0, 0, 90, 0, - 0, 0, 0, 0, 0, 0, 105, 0, 106, 0, - 0, 0, 108, 122, 0, 0, 0, 0, 0, 109, - 110, 174, 0, 127, 0, 0, 0, 0, 0, 128, + 687, 0, 0, 0, 0, 0, 0, 118, 119, 120, + 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, + 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, + 108, 130, 131, 0, 0, 0, 132, 109, 110, 0, + 0, 0, 133, 134, 0, 135, 111, 0, 112, 113, + 114, 115, 0, 136, 0, 116, 0, 0, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 868, 0, 0, 0, 0, 0, 0, 118, + 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, + 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, + 129, 107, 108, 130, 131, 0, 0, 0, 132, 109, + 110, 0, 0, 0, 133, 134, 0, 135, 111, 0, + 112, 113, 114, 115, 0, 136, 0, 116, 0, 0, + 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 910, 0, 0, 0, 0, 0, + 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, + 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, + 106, 128, 129, 107, 108, 130, 131, 0, 0, 0, + 132, 109, 110, 0, 0, 0, 133, 134, 0, 135, + 111, 0, 112, 113, 114, 115, 0, 136, 0, 116, + 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1017, 0, 0, 0, + 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, + 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, + 105, 0, 106, 128, 129, 107, 108, 130, 131, 0, + 0, 0, 132, 109, 110, 0, 0, 0, 133, 134, + 0, 135, 111, 0, 112, 113, 114, 115, 0, 136, + 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 0, + 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, + 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, + 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, + 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, + 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, + 0, 136, 0, 116, 0, 214, 215, 216, 117, 0, + 0, 0, 0, 0, 0, 70, 0, 71, 72, 73, + 1289, 0, 0, 0, 0, 0, 0, 118, 119, 120, + 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, + 126, 127, 482, 0, 483, 80, 0, 128, 129, 0, + 0, 130, 131, 0, 0, 0, 132, 0, 0, 217, + 0, 264, 133, 134, 105, 135, 106, 0, 0, 0, + 108, 218, 219, 136, 0, 0, 0, 109, 110, 0, + 82, 83, 0, 0, 0, 0, 0, 0, 112, 297, + 114, 0, 1431, 0, 0, 116, 0, 88, 0, 0, + 298, 0, 90, 0, 0, 0, 0, 220, 221, 0, + 222, 0, 0, 0, 0, 223, 105, 224, 106, 0, + 0, 0, 108, 122, 0, 191, 0, 0, 0, 109, + 110, 0, 0, 127, 0, 0, 0, 0, 0, 128, 112, 113, 114, 0, 131, 0, 0, 116, 0, 0, - 0, 0, 297, 0, 133, 134, 105, 135, 106, 0, + 0, 0, 298, 0, 133, 134, 105, 135, 106, 0, 0, 107, 108, 0, 0, 0, 0, 0, 0, 109, 110, 0, -149, 0, 0, 122, 0, 0, 111, 0, 112, 113, 114, 115, 0, 127, 0, 116, 0, 0, @@ -2161,10 +2166,10 @@ static const yytype_int16 yytable[] = 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, 129, 0, 108, 130, 131, 105, 0, 106, 132, 109, 110, 108, 0, 0, 133, 134, 0, 135, - 109, 110, 112, 296, 114, 0, 0, 0, 0, 0, - 0, 112, 296, 114, 297, 0, 0, 0, 0, 0, - 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 122, 308, 0, + 109, 110, 112, 297, 114, 0, 0, 0, 0, 0, + 0, 112, 297, 114, 298, 0, 0, 0, 0, 0, + 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 122, 309, 0, 0, 0, 0, 0, 0, 0, 122, 127, 0, 0, 0, 0, 0, 128, 0, 0, 127, 0, 131, 0, 0, 0, 128, 0, 0, 0, 0, 131, 0, 134, @@ -2174,333 +2179,289 @@ static const yytype_int16 yytable[] = static const yytype_int16 yycheck[] = { - 1, 61, 315, 113, 490, 705, 92, 130, 44, 130, - 922, 601, 147, 461, 149, 150, 151, 152, 656, 154, - 182, 156, 747, 158, 727, 508, 477, 140, 13, 295, - 76, 44, 76, 15, 583, 15, 44, 140, 459, 174, - 140, 6, 490, 8, 15, 15, 710, 0, 76, 15, - 185, 186, 81, 82, 83, 147, 191, 192, 15, 88, - 481, 62, 328, 582, 76, 790, 147, 714, 489, 716, - 717, 718, 719, 720, 147, 739, 740, 169, 742, 743, - 744, 745, 150, 155, 150, 166, 59, 33, 147, 147, - 91, 92, 147, 166, 10, 11, 12, 165, 99, 165, - 146, 620, 146, 149, 140, 149, 147, 166, 166, 149, - 147, 166, 631, 33, 147, 10, 11, 12, 146, 164, - 150, 149, 147, 147, 147, 166, 164, 140, 766, 166, - 164, 165, 140, 166, 146, 165, 146, 149, 148, 75, - 150, 166, 166, 166, 147, 146, 147, 33, 149, 150, - 151, 152, 125, 154, 164, 156, 6, 158, 8, 708, - 76, 77, 711, 166, 612, 147, 147, 164, 6, 150, - 8, 257, 258, 174, 159, 33, 147, 206, 207, 208, - 209, 182, 295, 496, 185, 186, 166, 273, 274, 351, - 191, 192, 295, 253, 164, 295, 112, 113, 164, 115, - 164, 166, 688, 149, 120, 164, 122, 164, 521, 164, - 800, 324, 75, 147, 147, 328, 147, 112, 164, 165, - 810, 324, 164, 147, 324, 328, 155, 228, 328, 748, - 894, 146, 166, 166, 263, 166, 147, 272, 273, 274, - 275, 276, 166, 163, 164, 165, 467, 147, 155, 164, - 166, 147, 387, 900, 149, 166, 257, 258, 287, 295, - 610, 62, 146, 164, 928, 748, 166, 786, 787, 146, - 166, 272, 273, 274, 275, 276, 277, 163, 164, 165, - 164, 282, 295, 148, 85, 150, 164, 295, 324, 164, - 147, 164, 328, 996, 147, 143, 144, 145, 164, 750, - 147, 159, 160, 161, 105, 163, 164, 165, 164, 166, - 33, 324, 147, 166, 315, 328, 324, 907, 147, 166, - 328, 146, 123, 148, 149, 150, 146, 640, 148, 166, - 150, 166, 133, 164, 146, 783, 148, 166, 150, 165, - 166, 277, 164, 108, 109, 110, 767, 112, 113, 114, - 351, 164, 117, 164, 992, 841, 13, 122, 15, 164, - 17, 910, 127, 128, 164, 130, 131, 132, 164, 134, - 135, 164, 891, 639, 687, 165, 166, 178, 164, 146, - 181, 148, 164, 150, 605, 164, 387, 164, 978, 164, - 1093, 165, 166, 841, 615, 616, 617, 618, 619, 155, - 164, 165, 166, 60, 164, 440, 407, 164, 891, 444, - 445, 446, 447, 448, 277, 1327, 13, 164, 15, 164, - 17, 64, 65, 458, 225, 226, 164, 462, 463, 13, - 164, 15, 164, 17, 157, 158, 159, 160, 161, 440, - 163, 164, 165, 444, 445, 446, 447, 448, 477, 998, - 164, 165, 166, 165, 166, 1004, 1005, 458, 164, 165, - 166, 462, 463, 60, 165, 166, 467, 164, 165, 470, - 271, 113, 114, 115, 164, 338, 60, 146, 147, 700, - 164, 1000, 1001, 140, 10, 11, 12, 164, 289, 490, - 291, 164, 505, 164, 165, 496, 149, 154, 149, 149, - 164, 164, 159, 164, 505, 164, 164, 308, 149, 310, - 311, 312, 313, 150, 159, 48, 165, 518, 165, 147, - 521, 1246, 146, 155, 460, 461, 639, 148, 164, 330, - 164, 296, 297, 164, 164, 147, 639, 302, 339, 639, - 1089, 342, 167, 140, 166, 15, 166, 166, 166, 350, - 76, 77, 166, 166, 490, 868, 140, 154, 156, 594, - 166, 156, 159, 784, 166, 166, 166, 164, 147, 147, - 154, 156, 793, 166, 166, 159, 166, 166, 166, 166, - 164, 582, 583, 584, 166, 166, 112, 113, 389, 115, - 166, 166, 393, 594, 120, 166, 122, 460, 461, 166, - 601, 166, 166, 639, 605, 406, 166, 166, 668, 610, - 166, 156, 1312, 614, 615, 616, 617, 618, 619, 620, - 656, 159, 166, 166, 150, 166, 639, 490, 154, 164, - 631, 639, 166, 159, 166, 165, 165, 164, 166, 640, - 641, 991, 443, 656, 167, 149, 166, 583, 656, 146, - 164, 147, 147, 147, 517, 876, 147, 164, 459, 148, - 166, 149, 883, 884, 885, 886, 887, 166, 604, 48, - 471, 164, 10, 11, 12, 13, 612, 164, 164, 17, - 481, 694, 166, 164, 159, 159, 687, 169, 489, 146, - 48, 76, 752, 753, 1419, 1420, 1421, 164, 164, 700, - 760, 155, 762, 155, 155, 2, 155, 708, 166, 1258, - 711, 1260, 10, 714, 1417, 716, 717, 718, 719, 720, - 583, 750, 60, 488, 10, 10, 61, 10, 148, 156, - 766, 532, 733, 1083, 147, 736, 1086, 148, 159, 167, - 166, 604, 159, 166, 148, 148, 747, 748, 166, 612, - 159, 17, 1238, 766, 877, 146, 877, 164, 766, 56, - 57, 58, 59, 60, 166, 166, 63, 877, 1317, 166, - 169, 164, 708, 165, 112, 711, 164, 164, 149, 165, - 581, 47, 165, 784, 166, 786, 787, 164, 164, 790, - 1238, 166, 793, 147, 60, 61, 147, 1522, 147, 800, - 150, 166, 140, 863, 1529, 166, 159, 167, 165, 810, - 76, 148, 148, 148, 147, 167, 154, 10, 153, 820, - 155, 159, 157, 624, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 166, - 106, 642, 4, 109, 169, 708, 112, 783, 711, 184, - 48, 147, 164, 188, 189, 190, 1077, 468, 1407, 169, - 164, 169, 128, 147, 146, 878, 166, 868, 156, 156, - 10, 166, 166, 166, 140, 876, 156, 156, 148, 33, - 10, 882, 883, 884, 885, 886, 887, 888, 154, 1024, - 891, 10, 10, 190, 148, 147, 164, 698, 169, 900, - 22, 23, 166, 15, 167, 841, 907, 993, 169, 910, - 167, 33, 155, 678, 679, 166, 166, 166, 164, 164, - 783, 922, 166, 164, 166, 1474, 164, 166, 729, 164, - 155, 155, 155, 268, 164, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 992, 254, 1271, 98, - 1095, 1096, 259, 166, 146, 167, 767, 167, 10, 166, - 1320, 166, 166, 148, 910, 166, 166, 978, 841, 992, - 20, 21, 22, 23, 992, 10, 10, 1337, 1338, 1339, - 991, 148, 993, 33, 164, 606, 148, 998, 295, 1000, - 1001, 148, 166, 1004, 1005, 159, 160, 161, 166, 163, - 164, 165, 15, 147, 167, 626, 627, 628, 629, 630, - 166, 166, 166, 1024, 156, 322, 10, 11, 12, 156, - 156, 166, 156, 166, 148, 157, 158, 159, 160, 161, - 10, 163, 164, 165, 167, 10, 148, 910, 164, 164, - 148, 386, 1094, 10, 11, 12, 13, 164, 166, 1409, - 17, 164, 998, 148, 1241, 166, 1416, 1068, 1004, 1005, - 166, 166, 1422, 1423, 307, 1312, 1077, 694, 879, 642, - 328, 878, 1083, 1238, 1068, 1086, 841, 384, 1089, 700, - 1272, 328, 76, 77, 1095, 1096, 1205, 406, -1, -1, - -1, -1, -1, 60, 401, 402, 10, 11, 12, 13, - -1, 408, 877, 17, -1, 155, 156, 157, 158, 159, - 160, 161, -1, 163, 164, 165, 1476, -1, 112, 113, - -1, 115, -1, -1, -1, 998, 120, -1, 122, -1, - -1, 1004, 1005, -1, -1, -1, -1, -1, -1, -1, - 289, -1, -1, 1089, 111, 112, 60, -1, 1508, -1, - -1, 1247, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1521, -1, 470, 785, 1263, 1264, 1265, 513, -1, - -1, 165, -1, 140, -1, 520, -1, -1, -1, -1, - -1, 802, -1, -1, 995, -1, -1, 154, -1, -1, - -1, -1, 159, -1, 1205, -1, -1, 164, 112, -1, - -1, 350, 547, -1, 549, -1, 551, -1, -1, 516, - -1, -1, -1, -1, -1, 1026, 1089, -1, -1, 526, - -1, -1, -1, -1, -1, -1, 140, 1238, -1, -1, - -1, -1, 10, 11, 12, 1246, 1247, -1, 1308, -1, - 154, -1, -1, -1, 1342, 159, 1344, 1258, 1346, 1260, - 164, 1349, 1350, 1351, -1, 876, -1, -1, -1, -1, - 1271, -1, 883, 884, 885, 886, 887, -1, -1, -1, - 10, 11, 12, 13, -1, 15, -1, 17, -1, -1, - 587, -1, -1, 1094, -1, 1355, 1356, -1, 1358, -1, - 1360, -1, 1238, 11, 601, -1, -1, -1, 76, 77, - -1, -1, -1, -1, -1, -1, 1317, -1, -1, 1320, - -1, -1, 1258, -1, 1260, -1, 1327, -1, -1, -1, - 60, -1, -1, 668, -1, -1, 1337, 1338, 1339, -1, - -1, -1, 639, 1403, 112, 113, 54, 115, 56, 57, - 58, -1, 120, 33, 122, -1, -1, -1, -1, 18, - 19, 20, 21, 22, 23, -1, -1, 664, 665, 666, - 667, -1, 669, -1, 33, 1238, 84, -1, -1, 518, - -1, 1317, 112, -1, -1, -1, 154, 1078, 22, 23, - 529, 159, 100, 532, -1, 1258, -1, 1260, -1, 33, - -1, -1, -1, -1, -1, -1, 1407, -1, 1409, -1, - 140, 119, 120, -1, -1, 1416, -1, -1, 1419, 1420, - 1421, 1422, 1423, -1, 154, -1, -1, -1, 136, 159, - -1, -1, -1, 141, 164, -1, -1, -1, -1, 736, - -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, - 20, 21, 22, 23, 1317, 1515, 1516, 1517, -1, 1519, - -1, -1, -1, 33, -1, 1266, 1077, -1, -1, -1, - -1, 1407, -1, 1474, -1, 1476, -1, 157, 158, 159, - 160, 161, -1, 163, 164, 165, -1, -1, 823, 824, - 825, -1, 827, -1, 829, 830, 831, -1, 157, 158, - 159, 160, 161, 800, 163, 164, 165, 1508, -1, 20, - 21, 22, 23, 810, -1, -1, -1, 814, -1, -1, - 1521, 1522, 33, 157, 158, 159, 160, 161, 1529, 163, - 164, 165, -1, -1, 831, -1, -1, -1, 1474, -1, - -1, -1, -1, -1, 1407, 842, 843, 844, 845, 846, - 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, - 857, 858, 859, 860, 861, 862, 705, 864, -1, -1, - -1, 710, 10, 11, 12, 714, -1, 716, 717, 718, - 719, 720, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, 164, 165, -1, -1, -1, -1, - 739, 740, -1, 742, 743, 744, 745, -1, -1, -1, - 907, 1474, 1303, 1304, 1305, 1306, 1307, -1, 1309, -1, - -1, -1, -1, -1, -1, 922, -1, -1, -1, -1, - -1, 1303, 1304, 1305, 1306, 1307, -1, 1309, 76, 77, - -1, -1, -1, -1, -1, 1446, 157, 158, 159, 160, - 161, -1, 163, 164, 165, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, -1, -1, 107, - -1, -1, 33, -1, 112, 113, -1, 115, -1, -1, - -1, 978, 120, 980, 122, -1, -1, -1, -1, -1, - -1, -1, -1, 1384, 1385, 1386, 1387, 1388, 1389, 1390, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, - 1401, 1402, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, - 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, - 1402, -1, -1, -1, -1, 1032, -1, -1, -1, -1, - -1, 1076, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 894, -1, -1, -1, 1450, - -1, 900, -1, 3, 4, 5, 6, -1, 8, 9, - 10, 11, 12, -1, -1, -1, -1, -1, 1450, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 928, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, -1, 163, 164, 165, -1, -1, -1, 169, -1, - 50, 51, -1, 1504, 54, -1, 56, 57, 58, 59, - 60, -1, 62, 63, -1, -1, 66, 67, -1, -1, - 70, -1, 1504, -1, -1, 75, 76, 77, 10, 11, - 12, 81, -1, -1, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 18, 19, 20, 21, 22, 23, -1, 108, -1, - 110, -1, 112, -1, -1, -1, 33, 117, -1, 119, - 120, 121, -1, -1, 124, 125, -1, -1, -1, 129, - -1, -1, 132, 133, 134, 135, 136, -1, -1, 139, - -1, 141, -1, -1, 76, 77, 16, 17, 18, 19, - 20, 21, 22, 23, 154, -1, -1, 157, 158, 159, - -1, -1, 162, 33, 164, 165, -1, -1, 168, -1, - -1, -1, -1, -1, 1231, -1, -1, -1, -1, -1, - 112, 113, -1, 115, -1, -1, -1, -1, 120, -1, - 122, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 10, 11, 12, -1, -1, - -1, -1, -1, 1308, -1, -1, -1, 149, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 1285, -1, - -1, -1, -1, -1, -1, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, + 1, 61, 728, 748, 92, 706, 923, 140, 113, 509, + 140, 15, 316, 602, 75, 62, 140, 296, 6, 182, + 8, 478, 657, 491, 150, 15, 462, 130, 33, 59, + 13, 147, 460, 15, 15, 15, 0, 147, 85, 165, + 147, 130, 149, 150, 151, 152, 791, 154, 149, 156, + 329, 158, 164, 169, 482, 491, 166, 155, 105, 468, + 44, 62, 490, 76, 164, 44, 715, 174, 717, 718, + 719, 720, 721, 150, 15, 147, 123, 711, 185, 186, + 147, 164, 147, 33, 191, 192, 133, 6, 165, 8, + 91, 92, 44, 164, 166, 125, 146, 75, 99, 166, + 13, 166, 15, 155, 17, 584, 740, 741, 33, 743, + 744, 745, 746, 164, 164, 273, 274, 275, 276, 277, + 583, 10, 11, 12, 147, 150, 165, 166, 81, 82, + 83, 178, 767, 146, 181, 88, 149, 146, 33, 148, + 165, 150, 164, 166, 149, 146, 147, 60, 149, 150, + 151, 152, 148, 154, 150, 156, 140, 158, 621, 164, + 165, 140, 166, 296, 164, 165, 296, 147, 155, 632, + 258, 259, 296, 174, 164, 164, 159, 613, 166, 226, + 227, 182, 164, 164, 185, 186, 274, 275, 140, 352, + 191, 192, 325, 497, 254, 325, 329, 606, 146, 329, + 147, 325, 33, 165, 166, 329, 147, 616, 617, 618, + 619, 620, 801, 163, 164, 165, 164, 278, 522, 166, + 164, 689, 811, 112, 6, 272, 8, 140, 229, 76, + 709, 165, 166, 712, 159, 160, 161, 76, 163, 164, + 165, 154, 164, 290, 147, 292, 159, 64, 65, 749, + 98, 164, 901, 206, 207, 208, 209, 258, 259, 164, + 149, 895, 309, 166, 311, 312, 313, 314, 163, 164, + 165, 997, 273, 274, 275, 276, 277, 278, 339, 147, + 164, 388, 283, 441, 331, 164, 749, 445, 446, 447, + 448, 449, 701, 340, 751, 929, 343, 147, 166, 146, + 278, 459, 149, 611, 351, 463, 464, 146, 76, 146, + 149, 264, 296, 165, 166, 316, 166, 296, 164, 908, + 10, 11, 12, 13, 787, 788, 164, 17, 159, 160, + 161, 164, 163, 164, 165, 288, 147, 641, 164, 150, + 768, 325, 164, 390, 296, 329, 325, 394, 784, 164, + 329, 352, 18, 19, 20, 21, 22, 23, 993, 164, + 407, 640, 164, 147, 147, 165, 166, 33, 1094, 147, + 60, 164, 147, 325, 842, 147, 785, 329, 146, 164, + 147, 149, 166, 166, 688, 794, 149, 388, 166, 147, + 979, 166, 892, 147, 166, 164, 147, 444, 147, 166, + 461, 462, 10, 11, 12, 13, 842, 408, 166, 17, + 469, 1328, 166, 460, 13, 166, 15, 166, 17, 147, + 147, 111, 112, 164, 146, 472, 148, 149, 150, 892, + 491, 164, 911, 164, 147, 482, 147, 595, 166, 166, + 441, 147, 290, 490, 445, 446, 447, 448, 449, 164, + 140, 155, 60, 166, 164, 166, 164, 518, 459, 164, + 166, 60, 463, 464, 154, 164, 165, 468, 877, 159, + 471, 143, 144, 145, 164, 884, 885, 886, 887, 888, + 164, 165, 166, 461, 462, 164, 533, 153, 154, 164, + 491, 157, 158, 159, 160, 161, 497, 163, 164, 165, + 146, 147, 1247, 351, 112, 506, 164, 640, 164, 165, + 640, 164, 164, 491, 164, 164, 640, 149, 519, 2, + 999, 522, 149, 584, 164, 478, 1005, 1006, 164, 146, + 164, 148, 140, 150, 164, 582, 164, 166, 1001, 1002, + 150, 140, 165, 159, 605, 13, 154, 15, 607, 17, + 165, 159, 613, 149, 506, 154, 164, 146, 48, 148, + 159, 150, 164, 165, 166, 869, 147, 164, 627, 628, + 629, 630, 631, 56, 57, 58, 59, 60, 625, 155, + 63, 146, 583, 584, 585, 146, 164, 148, 148, 150, + 164, 164, 60, 147, 595, 167, 643, 164, 165, 166, + 166, 602, 166, 164, 166, 606, 584, 166, 166, 669, + 611, 1090, 1313, 166, 615, 616, 617, 618, 619, 620, + 621, 113, 114, 115, 156, 166, 156, 605, 166, 166, + 166, 632, 166, 147, 147, 613, 15, 166, 166, 166, + 641, 642, 701, 166, 166, 166, 166, 166, 709, 166, + 166, 712, 699, 156, 166, 166, 640, 166, 166, 166, + 166, 640, 156, 167, 166, 166, 166, 164, 166, 1078, + 166, 519, 140, 657, 165, 1420, 1421, 1422, 657, 159, + 165, 146, 530, 730, 992, 533, 154, 688, 640, 166, + 164, 159, 1418, 753, 754, 149, 164, 166, 147, 147, + 701, 761, 147, 763, 147, 657, 164, 190, 709, 148, + 166, 712, 164, 149, 715, 166, 717, 718, 719, 720, + 721, 768, 164, 784, 164, 166, 164, 786, 48, 164, + 159, 709, 159, 734, 712, 169, 737, 146, 48, 76, + 164, 155, 155, 695, 803, 155, 164, 748, 749, 155, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 1239, 255, 878, 166, 878, 1084, 260, 1523, 1087, + 1259, 842, 1261, 767, 785, 1530, 787, 788, 767, 878, + 791, 10, 10, 794, 10, 10, 148, 156, 751, 147, + 801, 148, 159, 1239, 864, 166, 784, 167, 159, 148, + 811, 166, 148, 296, 159, 767, 166, 166, 877, 146, + 821, 147, 166, 166, 164, 884, 885, 886, 887, 888, + 164, 169, 164, 880, 164, 166, 165, 165, 149, 1318, + 323, 165, 164, 164, 147, 147, 150, 166, 166, 166, + 911, 159, 165, 167, 61, 148, 148, 147, 706, 10, + 167, 166, 4, 711, 842, 147, 48, 715, 869, 717, + 718, 719, 720, 721, 169, 164, 877, 164, 11, 146, + 166, 169, 883, 884, 885, 886, 887, 888, 889, 169, + 147, 892, 740, 741, 156, 743, 744, 745, 746, 10, + 901, 156, 385, 156, 156, 166, 994, 908, 166, 148, + 911, 10, 166, 10, 10, 148, 147, 164, 1025, 402, + 403, 54, 923, 56, 57, 58, 409, 879, 169, 1408, + 166, 169, 167, 911, 15, 167, 166, 166, 999, 166, + 164, 148, 164, 166, 1005, 1006, 153, 164, 155, 996, + 157, 84, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 100, 1272, 166, + 164, 166, 164, 164, 155, 155, 155, 184, 979, 155, + 1027, 188, 189, 190, 167, 146, 119, 120, 471, 1096, + 1097, 992, 166, 994, 167, 17, 1475, 166, 999, 166, + 1001, 1002, 166, 136, 1005, 1006, 166, 166, 141, 993, + 10, 33, 148, 1321, 993, 10, 148, 148, 10, 1078, + 148, 999, 166, 164, 1025, 47, 166, 1005, 1006, 1090, + 1338, 1339, 1340, 15, 517, 147, 156, 167, 60, 61, + 166, 993, 166, 156, 527, 166, 156, 895, 1095, 166, + 156, 166, 10, 901, 76, 148, 10, 148, 167, 164, + 164, 164, 269, 148, 33, 166, 164, 1095, 1069, 10, + 11, 12, 20, 21, 22, 23, 166, 1078, 166, 166, + 148, 929, 308, 1084, 106, 33, 1087, 109, 643, 1090, + 112, 10, 11, 12, 13, 1096, 1097, 1242, 17, 1313, + 879, 329, 1410, 695, 1239, 588, 128, 842, 1069, 1417, + 1206, 1273, 1090, 407, -1, 1423, 1424, 329, 140, 602, + 108, 109, 110, 64, 112, 113, 114, -1, -1, 117, + -1, -1, 154, -1, 122, 76, 77, -1, -1, 127, + 128, 60, 130, 131, 132, -1, 134, 135, -1, 10, + 11, 12, 13, -1, 15, -1, 17, 640, -1, -1, + 1248, -1, -1, -1, 10, 11, 12, -1, -1, 1477, + -1, 112, 113, -1, 115, 10, 11, 12, 1239, 120, + 387, 122, 665, 666, 667, 668, -1, 670, 157, 158, + 159, 160, 161, 112, 163, 164, 165, -1, 1259, 60, + 1261, 1509, -1, -1, -1, 1206, -1, 155, 156, 157, + 158, 159, 160, 161, 1522, 163, 164, 165, 64, -1, + 1267, 140, -1, -1, 1079, 166, -1, -1, -1, 64, + 76, 77, -1, -1, -1, 154, -1, -1, 1239, -1, + 159, 76, 77, -1, -1, -1, 1247, 1248, -1, 1309, + -1, 112, -1, -1, 737, -1, -1, 1318, 1259, -1, + 1261, 1239, -1, -1, -1, -1, 112, 113, -1, 115, + -1, 1272, -1, -1, 120, -1, 122, 112, 113, 140, + 115, 1259, -1, 1261, -1, 120, -1, 122, -1, -1, + -1, -1, 17, 154, -1, -1, 1356, 1357, 159, 1359, + -1, 1361, -1, 164, -1, -1, -1, 514, -1, 297, + 298, 146, -1, -1, 521, 303, -1, 1318, 801, 165, + 1321, -1, 47, -1, -1, -1, -1, 1328, 811, 10, + 11, 12, 815, -1, -1, 60, 61, 1338, 1339, 1340, + 1318, 548, -1, 550, 1404, 552, -1, 1408, -1, 832, + -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, + 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, + 863, 106, 865, 64, 109, 33, -1, 112, -1, -1, + -1, -1, -1, -1, 1242, 76, 77, -1, -1, -1, + 1447, -1, -1, 128, -1, -1, -1, 1408, -1, 1410, + -1, -1, -1, -1, 1475, 140, 1417, -1, -1, 1420, + 1421, 1422, 1423, 1424, -1, 908, -1, -1, -1, 154, + 1408, 112, 113, -1, 115, -1, -1, -1, -1, 120, + 923, 122, -1, -1, -1, -1, -1, -1, -1, 1304, + 1305, 1306, 1307, 1308, -1, 1310, 1516, 1517, 1518, -1, + 1520, -1, 669, -1, -1, 1313, 22, 23, -1, 150, + 1264, 1265, 1266, 154, 1475, -1, 1477, 33, 159, 1304, + 1305, 1306, 1307, 1308, -1, 1310, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 979, 1475, 981, -1, + -1, 489, -1, -1, -1, -1, -1, -1, 1509, 157, + 158, 159, 160, 161, -1, 163, 164, 165, -1, -1, + -1, 1522, 1523, -1, -1, -1, -1, -1, -1, 1530, + 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, + 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1343, + 1033, 1345, -1, 1347, -1, -1, 1350, 1351, 1352, -1, + 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, + 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, -1, + 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, + -1, -1, -1, -1, -1, -1, 1451, -1, -1, -1, + -1, 157, 158, 159, 160, 161, -1, 163, 164, 165, + -1, -1, -1, -1, -1, -1, -1, 824, 825, 826, + -1, 828, -1, 830, 831, 832, 1451, 50, 51, -1, + -1, 54, -1, 56, 57, 58, 59, 60, -1, 62, + 63, -1, -1, 66, 67, -1, -1, 70, -1, -1, + 1505, -1, 75, 76, 77, -1, -1, -1, 81, -1, + -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, + 1505, -1, -1, -1, -1, 108, -1, 110, -1, 112, + -1, 679, 680, -1, 117, -1, 119, 120, 121, -1, + -1, 124, 125, 10, 11, 12, 129, -1, -1, 132, + 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, + 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, + -1, 154, 15, -1, 157, 158, 159, -1, -1, 162, + -1, 164, 165, -1, -1, 168, -1, -1, -1, 1232, + -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, + -1, -1, -1, -1, 47, -1, -1, 50, 51, 76, + 77, 54, -1, 56, 57, 58, 59, 60, -1, 62, + 63, -1, -1, 66, 67, -1, -1, 70, -1, -1, + -1, -1, 75, 76, 77, -1, -1, -1, -1, -1, + -1, 84, -1, 1286, -1, 112, 113, -1, 115, -1, + -1, -1, -1, 120, -1, 122, -1, 100, -1, -1, + -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, + -1, -1, -1, 116, 117, -1, 119, 120, 121, 146, + -1, 124, 125, 22, 23, 1328, 129, -1, -1, 132, + 133, 134, 135, 136, 33, -1, 139, -1, 141, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 18, 19, 20, 21, 22, 23, -1, - 1327, 76, 77, -1, 1369, 1370, 1371, 1372, 33, 1374, - 1375, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, 164, 165, -1, -1, -1, 169, - -1, -1, -1, -1, -1, -1, -1, 112, 113, -1, - 115, -1, -1, -1, -1, 120, -1, 122, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 146, 1241, -1, -1, -1, -1, 1404, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, -1, -1, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, -1, 70, -1, 72, 73, 74, - 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, - 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, - 165, -1, -1, 1312, -1, 100, -1, -1, -1, -1, - -1, 106, 107, 108, -1, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, -1, -1, - -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, - -1, -1, -1, -1, -1, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, -1, -1, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, -1, 70, -1, 72, 73, 74, 75, 76, 77, - 78, 79, 80, -1, 82, 83, 84, -1, -1, -1, + 1077, 154, -1, -1, 157, 158, -1, -1, -1, 162, + -1, 164, -1, -1, -1, 168, -1, -1, -1, -1, + 878, -1, -1, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, -1, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, + -1, -1, 1405, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, -1, -1, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, + 70, -1, 72, 73, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, -1, -1, -1, 157, 158, + 159, 160, 161, -1, 163, 164, 165, -1, -1, -1, + 100, -1, -1, -1, -1, -1, 106, 107, 108, -1, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, -1, -1, -1, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 100, -1, -1, -1, -1, -1, 106, 107, - 108, -1, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, -1, -1, -1, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, -1, - 168, 169, 3, 4, 5, 6, -1, 8, 9, 10, - 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, -1, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, + -1, -1, 1309, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, -1, -1, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, + 70, -1, 72, 73, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, -1, -1, -1, -1, -1, + -1, -1, -1, 1370, 1371, 1372, 1373, -1, 1375, 1376, + 100, -1, -1, -1, -1, -1, 106, 107, 108, -1, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, -1, -1, -1, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, -1, 168, 169, + 3, 4, 5, 6, -1, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, -1, -1, -1, -1, 50, - 51, 33, -1, 54, -1, 56, 57, 58, 59, -1, - -1, 62, 63, -1, -1, 66, 67, -1, -1, 70, - -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, - 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, - -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, - 121, -1, -1, 124, 125, -1, -1, -1, 129, -1, - -1, 132, 133, 134, 135, 136, -1, -1, 139, -1, - 141, 3, 4, 5, 6, -1, 8, 9, 10, 11, - -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, - -1, 162, -1, 164, 165, -1, -1, 168, -1, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, -1, -1, -1, 169, 50, -1, - -1, -1, 54, -1, 56, 57, 58, -1, -1, -1, - 62, -1, 64, 65, 66, 67, -1, -1, -1, -1, - -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, - -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, - -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, - 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, - -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, - 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, - 8, 9, 10, 11, 146, 10, 11, 12, -1, -1, - -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, - 162, -1, 164, 165, -1, -1, 168, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, - -1, -1, 50, 33, -1, -1, 54, -1, 56, 57, - 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, - -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, 76, 77, 81, -1, -1, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, - 108, -1, 110, -1, 112, -1, -1, 112, 113, 117, - 115, 119, 120, 121, -1, 120, 124, 122, -1, -1, - -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, - 4, 5, 6, 141, 8, 9, 10, 11, -1, -1, - -1, 146, -1, -1, -1, -1, 154, -1, -1, 157, - 158, 159, -1, -1, 162, -1, 164, 165, 166, -1, - 168, -1, 152, 153, 154, -1, -1, 157, 158, 159, - 160, 161, -1, 163, 164, 165, 50, 51, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, + -1, -1, -1, -1, -1, -1, -1, 50, 51, 33, + -1, 54, -1, 56, 57, 58, 59, -1, -1, 62, + 63, -1, -1, 66, 67, -1, -1, 70, -1, -1, + -1, -1, 75, 76, 77, -1, -1, -1, 81, -1, + -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, + -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, + -1, -1, -1, -1, 117, -1, 119, 120, 121, -1, + -1, 124, 125, -1, -1, -1, 129, -1, -1, 132, + 133, 134, 135, 136, -1, -1, 139, -1, 141, 3, + 4, 5, 6, -1, 8, 9, 10, 11, -1, -1, + -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, + -1, 164, 165, -1, -1, 168, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 164, 165, -1, -1, -1, 169, 50, -1, -1, -1, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, - -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, + 64, 65, 66, 67, 10, 11, 12, -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, - -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, + -1, -1, -1, 117, -1, 119, 120, 121, 64, -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, - -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, - 10, 11, -1, 10, 11, 12, -1, -1, 15, -1, + 76, 77, 136, 3, 4, 5, 6, 141, 8, 9, + 10, 11, 146, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, - 164, 165, -1, -1, 168, -1, -1, -1, 16, 17, - 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, - 50, 51, -1, -1, 54, 33, 56, 57, 58, -1, - -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, - -1, -1, -1, -1, -1, 75, 76, 77, -1, 76, - 77, 81, -1, -1, 84, 85, 86, 87, 88, 89, + 164, 165, -1, -1, 168, -1, 112, 113, -1, 115, + -1, -1, -1, -1, 120, -1, 122, -1, -1, -1, + 50, -1, -1, -1, 54, -1, 56, 57, 58, -1, + -1, -1, 62, -1, -1, -1, 66, 67, 10, 11, + 12, -1, -1, -1, -1, 75, 76, 77, 154, -1, + -1, 81, -1, 159, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, - 110, -1, 112, -1, -1, 112, 113, 117, 115, 119, - 120, 121, -1, 120, 124, 122, -1, -1, -1, 129, - -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, - 6, 141, 8, 9, 10, 11, -1, 10, 11, 12, + 110, -1, 112, -1, -1, -1, -1, 117, -1, 119, + 120, 121, 64, -1, 124, -1, -1, -1, -1, 129, + -1, -1, 132, -1, 76, 77, 136, 3, 4, 5, + 6, 141, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, - -1, -1, 162, -1, 164, 165, -1, -1, 168, -1, - -1, 149, -1, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 50, 163, 164, 165, 54, -1, + -1, -1, 162, -1, 164, 165, 166, -1, 168, -1, + 112, 113, -1, 115, -1, -1, -1, -1, 120, -1, + 122, -1, -1, -1, 50, 51, -1, -1, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, - 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, 76, 77, 81, -1, -1, 84, 85, + 66, 67, -1, -1, -1, -1, -1, 149, -1, 75, + 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, - -1, -1, 108, -1, 110, -1, 112, -1, -1, 112, - 113, 117, 115, 119, 120, 121, -1, 120, 124, 122, + -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, + -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, - 146, -1, -1, -1, -1, -1, -1, -1, 154, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, -1, -1, 168, -1, -1, -1, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, 50, -1, + 20, 21, 22, 23, -1, -1, -1, -1, 50, 51, -1, -1, 54, 33, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, @@ -2512,7 +2473,7 @@ static const yytype_int16 yycheck[] = 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, - 162, -1, 164, 165, 166, -1, 168, -1, 148, -1, + 162, -1, 164, 165, -1, -1, 168, -1, -1, 149, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 50, 163, 164, 165, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, @@ -2539,7 +2500,7 @@ static const yytype_int16 yycheck[] = -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, - 164, 165, 166, -1, 168, 147, -1, -1, -1, 151, + 164, 165, 166, -1, 168, -1, 148, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 50, 163, 164, 165, 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, @@ -2550,306 +2511,355 @@ static const yytype_int16 yycheck[] = 110, -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, - 6, 141, 8, 9, 10, 11, 12, -1, -1, 15, + 6, 141, 8, 9, 10, 11, 146, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, - -1, -1, 162, -1, 164, 165, -1, -1, 168, 16, - 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, - -1, 47, -1, -1, 50, 51, 33, -1, 54, -1, - 56, 57, 58, 59, 60, -1, 62, 63, -1, -1, - 66, 67, -1, -1, 70, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, -1, -1, -1, 84, -1, - -1, -1, -1, -1, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, 100, -1, -1, -1, -1, -1, - -1, 33, 108, -1, 110, -1, 112, -1, -1, -1, - 116, 117, -1, 119, 120, 121, -1, -1, 124, 125, - -1, -1, -1, 129, -1, -1, 132, 133, 134, 135, - 136, -1, -1, 139, -1, 141, -1, 3, 4, 5, - 6, -1, 8, 9, 10, 11, 12, -1, 154, 15, - -1, 157, 158, -1, -1, -1, 162, -1, 164, -1, - 147, -1, 168, -1, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, - -1, 47, -1, -1, 50, 51, -1, -1, 54, -1, - 56, 57, 58, 59, 60, -1, 62, 63, -1, -1, - 66, 67, -1, -1, 70, 10, 11, 12, -1, 75, - 76, 77, -1, -1, -1, -1, -1, 149, 84, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, 100, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, 165, -1, -1, 168, -1, + -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, + -1, -1, -1, -1, 50, -1, -1, -1, 54, 33, + 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, + 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, + 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, - 116, 117, -1, 119, 120, 121, -1, -1, 124, 125, - -1, -1, -1, 129, -1, -1, 132, 133, 134, 135, - 136, 76, 77, 139, -1, 141, 3, 4, 5, 6, - -1, 8, 9, 10, -1, -1, -1, -1, 154, -1, - -1, 157, 158, -1, -1, -1, 162, -1, 164, -1, - -1, -1, 168, -1, -1, -1, -1, 112, 113, 114, - 115, -1, -1, -1, -1, 120, -1, 122, -1, -1, - -1, -1, -1, 50, -1, -1, -1, -1, 133, -1, - -1, -1, -1, 138, -1, 62, -1, -1, -1, -1, - 67, 18, 19, 20, 21, 22, 23, -1, 75, 76, - -1, -1, -1, -1, 81, -1, 33, -1, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, -1, 16, 17, 18, 19, 20, 21, - 22, 23, -1, 110, -1, 112, -1, -1, -1, -1, - 117, 33, -1, -1, 121, -1, -1, 124, -1, -1, - -1, -1, 129, -1, -1, -1, -1, -1, -1, 54, - -1, 56, 57, 58, -1, -1, -1, -1, -1, -1, - -1, 66, -1, -1, -1, -1, -1, 154, -1, -1, - 157, 158, 159, 6, -1, 162, -1, 164, 165, 84, - -1, 168, -1, 16, 17, 18, 19, 20, 21, 22, - 23, -1, -1, -1, -1, 100, -1, -1, -1, -1, - 33, -1, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 119, 120, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, - -1, 136, 65, -1, -1, -1, 141, -1, -1, 10, - 11, 12, -1, -1, 10, 11, -1, -1, -1, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, 166, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, 108, -1, -1, -1, -1, - -1, -1, 33, -1, -1, 51, -1, -1, 54, -1, - 56, 57, 58, 59, -1, -1, -1, 63, -1, -1, - 66, -1, -1, -1, 70, 76, 77, -1, -1, -1, - -1, 77, -1, -1, 147, -1, -1, 150, 84, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - -1, 164, 165, -1, 100, 168, -1, 10, 11, -1, - -1, 112, 113, -1, 115, 111, -1, -1, -1, 120, - -1, 122, -1, 119, 120, -1, -1, -1, -1, 125, - -1, -1, -1, -1, -1, -1, 137, 133, 134, 135, - 136, -1, -1, 139, -1, 141, -1, -1, 51, -1, - 146, 54, -1, 56, 57, 58, 59, -1, -1, -1, - 63, -1, -1, 66, -1, -1, 162, 70, 149, 17, - 151, 152, 153, 154, 77, -1, 157, 158, 159, 160, - 161, 84, 163, 164, 165, 33, -1, -1, 10, 11, - 12, -1, -1, 10, 11, -1, -1, 100, -1, 47, - -1, -1, -1, -1, -1, -1, -1, -1, 111, -1, - -1, -1, 60, 61, -1, -1, 119, 120, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, 76, -1, - 133, 134, 135, 136, 51, -1, 139, 54, 141, 56, - 57, 58, 59, -1, -1, -1, 63, -1, -1, 66, - -1, -1, -1, 70, 76, 77, -1, -1, 106, 162, - 77, 109, -1, -1, 112, -1, -1, 84, 16, 17, - 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, - 128, -1, -1, 100, -1, 33, -1, -1, -1, -1, - 112, 113, 140, 115, 111, -1, -1, -1, 120, -1, - 122, -1, 119, 120, -1, -1, 154, -1, 125, -1, - 54, 133, 56, 57, 58, -1, 133, 134, 135, 136, - -1, -1, 139, -1, 141, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, - 84, -1, 33, -1, -1, 162, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, 100, -1, -1, -1, - -1, -1, -1, 33, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, 119, 120, -1, -1, -1, + -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, + -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, + 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, + -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, + -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, + 166, -1, 168, 147, -1, -1, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 50, 163, + 164, 165, 54, -1, 56, 57, 58, -1, -1, -1, + 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, + -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, + -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, + -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, + 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, + -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, + 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, + 162, -1, 164, 165, -1, -1, 168, 16, 17, 18, + 19, 20, 21, 22, 23, -1, -1, -1, -1, 47, + -1, -1, 50, 51, 33, -1, 54, -1, 56, 57, + 58, 59, 60, -1, 62, 63, -1, -1, 66, 67, + -1, -1, 70, -1, -1, -1, -1, 75, 76, 77, + -1, -1, -1, -1, -1, -1, 84, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 100, -1, -1, -1, -1, -1, -1, -1, + 108, -1, 110, -1, 112, -1, -1, -1, 116, 117, + -1, 119, 120, 121, -1, -1, 124, 125, -1, -1, + -1, 129, -1, -1, 132, 133, 134, 135, 136, -1, + -1, 139, -1, 141, 3, 4, 5, 6, -1, 8, + 9, 10, -1, -1, -1, -1, 154, -1, -1, 157, + 158, -1, -1, -1, 162, -1, 164, -1, -1, -1, + 168, -1, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, 163, 164, 165, -1, -1, -1, + 169, 50, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 62, -1, -1, -1, -1, 67, 17, + 18, 19, 20, 21, 22, 23, 75, 76, -1, -1, + -1, -1, 81, -1, -1, 33, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, -1, 16, 17, 18, 19, 20, 21, 22, 23, + -1, 110, -1, 112, -1, -1, -1, -1, 117, 33, + -1, -1, 121, -1, -1, 124, -1, -1, -1, -1, + 129, -1, -1, -1, -1, -1, -1, 54, -1, 56, + 57, 58, -1, -1, -1, -1, -1, -1, -1, 66, + -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, + 159, 6, -1, 162, -1, 164, 165, 84, -1, 168, + -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, 100, -1, -1, -1, -1, 33, -1, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 119, 120, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, -1, 163, 164, 165, -1, 136, + 65, -1, -1, -1, 141, -1, -1, -1, -1, -1, + -1, -1, 10, 11, -1, -1, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 164, 165, -1, -1, -1, 169, -1, 20, 21, 22, + 23, -1, -1, 108, -1, -1, -1, -1, -1, -1, + 33, -1, -1, 51, -1, -1, 54, -1, 56, 57, + 58, 59, -1, -1, -1, 63, -1, -1, 66, -1, + -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, + -1, -1, 147, -1, -1, 150, 84, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, -1, 164, + 165, -1, 100, 168, -1, 10, 11, -1, -1, -1, + -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, + -1, 119, 120, -1, -1, -1, -1, 125, -1, -1, + -1, -1, -1, -1, -1, 133, 134, 135, 136, -1, + -1, 139, -1, 141, -1, -1, 51, -1, 146, 54, + -1, 56, 57, 58, 59, -1, -1, -1, 63, -1, + -1, 66, -1, -1, 162, 70, -1, -1, -1, -1, + -1, -1, 77, -1, 157, 158, 159, 160, 161, 84, + 163, 164, 165, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, -1, -1, 100, -1, 54, -1, 56, + 57, 58, -1, -1, -1, -1, 111, -1, -1, 66, + -1, -1, -1, -1, 119, 120, -1, -1, -1, -1, + 125, -1, -1, -1, -1, -1, -1, 84, 133, 134, + 135, 136, 51, -1, 139, 54, 141, 56, 57, 58, + 59, -1, -1, 100, 63, -1, -1, 66, -1, -1, + -1, 70, -1, -1, -1, -1, -1, 162, 77, -1, + -1, -1, 119, 120, -1, 84, 16, 17, 18, 19, + 20, 21, 22, 23, -1, -1, -1, -1, -1, 136, + -1, 100, -1, 33, 141, -1, -1, -1, -1, -1, + -1, 54, 111, 56, 57, 58, -1, -1, -1, -1, + 119, 120, -1, -1, -1, -1, 125, 164, -1, -1, + -1, -1, -1, -1, 133, 134, 135, 136, -1, -1, + 139, 84, 141, 16, 17, 18, 19, 20, 21, 22, + 23, -1, -1, -1, -1, -1, -1, 100, -1, -1, + 33, -1, -1, 162, 16, 17, 18, 19, 20, 21, + 22, 23, -1, -1, -1, -1, 119, 120, -1, -1, -1, 33, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, 136, -1, -1, -1, -1, 141, -1, 33, - -1, -1, -1, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, -1, 163, 164, 165, 166, 16, - 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 33, 16, 17, 18, - 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, -1, 163, 164, 165, 166, -1, -1, -1, -1, + -1, -1, -1, 136, -1, -1, -1, -1, 141, 33, + -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, -1, -1, -1, -1, 147, 33, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, 164, 165, 166, -1, -1, 151, + 160, 161, -1, 163, 164, 165, 166, 16, 17, 18, + 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 33, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 33, -1, -1, -1, -1, -1, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, 164, 165, 166, -1, -1, -1, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 164, 165, 166, -1, -1, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, 166, 16, 17, 18, 19, 20, 21, 22, 23, + -1, -1, -1, -1, -1, -1, 10, 11, 12, 33, + -1, 15, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, 163, 164, 165, 166, -1, -1, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, 164, 165, 166, 16, 17, 18, 19, + 20, 21, 22, 23, -1, -1, 10, 11, 12, -1, + 64, -1, -1, 33, 16, 17, 18, 19, 20, 21, + 22, 23, 76, 77, -1, -1, -1, -1, -1, -1, + -1, 33, 16, 17, 18, 19, 20, 21, 22, 23, + -1, -1, -1, 47, -1, 49, -1, -1, -1, 33, + 16, 17, 18, 19, 20, 21, 22, 23, 112, 113, + 64, 115, -1, -1, -1, -1, 120, 33, 122, -1, + -1, -1, 76, 77, -1, -1, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, 16, 17, 18, 19, 20, 21, 22, - 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 33, -1, -1, -1, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, - -1, -1, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, -1, 163, 164, 165, 16, 17, 18, - 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 18, 19, 20, 21, 22, 23, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 33, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 23, -1, -1, -1, -1, -1, -1, -1, 112, 113, + 33, 115, -1, -1, -1, -1, 120, -1, 122, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, + -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 146, 163, 164, 165, -1, -1, -1, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, -1, -1, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 164, 165, -1, 149, -1, 151, 152, 153, 154, -1, + -1, 157, 158, 159, 160, 161, 0, 163, 164, 165, + -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, + 22, 23, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 33, -1, -1, -1, -1, -1, -1, 151, 152, + 153, 154, -1, -1, 157, 158, 159, 160, 161, -1, 163, 164, 165, 47, -1, 49, -1, -1, 52, 53, -1, -1, -1, -1, -1, -1, 60, 61, -1, -1, -1, -1, -1, -1, -1, 69, -1, 71, 72, 73, 74, -1, -1, -1, 78, -1, -1, -1, -1, 83, - -1, -1, 151, 152, 153, 154, -1, -1, 157, 158, - 159, 160, 161, -1, 163, 164, 165, -1, 102, 103, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, -1, -1, -1, 122, 123, 11, 12, 126, 127, 15, -1, 17, 131, -1, -1, -1, -1, -1, 137, 138, -1, 140, -1, -1, -1, - -1, -1, -1, -1, 148, -1, -1, -1, 154, 155, - 156, 157, 158, 159, 160, 161, 47, 163, 164, 165, + 152, 153, 154, -1, 148, 157, 158, 159, 160, 161, + -1, 163, 164, 165, -1, -1, 47, -1, -1, -1, 51, -1, -1, 54, -1, 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, -1, -1, 70, - 18, 19, 20, 21, 22, 23, 77, -1, -1, 10, - 11, 12, -1, 84, -1, 33, 18, 19, 20, 21, + 18, 19, 20, 21, 22, 23, 77, -1, -1, -1, + -1, -1, -1, 84, -1, 33, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, 100, -1, 33, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, 116, -1, 33, 119, 120, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - -1, -1, 133, 134, 135, 136, -1, -1, 139, -1, - 141, -1, -1, -1, -1, 76, 77, -1, -1, -1, - -1, -1, -1, 154, -1, -1, -1, -1, 159, -1, + -1, -1, -1, -1, 125, -1, 18, 19, 20, 21, + 22, 23, 133, 134, 135, 136, -1, -1, 139, -1, + 141, 33, 18, 19, 20, 21, 22, 23, -1, -1, + -1, -1, -1, 154, -1, -1, -1, 33, 159, 18, + 19, 20, 21, 22, 23, -1, -1, -1, 18, 19, + 20, 21, 22, 23, 33, -1, -1, -1, -1, -1, + -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, -1, 163, 164, 165, -1, -1, + -1, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, -1, -1, -1, -1, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 112, 113, -1, 115, -1, -1, -1, -1, 120, - -1, 122, -1, -1, -1, -1, -1, 10, 11, 12, - -1, -1, 133, -1, 152, 153, 154, 138, -1, 157, - 158, 159, 160, 161, 6, 163, 164, 165, -1, -1, - -1, 153, 154, -1, -1, 157, 158, 159, 160, 161, - 11, 163, 164, 165, 47, -1, 49, -1, 154, -1, - -1, 157, 158, 159, 160, 161, -1, 163, 164, 165, - -1, 6, -1, -1, -1, 47, -1, 49, -1, -1, - -1, 53, -1, 76, 77, -1, -1, -1, 60, 61, - 51, -1, -1, 54, -1, 56, 57, 58, 59, 71, - 72, 73, 63, -1, -1, 66, -1, -1, -1, 70, - -1, 83, 47, -1, 49, -1, 77, -1, 53, 112, - 113, -1, 115, 84, -1, 60, 61, 120, -1, 122, - -1, -1, -1, -1, 106, -1, 71, 72, 73, 100, - -1, -1, -1, -1, 116, -1, -1, -1, 83, -1, - 122, -1, -1, 146, 126, 127, -1, -1, 119, 120, - 10, 11, 12, -1, 125, -1, 138, -1, 140, -1, - -1, 106, 133, 134, 135, 136, -1, -1, 139, -1, - 141, 116, -1, -1, -1, -1, -1, 122, -1, 10, - 11, 12, 127, -1, -1, -1, -1, -1, -1, -1, - -1, 51, -1, 138, 54, 140, 56, 57, 58, 59, - 60, -1, -1, 63, -1, -1, 66, -1, -1, -1, - 70, -1, -1, -1, -1, -1, -1, 77, -1, -1, - 51, -1, -1, 54, 84, 56, 57, 58, 59, 60, + 152, 153, 154, -1, -1, 157, 158, 159, 160, 161, + -1, 163, 164, 165, -1, 6, -1, -1, 6, 155, + 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, + -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, + 159, 160, 161, -1, 163, 164, 165, 157, 158, 159, + 160, 161, -1, 163, 164, 165, 47, -1, 49, 47, + -1, 49, 53, -1, -1, 53, -1, -1, -1, 60, + 61, -1, 60, 61, -1, 10, 11, 12, -1, -1, + 71, 72, 73, 71, 72, 73, -1, -1, -1, -1, + -1, -1, 83, -1, -1, 83, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, + -1, -1, -1, -1, -1, 106, -1, -1, 106, -1, + -1, -1, -1, -1, -1, 116, -1, -1, 116, 64, + -1, 122, -1, -1, 122, 126, 127, -1, -1, 127, + -1, 76, 77, -1, -1, -1, -1, 138, 51, 140, + 138, 54, 140, 56, 57, 58, 59, 60, -1, -1, + 63, -1, -1, 66, -1, -1, -1, 70, -1, -1, + -1, -1, -1, -1, 77, -1, -1, 112, 113, 114, + 115, 84, -1, -1, -1, 120, -1, 122, -1, -1, + -1, -1, -1, 10, 11, 12, -1, 100, 133, -1, + -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 119, 120, -1, -1, + -1, -1, 125, -1, 10, 11, 12, -1, -1, -1, + 133, 134, 135, 136, 51, -1, 139, 54, 141, 56, + 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, + -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, + 77, -1, -1, -1, -1, 51, -1, 84, 54, -1, + 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, + 66, -1, -1, 100, 70, -1, -1, -1, -1, -1, + -1, 77, -1, -1, -1, -1, -1, -1, 84, -1, + -1, -1, 119, 120, -1, -1, -1, -1, 125, -1, + 10, 11, 12, -1, 100, -1, 133, 134, 135, 136, + -1, -1, 139, -1, 141, 10, 11, 12, -1, -1, + -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, + 54, -1, 56, 57, 58, -1, -1, 133, 134, 135, + 136, -1, -1, 139, 54, 141, 56, 57, 58, 59, + 60, -1, -1, 10, 11, 12, 66, -1, -1, 54, + 84, 56, 57, 58, -1, -1, -1, 77, -1, -1, + -1, 66, -1, -1, 84, -1, 100, -1, -1, -1, + -1, -1, 77, -1, -1, -1, -1, -1, -1, 84, + 100, -1, -1, -1, -1, 119, 120, -1, -1, -1, + -1, -1, 11, 12, -1, 100, 15, 64, -1, 119, + 120, -1, 136, -1, -1, -1, -1, 141, -1, 76, + 77, -1, -1, 133, 119, 120, 136, -1, -1, 139, + -1, 141, -1, 11, 12, -1, -1, 15, 47, -1, + 164, 136, 51, -1, 139, 54, 141, 56, 57, 58, + 59, 60, -1, -1, 63, 112, 113, 66, 115, -1, + -1, 70, -1, 120, -1, 122, -1, -1, 77, 47, + -1, -1, -1, 51, -1, 84, 54, -1, 56, 57, + 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, + -1, 100, 70, -1, -1, -1, -1, -1, -1, 77, + -1, -1, -1, -1, -1, -1, 84, 116, -1, -1, + 119, 120, -1, -1, -1, -1, 125, -1, 10, 11, + 12, -1, 100, -1, 133, 134, 135, 136, 11, 12, + 139, -1, 141, -1, -1, -1, -1, -1, 116, -1, + -1, 119, 120, -1, -1, -1, -1, 125, -1, -1, + -1, -1, -1, -1, -1, 133, 134, 135, 136, 11, + 12, 139, -1, 141, 47, -1, -1, -1, 51, -1, + -1, 54, 64, 56, 57, 58, 59, 60, -1, -1, + 63, -1, -1, 66, 76, 77, -1, 70, -1, 54, + -1, 56, 57, 58, 77, -1, -1, -1, -1, 51, + -1, 84, 54, -1, 56, 57, 58, 59, 60, -1, + -1, 63, -1, -1, 66, -1, -1, 100, 70, 84, + 112, 113, -1, 115, -1, 77, -1, -1, 120, -1, + 122, -1, 84, 116, -1, 100, 119, 120, -1, -1, + -1, 133, 125, -1, -1, 11, 12, -1, 100, -1, + 133, 134, 135, 136, 119, 120, 139, -1, 141, -1, + -1, -1, -1, -1, -1, -1, -1, 119, 120, 11, + 12, 136, -1, 125, -1, -1, 141, 10, 11, 12, + -1, 133, 134, 135, 136, 51, -1, 139, 54, 141, + 56, 57, 58, 59, -1, -1, -1, 63, -1, 164, + 66, -1, -1, -1, 70, -1, -1, -1, -1, 51, + -1, 77, 54, -1, 56, 57, 58, 59, 84, -1, + -1, 63, -1, -1, 66, -1, -1, -1, 70, -1, + -1, 64, -1, -1, 100, 77, -1, -1, -1, -1, + -1, -1, 84, 76, 77, -1, -1, -1, -1, -1, + 116, -1, -1, 119, 120, 11, -1, -1, 100, 125, + -1, -1, -1, -1, -1, -1, -1, 133, 134, 135, + 136, -1, -1, 139, 107, 141, -1, 119, 120, 112, + 113, -1, 115, 125, 11, -1, -1, 120, -1, 122, + -1, 133, 134, 135, 136, 51, -1, 139, 54, 141, + 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, + 66, -1, -1, -1, 70, -1, -1, -1, -1, -1, + -1, 77, -1, -1, 51, -1, -1, 54, 84, 56, + 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, + -1, -1, -1, 70, 100, -1, -1, -1, -1, -1, + 77, -1, -1, -1, -1, -1, -1, 84, -1, -1, + -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, + 11, -1, -1, 100, -1, -1, -1, 133, 134, 135, + 136, -1, -1, 139, -1, 141, -1, -1, -1, -1, + -1, -1, 119, 120, 11, -1, -1, -1, 125, -1, + -1, -1, 10, 11, 12, -1, 133, 134, 135, 136, + 51, -1, 139, 54, 141, 56, 57, 58, 59, -1, -1, -1, 63, -1, -1, 66, -1, -1, -1, 70, - 100, -1, -1, -1, -1, -1, 77, 54, -1, 56, - 57, 58, -1, 84, -1, -1, -1, -1, -1, 119, - 120, -1, -1, -1, -1, 125, -1, -1, -1, 100, - 10, 11, 12, 133, 134, 135, 136, 84, -1, 139, - -1, 141, -1, -1, -1, -1, -1, -1, 119, 120, + -1, -1, -1, -1, 51, -1, 77, 54, -1, 56, + 57, 58, 59, 84, -1, -1, 63, -1, -1, 66, + -1, -1, -1, 70, -1, -1, 64, -1, -1, 100, + 77, 10, 11, 12, -1, -1, -1, 84, 76, 77, + -1, -1, -1, -1, -1, 10, 11, 12, 119, 120, -1, -1, -1, 100, 125, -1, -1, -1, -1, 10, 11, 12, 133, 134, 135, 136, -1, -1, 139, -1, - 141, 51, 119, 120, 54, -1, 56, 57, 58, 59, - 60, -1, -1, 63, -1, -1, 66, -1, -1, 136, - 70, -1, -1, -1, 141, -1, -1, 77, -1, -1, - -1, -1, -1, 54, 84, 56, 57, 58, 59, 60, - -1, -1, -1, -1, -1, 66, -1, 164, -1, -1, - 100, -1, -1, -1, -1, -1, 77, 10, 11, 12, - -1, -1, -1, 84, -1, -1, -1, -1, -1, 119, - 120, -1, -1, -1, -1, 125, -1, -1, -1, 100, - -1, -1, -1, 133, 134, 135, 136, -1, -1, 139, - -1, 141, -1, -1, -1, -1, 11, 12, 119, 120, - 15, 54, -1, 56, 57, 58, -1, -1, -1, -1, - -1, -1, 133, 66, -1, 136, -1, -1, 139, -1, - 141, -1, -1, -1, 77, 11, 12, -1, -1, 15, - -1, 84, 47, -1, -1, -1, 51, -1, -1, 54, - -1, 56, 57, 58, 59, 60, -1, 100, 63, -1, - -1, 66, -1, -1, -1, 70, -1, -1, -1, -1, - -1, 47, 77, -1, -1, 51, 119, 120, 54, 84, - 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, - 66, -1, -1, 136, 70, 100, 139, -1, 141, -1, - -1, 77, -1, -1, -1, -1, -1, -1, 84, -1, - -1, 116, -1, -1, 119, 120, -1, -1, -1, -1, - 125, -1, -1, -1, 100, -1, 11, 12, 133, 134, - 135, 136, -1, -1, 139, -1, 141, -1, -1, -1, - 116, -1, -1, 119, 120, -1, -1, -1, -1, 125, - 10, 11, 12, -1, -1, 11, 12, 133, 134, 135, - 136, -1, 47, 139, -1, 141, 51, -1, -1, 54, - -1, 56, 57, 58, 59, 60, -1, -1, 63, -1, - -1, 66, -1, -1, -1, 70, -1, 47, -1, 49, - -1, -1, 77, -1, -1, 51, -1, -1, 54, 84, - 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, - 66, -1, -1, -1, 70, 100, 76, 77, -1, -1, - -1, 77, -1, -1, 10, 11, 12, -1, 84, -1, - -1, 116, -1, -1, 119, 120, -1, -1, -1, -1, - 125, 11, 12, -1, 100, -1, -1, -1, 133, 134, - 135, 136, 112, 113, 139, 115, 141, -1, -1, -1, - 120, -1, 122, 119, 120, 11, 12, -1, -1, 125, - -1, -1, -1, -1, -1, -1, -1, 133, 134, 135, - 136, 51, -1, 139, 54, 141, 56, 57, 58, 59, - 76, 77, -1, 63, -1, 54, 66, 56, 57, 58, - 70, -1, -1, -1, -1, 51, -1, 77, 54, -1, - 56, 57, 58, 59, 84, -1, -1, 63, -1, -1, - 66, -1, -1, -1, 70, 84, 112, 113, -1, 115, - 100, 77, -1, -1, 120, -1, 122, -1, 84, -1, - -1, 100, -1, -1, -1, -1, 116, 133, -1, 119, - 120, 11, 138, -1, 100, 125, -1, -1, -1, -1, - 119, 120, -1, 133, 134, 135, 136, -1, -1, 139, - -1, 141, -1, 119, 120, -1, -1, 136, -1, 125, - 11, -1, 141, -1, -1, -1, -1, 133, 134, 135, - 136, 51, -1, 139, 54, 141, 56, 57, 58, 59, - 60, -1, -1, 63, -1, 164, 66, -1, -1, -1, - 70, -1, -1, -1, -1, -1, -1, 77, -1, -1, - 51, -1, -1, 54, 84, 56, 57, 58, 59, 60, - -1, -1, 63, -1, -1, 66, -1, -1, -1, 70, - 100, -1, -1, -1, -1, -1, 77, -1, -1, 10, - 11, 12, -1, 84, 54, -1, 56, 57, 58, 119, - 120, -1, -1, -1, -1, 125, 11, -1, -1, 100, - -1, -1, -1, 133, 134, 135, 136, -1, -1, 139, - -1, 141, -1, -1, 84, -1, -1, -1, 119, 120, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - 100, -1, 133, 134, 135, 136, 51, -1, 139, 54, - 141, 56, 57, 58, 59, 76, 77, -1, 63, 119, - 120, 66, -1, -1, -1, 70, -1, -1, -1, -1, - -1, -1, 77, -1, -1, -1, 136, -1, -1, 84, - -1, 141, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 112, 113, -1, 115, 100, -1, -1, -1, 120, - -1, 122, -1, -1, 164, -1, -1, -1, -1, -1, - -1, -1, 133, -1, 119, 120, -1, 138, -1, 47, - 125, 49, -1, -1, 52, 53, -1, -1, 133, 134, - 135, 136, 60, 61, 139, -1, 141, -1, -1, -1, - -1, 69, -1, 71, 72, 73, 74, -1, -1, -1, - 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, + 141, -1, 119, 120, 112, 113, -1, 115, 125, -1, + -1, -1, 120, -1, 122, 64, 133, 134, 135, 136, + -1, -1, 139, -1, 141, 133, -1, 76, 77, 64, + 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 76, 77, 64, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 76, 77, -1, -1, -1, + -1, -1, -1, 112, 113, -1, 115, -1, -1, -1, + -1, 120, -1, 122, -1, -1, -1, 112, 113, -1, + 115, -1, -1, -1, 133, 120, -1, 122, -1, 138, + -1, 112, 113, -1, 115, -1, -1, -1, 133, 120, + 47, 122, 49, 138, -1, 52, 53, -1, -1, -1, + -1, -1, -1, 60, 61, -1, 137, -1, -1, -1, + -1, -1, 69, -1, 71, 72, 73, 74, -1, -1, + -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, - -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, - -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, - -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, - 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, - 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, - -1, -1, -1, -1, -1, -1, 102, 103, 104, 105, - 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, - 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, - 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, - -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, - 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, + -1, -1, -1, -1, -1, 102, 103, 104, 105, 106, + 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, + -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, + 127, -1, -1, -1, 131, 60, 61, -1, -1, -1, + 137, 138, -1, 140, 69, -1, 71, 72, 73, 74, + -1, 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 167, -1, -1, -1, -1, -1, -1, 102, 103, - 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, - 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, - 52, 53, 126, 127, -1, -1, -1, 131, 60, 61, - -1, -1, -1, 137, 138, -1, 140, 69, -1, 71, - 72, 73, 74, -1, 148, -1, 78, -1, -1, -1, - -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 167, -1, -1, -1, -1, -1, -1, - 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, - -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, - 122, 123, 52, 53, 126, 127, -1, -1, -1, 131, - 60, 61, -1, -1, -1, 137, 138, -1, 140, 69, - -1, 71, 72, 73, 74, -1, 148, -1, 78, -1, - -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 167, -1, -1, -1, -1, - -1, -1, 102, 103, 104, 105, 106, 107, -1, -1, - -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, - -1, 49, 122, 123, 52, 53, 126, 127, -1, -1, - -1, 131, 60, 61, -1, -1, -1, 137, 138, -1, - 140, 69, -1, 71, 72, 73, 74, -1, 148, -1, - 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 167, -1, -1, - -1, -1, -1, -1, 102, 103, 104, 105, 106, 107, - -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, - -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, - -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, - 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, - 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, - -1, 54, -1, 56, 57, 58, -1, -1, -1, 167, - -1, -1, -1, 66, -1, -1, 102, 103, 104, 105, - 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, - 116, 84, -1, -1, -1, -1, 122, 123, -1, -1, - 126, 127, -1, -1, 47, 131, 49, 100, -1, -1, - 53, 137, 138, -1, 140, -1, -1, 60, 61, -1, - -1, -1, 148, -1, -1, -1, 119, 120, 71, 72, - 73, -1, -1, -1, -1, 78, -1, -1, -1, -1, - 83, 167, -1, 136, -1, -1, -1, -1, 141, -1, - -1, -1, -1, -1, -1, -1, 47, -1, 49, -1, - -1, -1, 53, 106, -1, -1, -1, -1, -1, 60, - 61, 164, -1, 116, -1, -1, -1, -1, -1, 122, + 167, -1, -1, -1, -1, -1, -1, 102, 103, 104, + 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, + 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, + 53, 126, 127, -1, -1, -1, 131, 60, 61, -1, + -1, -1, 137, 138, -1, 140, 69, -1, 71, 72, + 73, 74, -1, 148, -1, 78, -1, -1, -1, -1, + 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 167, -1, -1, -1, -1, -1, -1, 102, + 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, + 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, + 123, 52, 53, 126, 127, -1, -1, -1, 131, 60, + 61, -1, -1, -1, 137, 138, -1, 140, 69, -1, + 71, 72, 73, 74, -1, 148, -1, 78, -1, -1, + -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 167, -1, -1, -1, -1, -1, + -1, 102, 103, 104, 105, 106, 107, -1, -1, -1, + -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, + 49, 122, 123, 52, 53, 126, 127, -1, -1, -1, + 131, 60, 61, -1, -1, -1, 137, 138, -1, 140, + 69, -1, 71, 72, 73, 74, -1, 148, -1, 78, + -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 167, -1, -1, -1, + -1, -1, -1, 102, 103, 104, 105, 106, 107, -1, + -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, + 47, -1, 49, 122, 123, 52, 53, 126, 127, -1, + -1, -1, 131, 60, 61, -1, -1, -1, 137, 138, + -1, 140, 69, -1, 71, 72, 73, 74, -1, 148, + -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, + -1, -1, -1, -1, -1, 102, 103, 104, 105, 106, + 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, + -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, + 127, -1, -1, -1, 131, 60, 61, -1, -1, -1, + 137, 138, -1, 140, 69, -1, 71, 72, 73, 74, + -1, 148, -1, 78, -1, 10, 11, 12, 83, -1, + -1, -1, -1, -1, -1, 54, -1, 56, 57, 58, + 167, -1, -1, -1, -1, -1, -1, 102, 103, 104, + 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, + 115, 116, 47, -1, 49, 84, -1, 122, 123, -1, + -1, 126, 127, -1, -1, -1, 131, -1, -1, 64, + -1, 100, 137, 138, 47, 140, 49, -1, -1, -1, + 53, 76, 77, 148, -1, -1, -1, 60, 61, -1, + 119, 120, -1, -1, -1, -1, -1, -1, 71, 72, + 73, -1, 167, -1, -1, 78, -1, 136, -1, -1, + 83, -1, 141, -1, -1, -1, -1, 112, 113, -1, + 115, -1, -1, -1, -1, 120, 47, 122, 49, -1, + -1, -1, 53, 106, -1, 164, -1, -1, -1, 60, + 61, -1, -1, 116, -1, -1, -1, -1, -1, 122, 71, 72, 73, -1, 127, -1, -1, 78, -1, -1, -1, -1, 83, -1, 137, 138, 47, 140, 49, -1, -1, 52, 53, -1, -1, -1, -1, -1, -1, 60, @@ -2897,139 +2907,139 @@ static const yytype_uint16 yystos[] = 233, 250, 251, 256, 155, 164, 164, 15, 164, 155, 164, 164, 164, 268, 268, 268, 268, 268, 11, 54, 56, 57, 58, 66, 77, 84, 100, 119, 120, 136, - 141, 235, 266, 268, 10, 11, 12, 76, 77, 112, - 113, 115, 120, 122, 150, 154, 159, 272, 273, 275, - 278, 268, 16, 17, 18, 19, 20, 21, 22, 23, - 33, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 163, 164, 165, 6, 8, 230, 231, 164, - 59, 125, 66, 100, 257, 257, 257, 275, 164, 257, - 13, 15, 17, 60, 140, 154, 159, 164, 228, 229, - 278, 229, 146, 10, 11, 12, 112, 149, 276, 236, - 278, 137, 181, 182, 275, 164, 72, 83, 180, 180, - 180, 180, 6, 180, 202, 180, 149, 179, 107, 180, - 164, 164, 164, 164, 180, 146, 275, 149, 149, 149, - 180, 180, 164, 178, 180, 183, 203, 180, 180, 187, - 107, 275, 180, 180, 10, 11, 51, 63, 111, 133, - 134, 146, 162, 190, 193, 232, 234, 237, 239, 245, - 250, 251, 256, 265, 266, 278, 265, 235, 265, 265, - 265, 265, 235, 265, 235, 265, 235, 265, 235, 235, + 141, 235, 266, 268, 10, 11, 12, 64, 76, 77, + 112, 113, 115, 120, 122, 150, 154, 159, 272, 273, + 275, 278, 268, 16, 17, 18, 19, 20, 21, 22, + 23, 33, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 163, 164, 165, 6, 8, 230, 231, + 164, 59, 125, 66, 100, 257, 257, 257, 275, 164, + 257, 13, 15, 17, 60, 140, 154, 159, 164, 228, + 229, 278, 229, 146, 10, 11, 12, 112, 149, 276, + 236, 278, 137, 181, 182, 275, 164, 72, 83, 180, + 180, 180, 180, 6, 180, 202, 180, 149, 179, 107, + 180, 164, 164, 164, 164, 180, 146, 275, 149, 149, + 149, 180, 180, 164, 178, 180, 183, 203, 180, 180, + 187, 107, 275, 180, 180, 10, 11, 51, 63, 111, + 133, 134, 146, 162, 190, 193, 232, 234, 237, 239, + 245, 250, 251, 256, 265, 266, 278, 265, 235, 265, + 265, 265, 265, 235, 265, 235, 265, 235, 265, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 235, 235, 265, 164, 275, 164, 164, 275, 236, - 235, 265, 265, 164, 10, 235, 235, 235, 268, 265, - 265, 166, 147, 166, 275, 275, 147, 169, 150, 218, - 278, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 235, 235, 235, 235, 265, 164, 275, 164, 164, 275, + 236, 235, 265, 265, 164, 10, 235, 235, 235, 268, + 265, 265, 166, 147, 166, 275, 275, 147, 169, 150, + 218, 278, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 166, 266, 268, 229, 229, 51, 268, 235, - 159, 275, 13, 15, 17, 60, 140, 154, 159, 228, - 278, 228, 229, 228, 229, 228, 228, 15, 17, 47, - 60, 116, 154, 159, 213, 214, 223, 230, 231, 278, - 165, 248, 249, 278, 11, 247, 257, 149, 10, 11, - 12, 47, 49, 112, 146, 275, 276, 275, 48, 147, - 164, 11, 232, 268, 180, 177, 146, 275, 275, 275, - 275, 275, 172, 146, 268, 155, 10, 11, 193, 232, - 234, 275, 148, 150, 164, 164, 164, 60, 230, 275, - 164, 176, 275, 185, 146, 148, 150, 220, 148, 184, - 275, 276, 236, 167, 166, 166, 166, 166, 166, 166, - 156, 166, 156, 166, 166, 166, 166, 147, 166, 147, - 166, 147, 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 268, 235, 265, 275, 156, 166, 166, - 275, 166, 166, 156, 166, 166, 166, 166, 268, 268, - 15, 154, 273, 164, 199, 278, 268, 149, 166, 169, - 166, 166, 166, 228, 159, 275, 228, 228, 228, 228, - 228, 165, 228, 181, 116, 230, 231, 223, 228, 228, - 166, 15, 147, 13, 17, 60, 140, 154, 159, 164, - 226, 276, 278, 13, 15, 17, 60, 140, 154, 159, - 164, 227, 264, 268, 278, 275, 167, 247, 181, 164, - 238, 240, 149, 180, 181, 3, 4, 5, 9, 10, - 15, 50, 62, 67, 75, 76, 108, 110, 112, 117, - 121, 124, 129, 132, 154, 157, 158, 162, 164, 168, - 215, 216, 223, 224, 270, 271, 277, 278, 166, 166, - 172, 146, 147, 147, 147, 147, 167, 253, 147, 166, - 10, 11, 12, 59, 60, 133, 204, 205, 206, 207, - 208, 256, 278, 164, 220, 188, 148, 235, 191, 13, - 159, 192, 51, 268, 230, 13, 17, 60, 140, 154, - 159, 225, 276, 278, 235, 172, 164, 146, 148, 149, - 150, 219, 260, 261, 64, 65, 146, 268, 13, 17, - 60, 111, 140, 154, 159, 164, 186, 209, 211, 276, - 149, 275, 164, 164, 235, 235, 235, 166, 166, 166, - 164, 166, 164, 218, 213, 17, 33, 47, 60, 61, - 76, 106, 109, 112, 128, 140, 154, 212, 278, 268, - 228, 264, 166, 48, 230, 231, 226, 227, 166, 166, - 199, 15, 223, 159, 226, 226, 226, 226, 226, 226, - 165, 218, 159, 275, 227, 227, 227, 227, 227, 227, - 165, 218, 169, 147, 150, 48, 232, 268, 172, 76, - 241, 278, 182, 164, 155, 155, 233, 155, 15, 164, - 155, 164, 268, 268, 268, 268, 235, 266, 268, 166, - 15, 147, 16, 17, 18, 19, 20, 21, 22, 23, - 33, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 163, 164, 165, 180, 180, 167, 254, 10, - 10, 10, 10, 172, 277, 148, 208, 156, 147, 15, - 275, 13, 17, 60, 140, 154, 159, 164, 226, 227, - 189, 211, 148, 213, 159, 209, 213, 166, 166, 225, - 159, 225, 225, 225, 225, 225, 164, 165, 166, 167, - 194, 260, 173, 174, 275, 64, 65, 167, 262, 278, - 148, 148, 146, 221, 222, 268, 278, 148, 159, 209, - 209, 6, 16, 17, 18, 19, 20, 21, 22, 23, - 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 65, 108, 147, 150, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 164, 165, - 168, 200, 209, 209, 209, 209, 149, 164, 165, 212, - 150, 218, 220, 247, 266, 266, 166, 166, 166, 266, - 266, 166, 60, 233, 181, 164, 146, 169, 164, 223, - 226, 227, 218, 218, 164, 164, 212, 226, 166, 264, - 227, 166, 264, 268, 166, 166, 167, 149, 242, 243, - 278, 235, 235, 235, 164, 235, 164, 10, 235, 235, - 235, 268, 166, 166, 15, 224, 268, 268, 268, 268, + 268, 268, 268, 166, 266, 268, 229, 229, 51, 268, + 235, 159, 275, 13, 15, 17, 60, 140, 154, 159, + 228, 278, 228, 229, 228, 229, 228, 228, 15, 17, + 47, 60, 116, 154, 159, 213, 214, 223, 230, 231, + 278, 165, 248, 249, 278, 11, 247, 257, 149, 10, + 11, 12, 47, 49, 112, 146, 275, 276, 275, 48, + 147, 164, 11, 232, 268, 180, 177, 146, 275, 275, + 275, 275, 275, 172, 146, 268, 155, 10, 11, 193, + 232, 234, 275, 148, 150, 164, 164, 164, 60, 230, + 275, 164, 176, 275, 185, 146, 148, 150, 220, 148, + 184, 275, 276, 236, 167, 166, 166, 166, 166, 166, + 166, 156, 166, 156, 166, 166, 166, 166, 147, 166, + 147, 166, 147, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 268, 235, 265, 275, 156, 166, + 166, 275, 166, 166, 156, 166, 166, 166, 166, 268, + 268, 15, 154, 273, 164, 199, 278, 268, 149, 166, + 169, 166, 166, 166, 228, 159, 275, 228, 228, 228, + 228, 228, 165, 228, 181, 116, 230, 231, 223, 228, + 228, 166, 15, 147, 13, 17, 60, 140, 154, 159, + 164, 226, 276, 278, 13, 15, 17, 60, 140, 154, + 159, 164, 227, 264, 268, 278, 275, 167, 247, 181, + 164, 238, 240, 149, 180, 181, 3, 4, 5, 9, + 10, 15, 50, 62, 67, 75, 76, 108, 110, 112, + 117, 121, 124, 129, 132, 154, 157, 158, 162, 164, + 168, 215, 216, 223, 224, 270, 271, 277, 278, 166, + 166, 172, 146, 147, 147, 147, 147, 167, 253, 147, + 166, 10, 11, 12, 59, 60, 133, 204, 205, 206, + 207, 208, 256, 278, 164, 220, 188, 148, 235, 191, + 13, 159, 192, 51, 268, 230, 13, 17, 60, 140, + 154, 159, 225, 276, 278, 235, 172, 164, 146, 148, + 149, 150, 219, 260, 261, 64, 65, 146, 268, 13, + 17, 60, 111, 140, 154, 159, 164, 186, 209, 211, + 276, 149, 275, 164, 164, 235, 235, 235, 166, 166, + 166, 164, 166, 164, 218, 213, 17, 33, 47, 60, + 61, 76, 106, 109, 112, 128, 140, 154, 212, 278, + 268, 228, 264, 166, 48, 230, 231, 226, 227, 166, + 166, 199, 15, 223, 159, 226, 226, 226, 226, 226, + 226, 165, 218, 159, 275, 227, 227, 227, 227, 227, + 227, 165, 218, 169, 147, 150, 48, 232, 268, 172, + 76, 241, 278, 182, 164, 155, 155, 233, 155, 15, + 164, 155, 164, 268, 268, 268, 268, 235, 266, 268, + 166, 15, 147, 16, 17, 18, 19, 20, 21, 22, + 23, 33, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 163, 164, 165, 180, 180, 167, 254, + 10, 10, 10, 10, 172, 277, 148, 208, 156, 147, + 15, 275, 13, 17, 60, 140, 154, 159, 164, 226, + 227, 189, 211, 148, 213, 159, 209, 213, 166, 166, + 225, 159, 225, 225, 225, 225, 225, 164, 165, 166, + 167, 194, 260, 173, 174, 275, 64, 65, 167, 262, + 278, 148, 148, 146, 221, 222, 268, 278, 148, 159, + 209, 209, 6, 16, 17, 18, 19, 20, 21, 22, + 23, 33, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 65, 108, 147, 150, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 164, + 165, 168, 200, 209, 209, 209, 209, 149, 164, 165, + 212, 150, 218, 220, 247, 266, 266, 166, 166, 166, + 266, 266, 166, 60, 233, 181, 164, 146, 169, 164, + 223, 226, 227, 218, 218, 164, 164, 212, 226, 166, + 264, 227, 166, 264, 268, 166, 166, 167, 149, 242, + 243, 278, 235, 235, 235, 164, 235, 164, 10, 235, + 235, 235, 268, 166, 166, 15, 224, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 166, 266, 268, - 172, 147, 166, 147, 147, 147, 167, 166, 226, 227, - 178, 183, 201, 202, 207, 275, 150, 159, 150, 217, - 278, 218, 220, 166, 209, 166, 166, 164, 225, 197, - 264, 213, 167, 146, 147, 146, 164, 148, 148, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 70, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 82, 83, 84, 100, 106, - 107, 108, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 168, 169, 263, 221, - 167, 147, 209, 10, 166, 169, 166, 4, 210, 264, - 268, 147, 166, 166, 166, 166, 199, 233, 229, 48, - 166, 275, 260, 213, 218, 218, 213, 213, 164, 169, - 164, 169, 147, 113, 114, 115, 133, 138, 244, 274, - 275, 146, 147, 166, 156, 156, 265, 156, 275, 166, - 166, 156, 166, 166, 268, 149, 166, 169, 167, 10, - 148, 10, 10, 10, 148, 217, 235, 50, 62, 67, - 117, 121, 124, 154, 157, 158, 159, 162, 164, 168, - 267, 269, 147, 199, 166, 164, 199, 198, 213, 169, - 166, 260, 174, 265, 265, 262, 167, 146, 268, 215, - 169, 186, 212, 229, 15, 166, 167, 166, 166, 166, - 213, 213, 138, 274, 138, 274, 138, 274, 275, 113, - 114, 115, 15, 172, 244, 164, 164, 166, 164, 166, - 164, 268, 147, 166, 147, 166, 166, 147, 166, 164, - 155, 155, 155, 15, 164, 155, 267, 267, 267, 267, - 267, 235, 266, 267, 16, 17, 18, 19, 20, 21, - 22, 23, 33, 151, 152, 153, 154, 157, 158, 159, - 160, 161, 163, 164, 165, 189, 164, 195, 213, 166, - 199, 167, 167, 166, 167, 221, 166, 146, 166, 199, - 199, 199, 166, 166, 274, 274, 274, 274, 274, 274, - 167, 266, 266, 266, 266, 10, 148, 10, 148, 148, - 10, 148, 235, 235, 235, 235, 164, 10, 235, 235, - 166, 166, 267, 267, 267, 267, 267, 267, 267, 267, + 268, 268, 268, 268, 268, 268, 268, 268, 166, 266, + 268, 172, 147, 166, 147, 147, 147, 167, 166, 226, + 227, 178, 183, 201, 202, 207, 275, 150, 159, 150, + 217, 278, 218, 220, 166, 209, 166, 166, 164, 225, + 197, 264, 213, 167, 146, 147, 146, 164, 148, 148, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 70, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 82, 83, 84, 100, + 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 168, 169, 263, + 221, 167, 147, 209, 10, 166, 169, 166, 4, 210, + 264, 268, 147, 166, 166, 166, 166, 199, 233, 229, + 48, 166, 275, 260, 213, 218, 218, 213, 213, 164, + 169, 164, 169, 147, 113, 114, 115, 133, 138, 244, + 274, 275, 146, 147, 166, 156, 156, 265, 156, 275, + 166, 166, 156, 166, 166, 268, 149, 166, 169, 167, + 10, 148, 10, 10, 10, 148, 217, 235, 50, 62, + 67, 117, 121, 124, 154, 157, 158, 159, 162, 164, + 168, 267, 269, 147, 199, 166, 164, 199, 198, 213, + 169, 166, 260, 174, 265, 265, 262, 167, 146, 268, + 215, 169, 186, 212, 229, 15, 166, 167, 166, 166, + 166, 213, 213, 138, 274, 138, 274, 138, 274, 275, + 113, 114, 115, 15, 172, 244, 164, 164, 166, 164, + 166, 164, 268, 147, 166, 147, 166, 166, 147, 166, + 164, 155, 155, 155, 15, 164, 155, 267, 267, 267, + 267, 267, 235, 266, 267, 16, 17, 18, 19, 20, + 21, 22, 23, 33, 151, 152, 153, 154, 157, 158, + 159, 160, 161, 163, 164, 165, 189, 164, 195, 213, + 166, 199, 167, 167, 166, 167, 221, 166, 146, 166, + 199, 199, 199, 166, 166, 274, 274, 274, 274, 274, + 274, 167, 266, 266, 266, 266, 10, 148, 10, 148, + 148, 10, 148, 235, 235, 235, 235, 164, 10, 235, + 235, 166, 166, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 166, 266, 268, 196, 213, 166, 199, 15, 167, - 199, 260, 212, 212, 212, 199, 199, 166, 166, 166, - 166, 166, 147, 147, 166, 166, 156, 156, 156, 275, - 166, 166, 156, 267, 149, 166, 169, 213, 166, 199, - 167, 148, 10, 10, 148, 164, 164, 164, 166, 164, - 267, 166, 199, 166, 166, 266, 266, 266, 266, 199, - 212, 148, 148, 166, 166, 166, 166, 212 + 267, 267, 166, 266, 268, 196, 213, 166, 199, 15, + 167, 199, 260, 212, 212, 212, 199, 199, 166, 166, + 166, 166, 166, 147, 147, 166, 166, 156, 156, 156, + 275, 166, 166, 156, 267, 149, 166, 169, 213, 166, + 199, 167, 148, 10, 10, 148, 164, 164, 164, 166, + 164, 267, 166, 199, 166, 166, 266, 266, 266, 266, + 199, 212, 148, 148, 166, 166, 166, 166, 212 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -3109,8 +3119,8 @@ static const yytype_uint16 yyr1[] = 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 273, 273, 273, 273, 274, 274, 274, 275, 275, - 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, - 276, 276, 277, 277, 277, 277, 278 + 275, 275, 275, 275, 275, 275, 275, 275, 275, 276, + 276, 276, 276, 277, 277, 277, 277, 278 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -3191,7 +3201,7 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 0 + 1, 1, 1, 1, 1, 2, 2, 0 }; @@ -3971,7 +3981,7 @@ yyreduce: { current_expr = (yyvsp[0].u.expr); } -#line 3975 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 3985 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 4: @@ -3979,7 +3989,7 @@ yyreduce: { current_type = (yyvsp[0].u.type); } -#line 3983 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 3993 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 10: @@ -3987,7 +3997,7 @@ yyreduce: { delete (yyvsp[-1].u.expr); } -#line 3991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4001 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 11: @@ -3995,7 +4005,7 @@ yyreduce: { delete (yyvsp[-2].u.expr); } -#line 3999 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4009 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 12: @@ -4003,7 +4013,7 @@ yyreduce: { delete (yyvsp[-1].u.expr); } -#line 4007 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4017 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 13: @@ -4012,7 +4022,7 @@ yyreduce: push_storage_class((current_storage_class & ~CPPInstance::SC_c_binding) | ((yyvsp[-1].u.integer) & CPPInstance::SC_c_binding)); } -#line 4016 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4026 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 14: @@ -4020,7 +4030,7 @@ yyreduce: { pop_storage_class(); } -#line 4024 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4034 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 21: @@ -4037,7 +4047,7 @@ yyreduce: publish_nest_level++; current_scope->set_current_vis(V_published); } -#line 4041 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 22: @@ -4050,7 +4060,7 @@ yyreduce: } publish_nest_level = 0; } -#line 4054 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4064 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 23: @@ -4058,7 +4068,7 @@ yyreduce: { current_scope->set_current_vis(V_published); } -#line 4062 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 24: @@ -4070,7 +4080,7 @@ yyreduce: current_scope->set_current_vis(V_public); } } -#line 4074 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 25: @@ -4078,7 +4088,7 @@ yyreduce: { current_scope->set_current_vis(V_protected); } -#line 4082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 26: @@ -4086,7 +4096,7 @@ yyreduce: { current_scope->set_current_vis(V_private); } -#line 4090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4100 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 27: @@ -4101,7 +4111,7 @@ yyreduce: CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-4].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[-6]).file); current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-6])); } -#line 4105 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4115 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 28: @@ -4126,7 +4136,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } } -#line 4130 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4140 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 29: @@ -4160,7 +4170,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); } } -#line 4164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4174 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 30: @@ -4181,7 +4191,7 @@ yyreduce: make_property->_length_function = length_getter->as_function_group(); current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } -#line 4185 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4195 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 31: @@ -4213,7 +4223,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); } } -#line 4217 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 32: @@ -4254,7 +4264,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); } } -#line 4258 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4268 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 33: @@ -4280,7 +4290,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); } } -#line 4284 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4294 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 34: @@ -4317,7 +4327,7 @@ yyreduce: current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); } } -#line 4321 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4331 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 35: @@ -4343,7 +4353,7 @@ yyreduce: current_scope->add_declaration(make_seq, global_scope, current_lexer, (yylsp[-8])); } } -#line 4347 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4357 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 36: @@ -4358,7 +4368,7 @@ yyreduce: yywarning("static_assert failed: " + str.str(), (yylsp[-4])); } } -#line 4362 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 37: @@ -4372,7 +4382,7 @@ yyreduce: yywarning("static_assert failed", (yylsp[-2])); } } -#line 4376 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 38: @@ -4382,7 +4392,7 @@ yyreduce: V_public); push_scope(new_scope); } -#line 4386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 39: @@ -4391,7 +4401,7 @@ yyreduce: delete current_scope; pop_scope(); } -#line 4395 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 40: @@ -4399,7 +4409,7 @@ yyreduce: { (yyval.u.integer) = 0; } -#line 4403 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 41: @@ -4408,7 +4418,7 @@ yyreduce: // This isn't really a storage class, but it helps with parsing. (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_const; } -#line 4412 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 42: @@ -4416,7 +4426,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extern; } -#line 4420 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 43: @@ -4431,7 +4441,7 @@ yyreduce: yywarning("Ignoring unknown linkage type \"" + (yyvsp[-1].str) + "\"", (yylsp[-1])); } } -#line 4435 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4445 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 44: @@ -4439,7 +4449,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_static; } -#line 4443 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4453 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 45: @@ -4447,7 +4457,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_inline; } -#line 4451 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4461 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 46: @@ -4455,7 +4465,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_virtual; } -#line 4459 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4469 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 47: @@ -4463,7 +4473,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_explicit; } -#line 4467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4477 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 48: @@ -4471,7 +4481,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_register; } -#line 4475 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 49: @@ -4479,7 +4489,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_volatile; } -#line 4483 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4493 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 50: @@ -4487,7 +4497,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_mutable; } -#line 4491 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4501 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 51: @@ -4495,7 +4505,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_constexpr; } -#line 4499 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4509 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 52: @@ -4503,7 +4513,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_blocking; } -#line 4507 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4517 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 53: @@ -4511,7 +4521,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extension; } -#line 4515 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4525 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 54: @@ -4519,7 +4529,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_thread_local; } -#line 4523 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 55: @@ -4528,7 +4538,7 @@ yyreduce: // Ignore attribute specifiers for now. (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4532 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 56: @@ -4536,7 +4546,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4540 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 57: @@ -4544,7 +4554,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4548 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4558 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 63: @@ -4559,7 +4569,7 @@ yyreduce: } push_storage_class((yyvsp[-1].u.integer)); } -#line 4563 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4573 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 64: @@ -4567,7 +4577,7 @@ yyreduce: { pop_storage_class(); } -#line 4571 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4581 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 65: @@ -4580,7 +4590,7 @@ yyreduce: current_scope->add_declaration((yyvsp[-1].u.decl), global_scope, current_lexer, (yylsp[-1])); } -#line 4584 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4594 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 66: @@ -4593,7 +4603,7 @@ yyreduce: (yyvsp[0].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-1].u.integer)); } } -#line 4597 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4607 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 67: @@ -4605,7 +4615,7 @@ yyreduce: (yyvsp[-2].u.instance)->set_initializer((yyvsp[0].u.expr)); } } -#line 4609 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4619 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 68: @@ -4617,7 +4627,7 @@ yyreduce: (yyvsp[-1].u.instance)->set_initializer((yyvsp[0].u.expr)); } } -#line 4621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 70: @@ -4632,7 +4642,7 @@ yyreduce: inst->set_initializer((yyvsp[0].u.expr)); current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-1])); } -#line 4636 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4646 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 71: @@ -4647,7 +4657,7 @@ yyreduce: inst->set_initializer((yyvsp[-2].u.expr)); current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-3])); } -#line 4651 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4661 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 72: @@ -4662,7 +4672,7 @@ yyreduce: } push_storage_class((yyvsp[-1].u.integer)); } -#line 4666 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4676 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 73: @@ -4670,7 +4680,7 @@ yyreduce: { pop_storage_class(); } -#line 4674 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4684 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 74: @@ -4686,7 +4696,7 @@ yyreduce: } } } -#line 4690 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4700 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 75: @@ -4699,7 +4709,7 @@ yyreduce: CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-1].u.inst_ident), current_scope, (yylsp[-1]).file); current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-1])); } -#line 4703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4713 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 76: @@ -4712,7 +4722,7 @@ yyreduce: CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-3].u.inst_ident), current_scope, (yylsp[-3]).file); current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-3])); } -#line 4716 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4726 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 77: @@ -4720,7 +4730,7 @@ yyreduce: { push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } -#line 4724 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 78: @@ -4744,7 +4754,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } -#line 4748 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4758 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 79: @@ -4752,7 +4762,7 @@ yyreduce: { push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } -#line 4756 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 80: @@ -4774,7 +4784,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } -#line 4778 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4788 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 81: @@ -4782,7 +4792,7 @@ yyreduce: { push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } -#line 4786 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4796 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 82: @@ -4805,7 +4815,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } } -#line 4809 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4819 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 83: @@ -4813,7 +4823,7 @@ yyreduce: { push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); } -#line 4817 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4827 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 84: @@ -4831,7 +4841,7 @@ yyreduce: ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-10]).file); } -#line 4835 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 85: @@ -4839,7 +4849,7 @@ yyreduce: { push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); } -#line 4843 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4853 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 86: @@ -4857,7 +4867,7 @@ yyreduce: ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-11]).file); } -#line 4861 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4871 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 87: @@ -4867,7 +4877,7 @@ yyreduce: push_scope((yyvsp[-3].u.identifier)->get_scope(current_scope, global_scope)); } } -#line 4871 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4881 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 88: @@ -4896,7 +4906,7 @@ yyreduce: (yyval.u.instance) = CPPInstance::make_typecast_function (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 4900 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 89: @@ -4906,7 +4916,7 @@ yyreduce: push_scope((yyvsp[-4].u.identifier)->get_scope(current_scope, global_scope)); } } -#line 4910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4920 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 90: @@ -4926,7 +4936,7 @@ yyreduce: (yyval.u.instance) = CPPInstance::make_typecast_function (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 4930 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4940 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 91: @@ -4940,7 +4950,7 @@ yyreduce: (yyval.u.instance) = (CPPInstance *)NULL; } } -#line 4944 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4954 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 92: @@ -4948,7 +4958,7 @@ yyreduce: { (yyval.u.integer) = 0; } -#line 4952 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4962 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 93: @@ -4956,7 +4966,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_const_method; } -#line 4960 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4970 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 94: @@ -4964,7 +4974,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_volatile_method; } -#line 4968 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4978 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 95: @@ -4972,7 +4982,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_noexcept; } -#line 4976 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4986 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 96: @@ -4980,7 +4990,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_final; } -#line 4984 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4994 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 97: @@ -4988,7 +4998,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_override; } -#line 4992 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5002 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 98: @@ -4996,7 +5006,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_lvalue_method; } -#line 5000 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5010 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 99: @@ -5004,7 +5014,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_rvalue_method; } -#line 5008 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5018 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 100: @@ -5013,7 +5023,7 @@ yyreduce: // Used for lambdas, currently ignored. (yyval.u.integer) = (yyvsp[-1].u.integer); } -#line 5017 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5027 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 101: @@ -5022,7 +5032,7 @@ yyreduce: // Used for lambdas in C++17, currently ignored. (yyval.u.integer) = (yyvsp[-1].u.integer); } -#line 5026 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5036 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 102: @@ -5030,7 +5040,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-3].u.integer); } -#line 5034 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5044 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 103: @@ -5038,7 +5048,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-4].u.integer); } -#line 5042 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 104: @@ -5046,7 +5056,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-5].u.integer); } -#line 5050 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5060 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 105: @@ -5054,7 +5064,7 @@ yyreduce: { (yyval.u.integer) = (yyvsp[-3].u.integer); } -#line 5058 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5068 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 106: @@ -5062,7 +5072,7 @@ yyreduce: { (yyval.str) = "!"; } -#line 5066 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5076 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 107: @@ -5070,7 +5080,7 @@ yyreduce: { (yyval.str) = "~"; } -#line 5074 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 108: @@ -5078,7 +5088,7 @@ yyreduce: { (yyval.str) = "*"; } -#line 5082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 109: @@ -5086,7 +5096,7 @@ yyreduce: { (yyval.str) = "/"; } -#line 5090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5100 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 110: @@ -5094,7 +5104,7 @@ yyreduce: { (yyval.str) = "%"; } -#line 5098 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5108 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 111: @@ -5102,7 +5112,7 @@ yyreduce: { (yyval.str) = "+"; } -#line 5106 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5116 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 112: @@ -5110,7 +5120,7 @@ yyreduce: { (yyval.str) = "-"; } -#line 5114 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5124 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 113: @@ -5118,7 +5128,7 @@ yyreduce: { (yyval.str) = "|"; } -#line 5122 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5132 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 114: @@ -5126,7 +5136,7 @@ yyreduce: { (yyval.str) = "&"; } -#line 5130 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5140 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 115: @@ -5134,7 +5144,7 @@ yyreduce: { (yyval.str) = "^"; } -#line 5138 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5148 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 116: @@ -5142,7 +5152,7 @@ yyreduce: { (yyval.str) = "||"; } -#line 5146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5156 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 117: @@ -5150,7 +5160,7 @@ yyreduce: { (yyval.str) = "&&"; } -#line 5154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 118: @@ -5158,7 +5168,7 @@ yyreduce: { (yyval.str) = "=="; } -#line 5162 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5172 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 119: @@ -5166,7 +5176,7 @@ yyreduce: { (yyval.str) = "!="; } -#line 5170 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5180 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 120: @@ -5174,7 +5184,7 @@ yyreduce: { (yyval.str) = "<="; } -#line 5178 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5188 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 121: @@ -5182,7 +5192,7 @@ yyreduce: { (yyval.str) = ">="; } -#line 5186 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5196 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 122: @@ -5190,7 +5200,7 @@ yyreduce: { (yyval.str) = "<"; } -#line 5194 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5204 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 123: @@ -5198,7 +5208,7 @@ yyreduce: { (yyval.str) = ">"; } -#line 5202 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5212 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 124: @@ -5206,7 +5216,7 @@ yyreduce: { (yyval.str) = "<<"; } -#line 5210 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5220 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 125: @@ -5214,7 +5224,7 @@ yyreduce: { (yyval.str) = ">>"; } -#line 5218 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5228 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 126: @@ -5222,7 +5232,7 @@ yyreduce: { (yyval.str) = "="; } -#line 5226 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5236 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 127: @@ -5230,7 +5240,7 @@ yyreduce: { (yyval.str) = ","; } -#line 5234 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5244 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 128: @@ -5238,7 +5248,7 @@ yyreduce: { (yyval.str) = "++"; } -#line 5242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 129: @@ -5246,7 +5256,7 @@ yyreduce: { (yyval.str) = "--"; } -#line 5250 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 130: @@ -5254,7 +5264,7 @@ yyreduce: { (yyval.str) = "*="; } -#line 5258 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5268 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 131: @@ -5262,7 +5272,7 @@ yyreduce: { (yyval.str) = "/="; } -#line 5266 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5276 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 132: @@ -5270,7 +5280,7 @@ yyreduce: { (yyval.str) = "%="; } -#line 5274 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5284 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 133: @@ -5278,7 +5288,7 @@ yyreduce: { (yyval.str) = "+="; } -#line 5282 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5292 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 134: @@ -5286,7 +5296,7 @@ yyreduce: { (yyval.str) = "-="; } -#line 5290 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5300 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 135: @@ -5294,7 +5304,7 @@ yyreduce: { (yyval.str) = "|="; } -#line 5298 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5308 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 136: @@ -5302,7 +5312,7 @@ yyreduce: { (yyval.str) = "&="; } -#line 5306 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5316 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 137: @@ -5310,7 +5320,7 @@ yyreduce: { (yyval.str) = "^="; } -#line 5314 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5324 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 138: @@ -5318,7 +5328,7 @@ yyreduce: { (yyval.str) = "<<="; } -#line 5322 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5332 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 139: @@ -5326,7 +5336,7 @@ yyreduce: { (yyval.str) = ">>="; } -#line 5330 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5340 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 140: @@ -5334,7 +5344,7 @@ yyreduce: { (yyval.str) = "->"; } -#line 5338 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5348 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 141: @@ -5342,7 +5352,7 @@ yyreduce: { (yyval.str) = "[]"; } -#line 5346 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 142: @@ -5350,7 +5360,7 @@ yyreduce: { (yyval.str) = "()"; } -#line 5354 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5364 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 143: @@ -5358,7 +5368,7 @@ yyreduce: { (yyval.str) = "new"; } -#line 5362 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 144: @@ -5366,7 +5376,7 @@ yyreduce: { (yyval.str) = "delete"; } -#line 5370 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5380 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 149: @@ -5374,7 +5384,7 @@ yyreduce: { push_scope(new CPPTemplateScope(current_scope)); } -#line 5378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 150: @@ -5382,7 +5392,7 @@ yyreduce: { pop_scope(); } -#line 5386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 155: @@ -5392,7 +5402,7 @@ yyreduce: assert(ts != NULL); ts->add_template_parameter((yyvsp[0].u.decl)); } -#line 5396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 156: @@ -5402,7 +5412,7 @@ yyreduce: assert(ts != NULL); ts->add_template_parameter((yyvsp[0].u.decl)); } -#line 5406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5416 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 159: @@ -5410,7 +5420,7 @@ yyreduce: { (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); } -#line 5414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5424 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 160: @@ -5418,7 +5428,7 @@ yyreduce: { (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[0].u.identifier))); } -#line 5422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5432 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 161: @@ -5426,7 +5436,7 @@ yyreduce: { (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[-2].u.identifier), (yyvsp[0].u.type))); } -#line 5430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5440 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 162: @@ -5436,7 +5446,7 @@ yyreduce: ctp->_packed = true; (yyval.u.decl) = CPPType::new_type(ctp); } -#line 5440 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 163: @@ -5446,7 +5456,7 @@ yyreduce: ctp->_packed = true; (yyval.u.decl) = CPPType::new_type(ctp); } -#line 5450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 164: @@ -5456,7 +5466,7 @@ yyreduce: inst->set_initializer((yyvsp[0].u.expr)); (yyval.u.decl) = inst; } -#line 5460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 165: @@ -5467,7 +5477,7 @@ yyreduce: inst->set_initializer((yyvsp[0].u.expr)); (yyval.u.decl) = inst; } -#line 5471 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5481 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 166: @@ -5476,7 +5486,7 @@ yyreduce: CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); (yyval.u.decl) = inst; } -#line 5480 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5490 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 167: @@ -5486,7 +5496,7 @@ yyreduce: CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); (yyval.u.decl) = inst; } -#line 5490 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5500 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 168: @@ -5494,7 +5504,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 5498 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5508 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 169: @@ -5503,7 +5513,7 @@ yyreduce: yywarning("Not a type: " + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } -#line 5507 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5517 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 170: @@ -5515,7 +5525,7 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 5519 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5529 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 171: @@ -5527,7 +5537,7 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 5531 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5541 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 172: @@ -5535,7 +5545,7 @@ yyreduce: { (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); } -#line 5539 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 173: @@ -5553,7 +5563,7 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } -#line 5557 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5567 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 174: @@ -5572,7 +5582,7 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } -#line 5576 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5586 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 175: @@ -5581,7 +5591,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 5585 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5595 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 176: @@ -5590,7 +5600,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 5594 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5604 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 177: @@ -5599,7 +5609,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 5603 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5613 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 178: @@ -5608,7 +5618,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 5612 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5622 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 179: @@ -5617,7 +5627,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 5621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 180: @@ -5626,7 +5636,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 5630 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5640 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 181: @@ -5635,7 +5645,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 5639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5649 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 182: @@ -5644,7 +5654,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 5648 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5658 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 183: @@ -5661,7 +5671,7 @@ yyreduce: push_scope(scope); } -#line 5665 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5675 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 184: @@ -5679,7 +5689,7 @@ yyreduce: (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } } -#line 5683 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 185: @@ -5693,7 +5703,7 @@ yyreduce: } (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); } -#line 5697 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5707 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 186: @@ -5703,7 +5713,7 @@ yyreduce: (yyvsp[-2].u.inst_ident)->_bit_width = (yyvsp[0].u.integer); (yyval.u.inst_ident) = (yyvsp[-2].u.inst_ident); } -#line 5707 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 187: @@ -5711,7 +5721,7 @@ yyreduce: { (yyval.u.type) = NULL; } -#line 5715 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5725 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 188: @@ -5719,7 +5729,7 @@ yyreduce: { (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 5723 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5733 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 189: @@ -5728,7 +5738,7 @@ yyreduce: (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 5732 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5742 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 190: @@ -5736,7 +5746,7 @@ yyreduce: { (yyval.u.param_list) = new CPPParameterList; } -#line 5740 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5750 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 191: @@ -5745,7 +5755,7 @@ yyreduce: (yyval.u.param_list) = new CPPParameterList; (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5749 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5759 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 192: @@ -5753,7 +5763,7 @@ yyreduce: { (yyval.u.param_list) = (yyvsp[0].u.param_list); } -#line 5757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5767 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 193: @@ -5762,7 +5772,7 @@ yyreduce: (yyval.u.param_list) = (yyvsp[-2].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5776 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 194: @@ -5771,7 +5781,7 @@ yyreduce: (yyval.u.param_list) = (yyvsp[-1].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5775 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5785 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 195: @@ -5780,7 +5790,7 @@ yyreduce: (yyval.u.param_list) = new CPPParameterList; (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5784 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5794 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 196: @@ -5789,7 +5799,7 @@ yyreduce: (yyval.u.param_list) = (yyvsp[-2].u.param_list); (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5793 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5803 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 197: @@ -5797,7 +5807,7 @@ yyreduce: { (yyval.u.param_list) = new CPPParameterList; } -#line 5801 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5811 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 198: @@ -5806,7 +5816,7 @@ yyreduce: (yyval.u.param_list) = new CPPParameterList; (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5810 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5820 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 199: @@ -5814,7 +5824,7 @@ yyreduce: { (yyval.u.param_list) = (yyvsp[0].u.param_list); } -#line 5818 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5828 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 200: @@ -5823,7 +5833,7 @@ yyreduce: (yyval.u.param_list) = (yyvsp[-2].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5827 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5837 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 201: @@ -5832,7 +5842,7 @@ yyreduce: (yyval.u.param_list) = (yyvsp[-1].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5836 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5846 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 202: @@ -5841,7 +5851,7 @@ yyreduce: (yyval.u.param_list) = new CPPParameterList; (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 203: @@ -5850,7 +5860,7 @@ yyreduce: (yyval.u.param_list) = (yyvsp[-2].u.param_list); (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5854 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5864 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 204: @@ -5858,7 +5868,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5862 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5872 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 205: @@ -5866,7 +5876,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 5870 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5880 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 206: @@ -5874,7 +5884,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5888 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 207: @@ -5882,7 +5892,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 5886 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5896 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 208: @@ -5890,7 +5900,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5904 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 209: @@ -5898,7 +5908,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5902 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5912 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 210: @@ -5906,7 +5916,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5920 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 211: @@ -5914,7 +5924,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); } -#line 5918 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5928 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 212: @@ -5922,7 +5932,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); } -#line 5926 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5936 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 213: @@ -5930,7 +5940,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5944 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 214: @@ -5938,7 +5948,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5942 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5952 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 215: @@ -5946,7 +5956,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 5950 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5960 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 216: @@ -5954,7 +5964,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); } -#line 5958 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5968 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 217: @@ -5962,7 +5972,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); } -#line 5966 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5976 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 218: @@ -5970,14 +5980,14 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5974 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5984 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 222: #line 1884 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { } -#line 5981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 226: @@ -5986,7 +5996,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 5990 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6000 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 227: @@ -5996,7 +6006,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6000 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6010 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 228: @@ -6006,7 +6016,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6010 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6020 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 229: @@ -6015,7 +6025,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 230: @@ -6025,7 +6035,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6039 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 231: @@ -6035,7 +6045,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6039 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6049 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 232: @@ -6043,7 +6053,7 @@ yyreduce: { (yyval.u.instance) = (yyvsp[0].u.instance); } -#line 6047 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6057 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 233: @@ -6051,7 +6061,7 @@ yyreduce: { (yyval.u.instance) = (yyvsp[0].u.instance); } -#line 6055 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6065 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 234: @@ -6059,7 +6069,7 @@ yyreduce: { (yyval.u.instance) = (yyvsp[0].u.instance); } -#line 6063 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6073 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 235: @@ -6070,7 +6080,7 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, "expr"); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6074 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 236: @@ -6078,7 +6088,7 @@ yyreduce: { (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 237: @@ -6086,7 +6096,7 @@ yyreduce: { (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); } -#line 6090 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6100 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 238: @@ -6095,7 +6105,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6099 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6109 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 239: @@ -6104,7 +6114,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6108 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6118 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 240: @@ -6113,7 +6123,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6117 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6127 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 241: @@ -6122,7 +6132,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6126 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6136 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 242: @@ -6131,7 +6141,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6135 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6145 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 243: @@ -6140,7 +6150,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6144 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 244: @@ -6149,7 +6159,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6153 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6163 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 245: @@ -6157,7 +6167,7 @@ yyreduce: { (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6161 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6171 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 246: @@ -6165,7 +6175,7 @@ yyreduce: { (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); } -#line 6169 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6179 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 247: @@ -6174,7 +6184,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6178 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6188 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 248: @@ -6183,7 +6193,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6187 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6197 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 249: @@ -6192,7 +6202,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6196 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6206 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 250: @@ -6201,7 +6211,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6205 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6215 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 251: @@ -6210,7 +6220,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6214 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6224 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 252: @@ -6219,7 +6229,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6223 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6233 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 253: @@ -6228,7 +6238,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6232 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 254: @@ -6238,7 +6248,7 @@ yyreduce: (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 6242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 255: @@ -6247,7 +6257,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 6251 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 256: @@ -6256,7 +6266,7 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); (yyval.u.inst_ident)->_packed = true; } -#line 6260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6270 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 257: @@ -6265,7 +6275,7 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); (yyval.u.inst_ident)->_packed = true; } -#line 6269 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6279 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 258: @@ -6274,7 +6284,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6278 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6288 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 259: @@ -6283,7 +6293,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6287 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6297 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 260: @@ -6292,7 +6302,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6296 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6306 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 261: @@ -6301,7 +6311,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6315 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 262: @@ -6310,7 +6320,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6314 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6324 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 263: @@ -6319,7 +6329,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6323 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6333 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 264: @@ -6328,7 +6338,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6332 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6342 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 265: @@ -6338,7 +6348,7 @@ yyreduce: (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 6342 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6352 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 266: @@ -6347,7 +6357,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 6351 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6361 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 267: @@ -6355,7 +6365,7 @@ yyreduce: { (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6359 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6369 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 268: @@ -6364,7 +6374,7 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); (yyval.u.inst_ident)->_packed = true; } -#line 6368 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 269: @@ -6373,7 +6383,7 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); (yyval.u.inst_ident)->_packed = true; } -#line 6377 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6387 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 270: @@ -6382,7 +6392,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 271: @@ -6391,7 +6401,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6395 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 272: @@ -6400,7 +6410,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6404 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 273: @@ -6409,7 +6419,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6423 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 274: @@ -6418,7 +6428,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6432 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 275: @@ -6427,7 +6437,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6431 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6441 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 276: @@ -6436,7 +6446,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6440 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 277: @@ -6444,7 +6454,7 @@ yyreduce: { (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6448 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6458 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 278: @@ -6453,7 +6463,7 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); (yyval.u.inst_ident)->_packed = true; } -#line 6457 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 279: @@ -6462,7 +6472,7 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); (yyval.u.inst_ident)->_packed = true; } -#line 6466 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6476 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 280: @@ -6471,7 +6481,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6475 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 281: @@ -6480,7 +6490,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6484 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6494 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 282: @@ -6489,7 +6499,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6493 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6503 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 283: @@ -6498,7 +6508,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6502 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6512 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 284: @@ -6507,7 +6517,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6511 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6521 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 285: @@ -6516,7 +6526,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6520 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6530 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 286: @@ -6525,7 +6535,7 @@ yyreduce: (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6529 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6539 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 287: @@ -6535,7 +6545,7 @@ yyreduce: (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6539 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 288: @@ -6546,7 +6556,7 @@ yyreduce: (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6560 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 289: @@ -6557,7 +6567,7 @@ yyreduce: (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6561 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6571 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 290: @@ -6568,7 +6578,7 @@ yyreduce: (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6572 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6582 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 291: @@ -6576,7 +6586,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 6580 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6590 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 292: @@ -6588,7 +6598,7 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6592 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6602 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 293: @@ -6596,7 +6606,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } -#line 6600 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6610 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 294: @@ -6604,7 +6614,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); } -#line 6608 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6618 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 295: @@ -6612,7 +6622,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); } -#line 6616 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6626 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 296: @@ -6620,7 +6630,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.enum_type)); } -#line 6624 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6634 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 297: @@ -6640,7 +6650,7 @@ yyreduce: (yyval.u.type) = et; } } -#line 6644 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 298: @@ -6660,7 +6670,7 @@ yyreduce: (yyval.u.type) = et; } } -#line 6664 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6674 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 299: @@ -6673,7 +6683,7 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6677 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6687 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 300: @@ -6681,7 +6691,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6685 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6695 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 301: @@ -6695,7 +6705,7 @@ yyreduce: (yyval.u.type) = enum_type->get_underlying_type(); } } -#line 6699 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6709 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 302: @@ -6703,7 +6713,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6707 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 303: @@ -6715,7 +6725,7 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6719 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6729 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 304: @@ -6723,7 +6733,7 @@ yyreduce: { (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 6727 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6737 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 305: @@ -6735,7 +6745,7 @@ yyreduce: } assert((yyval.u.decl) != NULL); } -#line 6739 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6749 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 306: @@ -6743,7 +6753,7 @@ yyreduce: { (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } -#line 6747 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 307: @@ -6751,7 +6761,7 @@ yyreduce: { (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.struct_type)); } -#line 6755 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6765 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 308: @@ -6759,7 +6769,7 @@ yyreduce: { (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.struct_type))); } -#line 6763 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6773 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 309: @@ -6767,7 +6777,7 @@ yyreduce: { (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.enum_type))); } -#line 6771 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6781 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 310: @@ -6787,7 +6797,7 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6791 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6801 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 311: @@ -6807,7 +6817,7 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6811 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6821 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 312: @@ -6829,7 +6839,7 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6833 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6843 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 313: @@ -6842,7 +6852,7 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6846 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6856 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 314: @@ -6850,7 +6860,7 @@ yyreduce: { (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6854 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6864 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 315: @@ -6864,7 +6874,7 @@ yyreduce: (yyval.u.decl) = enum_type->get_underlying_type(); } } -#line 6868 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 316: @@ -6872,7 +6882,7 @@ yyreduce: { (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6876 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6886 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 317: @@ -6880,7 +6890,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 6884 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 318: @@ -6892,7 +6902,7 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6896 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6906 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 319: @@ -6900,7 +6910,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } -#line 6904 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6914 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 320: @@ -6920,7 +6930,7 @@ yyreduce: (yyval.u.type) = et; } } -#line 6924 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 321: @@ -6940,7 +6950,7 @@ yyreduce: (yyval.u.type) = et; } } -#line 6944 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6954 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 322: @@ -6953,7 +6963,7 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6957 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6967 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 323: @@ -6967,7 +6977,7 @@ yyreduce: (yyval.u.type) = enum_type->get_underlying_type(); } } -#line 6971 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 324: @@ -6975,7 +6985,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6979 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6989 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 325: @@ -6983,7 +6993,7 @@ yyreduce: { (yyval.u.decl) = (yyvsp[0].u.decl); } -#line 6987 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 326: @@ -6993,7 +7003,7 @@ yyreduce: (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } -#line 6997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7007 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 327: @@ -7001,7 +7011,7 @@ yyreduce: { (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7005 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7015 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 328: @@ -7010,7 +7020,7 @@ yyreduce: (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7014 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7024 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 329: @@ -7018,7 +7028,7 @@ yyreduce: { (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7022 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7032 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 330: @@ -7027,7 +7037,7 @@ yyreduce: (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7031 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7041 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 335: @@ -7045,7 +7055,7 @@ yyreduce: push_scope(new_scope); push_struct(st); } -#line 7049 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 336: @@ -7056,7 +7066,7 @@ yyreduce: pop_struct(); pop_scope(); } -#line 7060 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7070 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 337: @@ -7080,7 +7090,7 @@ yyreduce: push_scope(new_scope); push_struct(st); } -#line 7084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7094 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 338: @@ -7091,7 +7101,7 @@ yyreduce: pop_struct(); pop_scope(); } -#line 7095 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7105 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 340: @@ -7099,7 +7109,7 @@ yyreduce: { current_struct->_final = true; } -#line 7103 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7113 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 345: @@ -7107,7 +7117,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_unknown, false); } -#line 7111 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7121 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 346: @@ -7115,7 +7125,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_public, false); } -#line 7119 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7129 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 347: @@ -7123,7 +7133,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_protected, false); } -#line 7127 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7137 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 348: @@ -7131,7 +7141,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_private, false); } -#line 7135 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7145 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 349: @@ -7139,7 +7149,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_public, true); } -#line 7143 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7153 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 350: @@ -7147,7 +7157,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); } -#line 7151 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7161 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 351: @@ -7155,7 +7165,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_private, true); } -#line 7159 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7169 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 352: @@ -7163,7 +7173,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_public, true); } -#line 7167 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7177 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 353: @@ -7171,7 +7181,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); } -#line 7175 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7185 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 354: @@ -7179,7 +7189,7 @@ yyreduce: { current_struct->append_derivation((yyvsp[0].u.type), V_private, true); } -#line 7183 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7193 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 355: @@ -7188,7 +7198,7 @@ yyreduce: (yyval.u.enum_type) = current_enum; current_enum = NULL; } -#line 7192 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7202 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 356: @@ -7196,7 +7206,7 @@ yyreduce: { current_enum = new CPPEnumType((yyvsp[-2].u.extension_enum), NULL, (yyvsp[0].u.type), current_scope, NULL, (yylsp[-2]).file); } -#line 7200 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7210 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 357: @@ -7204,7 +7214,7 @@ yyreduce: { current_enum = new CPPEnumType((yyvsp[0].u.extension_enum), NULL, current_scope, NULL, (yylsp[0]).file); } -#line 7208 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7218 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 358: @@ -7213,7 +7223,7 @@ yyreduce: CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[-2].u.identifier)->_names.back(), V_public); current_enum = new CPPEnumType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), (yyvsp[0].u.type), current_scope, new_scope, (yylsp[-3]).file); } -#line 7217 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 359: @@ -7222,7 +7232,7 @@ yyreduce: CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[0].u.identifier)->_names.back(), V_public); current_enum = new CPPEnumType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, new_scope, (yylsp[-1]).file); } -#line 7226 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7236 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 360: @@ -7230,7 +7240,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 7234 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7244 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 361: @@ -7238,7 +7248,7 @@ yyreduce: { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); } -#line 7242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 363: @@ -7247,7 +7257,7 @@ yyreduce: assert(current_enum != NULL); current_enum->add_element((yyvsp[-1].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[-1])); } -#line 7251 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 364: @@ -7256,7 +7266,7 @@ yyreduce: assert(current_enum != NULL); current_enum->add_element((yyvsp[-3].u.identifier)->get_simple_name(), (yyvsp[-1].u.expr), current_lexer, (yylsp[-3])); } -#line 7260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7270 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 366: @@ -7265,7 +7275,7 @@ yyreduce: assert(current_enum != NULL); current_enum->add_element((yyvsp[0].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[0])); } -#line 7269 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7279 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 367: @@ -7274,7 +7284,7 @@ yyreduce: assert(current_enum != NULL); current_enum->add_element((yyvsp[-2].u.identifier)->get_simple_name(), (yyvsp[0].u.expr), current_lexer, (yylsp[-2])); } -#line 7278 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7288 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 368: @@ -7282,7 +7292,7 @@ yyreduce: { (yyval.u.extension_enum) = CPPExtensionType::T_enum; } -#line 7286 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7296 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 369: @@ -7290,7 +7300,7 @@ yyreduce: { (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; } -#line 7294 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7304 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 370: @@ -7298,7 +7308,7 @@ yyreduce: { (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; } -#line 7302 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7312 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 371: @@ -7306,7 +7316,7 @@ yyreduce: { (yyval.u.extension_enum) = CPPExtensionType::T_class; } -#line 7310 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7320 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 372: @@ -7314,7 +7324,7 @@ yyreduce: { (yyval.u.extension_enum) = CPPExtensionType::T_struct; } -#line 7318 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7328 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 373: @@ -7322,7 +7332,7 @@ yyreduce: { (yyval.u.extension_enum) = CPPExtensionType::T_union; } -#line 7326 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7336 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 374: @@ -7344,7 +7354,7 @@ yyreduce: current_scope->define_namespace(nspace); push_scope(scope); } -#line 7348 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7358 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 375: @@ -7352,7 +7362,7 @@ yyreduce: { pop_scope(); } -#line 7356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7366 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 376: @@ -7375,7 +7385,7 @@ yyreduce: current_scope->define_namespace(nspace); push_scope(scope); } -#line 7379 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7389 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 377: @@ -7383,7 +7393,7 @@ yyreduce: { pop_scope(); } -#line 7387 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 380: @@ -7393,7 +7403,7 @@ yyreduce: current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-2])); current_scope->add_using(using_decl, global_scope, current_lexer); } -#line 7397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7407 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 381: @@ -7404,7 +7414,7 @@ yyreduce: typedef_type->_using = true; current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-4])); } -#line 7408 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7418 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 382: @@ -7414,7 +7424,7 @@ yyreduce: current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-3])); current_scope->add_using(using_decl, global_scope, current_lexer); } -#line 7418 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7428 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 386: @@ -7422,7 +7432,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); } -#line 7426 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7436 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 387: @@ -7430,7 +7440,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); } -#line 7434 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 388: @@ -7438,7 +7448,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); } -#line 7442 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 389: @@ -7446,7 +7456,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); } -#line 7450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 390: @@ -7454,7 +7464,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char32_t); } -#line 7458 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 391: @@ -7463,7 +7473,7 @@ yyreduce: (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short); } -#line 7467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7477 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 392: @@ -7472,7 +7482,7 @@ yyreduce: (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long); } -#line 7476 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7486 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 393: @@ -7481,7 +7491,7 @@ yyreduce: (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned); } -#line 7485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7495 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 394: @@ -7490,7 +7500,7 @@ yyreduce: (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed); } -#line 7494 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7504 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 395: @@ -7498,7 +7508,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int); } -#line 7502 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7512 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 396: @@ -7507,7 +7517,7 @@ yyreduce: (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_short; } -#line 7511 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7521 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 397: @@ -7520,7 +7530,7 @@ yyreduce: (yyval.u.simple_type)->_flags |= CPPSimpleType::F_long; } } -#line 7524 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7534 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 398: @@ -7529,7 +7539,7 @@ yyreduce: (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_unsigned; } -#line 7533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7543 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 399: @@ -7538,7 +7548,7 @@ yyreduce: (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_signed; } -#line 7542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7552 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 400: @@ -7546,7 +7556,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_float); } -#line 7550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7560 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 401: @@ -7554,7 +7564,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double); } -#line 7558 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7568 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 402: @@ -7563,7 +7573,7 @@ yyreduce: (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double, CPPSimpleType::F_long); } -#line 7567 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7577 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 403: @@ -7571,7 +7581,7 @@ yyreduce: { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_void); } -#line 7575 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7585 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 404: @@ -7579,7 +7589,7 @@ yyreduce: { current_lexer->_resolve_identifiers = false; } -#line 7583 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7593 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 405: @@ -7587,14 +7597,14 @@ yyreduce: { current_lexer->_resolve_identifiers = true; } -#line 7591 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7601 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 513: #line 3006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { } -#line 7598 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7608 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 537: @@ -7602,7 +7612,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 7606 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7616 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 538: @@ -7610,7 +7620,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7614 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7624 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 539: @@ -7618,7 +7628,7 @@ yyreduce: { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 7622 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7632 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 540: @@ -7626,7 +7636,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7630 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7640 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 541: @@ -7634,7 +7644,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7638 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7648 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 542: @@ -7642,7 +7652,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(',', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7646 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7656 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 543: @@ -7650,7 +7660,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7664 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 544: @@ -7658,7 +7668,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 7662 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7672 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 545: @@ -7666,7 +7676,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } -#line 7670 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7680 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 546: @@ -7674,7 +7684,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); } -#line 7678 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7688 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 547: @@ -7682,7 +7692,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); } -#line 7686 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7696 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 548: @@ -7690,7 +7700,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); } -#line 7694 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7704 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 549: @@ -7698,7 +7708,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); } -#line 7702 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7712 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 550: @@ -7714,7 +7724,7 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 7718 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7728 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 551: @@ -7722,7 +7732,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } -#line 7726 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7736 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 552: @@ -7730,7 +7740,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } -#line 7734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7744 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 553: @@ -7738,7 +7748,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 7742 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7752 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 554: @@ -7746,7 +7756,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 7750 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7760 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 555: @@ -7754,7 +7764,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 7758 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7768 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 556: @@ -7762,7 +7772,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 7766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7776 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 557: @@ -7770,7 +7780,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); } -#line 7774 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7784 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 558: @@ -7778,7 +7788,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 7782 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7792 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 559: @@ -7786,7 +7796,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7790 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7800 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 560: @@ -7794,7 +7804,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7798 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7808 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 561: @@ -7802,7 +7812,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7806 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7816 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 562: @@ -7810,7 +7820,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7814 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7824 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 563: @@ -7818,7 +7828,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7822 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7832 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 564: @@ -7826,7 +7836,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7830 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7840 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 565: @@ -7834,7 +7844,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7838 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7848 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 566: @@ -7842,7 +7852,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7846 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7856 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 567: @@ -7850,7 +7860,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7854 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7864 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 568: @@ -7858,7 +7868,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7862 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7872 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 569: @@ -7866,7 +7876,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7870 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7880 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 570: @@ -7874,7 +7884,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7888 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 571: @@ -7882,7 +7892,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7886 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7896 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 572: @@ -7890,7 +7900,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7904 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 573: @@ -7898,7 +7908,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7902 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7912 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 574: @@ -7906,7 +7916,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7920 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 575: @@ -7914,7 +7924,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7918 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7928 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 576: @@ -7922,7 +7932,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 7926 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7936 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 577: @@ -7930,7 +7940,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 7934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7944 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 578: @@ -7938,7 +7948,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 7942 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7952 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 579: @@ -7946,7 +7956,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7950 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7960 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 580: @@ -7954,7 +7964,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7958 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7968 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 581: @@ -7962,7 +7972,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 7966 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7976 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 582: @@ -7970,7 +7980,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7974 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7984 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 583: @@ -7978,7 +7988,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 7982 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7992 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 584: @@ -7986,7 +7996,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } -#line 7990 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8000 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 585: @@ -7994,7 +8004,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); } -#line 7998 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8008 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 586: @@ -8002,7 +8012,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); } -#line 8006 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8016 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 587: @@ -8010,7 +8020,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); } -#line 8014 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8024 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 588: @@ -8024,7 +8034,7 @@ yyreduce: assert(type != NULL); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8028 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8038 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 589: @@ -8038,7 +8048,7 @@ yyreduce: assert(type != NULL); (yyval.u.expr) = new CPPExpression(CPPExpression::aggregate_init_op(type, (yyvsp[-1].u.expr))); } -#line 8042 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 590: @@ -8048,7 +8058,7 @@ yyreduce: CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8062 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 591: @@ -8058,7 +8068,7 @@ yyreduce: CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8062 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 592: @@ -8068,7 +8078,7 @@ yyreduce: CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_wchar_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 593: @@ -8078,7 +8088,7 @@ yyreduce: CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char16_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 594: @@ -8088,7 +8098,7 @@ yyreduce: CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char32_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8102 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 595: @@ -8098,7 +8108,7 @@ yyreduce: CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_bool)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8102 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 596: @@ -8109,7 +8119,7 @@ yyreduce: CPPSimpleType::F_short)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8113 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 597: @@ -8120,7 +8130,7 @@ yyreduce: CPPSimpleType::F_long)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8124 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8134 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 598: @@ -8131,7 +8141,7 @@ yyreduce: CPPSimpleType::F_unsigned)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8135 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8145 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 599: @@ -8142,7 +8152,7 @@ yyreduce: CPPSimpleType::F_signed)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8156 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 600: @@ -8152,7 +8162,7 @@ yyreduce: CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_float)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8156 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8166 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 601: @@ -8162,7 +8172,7 @@ yyreduce: CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_double)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8166 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8176 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 602: @@ -8170,7 +8180,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); } -#line 8174 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8184 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 603: @@ -8186,7 +8196,7 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 8190 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8200 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 604: @@ -8194,7 +8204,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } -#line 8198 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8208 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 605: @@ -8202,7 +8212,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } -#line 8206 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8216 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 606: @@ -8210,7 +8220,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); } -#line 8214 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8224 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 607: @@ -8218,7 +8228,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); } -#line 8222 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8232 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 608: @@ -8233,7 +8243,7 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); } -#line 8237 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8247 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 609: @@ -8248,7 +8258,7 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); } -#line 8252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8262 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 610: @@ -8256,7 +8266,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 8260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8270 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 611: @@ -8264,7 +8274,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 8268 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8278 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 612: @@ -8272,7 +8282,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 8276 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8286 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 613: @@ -8280,7 +8290,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 8284 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8294 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 614: @@ -8288,7 +8298,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); } -#line 8292 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8302 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 615: @@ -8296,7 +8306,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 8300 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8310 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 616: @@ -8304,7 +8314,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8308 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8318 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 617: @@ -8312,7 +8322,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8316 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8326 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 618: @@ -8320,7 +8330,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8324 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8334 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 619: @@ -8328,7 +8338,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8332 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8342 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 620: @@ -8336,7 +8346,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8340 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8350 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 621: @@ -8344,7 +8354,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8348 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8358 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 622: @@ -8352,7 +8362,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8366 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 623: @@ -8360,7 +8370,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8364 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8374 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 624: @@ -8368,7 +8378,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8382 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 625: @@ -8376,7 +8386,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8380 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8390 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 626: @@ -8384,7 +8394,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8398 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 627: @@ -8392,7 +8402,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 628: @@ -8400,7 +8410,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8404 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 629: @@ -8408,7 +8418,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8412 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 630: @@ -8416,7 +8426,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8420 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 631: @@ -8424,7 +8434,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8428 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8438 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 632: @@ -8432,7 +8442,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8436 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8446 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 633: @@ -8440,7 +8450,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8454 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 634: @@ -8448,7 +8458,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8462 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 635: @@ -8456,7 +8466,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 8460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 636: @@ -8464,7 +8474,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 8468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8478 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 637: @@ -8472,7 +8482,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 8476 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8486 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 638: @@ -8480,7 +8490,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8484 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8494 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 639: @@ -8488,7 +8498,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8492 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8502 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 640: @@ -8496,7 +8506,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 8500 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8510 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 641: @@ -8504,7 +8514,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 8508 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8518 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 642: @@ -8512,7 +8522,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(true); } -#line 8516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8526 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 643: @@ -8520,7 +8530,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(false); } -#line 8524 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8534 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 644: @@ -8528,7 +8538,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 8532 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 645: @@ -8536,7 +8546,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); } -#line 8540 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 646: @@ -8544,7 +8554,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 8548 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8558 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 647: @@ -8552,7 +8562,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 8556 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8566 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 648: @@ -8560,7 +8570,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); } -#line 8564 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8574 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 649: @@ -8570,7 +8580,7 @@ yyreduce: CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8574 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8584 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 650: @@ -8580,7 +8590,7 @@ yyreduce: CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8584 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8594 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 651: @@ -8588,7 +8598,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); } -#line 8592 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8602 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 652: @@ -8598,7 +8608,7 @@ yyreduce: (yyvsp[-6].u.closure_type)->_return_type = (yyvsp[-3].u.type); (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[-6].u.closure_type))); } -#line 8602 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8612 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 653: @@ -8609,7 +8619,7 @@ yyreduce: (yyvsp[-9].u.closure_type)->_return_type = (yyvsp[-3].u.type); (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[-9].u.closure_type))); } -#line 8613 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8623 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 654: @@ -8617,7 +8627,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[-1].u.type))); } -#line 8621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 655: @@ -8625,7 +8635,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[-1].u.type))); } -#line 8629 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 656: @@ -8633,7 +8643,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8637 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8647 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 657: @@ -8641,7 +8651,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-1].u.type))); } -#line 8645 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8655 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 658: @@ -8649,7 +8659,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-1].u.type))); } -#line 8653 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8663 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 659: @@ -8657,7 +8667,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8661 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8671 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 660: @@ -8665,7 +8675,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8669 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8679 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 661: @@ -8673,7 +8683,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[-1].u.type))); } -#line 8677 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8687 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 662: @@ -8681,7 +8691,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[-1].u.type))); } -#line 8685 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8695 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 663: @@ -8689,7 +8699,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[-1].u.type))); } -#line 8693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 664: @@ -8697,7 +8707,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[-1].u.type))); } -#line 8701 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8711 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 665: @@ -8705,7 +8715,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[-1].u.type))); } -#line 8709 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8719 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 666: @@ -8713,7 +8723,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[-1].u.type))); } -#line 8717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8727 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 667: @@ -8721,7 +8731,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[-1].u.type))); } -#line 8725 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8735 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 668: @@ -8729,7 +8739,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[-1].u.type))); } -#line 8733 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8743 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 669: @@ -8737,7 +8747,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[-1].u.type))); } -#line 8741 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8751 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 670: @@ -8745,7 +8755,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[-1].u.type))); } -#line 8749 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8759 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 671: @@ -8753,7 +8763,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 8757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8767 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 672: @@ -8761,7 +8771,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 8765 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8775 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 673: @@ -8769,7 +8779,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } -#line 8773 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8783 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 674: @@ -8777,7 +8787,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); } -#line 8781 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8791 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 675: @@ -8785,7 +8795,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); } -#line 8789 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8799 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 676: @@ -8793,7 +8803,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); } -#line 8797 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8807 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 677: @@ -8801,7 +8811,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); } -#line 8805 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8815 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 678: @@ -8817,7 +8827,7 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 8821 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 679: @@ -8825,7 +8835,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } -#line 8829 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8839 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 680: @@ -8833,7 +8843,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } -#line 8837 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8847 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 681: @@ -8841,7 +8851,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); } -#line 8845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 682: @@ -8849,7 +8859,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); } -#line 8853 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 683: @@ -8864,7 +8874,7 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); } -#line 8868 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 684: @@ -8879,7 +8889,7 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); } -#line 8883 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8893 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 685: @@ -8887,7 +8897,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 8891 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8901 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 686: @@ -8895,7 +8905,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 8899 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8909 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 687: @@ -8903,7 +8913,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 8907 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8917 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 688: @@ -8911,7 +8921,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 8915 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8925 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 689: @@ -8919,7 +8929,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 8923 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8933 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 690: @@ -8927,7 +8937,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8931 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8941 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 691: @@ -8935,7 +8945,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8939 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8949 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 692: @@ -8943,7 +8953,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8947 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8957 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 693: @@ -8951,7 +8961,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8955 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8965 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 694: @@ -8959,7 +8969,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8963 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8973 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 695: @@ -8967,7 +8977,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8971 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 696: @@ -8975,7 +8985,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8979 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8989 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 697: @@ -8983,7 +8993,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8987 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 698: @@ -8991,7 +9001,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8995 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9005 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 699: @@ -8999,7 +9009,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9003 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9013 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 700: @@ -9007,7 +9017,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9011 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9021 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 701: @@ -9015,7 +9025,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 702: @@ -9023,7 +9033,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9027 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9037 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 703: @@ -9031,7 +9041,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9035 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9045 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 704: @@ -9039,7 +9049,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9043 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9053 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 705: @@ -9047,7 +9057,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9061 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 706: @@ -9055,7 +9065,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9069 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 707: @@ -9063,7 +9073,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9067 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9077 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 708: @@ -9071,7 +9081,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9075 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9085 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 709: @@ -9079,7 +9089,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 9083 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9093 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 710: @@ -9087,7 +9097,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 9091 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9101 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 711: @@ -9095,7 +9105,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 9099 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9109 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 712: @@ -9103,7 +9113,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9107 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9117 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 713: @@ -9111,7 +9121,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9115 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9125 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 714: @@ -9119,7 +9129,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 9123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9133 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 715: @@ -9127,7 +9137,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 9131 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9141 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 716: @@ -9135,7 +9145,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(true); } -#line 9139 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9149 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 717: @@ -9143,7 +9153,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(false); } -#line 9147 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9157 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 718: @@ -9151,7 +9161,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 9155 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9165 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 719: @@ -9159,7 +9169,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); } -#line 9163 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9173 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 720: @@ -9167,7 +9177,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 9171 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9181 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 721: @@ -9175,7 +9185,7 @@ yyreduce: { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 9179 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9189 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 722: @@ -9183,7 +9193,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); } -#line 9187 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9197 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 723: @@ -9193,7 +9203,7 @@ yyreduce: CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 9197 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9207 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 724: @@ -9203,7 +9213,7 @@ yyreduce: CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 9207 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9217 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 725: @@ -9211,7 +9221,7 @@ yyreduce: { (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); } -#line 9215 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9225 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 726: @@ -9219,7 +9229,7 @@ yyreduce: { (yyval.u.closure_type) = new CPPClosureType(); } -#line 9223 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9233 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 727: @@ -9227,7 +9237,7 @@ yyreduce: { (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_value); } -#line 9231 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9241 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 728: @@ -9235,7 +9245,7 @@ yyreduce: { (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_reference); } -#line 9239 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9249 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 729: @@ -9246,7 +9256,7 @@ yyreduce: (yyval.u.closure_type)->_captures.push_back(*(yyvsp[-1].u.capture)); delete (yyvsp[-1].u.capture); } -#line 9250 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 730: @@ -9257,7 +9267,7 @@ yyreduce: (yyval.u.closure_type)->_captures.push_back(*(yyvsp[-1].u.capture)); delete (yyvsp[-1].u.capture); } -#line 9261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 731: @@ -9267,7 +9277,7 @@ yyreduce: (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } -#line 9271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9281 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 732: @@ -9277,7 +9287,7 @@ yyreduce: (yyval.u.capture)->_name = (yyvsp[-1].u.identifier)->get_simple_name(); (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } -#line 9281 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9291 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 733: @@ -9291,7 +9301,7 @@ yyreduce: (yyval.u.capture)->_type = CPPClosureType::CT_by_value; } } -#line 9295 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 734: @@ -9304,7 +9314,7 @@ yyreduce: yywarning("only capture name 'this' may be preceded by an asterisk", (yylsp[0])); } } -#line 9308 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9318 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 735: @@ -9316,7 +9326,7 @@ yyreduce: } (yyval.u.type) = type; } -#line 9320 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9330 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 736: @@ -9324,7 +9334,7 @@ yyreduce: { (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } -#line 9328 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9338 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 737: @@ -9334,7 +9344,7 @@ yyreduce: ctp->_packed = true; (yyval.u.type) = CPPType::new_type(ctp); } -#line 9338 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9348 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 738: @@ -9342,7 +9352,7 @@ yyreduce: { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9346 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 739: @@ -9350,7 +9360,7 @@ yyreduce: { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9354 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9364 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 740: @@ -9358,7 +9368,7 @@ yyreduce: { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9362 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 741: @@ -9366,7 +9376,7 @@ yyreduce: { (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[0])); } -#line 9370 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9380 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 742: @@ -9374,7 +9384,7 @@ yyreduce: { (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); } -#line 9378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 743: @@ -9384,7 +9394,7 @@ yyreduce: // in MAKE_PROPERTY definitions, etc. (yyval.u.identifier) = new CPPIdentifier("signed", (yylsp[0])); } -#line 9388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9398 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 744: @@ -9392,7 +9402,7 @@ yyreduce: { (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[0])); } -#line 9396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 745: @@ -9400,7 +9410,7 @@ yyreduce: { (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[0])); } -#line 9404 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 746: @@ -9408,7 +9418,7 @@ yyreduce: { (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[0])); } -#line 9412 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 747: @@ -9416,15 +9426,15 @@ yyreduce: { (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[0])); } -#line 9420 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 748: -#line 4063 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4056 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.identifier) = new CPPIdentifier("default", (yylsp[0])); } -#line 9428 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9438 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 749: @@ -9432,7 +9442,7 @@ yyreduce: { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9436 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9446 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 750: @@ -9440,45 +9450,53 @@ yyreduce: { (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9454 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 751: #line 4075 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9462 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 752: -#line 4083 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4079 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].str)); + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); } -#line 9460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 753: #line 4087 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression((yyvsp[0].str)); } -#line 9468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9478 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 754: #line 4091 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 9486 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 755: +#line 4095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { // The right string takes on the literal type of the left. (yyval.u.expr) = (yyvsp[-1].u.expr); (yyval.u.expr)->_str += (yyvsp[0].str); } -#line 9478 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9496 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 755: -#line 4097 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 756: +#line 4101 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We have to check that the two literal types match up. (yyval.u.expr) = (yyvsp[-1].u.expr); @@ -9487,11 +9505,11 @@ yyreduce: } (yyval.u.expr)->_str += (yyvsp[0].u.expr)->_str; } -#line 9491 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9509 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; -#line 9495 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9513 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 305b5a005c..5c834d5851 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -4051,6 +4051,10 @@ name: | KW_STATIC { $$ = new CPPIdentifier("static", @1); +} + | KW_DEFAULT +{ + $$ = new CPPIdentifier("default", @1); } ; diff --git a/dtool/src/dtoolutil/executionEnvironment.h b/dtool/src/dtoolutil/executionEnvironment.h index bd1c6e879a..f2f5472193 100644 --- a/dtool/src/dtoolutil/executionEnvironment.h +++ b/dtool/src/dtoolutil/executionEnvironment.h @@ -51,6 +51,11 @@ PUBLISHED: static Filename get_cwd(); + MAKE_SEQ_PROPERTY(args, get_num_args, get_arg); + MAKE_PROPERTY(binary_name, get_binary_name, set_binary_name); + MAKE_PROPERTY(dtool_name, get_dtool_name, set_dtool_name); + MAKE_PROPERTY(cwd, get_cwd); + private: bool ns_has_environment_variable(const string &var) const; string ns_get_environment_variable(const string &var) const; diff --git a/dtool/src/dtoolutil/pandaSystem.h b/dtool/src/dtoolutil/pandaSystem.h index bed5f2c073..85c1a0ea38 100644 --- a/dtool/src/dtoolutil/pandaSystem.h +++ b/dtool/src/dtoolutil/pandaSystem.h @@ -48,6 +48,21 @@ PUBLISHED: static string get_platform(); + MAKE_PROPERTY(version_string, get_version_string); + MAKE_PROPERTY(major_version, get_major_version); + MAKE_PROPERTY(minor_version, get_minor_version); + MAKE_PROPERTY(sequence_version, get_sequence_version); + MAKE_PROPERTY(official_version, is_official_version); + + MAKE_PROPERTY(memory_alignment, get_memory_alignment); + + MAKE_PROPERTY(distributor, get_distributor); + MAKE_PROPERTY(compiler, get_compiler); + MAKE_PROPERTY(build_date, get_build_date); + MAKE_PROPERTY(git_commit, get_git_commit); + + MAKE_PROPERTY(platform, get_platform); + bool has_system(const string &system) const; size_t get_num_systems() const; string get_system(size_t n) const; diff --git a/dtool/src/dtoolutil/textEncoder.h b/dtool/src/dtoolutil/textEncoder.h index bc42d4a4c1..ca885b15c3 100644 --- a/dtool/src/dtoolutil/textEncoder.h +++ b/dtool/src/dtoolutil/textEncoder.h @@ -46,6 +46,7 @@ PUBLISHED: INLINE static void set_default_encoding(Encoding encoding); INLINE static Encoding get_default_encoding(); + MAKE_PROPERTY(default_encoding, get_default_encoding, set_default_encoding); INLINE void set_text(const string &text); INLINE void set_text(const string &text, Encoding encoding); diff --git a/dtool/src/interrogate/interfaceMaker.cxx b/dtool/src/interrogate/interfaceMaker.cxx index c84456983d..527f983f8a 100644 --- a/dtool/src/interrogate/interfaceMaker.cxx +++ b/dtool/src/interrogate/interfaceMaker.cxx @@ -91,7 +91,8 @@ Property(const InterrogateElement &ielement) : _setter(NULL), _has_function(NULL), _clear_function(NULL), - _deleter(NULL) + _deleter(NULL), + _has_this(false) { } diff --git a/dtool/src/interrogate/interfaceMaker.h b/dtool/src/interrogate/interfaceMaker.h index c84714eb51..eb23e28430 100644 --- a/dtool/src/interrogate/interfaceMaker.h +++ b/dtool/src/interrogate/interfaceMaker.h @@ -132,6 +132,7 @@ public: Function *_has_function; Function *_clear_function; Function *_deleter; + bool _has_this; }; typedef vector Properties; diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index c4dd2d3b21..4042136bab 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -2623,7 +2623,8 @@ write_module_class(ostream &out, Object *obj) { for (pit = obj->_properties.begin(); pit != obj->_properties.end(); ++pit) { Property *property = (*pit); const InterrogateElement &ielem = property->_ielement; - if (property->_getter == NULL || !is_function_legal(property->_getter)) { + if (!property->_has_this || + property->_getter == NULL || !is_function_legal(property->_getter)) { continue; } @@ -3169,6 +3170,45 @@ write_module_class(ostream &out, Object *obj) { } } + // Also add the static properties, which can't be added via getset. + Properties::const_iterator pit; + for (pit = obj->_properties.begin(); pit != obj->_properties.end(); ++pit) { + Property *property = (*pit); + const InterrogateElement &ielem = property->_ielement; + if (property->_has_this || + property->_getter == NULL || !is_function_legal(property->_getter)) { + continue; + } + + string name1 = methodNameFromCppName(ielem.get_name(), "", false); + // string name2 = methodNameFromCppName(ielem.get_name(), "", true); + + string getter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter"; + string setter = "NULL"; + if (property->_length_function == NULL && + property->_setter != NULL && is_function_legal(property->_setter)) { + setter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter"; + } + + out << " static const PyGetSetDef def_" << name1 << " = {(char *)\"" << name1 << "\", " << getter << ", " << setter; + + if (ielem.has_comment()) { + out << ", (char *)\n"; + output_quoted(out, 4, ielem.get_comment()); + out << ",\n "; + } else { + out << ", NULL, "; + } + + // Extra void* argument; we don't make use of it. + out << "NULL};\n"; + + out << " PyDict_SetItemString(dict, \"" << name1 << "\", Dtool_NewStaticProperty(&Dtool_" << ClassName << "._PyType, &def_" << name1 << "));\n"; + /* Alternative spelling: + out << " PyDict_SetItemString(\"" << name2 << "\", &def_" << name1 << ");\n"; + */ + } + out << " if (PyType_Ready((PyTypeObject *)&Dtool_" << ClassName << ") < 0) {\n" " Dtool_Raise_TypeError(\"PyType_Ready(" << ClassName << ")\");\n" " return;\n" @@ -6443,11 +6483,15 @@ write_getset(ostream &out, Object *obj, Property *property) { "/**\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"; + "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getitem(PyObject *self, Py_ssize_t index) {\n"; + if (property->_getter->_has_this || + (property->_has_function && property->_has_function->_has_this)) { + out << + " " << 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. @@ -6458,8 +6502,12 @@ write_getset(ostream &out, Object *obj, Property *property) { out << " }\n"; if (property->_has_function != NULL) { - out << " if (!local_this->" << property->_has_function->_ifunc.get_name() << "(index)) {\n" - << " Py_INCREF(Py_None);\n" + if (property->_has_function->_has_this) { + out << " if (!local_this->" << property->_has_function->_ifunc.get_name() << "(index)) {\n"; + } else { + out << " if (!" << cClassName << "::" << property->_has_function->_ifunc.get_name() << "(index)) {\n"; + } + out << " Py_INCREF(Py_None);\n" << " return Py_None;\n" << " }\n"; } @@ -6494,16 +6542,22 @@ write_getset(ostream &out, Object *obj, Property *property) { // 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"; + if (property->_has_this) { + 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"; + if (property->_deleter->_has_this) { + out << " local_this->" << property->_deleter->_ifunc.get_name() << "(index);\n"; + } else { + out << " " << cClassName << "::" << property->_deleter->_ifunc.get_name() << "(index);\n"; + } + out << " return 0;\n"; } else { out << " Dtool_Raise_TypeError(\"can't delete " << ielem.get_name() << "[] attribute\");\n" " return -1;\n"; @@ -6511,9 +6565,13 @@ write_getset(ostream &out, Object *obj, Property *property) { 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" + out << " if (arg == Py_None) {\n"; + if (property->_clear_function->_has_this) { + out << " local_this->" << property->_clear_function->_ifunc.get_name() << "(index);\n"; + } else { + out << " " << cClassName << "::" << property->_clear_function->_ifunc.get_name() << "(index);\n"; + } + out << " return 0;\n" << " }\n"; } @@ -6547,9 +6605,14 @@ write_getset(ostream &out, Object *obj, Property *property) { } // 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" + out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n"; + if (property->_has_this) { + out << " nassertr(self != NULL, NULL);\n" + " Py_INCREF(self);\n"; + } else { + out << " Py_XINCREF(self);\n"; + } + out << " 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"; @@ -6566,20 +6629,26 @@ write_getset(ostream &out, Object *obj, Property *property) { out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n"; FunctionRemap *remap = property->_getter->_remaps.front(); - if (remap->_const_method) { - out << " const " << cClassName << " *local_this = NULL;\n"; - out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; - } else { - 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"; + if (remap->_has_this) { + if (remap->_const_method) { + out << " const " << cClassName << " *local_this = NULL;\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; + } else { + 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 NULL;\n"; + out << " }\n\n"; } - out << " return NULL;\n"; - out << " }\n\n"; if (property->_has_function != NULL) { - out << " if (!local_this->" << property->_has_function->_ifunc.get_name() << "()) {\n" - << " Py_INCREF(Py_None);\n" + if (remap->_has_this) { + out << " if (!local_this->" << property->_has_function->_ifunc.get_name() << "()) {\n"; + } else { + out << " if (!" << cClassName << "::" << property->_has_function->_ifunc.get_name() << "()) {\n"; + } + out << " Py_INCREF(Py_None);\n" << " return Py_None;\n" << " }\n"; } @@ -6596,16 +6665,21 @@ write_getset(ostream &out, Object *obj, Property *property) { // 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 (remap->_has_this) { + 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) { + if (property->_deleter != NULL && remap->_has_this) { out << " local_this->" << property->_deleter->_ifunc.get_name() << "();\n" << " return 0;\n"; + } else if (property->_deleter != NULL) { + out << " " << cClassName << "::" << 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"; @@ -6613,9 +6687,13 @@ write_getset(ostream &out, Object *obj, Property *property) { out << " }\n"; if (property->_clear_function != NULL) { - out << " if (arg == Py_None) {\n" - << " local_this->" << property->_clear_function->_ifunc.get_name() << "();\n" - << " return 0;\n" + out << " if (arg == Py_None) {\n"; + if (remap->_has_this) { + out << " local_this->" << property->_clear_function->_ifunc.get_name() << "();\n"; + } else { + out << " " << cClassName << "::" << property->_clear_function->_ifunc.get_name() << "();\n"; + } + out << " return 0;\n" << " }\n"; } @@ -6744,6 +6822,7 @@ record_object(TypeIndex type_index) { Function *setter = record_function(itype, func_index); if (is_function_legal(setter)) { property->_setter = setter; + property->_has_this |= setter->_has_this; } } @@ -6752,6 +6831,7 @@ record_object(TypeIndex type_index) { Function *getter = record_function(itype, func_index); if (is_function_legal(getter)) { property->_getter = getter; + property->_has_this |= getter->_has_this; } } @@ -6760,6 +6840,7 @@ record_object(TypeIndex type_index) { Function *has_function = record_function(itype, func_index); if (is_function_legal(has_function)) { property->_has_function = has_function; + property->_has_this |= has_function->_has_this; } } @@ -6768,6 +6849,7 @@ record_object(TypeIndex type_index) { Function *clear_function = record_function(itype, func_index); if (is_function_legal(clear_function)) { property->_clear_function = clear_function; + property->_has_this |= clear_function->_has_this; } } @@ -6776,12 +6858,16 @@ record_object(TypeIndex type_index) { Function *del_function = record_function(itype, func_index); if (is_function_legal(del_function)) { property->_deleter = del_function; + property->_has_this |= del_function->_has_this; } } if (ielement.is_sequence()) { FunctionIndex func_index = ielement.get_length_function(); property->_length_function = record_function(itype, func_index); + if (property->_length_function != nullptr) { + property->_has_this |= property->_length_function->_has_this; + } } if (property->_getter != NULL) { diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index 52525d74e6..1abb34100b 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -618,8 +618,11 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { dtool_inited = true; if (PyType_Ready(&Dtool_SequenceWrapper_Type) < 0) { - PyErr_SetString(PyExc_TypeError, "PyType_Ready(Dtool_SequenceWrapper)"); - return NULL; + return Dtool_Raise_TypeError("PyType_Ready(Dtool_SequenceWrapper)"); + } + + if (PyType_Ready(&Dtool_StaticProperty_Type) < 0) { + return Dtool_Raise_TypeError("PyType_Ready(Dtool_StaticProperty_Type)"); } // Initialize the base class of everything. @@ -1035,7 +1038,7 @@ bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, PyObject *kwds) static void Dtool_SequenceWrapper_dealloc(PyObject *self) { Dtool_SequenceWrapper *wrap = (Dtool_SequenceWrapper *)self; nassertv(wrap); - Py_DECREF(wrap->_base); + Py_XDECREF(wrap->_base); } static Py_ssize_t Dtool_SequenceWrapper_length(PyObject *self) { @@ -1131,4 +1134,134 @@ PyTypeObject Dtool_SequenceWrapper_Type = { #endif }; +/** + * This is a variant of the Python getset mechanism that permits static + * properties. + */ +PyObject * +Dtool_NewStaticProperty(PyTypeObject *type, const PyGetSetDef *getset) { + PyGetSetDescrObject *descr; + descr = (PyGetSetDescrObject *)PyType_GenericAlloc(&Dtool_StaticProperty_Type, 0); + if (descr != nullptr) { + Py_XINCREF(type); + descr->d_getset = (PyGetSetDef *)getset; +#if PY_MAJOR_VERSION >= 3 + descr->d_common.d_type = type; + descr->d_common.d_name = PyUnicode_InternFromString(getset->name); + descr->d_common.d_qualname = nullptr; +#else + descr->d_type = type; + descr->d_name = PyString_InternFromString(getset->name); +#endif + } + return (PyObject *)descr; +} + +static void +Dtool_StaticProperty_dealloc(PyDescrObject *descr) { + _PyObject_GC_UNTRACK(descr); + Py_XDECREF(descr->d_type); + Py_XDECREF(descr->d_name); +//#if PY_MAJOR_VERSION >= 3 +// Py_XDECREF(descr->d_qualname); +//#endif + PyObject_GC_Del(descr); +} + +static PyObject * +Dtool_StaticProperty_repr(PyDescrObject *descr, const char *format) { +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", descr->d_name, "?", descr->d_type->tp_name); +#else + return PyString_FromFormat("", descr->d_name, "?", descr->d_type->tp_name); +#endif +} + +static int +Dtool_StaticProperty_traverse(PyObject *self, visitproc visit, void *arg) { + PyDescrObject *descr = (PyDescrObject *)self; + Py_VISIT(descr->d_type); + return 0; +} + +static PyObject * +Dtool_StaticProperty_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *type) { + if (descr->d_getset->get != nullptr) { + return descr->d_getset->get(obj, descr->d_getset->closure); + } else { + return PyErr_Format(PyExc_AttributeError, + "attribute '%V' of type '%.100s' is not readable", + ((PyDescrObject *)descr)->d_name, "?", + ((PyDescrObject *)descr)->d_type->tp_name); + } +} + +static int +Dtool_StaticProperty_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) { + if (descr->d_getset->set != nullptr) { + return descr->d_getset->set(obj, value, descr->d_getset->closure); + } else { + PyErr_Format(PyExc_AttributeError, + "attribute '%V' of type '%.100s' is not writable", + ((PyDescrObject *)descr)->d_name, "?", + ((PyDescrObject *)descr)->d_type->tp_name); + return -1; + } +} + +PyTypeObject Dtool_StaticProperty_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "getset_descriptor", + sizeof(PyGetSetDescrObject), + 0, // tp_itemsize + (destructor)Dtool_StaticProperty_dealloc, + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_reserved + (reprfunc)Dtool_StaticProperty_repr, + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + 0, // tp_str + PyObject_GenericGetAttr, + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, + 0, // tp_doc + Dtool_StaticProperty_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 + (descrgetfunc)Dtool_StaticProperty_get, + (descrsetfunc)Dtool_StaticProperty_set, + 0, // tp_dictoffset + 0, // tp_init + 0, // tp_alloc + 0, // tp_new + 0, // tp_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 +#if PY_VERSION_HEX >= 0x03040000 + 0, // tp_finalize +#endif +}; + #endif // HAVE_PYTHON diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index c2cc584914..05a787de9f 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -471,6 +471,9 @@ struct Dtool_SequenceWrapper { }; EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SequenceWrapper_Type; +EXPCL_INTERROGATEDB extern PyTypeObject Dtool_StaticProperty_Type; + +EXPCL_INTERROGATEDB PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset); /** * These functions check whether the arguments passed to a function conform to diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index d94287c038..c97cea7476 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -105,6 +105,7 @@ extern "C" { EXPCL_PYSTUB int PyObject_Cmp(...); EXPCL_PYSTUB int PyObject_Compare(...); EXPCL_PYSTUB int PyObject_Free(...); + EXPCL_PYSTUB int PyObject_GC_Del(...); EXPCL_PYSTUB int PyObject_GenericGetAttr(...); EXPCL_PYSTUB int PyObject_GenericSetAttr(...); EXPCL_PYSTUB int PyObject_GetAttrString(...); @@ -223,6 +224,7 @@ extern "C" { EXPCL_PYSTUB extern void *PyExc_SystemExit; EXPCL_PYSTUB extern void *PyExc_TypeError; EXPCL_PYSTUB extern void *PyExc_ValueError; + EXPCL_PYSTUB extern void *PyType_Type; EXPCL_PYSTUB extern void *_PyThreadState_Current; EXPCL_PYSTUB extern void *_Py_FalseStruct; EXPCL_PYSTUB extern void *_Py_NoneStruct; @@ -324,6 +326,7 @@ int PyObject_CallObject(...) { return 0; } int PyObject_Cmp(...) { return 0; } int PyObject_Compare(...) { return 0; } int PyObject_Free(...) { return 0; } +int PyObject_GC_Del(...) { return 0; } int PyObject_GenericGetAttr(...) { return 0; }; int PyObject_GenericSetAttr(...) { return 0; }; int PyObject_GetAttrString(...) { return 0; } @@ -448,6 +451,7 @@ void *PyExc_StopIteration = (void *)NULL; void *PyExc_SystemExit = (void *)NULL; void *PyExc_TypeError = (void *)NULL; void *PyExc_ValueError = (void *)NULL; +void *PyType_Type = (void *)NULL; void *_PyThreadState_Current = (void *)NULL; void *_Py_FalseStruct = (void *)NULL; void *_Py_NoneStruct = (void *)NULL; diff --git a/panda/src/audio/audioManager.h b/panda/src/audio/audioManager.h index 4ab88cc96b..6de21e15c4 100644 --- a/panda/src/audio/audioManager.h +++ b/panda/src/audio/audioManager.h @@ -172,6 +172,7 @@ PUBLISHED: virtual PN_stdfloat audio_3d_get_drop_off_factor() const; static Filename get_dls_pathname(); + MAKE_PROPERTY(dls_pathname, get_dls_pathname); virtual void output(ostream &out) const; virtual void write(ostream &out) const; diff --git a/panda/src/collide/collisionNode.h b/panda/src/collide/collisionNode.h index db731f7bcf..82c40a4d12 100644 --- a/panda/src/collide/collisionNode.h +++ b/panda/src/collide/collisionNode.h @@ -75,6 +75,7 @@ PUBLISHED: MAKE_PROPERTY(collider_sort, get_collider_sort, set_collider_sort); INLINE static CollideMask get_default_collide_mask(); + MAKE_PROPERTY(default_collide_mask, get_default_collide_mask); protected: virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds, diff --git a/panda/src/display/windowProperties.h b/panda/src/display/windowProperties.h index efb58255b6..bd5e964f52 100644 --- a/panda/src/display/windowProperties.h +++ b/panda/src/display/windowProperties.h @@ -49,6 +49,8 @@ PUBLISHED: static WindowProperties get_default(); static void set_default(const WindowProperties &default_properties); static void clear_default(); + MAKE_PROPERTY(config_properties, get_config_properties); + MAKE_PROPERTY(default, get_default, set_default); static WindowProperties size(int x_size, int y_size); diff --git a/panda/src/express/memoryUsage.h b/panda/src/express/memoryUsage.h index 87fc4f59d8..9742348cac 100644 --- a/panda/src/express/memoryUsage.h +++ b/panda/src/express/memoryUsage.h @@ -89,6 +89,19 @@ PUBLISHED: INLINE static void show_current_ages(); INLINE static void show_trend_ages(); +PUBLISHED: + MAKE_PROPERTY(tracking, is_tracking); + MAKE_PROPERTY(counting, is_counting); + MAKE_PROPERTY(current_cpp_size, get_current_cpp_size); + MAKE_PROPERTY(total_cpp_size, get_total_cpp_size); + + MAKE_PROPERTY(panda_heap_single_size, get_panda_heap_single_size); + MAKE_PROPERTY(panda_heap_array_size, get_panda_heap_array_size); + MAKE_PROPERTY(panda_heap_overhead, get_panda_heap_overhead); + MAKE_PROPERTY(panda_mmap_size, get_panda_mmap_size); + MAKE_PROPERTY(external_size, get_external_size); + MAKE_PROPERTY(total_size, get_total_size); + protected: virtual void overflow_heap_size(); diff --git a/panda/src/express/multifile.h b/panda/src/express/multifile.h index 5c6ec16feb..f290c98602 100644 --- a/panda/src/express/multifile.h +++ b/panda/src/express/multifile.h @@ -136,6 +136,7 @@ PUBLISHED: void ls(ostream &out = cout) const; static INLINE string get_magic_number(); + MAKE_PROPERTY(magic_number, get_magic_number); void set_header_prefix(const string &header_prefix); INLINE const string &get_header_prefix() const; diff --git a/panda/src/gobj/textureStage.h b/panda/src/gobj/textureStage.h index 4ba5835910..ccaa32e5d0 100644 --- a/panda/src/gobj/textureStage.h +++ b/panda/src/gobj/textureStage.h @@ -201,6 +201,8 @@ PUBLISHED: MAKE_PROPERTY(tex_view_offset, get_tex_view_offset, set_tex_view_offset); + MAKE_PROPERTY(default, get_default); + public: INLINE static UpdateSeq get_sort_seq(); diff --git a/panda/src/gobj/textureStagePool.h b/panda/src/gobj/textureStagePool.h index 5dc9012ea9..4db775251d 100644 --- a/panda/src/gobj/textureStagePool.h +++ b/panda/src/gobj/textureStagePool.h @@ -43,6 +43,7 @@ PUBLISHED: INLINE static void set_mode(Mode mode); INLINE static Mode get_mode(); + MAKE_PROPERTY(mode, get_mode, set_mode); INLINE static int garbage_collect(); INLINE static void list_contents(ostream &out); diff --git a/panda/src/gobj/vertexDataPage.h b/panda/src/gobj/vertexDataPage.h index 5149663e6b..4c7fd02bf2 100644 --- a/panda/src/gobj/vertexDataPage.h +++ b/panda/src/gobj/vertexDataPage.h @@ -64,6 +64,7 @@ PUBLISHED: INLINE static SimpleLru *get_global_lru(RamClass rclass); INLINE static SimpleLru *get_pending_lru(); INLINE static VertexDataSaveFile *get_save_file(); + MAKE_PROPERTY(save_file, get_save_file); INLINE bool save_to_disk(); diff --git a/panda/src/parametrics/ropeNode.h b/panda/src/parametrics/ropeNode.h index 1469ec6174..c60a1b9d0b 100644 --- a/panda/src/parametrics/ropeNode.h +++ b/panda/src/parametrics/ropeNode.h @@ -136,6 +136,23 @@ PUBLISHED: void reset_bound(const NodePath &rel_to); +PUBLISHED: + MAKE_PROPERTY(curve, get_curve, set_curve); + MAKE_PROPERTY(render_mode, get_render_mode, set_render_mode); + MAKE_PROPERTY(uv_mode, get_uv_mode, set_uv_mode); + MAKE_PROPERTY(uv_direction, get_uv_direction, set_uv_direction); + MAKE_PROPERTY(uv_scale, get_uv_scale, set_uv_scale); + MAKE_PROPERTY(normal_mode, get_normal_mode, set_normal_mode); + MAKE_PROPERTY(tube_up, get_tube_up, set_tube_up); + MAKE_PROPERTY(use_vertex_color, get_use_vertex_color, set_use_vertex_color); + MAKE_PROPERTY(vertex_color_dimension, get_vertex_color_dimension); + MAKE_PROPERTY(num_subdiv, get_num_subdiv, set_num_subdiv); + MAKE_PROPERTY(num_slices, get_num_slices, set_num_slices); + MAKE_PROPERTY(use_vertex_thickness, get_use_vertex_thickness, set_use_vertex_thickness); + MAKE_PROPERTY(vertex_thickness_dimension, get_vertex_thickness_dimension); + MAKE_PROPERTY(thickness, get_thickness, set_thickness); + MAKE_PROPERTY2(matrix, has_matrix, get_matrix, set_matrix, clear_matrix); + protected: virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds, int &internal_vertices, diff --git a/panda/src/pgraph/alphaTestAttrib.h b/panda/src/pgraph/alphaTestAttrib.h index 9b547ad2a7..d9aae7ec5b 100644 --- a/panda/src/pgraph/alphaTestAttrib.h +++ b/panda/src/pgraph/alphaTestAttrib.h @@ -58,6 +58,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/antialiasAttrib.h b/panda/src/pgraph/antialiasAttrib.h index 30a72bb535..af149af5f6 100644 --- a/panda/src/pgraph/antialiasAttrib.h +++ b/panda/src/pgraph/antialiasAttrib.h @@ -75,6 +75,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/audioVolumeAttrib.h b/panda/src/pgraph/audioVolumeAttrib.h index 3b2120462f..abf1216130 100644 --- a/panda/src/pgraph/audioVolumeAttrib.h +++ b/panda/src/pgraph/audioVolumeAttrib.h @@ -65,6 +65,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/auxBitplaneAttrib.h b/panda/src/pgraph/auxBitplaneAttrib.h index 56658f0aa2..26ce021110 100644 --- a/panda/src/pgraph/auxBitplaneAttrib.h +++ b/panda/src/pgraph/auxBitplaneAttrib.h @@ -85,6 +85,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/clipPlaneAttrib.h b/panda/src/pgraph/clipPlaneAttrib.h index e62c57857a..ca95233b79 100644 --- a/panda/src/pgraph/clipPlaneAttrib.h +++ b/panda/src/pgraph/clipPlaneAttrib.h @@ -123,6 +123,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/colorAttrib.h b/panda/src/pgraph/colorAttrib.h index 9df0878559..df8c1b84ce 100644 --- a/panda/src/pgraph/colorAttrib.h +++ b/panda/src/pgraph/colorAttrib.h @@ -69,6 +69,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/colorBlendAttrib.h b/panda/src/pgraph/colorBlendAttrib.h index 0530d077ce..641633561c 100644 --- a/panda/src/pgraph/colorBlendAttrib.h +++ b/panda/src/pgraph/colorBlendAttrib.h @@ -138,6 +138,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/colorScaleAttrib.h b/panda/src/pgraph/colorScaleAttrib.h index b5e986e239..e8dded108b 100644 --- a/panda/src/pgraph/colorScaleAttrib.h +++ b/panda/src/pgraph/colorScaleAttrib.h @@ -74,6 +74,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/colorWriteAttrib.h b/panda/src/pgraph/colorWriteAttrib.h index b7dcb7eb37..a426a01659 100644 --- a/panda/src/pgraph/colorWriteAttrib.h +++ b/panda/src/pgraph/colorWriteAttrib.h @@ -76,6 +76,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static TypeHandle get_class_type() { diff --git a/panda/src/pgraph/cullBinAttrib.h b/panda/src/pgraph/cullBinAttrib.h index f17a9876c6..b3590ac1c5 100644 --- a/panda/src/pgraph/cullBinAttrib.h +++ b/panda/src/pgraph/cullBinAttrib.h @@ -57,6 +57,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/cullFaceAttrib.h b/panda/src/pgraph/cullFaceAttrib.h index 5f6589a52a..1ed0450db2 100644 --- a/panda/src/pgraph/cullFaceAttrib.h +++ b/panda/src/pgraph/cullFaceAttrib.h @@ -69,6 +69,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/depthOffsetAttrib.h b/panda/src/pgraph/depthOffsetAttrib.h index 0976e2025a..9ae6a6ce6f 100644 --- a/panda/src/pgraph/depthOffsetAttrib.h +++ b/panda/src/pgraph/depthOffsetAttrib.h @@ -86,6 +86,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/depthTestAttrib.h b/panda/src/pgraph/depthTestAttrib.h index 6380a197d9..2dfa4763e1 100644 --- a/panda/src/pgraph/depthTestAttrib.h +++ b/panda/src/pgraph/depthTestAttrib.h @@ -53,6 +53,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/depthWriteAttrib.h b/panda/src/pgraph/depthWriteAttrib.h index 9cd96b40f9..d1cdbdc98f 100644 --- a/panda/src/pgraph/depthWriteAttrib.h +++ b/panda/src/pgraph/depthWriteAttrib.h @@ -59,6 +59,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/fogAttrib.h b/panda/src/pgraph/fogAttrib.h index 0076ccfc82..7f659b6336 100644 --- a/panda/src/pgraph/fogAttrib.h +++ b/panda/src/pgraph/fogAttrib.h @@ -54,6 +54,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/geomNode.h b/panda/src/pgraph/geomNode.h index a490a914b4..d17903027a 100644 --- a/panda/src/pgraph/geomNode.h +++ b/panda/src/pgraph/geomNode.h @@ -89,6 +89,7 @@ PUBLISHED: void write_verbose(ostream &out, int indent_level) const; INLINE static CollideMask get_default_collide_mask(); + MAKE_PROPERTY(default_collide_mask, get_default_collide_mask); public: virtual void output(ostream &out) const; diff --git a/panda/src/pgraph/lightAttrib.h b/panda/src/pgraph/lightAttrib.h index 25fc1fa68a..8d8b87bfb6 100644 --- a/panda/src/pgraph/lightAttrib.h +++ b/panda/src/pgraph/lightAttrib.h @@ -131,6 +131,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: // This data is only needed when reading from a bam file. diff --git a/panda/src/pgraph/lightRampAttrib.h b/panda/src/pgraph/lightRampAttrib.h index ccba3501cd..65a894e582 100644 --- a/panda/src/pgraph/lightRampAttrib.h +++ b/panda/src/pgraph/lightRampAttrib.h @@ -76,6 +76,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/logicOpAttrib.h b/panda/src/pgraph/logicOpAttrib.h index 81621b51dc..99ab79d029 100644 --- a/panda/src/pgraph/logicOpAttrib.h +++ b/panda/src/pgraph/logicOpAttrib.h @@ -75,6 +75,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/materialAttrib.h b/panda/src/pgraph/materialAttrib.h index 8da67c3ada..88c4a4363d 100644 --- a/panda/src/pgraph/materialAttrib.h +++ b/panda/src/pgraph/materialAttrib.h @@ -56,6 +56,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/pandaNode.h b/panda/src/pgraph/pandaNode.h index a0a2d0f9a3..a51a34c9dd 100644 --- a/panda/src/pgraph/pandaNode.h +++ b/panda/src/pgraph/pandaNode.h @@ -234,6 +234,8 @@ PUBLISHED: INLINE static DrawMask get_all_camera_mask(); INLINE bool is_overall_hidden() const; INLINE void set_overall_hidden(bool overall_hidden); + MAKE_PROPERTY(overall_bit, get_overall_bit); + MAKE_PROPERTY(all_camera_mask, get_all_camera_mask); MAKE_PROPERTY(overall_hidden, is_overall_hidden, set_overall_hidden); void adjust_draw_mask(DrawMask show_mask, diff --git a/panda/src/pgraph/renderAttrib.h b/panda/src/pgraph/renderAttrib.h index 1ffda64a16..aaa537ee5f 100644 --- a/panda/src/pgraph/renderAttrib.h +++ b/panda/src/pgraph/renderAttrib.h @@ -83,6 +83,7 @@ PUBLISHED: static bool validate_attribs(); virtual int get_slot() const=0; + MAKE_PROPERTY(slot, get_slot); enum PandaCompareFunc { // intentionally defined to match D3DCMPFUNC M_none=0, // alpha-test disabled (always-draw) diff --git a/panda/src/pgraph/renderModeAttrib.h b/panda/src/pgraph/renderModeAttrib.h index 631789dd60..21a32ee5de 100644 --- a/panda/src/pgraph/renderModeAttrib.h +++ b/panda/src/pgraph/renderModeAttrib.h @@ -92,6 +92,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/rescaleNormalAttrib.h b/panda/src/pgraph/rescaleNormalAttrib.h index 746db42717..589f5351cc 100644 --- a/panda/src/pgraph/rescaleNormalAttrib.h +++ b/panda/src/pgraph/rescaleNormalAttrib.h @@ -72,6 +72,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/scissorAttrib.h b/panda/src/pgraph/scissorAttrib.h index 48a4b87a7c..9ea128e765 100644 --- a/panda/src/pgraph/scissorAttrib.h +++ b/panda/src/pgraph/scissorAttrib.h @@ -70,6 +70,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/shadeModelAttrib.h b/panda/src/pgraph/shadeModelAttrib.h index 067555207a..8f8cd8a570 100644 --- a/panda/src/pgraph/shadeModelAttrib.h +++ b/panda/src/pgraph/shadeModelAttrib.h @@ -59,6 +59,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/shaderAttrib.h b/panda/src/pgraph/shaderAttrib.h index c719ce1791..7f704cc10f 100644 --- a/panda/src/pgraph/shaderAttrib.h +++ b/panda/src/pgraph/shaderAttrib.h @@ -158,6 +158,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static TypeHandle get_class_type() { diff --git a/panda/src/pgraph/stencilAttrib.h b/panda/src/pgraph/stencilAttrib.h index 9e9086928b..6b0b773581 100644 --- a/panda/src/pgraph/stencilAttrib.h +++ b/panda/src/pgraph/stencilAttrib.h @@ -155,6 +155,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/texGenAttrib.h b/panda/src/pgraph/texGenAttrib.h index 3cf0323edc..b9e1cd273a 100644 --- a/panda/src/pgraph/texGenAttrib.h +++ b/panda/src/pgraph/texGenAttrib.h @@ -114,6 +114,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/texMatrixAttrib.h b/panda/src/pgraph/texMatrixAttrib.h index 36e06b1549..f68238cf9f 100644 --- a/panda/src/pgraph/texMatrixAttrib.h +++ b/panda/src/pgraph/texMatrixAttrib.h @@ -101,6 +101,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/textureAttrib.h b/panda/src/pgraph/textureAttrib.h index efb1ad786d..aa9eea03c9 100644 --- a/panda/src/pgraph/textureAttrib.h +++ b/panda/src/pgraph/textureAttrib.h @@ -157,6 +157,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgraph/transparencyAttrib.h b/panda/src/pgraph/transparencyAttrib.h index ef890aa158..75af58c64e 100644 --- a/panda/src/pgraph/transparencyAttrib.h +++ b/panda/src/pgraph/transparencyAttrib.h @@ -70,6 +70,7 @@ PUBLISHED: virtual int get_slot() const { return get_class_slot(); } + MAKE_PROPERTY(class_slot, get_class_slot); public: static void register_with_read_factory(); diff --git a/panda/src/pgui/pgButton.h b/panda/src/pgui/pgButton.h index 494ed45428..ce0cb315c4 100644 --- a/panda/src/pgui/pgButton.h +++ b/panda/src/pgui/pgButton.h @@ -73,6 +73,7 @@ PUBLISHED: INLINE static string get_click_prefix(); INLINE string get_click_event(const ButtonHandle &button) const; + MAKE_PROPERTY(click_prefix, get_click_prefix); private: typedef pset Buttons; diff --git a/panda/src/pipeline/thread.h b/panda/src/pipeline/thread.h index 2240174f02..80844ea409 100644 --- a/panda/src/pipeline/thread.h +++ b/panda/src/pipeline/thread.h @@ -100,6 +100,16 @@ PUBLISHED: MAKE_PROPERTY(python_index, get_python_index); MAKE_PROPERTY(unique_id, get_unique_id); MAKE_PROPERTY(pipeline_stage, get_pipeline_stage, set_pipeline_stage); + + MAKE_PROPERTY(main_thread, get_main_thread); + MAKE_PROPERTY(external_thread, get_external_thread); + MAKE_PROPERTY(current_thread, get_current_thread); + MAKE_PROPERTY(current_pipeline_stage, get_current_pipeline_stage); + + MAKE_PROPERTY(threading_supported, is_threading_supported); + MAKE_PROPERTY(true_threads, is_true_threads); + MAKE_PROPERTY(simple_threads, is_simple_threads); + MAKE_PROPERTY(started, is_started); MAKE_PROPERTY(joinable, is_joinable); MAKE_PROPERTY(current_task, get_current_task); diff --git a/panda/src/speedtree/speedTreeNode.h b/panda/src/speedtree/speedTreeNode.h index 942312a2fb..76a4d16a5e 100644 --- a/panda/src/speedtree/speedTreeNode.h +++ b/panda/src/speedtree/speedTreeNode.h @@ -141,6 +141,9 @@ PUBLISHED: INLINE double get_time_delta() const; INLINE static void set_global_time_delta(double delta); INLINE static double get_global_time_delta(); + MAKE_PROPERTY(time_delta, get_time_delta, set_time_delta); + MAKE_PROPERTY(global_time_delta, get_global_time_delta, + set_global_time_delta); static bool authorize(const string &license = ""); diff --git a/panda/src/vision/webcamVideo.h b/panda/src/vision/webcamVideo.h index a1a74d3562..cdcf5e393d 100644 --- a/panda/src/vision/webcamVideo.h +++ b/panda/src/vision/webcamVideo.h @@ -28,6 +28,7 @@ PUBLISHED: static int get_num_options(); static PT(WebcamVideo) get_option(int n); MAKE_SEQ(get_options, get_num_options, get_option); + MAKE_SEQ_PROPERTY(options, get_num_options, get_option); INLINE int get_size_x() const; INLINE int get_size_y() const; From e3d8123940fe35e9b85ee10abe82f247c09c2a98 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 7 Aug 2017 22:58:02 +0200 Subject: [PATCH 158/254] glsl: fix broken shadowMatrix as member of named light input Fixes: #157 --- panda/src/glstuff/glShaderContext_src.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 1afa11d2b8..f2c3b30a9b 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -1431,7 +1431,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { bind._arg[0] = NULL; bind._dep[0] = Shader::SSD_general | Shader::SSD_transform; bind._part[1] = Shader::SMO_mat_constant_x_attrib; - bind._arg[1] = InternalName::make("shadowViewMatrix"); + bind._arg[1] = iname->get_parent()->append("shadowViewMatrix"); bind._dep[1] = Shader::SSD_general | Shader::SSD_shaderinputs | Shader::SSD_frame | Shader::SSD_view_transform; } else { bind._part[0] = Shader::SMO_mat_constant_x_attrib; From 4fae81947e67e903fdc587589de7f47bffa484bd Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 7 Aug 2017 22:58:30 +0200 Subject: [PATCH 159/254] Fix regression (since 6f8b379) causing crash in flattening edge case --- panda/src/gobj/geom.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/panda/src/gobj/geom.cxx b/panda/src/gobj/geom.cxx index cf9a3a49b1..6019a4c577 100644 --- a/panda/src/gobj/geom.cxx +++ b/panda/src/gobj/geom.cxx @@ -683,6 +683,7 @@ unify_in_place(int max_indices, bool preserve_order) { int num_vertices = copy_primitives * total_vertices_per_primitive; nassertv(num_vertices > 0); { + smaller->set_index_type(reader.get_index_type()); GeomVertexArrayDataHandle writer(smaller->modify_vertices(), current_thread); writer.unclean_set_num_rows(num_vertices); memcpy(writer.get_write_pointer(), ptr, stride * (size_t)(num_vertices - num_unused_vertices_per_primitive)); From 114aee1d6aa7714225d5e32c2ab3779979cabea5 Mon Sep 17 00:00:00 2001 From: Younguk Kim Date: Fri, 4 Aug 2017 23:48:43 +0900 Subject: [PATCH 160/254] Add additional Windows SDK path Windows 10 SDK binary files are installed in versioned folder from Creator Update (10.0.15063.0) --- makepanda/makepandacore.py | 1 + 1 file changed, 1 insertion(+) diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 9f42b92580..9425794121 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -2422,6 +2422,7 @@ def SetupVisualStudioEnviron(): winsdk_ver = SDK["MSPLATFORM_VERSION"] if winsdk_ver.startswith('10.'): AddToPathEnv("PATH", SDK["MSPLATFORM"] + "bin\\" + arch) + AddToPathEnv("PATH", SDK["MSPLATFORM"] + "bin\\" + winsdk_ver + "\\" + arch) # Windows Kit 10 introduces the "universal CRT". inc_dir = SDK["MSPLATFORM"] + "Include\\" + winsdk_ver + "\\" From 3e6dc3b046f7ea519859012e56113d66acf242ba Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 7 Aug 2017 23:32:45 +0200 Subject: [PATCH 161/254] Fix Python 3.2 compilation error --- dtool/src/interrogatedb/py_panda.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index 1abb34100b..7b920979ef 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -1148,7 +1148,9 @@ Dtool_NewStaticProperty(PyTypeObject *type, const PyGetSetDef *getset) { #if PY_MAJOR_VERSION >= 3 descr->d_common.d_type = type; descr->d_common.d_name = PyUnicode_InternFromString(getset->name); +#if PY_VERSION_HEX >= 0x03030000 descr->d_common.d_qualname = nullptr; +#endif #else descr->d_type = type; descr->d_name = PyString_InternFromString(getset->name); From 99cf21acecb6956eff46f68273536d17283fd78e Mon Sep 17 00:00:00 2001 From: Younguk Kim Date: Tue, 22 Aug 2017 23:42:42 +0900 Subject: [PATCH 162/254] Fix failure to load DLL with unicode path - Change LoadLibrary API to unicode version on Windows --- dtool/src/dtoolutil/load_dso.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dtool/src/dtoolutil/load_dso.cxx b/dtool/src/dtoolutil/load_dso.cxx index ae224d3617..ba63eee044 100644 --- a/dtool/src/dtoolutil/load_dso.cxx +++ b/dtool/src/dtoolutil/load_dso.cxx @@ -47,20 +47,20 @@ load_dso(const DSearchPath &path, const Filename &filename) { if (!abspath.is_regular_file()) { return NULL; } - string os_specific = abspath.to_os_specific(); + wstring os_specific_w = abspath.to_os_specific_w(); // Try using LoadLibraryEx, if possible. - typedef HMODULE (WINAPI *tLoadLibraryEx)(LPCTSTR, HANDLE, DWORD); + typedef HMODULE (WINAPI *tLoadLibraryEx)(LPCWSTR, HANDLE, DWORD); tLoadLibraryEx pLoadLibraryEx; HINSTANCE hLib = LoadLibrary("kernel32.dll"); if (hLib) { - pLoadLibraryEx = (tLoadLibraryEx)GetProcAddress(hLib, "LoadLibraryExA"); + pLoadLibraryEx = (tLoadLibraryEx)GetProcAddress(hLib, "LoadLibraryExW"); if (pLoadLibraryEx) { - return pLoadLibraryEx(os_specific.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + return pLoadLibraryEx(os_specific_w.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH); } } - return LoadLibrary(os_specific.c_str()); + return LoadLibraryW(os_specific_w.c_str()); } bool From bbdc5d234153f9a617820a6a8d923d5ebf792b5a Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 22 Aug 2017 20:04:59 +0200 Subject: [PATCH 163/254] pnmimage: mark many heavy methods as BLOCKING to release GIL --- panda/src/pnmimage/pnmImage.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/panda/src/pnmimage/pnmImage.h b/panda/src/pnmimage/pnmImage.h index 2c45492029..2f7b653185 100644 --- a/panda/src/pnmimage/pnmImage.h +++ b/panda/src/pnmimage/pnmImage.h @@ -124,8 +124,8 @@ PUBLISHED: void make_grayscale(float rc, float gc, float bc); INLINE void make_rgb(); - void premultiply_alpha(); - void unpremultiply_alpha(); + BLOCKING void premultiply_alpha(); + BLOCKING void unpremultiply_alpha(); BLOCKING void reverse_rows(); BLOCKING void flip(bool flip_x, bool flip_y, bool transpose); @@ -244,27 +244,27 @@ PUBLISHED: // The bodies for the non-inline *_filter() functions can be found in the // file pnm-image-filter.cxx. - INLINE void box_filter(float radius = 1.0); - INLINE void gaussian_filter(float radius = 1.0); + BLOCKING INLINE void box_filter(float radius = 1.0); + BLOCKING INLINE void gaussian_filter(float radius = 1.0); - void unfiltered_stretch_from(const PNMImage ©); - void box_filter_from(float radius, const PNMImage ©); - void gaussian_filter_from(float radius, const PNMImage ©); - void quick_filter_from(const PNMImage ©, - int xborder = 0, int yborder = 0); + BLOCKING void unfiltered_stretch_from(const PNMImage ©); + BLOCKING void box_filter_from(float radius, const PNMImage ©); + BLOCKING void gaussian_filter_from(float radius, const PNMImage ©); + BLOCKING void quick_filter_from(const PNMImage ©, + int xborder = 0, int yborder = 0); void make_histogram(Histogram &hist); - void perlin_noise_fill(float sx, float sy, int table_size = 256, - unsigned long seed = 0); + BLOCKING void perlin_noise_fill(float sx, float sy, int table_size = 256, + unsigned long seed = 0); void perlin_noise_fill(StackedPerlinNoise2 &perlin); void remix_channels(const LMatrix4 &conv); - INLINE void gamma_correct(float from_gamma, float to_gamma); - INLINE void gamma_correct_alpha(float from_gamma, float to_gamma); - INLINE void apply_exponent(float gray_exponent); - INLINE void apply_exponent(float gray_exponent, float alpha_exponent); - INLINE void apply_exponent(float red_exponent, float green_exponent, float blue_exponent); - void apply_exponent(float red_exponent, float green_exponent, float blue_exponent, float alpha_exponent); + BLOCKING INLINE void gamma_correct(float from_gamma, float to_gamma); + BLOCKING INLINE void gamma_correct_alpha(float from_gamma, float to_gamma); + BLOCKING INLINE void apply_exponent(float gray_exponent); + BLOCKING INLINE void apply_exponent(float gray_exponent, float alpha_exponent); + BLOCKING INLINE void apply_exponent(float red_exponent, float green_exponent, float blue_exponent); + BLOCKING void apply_exponent(float red_exponent, float green_exponent, float blue_exponent, float alpha_exponent); LRGBColorf get_average_xel() const; LColorf get_average_xel_a() const; From b9437316b441f732ad56309e7d908d2799d2a646 Mon Sep 17 00:00:00 2001 From: kamgha Date: Sat, 26 Aug 2017 03:54:29 +0200 Subject: [PATCH 164/254] Add snake-case function names for 'threading2'-module Closes: #165 --- direct/src/stdpy/threading2.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/direct/src/stdpy/threading2.py b/direct/src/stdpy/threading2.py index 9beee770c0..d041faaa2b 100644 --- a/direct/src/stdpy/threading2.py +++ b/direct/src/stdpy/threading2.py @@ -24,9 +24,18 @@ from time import time as _time from traceback import format_exc as _format_exc # Rename some stuff so "from threading import *" is safe -__all__ = ['activeCount', 'Condition', 'currentThread', 'enumerate', 'Event', - 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', - 'Timer', 'setprofile', 'settrace', 'local', 'stack_size'] +__all__ = [ + 'enumerate', 'active_count', 'activeCount', + 'Condition', + 'current_thread', 'currentThread', + 'Event', + 'Lock', 'RLock', + 'Semaphore', 'BoundedSemaphore', + 'Thread', + 'Timer', + 'local', + 'setprofile', 'settrace', 'stack_size' + ] _start_new_thread = thread.start_new_thread _allocate_lock = thread.allocate_lock @@ -581,10 +590,12 @@ class Thread(_Verbose): assert self.__initialized, "Thread.__init__() not called" self.__name = str(name) - def isAlive(self): + def is_alive(self): assert self.__initialized, "Thread.__init__() not called" return self.__started and not self.__stopped + isAlive = is_alive + def isDaemon(self): assert self.__initialized, "Thread.__init__() not called" return self.__daemonic @@ -692,19 +703,23 @@ class _DummyThread(Thread): # Global API functions -def currentThread(): +def current_thread(): try: return _active[_get_ident()] except KeyError: - ##print "currentThread(): no current thread for", _get_ident() + ##print "current_thread(): no current thread for", _get_ident() return _DummyThread() -def activeCount(): +currentThread = current_thread + +def active_count(): _active_limbo_lock.acquire() count = len(_active) + len(_limbo) _active_limbo_lock.release() return count +activeCount = active_count + def enumerate(): _active_limbo_lock.acquire() active = list(_active.values()) + list(_limbo.values()) From 2d1f0e48664099c8c9ff60cd6f5e00bebd080e0a Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 27 Aug 2017 16:48:13 +0200 Subject: [PATCH 165/254] stdpy: update threading modules --- direct/src/stdpy/thread.py | 33 +++++++++++++---- direct/src/stdpy/threading.py | 16 ++++++--- direct/src/stdpy/threading2.py | 66 +++++++++++++++++----------------- 3 files changed, 72 insertions(+), 43 deletions(-) diff --git a/direct/src/stdpy/thread.py b/direct/src/stdpy/thread.py index 05090e65d8..07ed6dad3e 100644 --- a/direct/src/stdpy/thread.py +++ b/direct/src/stdpy/thread.py @@ -11,18 +11,32 @@ __all__ = [ 'interrupt_main', 'exit', 'allocate_lock', 'get_ident', 'stack_size', + 'force_yield', 'consider_yield', 'forceYield', 'considerYield', + 'TIMEOUT_MAX' ] from panda3d import core +import sys + +if sys.platform == "win32": + TIMEOUT_MAX = float(0xffffffff // 1000) +else: + TIMEOUT_MAX = float(0x7fffffffffffffff // 1000000000) # These methods are defined in Panda, and are particularly useful if # you may be running in Panda's SIMPLE_THREADS compilation mode. -forceYield = core.Thread.forceYield -considerYield = core.Thread.considerYield +force_yield = core.Thread.force_yield +consider_yield = core.Thread.consider_yield -class error(Exception): - pass +forceYield = force_yield +considerYield = consider_yield + +if sys.version_info >= (3, 3): + error = RuntimeError +else: + class error(Exception): + pass class LockType: """ Implements a mutex lock. Instead of directly subclassing @@ -36,13 +50,18 @@ class LockType: self.__cvar = core.ConditionVar(self.__lock) self.__locked = False - def acquire(self, waitflag = 1): + def acquire(self, waitflag = 1, timeout = -1): self.__lock.acquire() try: if self.__locked and not waitflag: return False - while self.__locked: - self.__cvar.wait() + + if timeout >= 0: + while self.__locked: + self.__cvar.wait(timeout) + else: + while self.__locked: + self.__cvar.wait() self.__locked = True return True diff --git a/direct/src/stdpy/threading.py b/direct/src/stdpy/threading.py index 5c8af3cc62..1bd0bdd9c8 100644 --- a/direct/src/stdpy/threading.py +++ b/direct/src/stdpy/threading.py @@ -35,11 +35,15 @@ __all__ = [ 'Event', 'Timer', 'local', - 'current_thread', 'currentThread', - 'enumerate', 'active_count', 'activeCount', + 'current_thread', + 'main_thread', + 'enumerate', 'active_count', 'settrace', 'setprofile', 'stack_size', + 'TIMEOUT_MAX', ] +TIMEOUT_MAX = _thread.TIMEOUT_MAX + local = _thread._local _newname = _thread._newname @@ -111,8 +115,7 @@ class Thread(ThreadBase): def is_alive(self): return self.__thread.isStarted() - def isAlive(self): - return self.__thread.isStarted() + isAlive = is_alive def start(self): if self.__thread.isStarted(): @@ -379,6 +382,10 @@ def current_thread(): t = core.Thread.getCurrentThread() return _thread._get_thread_wrapper(t, _create_thread_wrapper) +def main_thread(): + t = core.Thread.getMainThread() + return _thread._get_thread_wrapper(t, _create_thread_wrapper) + currentThread = current_thread def enumerate(): @@ -394,6 +401,7 @@ def enumerate(): def active_count(): return len(enumerate()) + activeCount = active_count _settrace_func = None diff --git a/direct/src/stdpy/threading2.py b/direct/src/stdpy/threading2.py index d041faaa2b..6e25f5208c 100644 --- a/direct/src/stdpy/threading2.py +++ b/direct/src/stdpy/threading2.py @@ -15,7 +15,7 @@ implementation. """ import sys as _sys -from direct.stdpy import thread +from direct.stdpy import thread as _thread from direct.stdpy.thread import stack_size, _newname, _local as local from panda3d import core _sleep = core.Thread.sleep @@ -23,25 +23,19 @@ _sleep = core.Thread.sleep from time import time as _time from traceback import format_exc as _format_exc -# Rename some stuff so "from threading import *" is safe -__all__ = [ - 'enumerate', 'active_count', 'activeCount', - 'Condition', - 'current_thread', 'currentThread', - 'Event', - 'Lock', 'RLock', - 'Semaphore', 'BoundedSemaphore', - 'Thread', - 'Timer', - 'local', - 'setprofile', 'settrace', 'stack_size' - ] +__all__ = ['get_ident', 'active_count', 'Condition', 'current_thread', + 'enumerate', 'main_thread', 'TIMEOUT_MAX', + 'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', + 'Timer', 'ThreadError', + 'setprofile', 'settrace', 'local', 'stack_size'] -_start_new_thread = thread.start_new_thread -_allocate_lock = thread.allocate_lock -_get_ident = thread.get_ident -ThreadError = thread.error -del thread +# Rename some stuff so "from threading import *" is safe +_start_new_thread = _thread.start_new_thread +_allocate_lock = _thread.allocate_lock +get_ident = _thread.get_ident +ThreadError = _thread.error +TIMEOUT_MAX = _thread.TIMEOUT_MAX +del _thread # Debug support (adapted from ihooks.py). @@ -455,7 +449,7 @@ class Thread(_Verbose): try: self.__started = True _active_limbo_lock.acquire() - _active[_get_ident()] = self + _active[get_ident()] = self del _limbo[self] _active_limbo_lock.release() if __debug__: @@ -546,7 +540,7 @@ class Thread(_Verbose): _active_limbo_lock.acquire() try: try: - del _active[_get_ident()] + del _active[get_ident()] except KeyError: if 'dummy_threading' not in _sys.modules: raise @@ -645,7 +639,7 @@ class _MainThread(Thread): Thread.__init__(self, name="MainThread") self._Thread__started = True _active_limbo_lock.acquire() - _active[_get_ident()] = self + _active[get_ident()] = self _active_limbo_lock.release() def _set_daemon(self): @@ -664,12 +658,6 @@ class _MainThread(Thread): self._note("%s: exiting", self) self._Thread__delete() -def _pickSomeNonDaemonThread(): - for t in enumerate(): - if not t.isDaemon() and t.isAlive(): - return t - return None - # Dummy thread class to represent threads not started here. # These aren't garbage collected when they die, nor can they be waited for. @@ -691,7 +679,7 @@ class _DummyThread(Thread): self._Thread__started = True _active_limbo_lock.acquire() - _active[_get_ident()] = self + _active[get_ident()] = self _active_limbo_lock.release() def _set_daemon(self): @@ -705,9 +693,9 @@ class _DummyThread(Thread): def current_thread(): try: - return _active[_get_ident()] + return _active[get_ident()] except KeyError: - ##print "current_thread(): no current thread for", _get_ident() + ##print "current_thread(): no current thread for", get_ident() return _DummyThread() currentThread = current_thread @@ -732,7 +720,21 @@ def enumerate(): # and make it available for the interpreter # (Py_Main) as threading._shutdown. -_shutdown = _MainThread()._exitfunc +_main_thread = _MainThread() +_shutdown = _main_thread._exitfunc + +def _pickSomeNonDaemonThread(): + for t in enumerate(): + if not t.isDaemon() and t.isAlive(): + return t + return None + +def main_thread(): + """Return the main thread object. + In normal conditions, the main thread is the thread from which the + Python interpreter was started. + """ + return _main_thread # get thread-local implementation, either from the thread # module, or from the python fallback From 1dc02f6a2887c754cfdd090b3f0ed9fdbeab3d7f Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 27 Aug 2017 16:55:26 +0200 Subject: [PATCH 166/254] stdpy: fix direct.stdpy.threading cleanup issue after thread runs Fixes: #164 --- direct/src/stdpy/threading.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/direct/src/stdpy/threading.py b/direct/src/stdpy/threading.py index 1bd0bdd9c8..2a1c875539 100644 --- a/direct/src/stdpy/threading.py +++ b/direct/src/stdpy/threading.py @@ -102,7 +102,14 @@ class Thread(ThreadBase): self.__dict__['daemon'] = current.daemon self.__dict__['name'] = name - self.__thread = core.PythonThread(self.run, None, name, name) + def call_run(): + # As soon as the thread is done, break the circular reference. + try: + self.run() + finally: + self.__thread = None + + self.__thread = core.PythonThread(call_run, None, name, name) threadId = _thread._add_thread(self.__thread, weakref.proxy(self)) self.__dict__['ident'] = threadId @@ -113,12 +120,12 @@ class Thread(ThreadBase): _thread._remove_thread_id(self.ident) def is_alive(self): - return self.__thread.isStarted() + return self.__thread is not None and self.__thread.is_started() isAlive = is_alive def start(self): - if self.__thread.isStarted(): + if self.__thread is None or self.__thread.is_started(): raise RuntimeError if not self.__thread.start(core.TPNormal, True): @@ -393,7 +400,7 @@ def enumerate(): _thread._threadsLock.acquire() try: for thread, locals, wrapper in list(_thread._threads.values()): - if wrapper and thread.isStarted(): + if wrapper and wrapper.is_alive(): tlist.append(wrapper) return tlist finally: From c66b4792d745aacb4a848465a767edf87e7ab6b9 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 29 Aug 2017 23:43:51 +0200 Subject: [PATCH 167/254] stdpy: protect against thread error when interpreter shuts down --- direct/src/stdpy/thread.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/direct/src/stdpy/thread.py b/direct/src/stdpy/thread.py index 07ed6dad3e..d6146ec997 100644 --- a/direct/src/stdpy/thread.py +++ b/direct/src/stdpy/thread.py @@ -221,6 +221,10 @@ def _get_thread_locals(thread, i): def _remove_thread_id(threadId): """ Removes the thread with the indicated ID from the thread list. """ + # On interpreter shutdown, Python may set module globals to None. + if _threadsLock is None or _threads is None: + return + _threadsLock.acquire() try: thread, locals, wrapper = _threads[threadId] From a925e0bcd909e686600da9e08722f2d7f42b1ab8 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 29 Aug 2017 23:51:15 +0200 Subject: [PATCH 168/254] x11: fix loading 24-bpp ico/cur image alpha with width 24 --- panda/src/x11display/x11GraphicsWindow.cxx | 24 +++++++++------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/panda/src/x11display/x11GraphicsWindow.cxx b/panda/src/x11display/x11GraphicsWindow.cxx index 17a8121efc..8efbf01b5d 100644 --- a/panda/src/x11display/x11GraphicsWindow.cxx +++ b/panda/src/x11display/x11GraphicsWindow.cxx @@ -2280,9 +2280,11 @@ read_ico(istream &ico) { if (!ico.good()) goto cleanup; } + int and_stride = ((infoHeader.width >> 3) + 3) & ~0x03; + // Read in the pixel data. xorBmpSize = (infoHeader.width * (infoHeader.height / 2) * bitsPerPixel) / 8; - andBmpSize = (infoHeader.width * (infoHeader.height / 2)) / 8; + andBmpSize = and_stride * (infoHeader.height / 2); curXor = xorBmp = new char[xorBmpSize]; curAnd = andBmp = new char[andBmpSize]; ico.read(xorBmp, xorBmpSize); @@ -2330,21 +2332,15 @@ read_ico(istream &ico) { // Pack each of the three bytes into a single color, BGR -> 0RGB for (i = image->height - 1; i >= 0; i--) { for (j = 0; j < image->width; j++) { - image->pixels[(i * image->width) + j] = (*(curXor + 2) << 16) + - (*(curXor + 1) << 8) + (*curXor); + shift = 7 - (j & 0x7); + uint32_t alpha = (curAnd[j >> 3] & (1 << shift)) ? 0 : 0xff000000U; + image->pixels[(i * image->width) + j] = (uint8_t)curXor[0] + | ((uint8_t)curXor[1] << 8u) + | ((uint8_t)curXor[2] << 16u) + | alpha; curXor += 3; } - - // Set the alpha byte properly according to the andBmp. - for (j = 0; j < image->width; j += 8) { - for (k = 0; k < 8; k++) { - shift = 7 - k; - image->pixels[(i * image->width) + j + k] |= - ((*curAnd & (1 << shift)) >> shift) ? 0x0 : (0xff << 24); - } - - curAnd++; - } + curAnd += and_stride; } break; From 1f017997f9d298fe6baaba81ac6f909142d46138 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 30 Aug 2017 13:00:02 +0200 Subject: [PATCH 169/254] stdpy: fix issues with direct.stdpy.threading thread cleanup Fixes: #164 --- direct/src/stdpy/thread.py | 9 +++++---- direct/src/stdpy/threading.py | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/direct/src/stdpy/thread.py b/direct/src/stdpy/thread.py index d6146ec997..c10675dd4c 100644 --- a/direct/src/stdpy/thread.py +++ b/direct/src/stdpy/thread.py @@ -227,10 +227,11 @@ def _remove_thread_id(threadId): _threadsLock.acquire() try: - thread, locals, wrapper = _threads[threadId] - assert thread.getPythonIndex() == threadId - del _threads[threadId] - thread.setPythonIndex(-1) + if threadId in _threads: + thread, locals, wrapper = _threads[threadId] + assert thread.getPythonIndex() == threadId + del _threads[threadId] + thread.setPythonIndex(-1) finally: _threadsLock.release() diff --git a/direct/src/stdpy/threading.py b/direct/src/stdpy/threading.py index 2a1c875539..b4cb6d9228 100644 --- a/direct/src/stdpy/threading.py +++ b/direct/src/stdpy/threading.py @@ -108,6 +108,7 @@ class Thread(ThreadBase): self.run() finally: self.__thread = None + _thread._remove_thread_id(self.ident) self.__thread = core.PythonThread(call_run, None, name, name) threadId = _thread._add_thread(self.__thread, weakref.proxy(self)) @@ -120,15 +121,17 @@ class Thread(ThreadBase): _thread._remove_thread_id(self.ident) def is_alive(self): - return self.__thread is not None and self.__thread.is_started() + thread = self.__thread + return thread is not None and thread.is_started() isAlive = is_alive def start(self): - if self.__thread is None or self.__thread.is_started(): + thread = self.__thread + if thread is None or thread.is_started(): raise RuntimeError - if not self.__thread.start(core.TPNormal, True): + if not thread.start(core.TPNormal, True): raise RuntimeError def run(self): @@ -142,8 +145,12 @@ class Thread(ThreadBase): def join(self, timeout = None): # We don't support a timed join here, sorry. assert timeout is None - self.__thread.join() - self.__thread = None + thread = self.__thread + if thread is not None: + thread.join() + # Clear the circular reference. + self.__thread = None + _thread._remove_thread_id(self.ident) def setName(self, name): self.__dict__['name'] = name From f09d767c6ec30fff501a1decd25e4277172d727e Mon Sep 17 00:00:00 2001 From: kamgha Date: Thu, 31 Aug 2017 13:03:17 +0200 Subject: [PATCH 170/254] pnmimagetypes: introduce png-compression-level PRC variable --- panda/src/pnmimagetypes/config_pnmimagetypes.cxx | 12 ++++++++++-- panda/src/pnmimagetypes/config_pnmimagetypes.h | 1 + panda/src/pnmimagetypes/pnmFileTypePNG.cxx | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/panda/src/pnmimagetypes/config_pnmimagetypes.cxx b/panda/src/pnmimagetypes/config_pnmimagetypes.cxx index c498951f3f..2fc23d574a 100644 --- a/panda/src/pnmimagetypes/config_pnmimagetypes.cxx +++ b/panda/src/pnmimagetypes/config_pnmimagetypes.cxx @@ -81,6 +81,7 @@ ConfigVariableInt img_size ("img-size", 0, PRC_DESC("If an IMG file without a header is loaded (e.g. img-header-type " "is set to 'none', this specifies the fixed x y size of the image.")); + ConfigVariableInt jpeg_quality ("jpeg-quality", 95, PRC_DESC("Set this to the quality percentage for writing JPEG files. 95 is " @@ -88,10 +89,17 @@ ConfigVariableInt jpeg_quality "significantly better quality, but do lead to significantly greater " "size).")); +ConfigVariableInt png_compression_level +("png-compression-level", 6, + PRC_DESC("Set this to the desired compression level for writing PNG images. " + "Valid values are 0 (no compression), or 1 (compression, best " + "speed) to 9 (best compression). Default is 6. PNG compression is " + "lossless.")); + ConfigVariableBool png_palette ("png-palette", true, - PRC_DESC("Set this true to allow writing palette-based PNG images when possible.")); - + PRC_DESC("Set this true to allow writing palette-based PNG images when " + "possible.")); ConfigVariableInt bmp_bpp ("bmp-bpp", 0, diff --git a/panda/src/pnmimagetypes/config_pnmimagetypes.h b/panda/src/pnmimagetypes/config_pnmimagetypes.h index dca563a683..95ed9224a5 100644 --- a/panda/src/pnmimagetypes/config_pnmimagetypes.h +++ b/panda/src/pnmimagetypes/config_pnmimagetypes.h @@ -57,6 +57,7 @@ extern ConfigVariableBool tga_grayscale; extern ConfigVariableInt jpeg_quality; +extern ConfigVariableInt png_compression_level; extern ConfigVariableBool png_palette; extern ConfigVariableInt bmp_bpp; diff --git a/panda/src/pnmimagetypes/pnmFileTypePNG.cxx b/panda/src/pnmimagetypes/pnmFileTypePNG.cxx index 49cbc2faba..bf4ab4ac31 100644 --- a/panda/src/pnmimagetypes/pnmFileTypePNG.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypePNG.cxx @@ -526,6 +526,10 @@ write_data(xel *array, xelval *alpha_data) { png_set_write_fn(_png, (void *)this, png_write_data, png_flush_data); + // The compression level corresponds directly to the compression levels for + // zlib. + png_set_compression_level(_png, png_compression_level); + // First, write the header. int true_bit_depth = pm_maxvaltobits(_maxval); From 82eec0302b716eb724976d4a0ad230e9458bfcb8 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 4 Sep 2017 13:03:37 +0200 Subject: [PATCH 171/254] ShaderGenerator: fix point light shadow regression Fixes: #167 --- panda/src/display/graphicsStateGuardian.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 0d337a803e..f0d807ffce 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -1455,8 +1455,8 @@ fetch_specified_part(Shader::ShaderMatInput part, InternalName *name, t.set_row(2, LVecBase4(d, cutoff)); } else if (node->is_of_type(PointLight::get_class_type())) { - t.set_cell(1, 3, lens->get_near()); - t.set_cell(3, 3, lens->get_far()); + t.set_cell(1, 3, lens->get_far()); + t.set_cell(3, 3, lens->get_near()); if (node->is_of_type(SphereLight::get_class_type())) { t.set_cell(2, 3, ((const SphereLight *)node)->get_radius()); From b8cb51715295c6452577849307412057aa0ff74f Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 16 Sep 2017 22:04:16 +0200 Subject: [PATCH 172/254] actor: comment out unused line of code Fixes #170 --- direct/src/actor/Actor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/direct/src/actor/Actor.py b/direct/src/actor/Actor.py index 5a64c1fe2a..8a7ef093b0 100644 --- a/direct/src/actor/Actor.py +++ b/direct/src/actor/Actor.py @@ -897,7 +897,7 @@ class Actor(DirectObject, NodePath): return ((toFrame+1)-fromFrame) / animControl.getFrameRate() def getNumFrames(self, animName=None, partName=None): - lodName = next(iter(self.__animControlDict)) + #lodName = next(iter(self.__animControlDict)) controls = self.getAnimControls(animName, partName) if len(controls) == 0: return None From 35349b622444884b1fb91dbde940a9b235cdcf61 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 17 Sep 2017 01:38:59 +0200 Subject: [PATCH 173/254] Expose DatagramOutputFile to Python, add props to DatagramSink --- panda/src/express/datagramSink.h | 4 ++++ panda/src/putil/datagramOutputFile.h | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/panda/src/express/datagramSink.h b/panda/src/express/datagramSink.h index 0c1b74449c..c72cf7595d 100644 --- a/panda/src/express/datagramSink.h +++ b/panda/src/express/datagramSink.h @@ -40,6 +40,10 @@ PUBLISHED: virtual const Filename &get_filename(); virtual const FileReference *get_file(); virtual streampos get_file_pos(); + + MAKE_PROPERTY(filename, get_filename); + MAKE_PROPERTY(file, get_file); + MAKE_PROPERTY(file_pos, get_file_pos); }; #include "datagramSink.I" diff --git a/panda/src/putil/datagramOutputFile.h b/panda/src/putil/datagramOutputFile.h index d2013c75ee..bd2007219a 100644 --- a/panda/src/putil/datagramOutputFile.h +++ b/panda/src/putil/datagramOutputFile.h @@ -28,14 +28,13 @@ * header followed by a number of datagrams. */ class EXPCL_PANDA_PUTIL DatagramOutputFile : public DatagramSink { -public: +PUBLISHED: INLINE DatagramOutputFile(); INLINE ~DatagramOutputFile(); bool open(const FileReference *file); INLINE bool open(const Filename &filename); bool open(ostream &out, const Filename &filename = Filename()); - INLINE ostream &get_stream(); void close(); @@ -46,10 +45,16 @@ public: virtual bool is_error(); virtual void flush(); +public: virtual const Filename &get_filename(); virtual const FileReference *get_file(); virtual streampos get_file_pos(); + INLINE ostream &get_stream(); + +PUBLISHED: + MAKE_PROPERTY(stream, get_stream); + private: bool _wrote_first_datagram; bool _error; From 4018efc50d2a1ebafcf146079be815f3543334ed Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 19 Sep 2017 17:49:04 +0200 Subject: [PATCH 174/254] Fix travis build --- .travis.yml | 1 + makepanda/test_imports.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7d8a3003b6..36e4749240 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,7 @@ addons: - python-dev - python3-dev - zlib1g-dev + - fakeroot script: $PYTHONV makepanda/makepanda.py --everything --git-commit $TRAVIS_COMMIT $FLAGS --threads 4 && LD_LIBRARY_PATH=built/lib PYTHONPATH=built $PYTHONV makepanda/test_imports.py notifications: irc: diff --git a/makepanda/test_imports.py b/makepanda/test_imports.py index b5ab5c1977..290ec03e13 100644 --- a/makepanda/test_imports.py +++ b/makepanda/test_imports.py @@ -7,13 +7,19 @@ import os, importlib import direct.showbase.VerboseImport +import imp import panda3d dir = os.path.dirname(panda3d.__file__) -for basename in os.listdir(dir): - module, ext = os.path.splitext(basename) +extensions = set() +for suffix in imp.get_suffixes(): + extensions.add(suffix[0]) - if ext in ('.pyd', '.so'): +for basename in os.listdir(dir): + module = basename.split('.', 1)[0] + ext = basename[len(module):] + + if ext in extensions: importlib.import_module('panda3d.%s' % (module)) From 7ff8b62fb8e90d692ec098f06b97cd2d8a14747c Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 19 Sep 2017 18:46:21 +0200 Subject: [PATCH 175/254] interrogate: various fixes: * handle static methods with explicit self * fix len() and __setitem__ of mapping types * fix inheritance of __getattr__ and __setattr__ * fix overload resolution error with nullptr_t arguments * bool overloads now come after float/double overloads * record whether class is final in interrogatedb * add Dtool_EmptyTuple * optimization for final classes: no need for downcast --- dtool/src/interrogate/functionRemap.cxx | 18 +++--- dtool/src/interrogate/interfaceMaker.cxx | 2 +- .../interfaceMakerPythonNative.cxx | 64 ++++++++++++------- dtool/src/interrogate/interrogateBuilder.cxx | 24 +++++-- dtool/src/interrogatedb/interrogateType.I | 8 +++ dtool/src/interrogatedb/interrogateType.h | 2 + dtool/src/interrogatedb/py_panda.cxx | 14 ++-- dtool/src/interrogatedb/py_panda.h | 6 ++ 8 files changed, 90 insertions(+), 48 deletions(-) diff --git a/dtool/src/interrogate/functionRemap.cxx b/dtool/src/interrogate/functionRemap.cxx index d58cdf8b88..5b04209c48 100644 --- a/dtool/src/interrogate/functionRemap.cxx +++ b/dtool/src/interrogate/functionRemap.cxx @@ -772,16 +772,14 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak first_param = 1; } - if (_has_this || _type == T_constructor) { - if (_parameters.size() > (size_t)first_param && _parameters[first_param]._name == "self" && - TypeManager::is_pointer_to_PyObject(_parameters[first_param]._remap->get_orig_type())) { - // Here's a special case. If the first parameter of a nonstatic method - // is a PyObject * called "self", then we will automatically fill it in - // from the this pointer, and remove it from the generated parameter - // list. - _parameters.erase(_parameters.begin() + first_param); - _flags |= F_explicit_self; - } + if (_parameters.size() > (size_t)first_param && _parameters[first_param]._name == "self" && + TypeManager::is_pointer_to_PyObject(_parameters[first_param]._remap->get_orig_type())) { + // Here's a special case. If the first parameter of a nonstatic method + // is a PyObject * called "self", then we will automatically fill it in + // from the this pointer, and remove it from the generated parameter + // list. + _parameters.erase(_parameters.begin() + first_param); + _flags |= F_explicit_self; } if ((int)_parameters.size() == first_param) { diff --git a/dtool/src/interrogate/interfaceMaker.cxx b/dtool/src/interrogate/interfaceMaker.cxx index 527f983f8a..5c2e589e3c 100644 --- a/dtool/src/interrogate/interfaceMaker.cxx +++ b/dtool/src/interrogate/interfaceMaker.cxx @@ -616,7 +616,7 @@ record_function(const InterrogateType &itype, FunctionIndex func_index) { // If *any* of the variants of this function has a "this" pointer, // the entire set of functions is deemed to have a "this" pointer. - if (remap->_has_this) { + if (remap->_has_this || (remap->_flags & FunctionRemap::F_explicit_self) != 0) { func->_has_this = true; } diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index 4042136bab..7b9aa8487a 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -478,6 +478,11 @@ get_slotted_function_def(Object *obj, Function *func, FunctionRemap *remap, def._wrapper_type = WT_mapping_setitem; return true; } + if (remap->_flags & FunctionRemap::F_size) { + def._answer_location = "mp_length"; + def._wrapper_type = WT_sequence_size; + return true; + } } if (obj->_protocol_types & Object::PT_iter) { @@ -707,7 +712,10 @@ write_python_instance(ostream &out, int indent_level, const string &return_expr, string class_name = itype.get_scoped_name(); - if (IsPandaTypedObject(itype._cpptype->as_struct_type())) { + // We don't handle final classes via DTool_CreatePyInstanceTyped since we + // know it can't be of a subclass type, so we don't need to do the downcast. + CPPStructType *struct_type = itype._cpptype->as_struct_type(); + if (IsPandaTypedObject(struct_type) && !struct_type->is_final()) { // We can't let DTool_CreatePyInstanceTyped do the NULL check since we // will be grabbing the type index (which would obviously crash when // called on a NULL pointer), so we do it here. @@ -2100,10 +2108,10 @@ write_module_class(ostream &out, Object *obj) { for (ri = def._remaps.begin(); ri != def._remaps.end(); ++ri) { FunctionRemap *remap = (*ri); - if (remap->_flags & FunctionRemap::F_setitem_int) { + if (remap->_flags & FunctionRemap::F_setitem) { setitem_remaps.insert(remap); - } else if (remap->_flags & FunctionRemap::F_delitem_int) { + } else if (remap->_flags & FunctionRemap::F_delitem) { delitem_remaps.insert(remap); } } @@ -2137,14 +2145,21 @@ write_module_class(ostream &out, Object *obj) { out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; out << "static int " << def._wrapper_name << "(PyObject *self) {\n"; - out << " " << cClassName << " *local_this = NULL;\n"; - out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; - out << " return -1;\n"; - out << " }\n\n"; + // Find the remap. There should be only one. FunctionRemap *remap = *def._remaps.begin(); + const char *container = ""; + + if (remap->_has_this) { + out << " " << cClassName << " *local_this = NULL;\n"; + out << " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"; + out << " return -1;\n"; + out << " }\n\n"; + container = "local_this"; + } + vector_string params; - out << " return (int) " << remap->call_function(out, 4, false, "local_this", params) << ";\n"; + out << " return (int) " << remap->call_function(out, 4, false, container, params) << ";\n"; out << "}\n\n"; } break; @@ -2374,23 +2389,25 @@ write_module_class(ostream &out, Object *obj) { out << "// " << ClassName << " slot " << rfi->second._answer_location << " -> " << fname << "\n"; out << "//////////////////\n"; out << "static int " << def._wrapper_name << "(PyObject *self, visitproc visit, void *arg) {\n"; - out << " " << cClassName << " *local_this = NULL;\n"; - out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **) &local_this);\n"; - out << " if (local_this == NULL) {\n"; - out << " return 0;\n"; - out << " }\n\n"; // Find the remap. There should be only one. FunctionRemap *remap = *def._remaps.begin(); + const char *container = ""; - vector_string params(1); - if (remap->_flags & FunctionRemap::F_explicit_self) { - params.push_back("self"); + if (remap->_has_this) { + out << " " << cClassName << " *local_this = NULL;\n"; + out << " DTOOL_Call_ExtractThisPointerForType(self, &Dtool_" << ClassName << ", (void **) &local_this);\n"; + out << " if (local_this == NULL) {\n"; + out << " return 0;\n"; + out << " }\n\n"; + container = "local_this"; } + + vector_string params((int)remap->_has_this); params.push_back("visit"); params.push_back("arg"); - out << " return " << remap->call_function(out, 2, false, "local_this", params) << ";\n"; + out << " return " << remap->call_function(out, 2, false, container, params) << ";\n"; out << "}\n\n"; } break; @@ -2857,11 +2874,9 @@ write_module_class(ostream &out, Object *obj) { } // getattrofunc tp_getattro; - write_function_slot(out, 4, slots, "tp_getattro", - "PyObject_GenericGetAttr"); + write_function_slot(out, 4, slots, "tp_getattro"); // setattrofunc tp_setattro; - write_function_slot(out, 4, slots, "tp_setattro", - "PyObject_GenericSetAttr"); + write_function_slot(out, 4, slots, "tp_setattro"); // PyBufferProcs *tp_as_buffer; if (has_parent_class || has_local_getbuffer) { @@ -4180,7 +4195,7 @@ int get_type_sort(CPPType *type) { return 7; } else if (TypeManager::is_longlong(type)) { return 6; - } else if (TypeManager::is_integer(type)) { + } else if (TypeManager::is_integer(type) && !TypeManager::is_bool(type)) { return 5; } else if (TypeManager::is_double(type)) { return 4; @@ -4973,7 +4988,7 @@ write_function_instance(ostream &out, FunctionRemap *remap, format_specifiers += "O"; parameter_list += ", &" + param_name; } - pexpr_string = "NULL"; + pexpr_string = "nullptr"; expected_params += "NoneType"; } else if (TypeManager::is_char(type)) { @@ -5800,7 +5815,8 @@ write_function_instance(ostream &out, FunctionRemap *remap, indent_level += 2; } - if (!remap->_has_this && (remap->_flags & FunctionRemap::F_explicit_self) != 0) { + if (is_constructor && !remap->_has_this && + (remap->_flags & FunctionRemap::F_explicit_self) != 0) { // If we'll be passing "self" to the constructor, we need to pre- // initialize it here. Unfortunately, we can't pre-load the "this" // pointer, but the constructor itself can do this. diff --git a/dtool/src/interrogate/interrogateBuilder.cxx b/dtool/src/interrogate/interrogateBuilder.cxx index a36b370942..349e9c46ad 100644 --- a/dtool/src/interrogate/interrogateBuilder.cxx +++ b/dtool/src/interrogate/interrogateBuilder.cxx @@ -1850,12 +1850,24 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP continue; } + const CPPParameterList::Parameters ¶ms = ftype->_parameters->_parameters; + + size_t expected_num_args = (size_t)is_seq; + size_t index_arg = 0; + + if (!params.empty() && params[0]->get_simple_name() == "self" && + TypeManager::is_pointer_to_PyObject(params[0]->_type)) { + // Taking a PyObject *self argument. + expected_num_args += 1; + index_arg += 1; + } + // The getter must either take no arguments, or all defaults. - if (ftype->_parameters->_parameters.size() == (size_t)is_seq || - (ftype->_parameters->_parameters.size() > (size_t)is_seq && - ftype->_parameters->_parameters[(size_t)is_seq]->_initializer != NULL)) { + if (params.size() == expected_num_args || + (params.size() > expected_num_args && + params[expected_num_args]->_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)) { + if (is_seq && !TypeManager::is_integer(params[index_arg]->_type)) { continue; } @@ -2428,6 +2440,10 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, break; } + if (cpptype->is_final()) { + itype._flags |= InterrogateType::F_final; + } + if (cpptype->_file.is_c_file()) { // This type declaration appears in a .C file. We can only export types // defined in a .h file. diff --git a/dtool/src/interrogatedb/interrogateType.I b/dtool/src/interrogatedb/interrogateType.I index b5527bbd23..840fdb18f3 100644 --- a/dtool/src/interrogatedb/interrogateType.I +++ b/dtool/src/interrogatedb/interrogateType.I @@ -289,6 +289,14 @@ is_union() const { return (_flags & F_union) != 0; } +/** + * + */ +INLINE bool InterrogateType:: +is_final() const { + return (_flags & F_final) != 0; +} + /** * */ diff --git a/dtool/src/interrogatedb/interrogateType.h b/dtool/src/interrogatedb/interrogateType.h index 151e10b5f5..176efb4fb9 100644 --- a/dtool/src/interrogatedb/interrogateType.h +++ b/dtool/src/interrogatedb/interrogateType.h @@ -75,6 +75,7 @@ public: INLINE bool is_struct() const; INLINE bool is_class() const; INLINE bool is_union() const; + INLINE bool is_final() const; INLINE bool is_fully_defined() const; INLINE bool is_unpublished() const; @@ -139,6 +140,7 @@ private: F_typedef = 0x200000, F_array = 0x400000, F_scoped_enum = 0x800000, + F_final =0x1000000, }; public: diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index 7b920979ef..1156b6dfef 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -17,6 +17,8 @@ #ifdef HAVE_PYTHON +PyTupleObject Dtool_EmptyTuple; + PyMemberDef standard_type_members[] = { {(char *)"this", (sizeof(void*) == sizeof(int)) ? T_UINT : T_ULONGLONG, offsetof(Dtool_PyInstDef, _ptr_to_object), READONLY, (char *)"C++ 'this' pointer, if any"}, {(char *)"this_ownership", T_BOOL, offsetof(Dtool_PyInstDef, _memory_rules), READONLY, (char *)"C++ 'this' ownership rules"}, @@ -65,15 +67,6 @@ size_t PyLongOrInt_AsSize_t(PyObject *vv) { } #endif -#if PY_VERSION_HEX < 0x03060000 -INLINE static PyObject *_PyObject_CallNoArg(PyObject *func) { - PyObject *args = PyTuple_New(0); - PyObject *result = PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -#endif - /** * Given a valid (non-NULL) PyObject, does a simple check to see if it might * be an instance of a Panda type. It does this using a signature that is @@ -625,6 +618,9 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { return Dtool_Raise_TypeError("PyType_Ready(Dtool_StaticProperty_Type)"); } + // Initialize the "empty tuple". + (void)PyObject_INIT_VAR((PyObject *)&Dtool_EmptyTuple, &PyTuple_Type, 0); + // Initialize the base class of everything. Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(NULL); } diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index 05a787de9f..9df9fad4af 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -138,6 +138,12 @@ typedef long Py_hash_t; #define FMTCHAR_BYTES "s" #endif +extern EXPCL_INTERROGATEDB PyTupleObject Dtool_EmptyTuple; + +#ifndef _PyObject_CallNoArg +#define _PyObject_CallNoArg(func) PyObject_Call((func), (PyObject *)&Dtool_EmptyTuple, NULL) +#endif + using namespace std; // this is tempory .. untill this is glued better into the panda build system From 019df482d64c2fd73e469632da791860d17259ff Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 19 Sep 2017 19:16:48 +0200 Subject: [PATCH 176/254] windisplay: fix origin not changing upon window being dragged --- panda/src/windisplay/winGraphicsWindow.cxx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/panda/src/windisplay/winGraphicsWindow.cxx b/panda/src/windisplay/winGraphicsWindow.cxx index 1ccede6968..054581e1fd 100644 --- a/panda/src/windisplay/winGraphicsWindow.cxx +++ b/panda/src/windisplay/winGraphicsWindow.cxx @@ -1440,15 +1440,12 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { break; case WM_SIZE: + // Actually, since we don't return in WM_WINDOWPOSCHANGED, WM_SIZE won't + // end up being called at all. This is more efficient according to MSDN. if (windisplay_cat.is_debug()) { windisplay_cat.debug() << "WM_SIZE: " << hwnd << ", " << wparam << "\n"; } - - // Resist calling handle_reshape before the window has opened. - if (_hWnd != NULL) { - handle_reshape(); - } break; case WM_EXITSIZEMOVE: @@ -1456,8 +1453,15 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { break; case WM_WINDOWPOSCHANGED: + if (windisplay_cat.is_debug()) { + windisplay_cat.debug() + << "WM_WINDOWPOSCHANGED: " << hwnd << ", " << wparam << "\n"; + } + if (_hWnd != NULL) { + handle_reshape(); + } adjust_z_order(); - break; + return 0; case WM_PAINT: // In response to WM_PAINT, we check to see if there are any update From 1583196022ac5c2fd109f1c36e59ea5c32ca9c2d Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 19 Sep 2017 19:41:18 +0200 Subject: [PATCH 177/254] pystub: fix faulty definition of PyTuple_Type symbol --- dtool/src/pystub/pystub.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index c97cea7476..935b3a47b6 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -142,7 +142,6 @@ extern "C" { EXPCL_PYSTUB int PyTuple_New(...); EXPCL_PYSTUB int PyTuple_Pack(...); EXPCL_PYSTUB int PyTuple_Size(...); - EXPCL_PYSTUB int PyTuple_Type(...); EXPCL_PYSTUB int PyType_GenericAlloc(...); EXPCL_PYSTUB int PyType_IsSubtype(...); EXPCL_PYSTUB int PyType_Ready(...); @@ -224,6 +223,7 @@ extern "C" { EXPCL_PYSTUB extern void *PyExc_SystemExit; EXPCL_PYSTUB extern void *PyExc_TypeError; EXPCL_PYSTUB extern void *PyExc_ValueError; + EXPCL_PYSTUB extern void *PyTuple_Type; EXPCL_PYSTUB extern void *PyType_Type; EXPCL_PYSTUB extern void *_PyThreadState_Current; EXPCL_PYSTUB extern void *_Py_FalseStruct; @@ -363,7 +363,6 @@ int PyTuple_GetItem(...) { return 0; } int PyTuple_New(...) { return 0; } int PyTuple_Pack(...) { return 0; } int PyTuple_Size(...) { return 0; }; -int PyTuple_Type(...) { return 0; }; int PyType_GenericAlloc(...) { return 0; }; int PyType_IsSubtype(...) { return 0; } int PyType_Ready(...) { return 0; }; @@ -451,6 +450,7 @@ void *PyExc_StopIteration = (void *)NULL; void *PyExc_SystemExit = (void *)NULL; void *PyExc_TypeError = (void *)NULL; void *PyExc_ValueError = (void *)NULL; +void *PyTuple_Type = (void *)NULL; void *PyType_Type = (void *)NULL; void *_PyThreadState_Current = (void *)NULL; void *_Py_FalseStruct = (void *)NULL; From b71ee446e30f1ce86736186175ec256ca00382e2 Mon Sep 17 00:00:00 2001 From: Younguk Kim Date: Sun, 24 Sep 2017 02:46:00 +0900 Subject: [PATCH 178/254] Add has_hook functions taking function pointer or callback data in EventHandler --- panda/src/event/eventHandler.cxx | 40 ++++++++++++++++++++++++++++++++ panda/src/event/eventHandler.h | 3 +++ 2 files changed, 43 insertions(+) diff --git a/panda/src/event/eventHandler.cxx b/panda/src/event/eventHandler.cxx index a71e7fc12c..d67d0661dd 100644 --- a/panda/src/event/eventHandler.cxx +++ b/panda/src/event/eventHandler.cxx @@ -182,6 +182,46 @@ has_hook(const string &event_name) const { } +/** + * Returns true if there is the hook added on the indicated event name and + * function pointer, false otherwise. + */ +bool EventHandler:: +has_hook(const string &event_name, EventFunction *function) const { + assert(!event_name.empty()); + Hooks::const_iterator hi; + hi = _hooks.find(event_name); + if (hi != _hooks.end()) { + const Functions& functions = (*hi).second; + if (functions.find(function) != functions.end()) { + return true; + } + } + + return false; +} + + +/** + * Returns true if there is the hook added on the indicated event name, + * function pointer and callback data, false otherwise. + */ +bool EventHandler:: +has_hook(const string &event_name, EventCallbackFunction *function, void *data) const { + assert(!event_name.empty()); + CallbackHooks::const_iterator chi; + chi = _cbhooks.find(event_name); + if (chi != _cbhooks.end()) { + const CallbackFunctions& cbfunctions = (*chi).second; + if (cbfunctions.find(CallbackFunction(function, data)) != cbfunctions.end()) { + return true; + } + } + + return false; +} + + /** * Removes the indicated function from the named event hook. Returns true if * the hook was removed, false if it wasn't there in the first place. diff --git a/panda/src/event/eventHandler.h b/panda/src/event/eventHandler.h index 452082549e..6a299fcc0e 100644 --- a/panda/src/event/eventHandler.h +++ b/panda/src/event/eventHandler.h @@ -55,6 +55,9 @@ public: bool add_hook(const string &event_name, EventCallbackFunction *function, void *data); bool has_hook(const string &event_name) const; + bool has_hook(const string &event_name, EventFunction *function) const; + bool has_hook(const string &event_name, EventCallbackFunction *function, + void *data) const; bool remove_hook(const string &event_name, EventFunction *function); bool remove_hook(const string &event_name, EventCallbackFunction *function, void *data); From 85a9cdd052449b6dbbe680f0232ca9cbecd21a8c Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 5 Oct 2017 17:34:26 +0200 Subject: [PATCH 179/254] Add a way to get access to OpenGL texture index --- panda/src/glstuff/glTextureContext_src.cxx | 21 +++++++++++++++++++++ panda/src/glstuff/glTextureContext_src.h | 3 +++ panda/src/gobj/textureContext.cxx | 21 +++++++++++++++++++++ panda/src/gobj/textureContext.h | 2 ++ 4 files changed, 47 insertions(+) diff --git a/panda/src/glstuff/glTextureContext_src.cxx b/panda/src/glstuff/glTextureContext_src.cxx index a56d6a20a4..e36f8f756e 100644 --- a/panda/src/glstuff/glTextureContext_src.cxx +++ b/panda/src/glstuff/glTextureContext_src.cxx @@ -95,6 +95,27 @@ reset_data() { #endif } +/** + * Returns an implementation-defined handle or pointer that can be used + * to interface directly with the underlying API. + * Returns 0 if the underlying implementation does not support this. + */ +uint64_t CLP(TextureContext):: +get_native_id() const { + return _index; +} + +/** + * Similar to get_native_id, but some implementations use a separate + * identifier for the buffer object associated with buffer textures. + * Returns 0 if the underlying implementation does not support this, or + * if this is not a buffer texture. + */ +uint64_t CLP(TextureContext):: +get_native_buffer_id() const { + return _buffer; +} + /** * */ diff --git a/panda/src/glstuff/glTextureContext_src.h b/panda/src/glstuff/glTextureContext_src.h index 309550eced..9a345b397d 100644 --- a/panda/src/glstuff/glTextureContext_src.h +++ b/panda/src/glstuff/glTextureContext_src.h @@ -33,6 +33,9 @@ public: virtual void evict_lru(); void reset_data(); + virtual uint64_t get_native_id() const; + virtual uint64_t get_native_buffer_id() const; + #ifndef OPENGLES void make_handle_resident(); GLuint64 get_handle(); diff --git a/panda/src/gobj/textureContext.cxx b/panda/src/gobj/textureContext.cxx index b0130bcf24..32224a7bde 100644 --- a/panda/src/gobj/textureContext.cxx +++ b/panda/src/gobj/textureContext.cxx @@ -15,6 +15,27 @@ TypeHandle TextureContext::_type_handle; +/** + * Returns an implementation-defined handle or pointer that can be used + * to interface directly with the underlying API. + * Returns 0 if the underlying implementation does not support this. + */ +uint64_t TextureContext:: +get_native_id() const { + return 0; +} + +/** + * Similar to get_native_id, but some implementations use a separate + * identifier for the buffer object associated with buffer textures. + * Returns 0 if the underlying implementation does not support this, or + * if this is not a buffer texture. + */ +uint64_t TextureContext:: +get_native_buffer_id() const { + return 0; +} + /** * */ diff --git a/panda/src/gobj/textureContext.h b/panda/src/gobj/textureContext.h index 7f5a514c81..813cd37dd9 100644 --- a/panda/src/gobj/textureContext.h +++ b/panda/src/gobj/textureContext.h @@ -37,6 +37,8 @@ public: PUBLISHED: INLINE Texture *get_texture() const; INLINE int get_view() const; + virtual uint64_t get_native_id() const; + virtual uint64_t get_native_buffer_id() const; INLINE bool was_modified() const; INLINE bool was_properties_modified() const; From be8f4de33789cbb96551bb34b1ba85e7134d1e73 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 5 Oct 2017 17:35:31 +0200 Subject: [PATCH 180/254] display: add_render_texture should set correct texture format --- panda/src/display/graphicsOutput.cxx | 55 ++++++++++++++++++---------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/panda/src/display/graphicsOutput.cxx b/panda/src/display/graphicsOutput.cxx index afdaddf3d4..40895cff1f 100644 --- a/panda/src/display/graphicsOutput.cxx +++ b/panda/src/display/graphicsOutput.cxx @@ -227,14 +227,20 @@ clear_render_textures() { * You can specify a bitplane to attach the texture to. the legal choices * are: * - * * RTP_depth * RTP_depth_stencil * RTP_color * RTP_aux_rgba_0 * - * RTP_aux_rgba_1 * RTP_aux_rgba_2 * RTP_aux_rgba_3 + * - RTP_depth + * - RTP_depth_stencil + * - RTP_color + * - RTP_aux_rgba_0 + * - RTP_aux_rgba_1 + * - RTP_aux_rgba_2 + * - RTP_aux_rgba_3 * * If you do not specify a bitplane to attach the texture to, this routine * will use a default based on the texture's format: * - * * F_depth_component attaches to RTP_depth * F_depth_stencil attaches to - * RTP_depth_stencil * all other formats attach to RTP_color. + * - F_depth_component attaches to RTP_depth + * - F_depth_stencil attaches to RTP_depth_stencil + * - all other formats attach to RTP_color. * * The texture's format will be changed to match the format of the bitplane to * which it is attached. For example, if you pass in an F_rgba texture and @@ -283,32 +289,41 @@ add_render_texture(Texture *tex, RenderTextureMode mode, // bitplane, while we're at it). if (plane == RTP_depth) { - tex->set_format(Texture::F_depth_component); + _fb_properties.setup_depth_texture(tex); tex->set_match_framebuffer_format(true); + } else if (plane == RTP_depth_stencil) { tex->set_format(Texture::F_depth_stencil); - tex->set_component_type(Texture::T_unsigned_int_24_8); + if (_fb_properties.get_float_depth()) { + tex->set_component_type(Texture::T_float); + } else { + tex->set_component_type(Texture::T_unsigned_int_24_8); + } tex->set_match_framebuffer_format(true); - } else if ((plane == RTP_color)|| - (plane == RTP_aux_rgba_0)|| - (plane == RTP_aux_rgba_1)|| - (plane == RTP_aux_rgba_2)|| - (plane == RTP_aux_rgba_3)) { - tex->set_format(Texture::F_rgba); + + } else if (plane == RTP_color || + plane == RTP_aux_rgba_0 || + plane == RTP_aux_rgba_1 || + plane == RTP_aux_rgba_2 || + plane == RTP_aux_rgba_3) { + _fb_properties.setup_color_texture(tex); tex->set_match_framebuffer_format(true); - } else if ((plane == RTP_aux_hrgba_0)|| - (plane == RTP_aux_hrgba_1)|| - (plane == RTP_aux_hrgba_2)|| - (plane == RTP_aux_hrgba_3)) { + + } else if (plane == RTP_aux_hrgba_0 || + plane == RTP_aux_hrgba_1 || + plane == RTP_aux_hrgba_2 || + plane == RTP_aux_hrgba_3) { tex->set_format(Texture::F_rgba16); tex->set_match_framebuffer_format(true); - } else if ((plane == RTP_aux_float_0)|| - (plane == RTP_aux_float_1)|| - (plane == RTP_aux_float_2)|| - (plane == RTP_aux_float_3)) { + + } else if (plane == RTP_aux_float_0 || + plane == RTP_aux_float_1 || + plane == RTP_aux_float_2 || + plane == RTP_aux_float_3) { tex->set_format(Texture::F_rgba32); tex->set_component_type(Texture::T_float); tex->set_match_framebuffer_format(true); + } else { display_cat.error() << "add_render_texture: invalid bitplane specified.\n"; From 5ac3ccb6f6c9a8804eba291154a6dc1fdb8fb114 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 6 Oct 2017 14:54:36 +0200 Subject: [PATCH 181/254] Remove pointless direct/metalibs directory --- direct/metalibs/direct/direct.cxx | 10 ---------- makepanda/makepanda.py | 7 +------ 2 files changed, 1 insertion(+), 16 deletions(-) delete mode 100644 direct/metalibs/direct/direct.cxx diff --git a/direct/metalibs/direct/direct.cxx b/direct/metalibs/direct/direct.cxx deleted file mode 100644 index 41594bf60d..0000000000 --- a/direct/metalibs/direct/direct.cxx +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @file direct.cxx - * @author drose - * @date 2000-05-18 - */ - -// This is a dummy file whose sole purpose is to give the compiler something -// to compile when making libdirect.so in NO_DEFER mode, which generates an -// empty library that itself links with all the other shared libraries that -// make up libdirect. diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 5912388cda..696cc33857 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -3148,7 +3148,6 @@ if (PkgSkip("DIRECT")==0): CopyAllHeaders('direct/src/distributed') CopyAllHeaders('direct/src/interval') CopyAllHeaders('direct/src/showbase') - CopyAllHeaders('direct/metalibs/direct') CopyAllHeaders('direct/src/dcparse') if (RUNTIME or RTDIST): @@ -5213,10 +5212,6 @@ if (PkgSkip("DIRECT")==0): # if (PkgSkip("DIRECT")==0): - OPTS=['DIR:direct/metalibs/direct', 'BUILDING:DIRECT'] - TargetAdd('p3direct_direct.obj', opts=OPTS, input='direct.cxx') - - TargetAdd('libp3direct.dll', input='p3direct_direct.obj') TargetAdd('libp3direct.dll', input='p3directbase_directbase.obj') TargetAdd('libp3direct.dll', input='p3showbase_showBase.obj') if GetTarget() == 'darwin': @@ -5228,7 +5223,7 @@ if (PkgSkip("DIRECT")==0): TargetAdd('libp3direct.dll', input=COMMON_PANDA_LIBS) TargetAdd('libp3direct.dll', opts=['ADVAPI', 'OPENSSL', 'WINUSER', 'WINGDI']) - OPTS=['DIR:direct/metalibs/direct', 'PYTHON'] + OPTS=['PYTHON'] TargetAdd('direct_module.obj', input='libp3dcparser.in') TargetAdd('direct_module.obj', input='libp3showbase.in') TargetAdd('direct_module.obj', input='libp3deadrec.in') From dfa47e55ce0caa48435069752215beef86018f85 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 6 Oct 2017 18:23:37 +0200 Subject: [PATCH 182/254] express: fix PTA get_data in Python 3, fix CPTA construction Fixes: #173 --- panda/src/express/pointerToArray.h | 12 +- panda/src/express/pointerToArray_ext.I | 251 ++++++++++++++++--------- panda/src/express/pointerToArray_ext.h | 39 +++- 3 files changed, 198 insertions(+), 104 deletions(-) diff --git a/panda/src/express/pointerToArray.h b/panda/src/express/pointerToArray.h index d486f1b00f..b4458f17b8 100644 --- a/panda/src/express/pointerToArray.h +++ b/panda/src/express/pointerToArray.h @@ -105,9 +105,9 @@ PUBLISHED: INLINE void set_element(size_type n, const Element &value); EXTENSION(const Element &__getitem__(size_type n) const); EXTENSION(void __setitem__(size_type n, const Element &value)); - INLINE string get_data() const; - INLINE void set_data(const string &data); - INLINE string get_subdata(size_type n, size_type count) const; + EXTENSION(PyObject *get_data() const); + EXTENSION(void set_data(PyObject *data)); + EXTENSION(PyObject *get_subdata(size_type n, size_type count) const); INLINE void set_subdata(size_type n, size_type count, const string &data); INLINE int get_ref_count() const; INLINE int get_node_ref_count() const; @@ -255,14 +255,12 @@ PUBLISHED: INLINE ConstPointerToArray(const PointerToArray ©); INLINE ConstPointerToArray(const ConstPointerToArray ©); - EXTENSION(ConstPointerToArray(PyObject *self, PyObject *source)); - typedef TYPENAME pvector::size_type size_type; INLINE size_type size() const; INLINE const Element &get_element(size_type n) const; EXTENSION(const Element &__getitem__(size_type n) const); - INLINE string get_data() const; - INLINE string get_subdata(size_type n, size_type count) const; + EXTENSION(PyObject *get_data() const); + EXTENSION(PyObject *get_subdata(size_type n, size_type count) const); INLINE int get_ref_count() const; INLINE int get_node_ref_count() const; diff --git a/panda/src/express/pointerToArray_ext.I b/panda/src/express/pointerToArray_ext.I index b7126e8363..6b8a9d54d0 100644 --- a/panda/src/express/pointerToArray_ext.I +++ b/panda/src/express/pointerToArray_ext.I @@ -79,93 +79,26 @@ INLINE void Extension >:: __init__(PyObject *self, PyObject *source) { #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(source)) { - // User passed a buffer object. - Py_buffer view; - if (PyObject_GetBuffer(source, &view, PyBUF_CONTIG_RO) == -1) { - PyErr_SetString(PyExc_TypeError, - "PointerToArray constructor requires a contiguous buffer"); - return; - } - - if (view.itemsize != 1 && view.itemsize != sizeof(Element)) { - PyErr_SetString(PyExc_TypeError, - "buffer.itemsize does not match PointerToArray element size"); - return; - } - - if (view.len % sizeof(Element) != 0) { - PyErr_Format(PyExc_ValueError, - "byte buffer is not a multiple of %zu bytes", - sizeof(Element)); - return; - } - - if (view.len > 0) { - this->_this->resize(view.len / sizeof(Element)); - memcpy(this->_this->p(), view.buf, view.len); - } - - PyBuffer_Release(&view); +#else + if (PyString_CheckExact(source)) { +#endif + // It's a byte sequence, or any object that exports the buffer protocol. + this->set_data(source); return; } -#endif - if (!PySequence_Check(source)) { + // Don't allow a unicode object even though it's a sequence. + if (!PySequence_Check(source) || PyUnicode_CheckExact(source)) { // If passed with a non-sequence, this isn't the right constructor. PyErr_SetString(PyExc_TypeError, "PointerToArray constructor requires a sequence or buffer object"); return; } - // If we were passed a Python string, then instead of storing it character- - // at-a-time, just load the whole string as a data buffer. Not sure if this - // case is still necessary - don't Python strbytes objects export the buffer - // protocol, as above? -#if PY_MAJOR_VERSION >= 3 - if (PyBytes_Check(source)) { - int size = PyBytes_Size(source); - if (size % sizeof(Element) != 0) { - PyErr_Format(PyExc_ValueError, - "bytes object is not a multiple of %zu bytes", - sizeof(Element)); - return; - } - - int num_elements = size / sizeof(Element); - this->_this->insert(this->_this->begin(), num_elements, Element()); - - // Hope there aren't any constructors or destructors involved here. - if (size != 0) { - const char *data = PyBytes_AsString(source); - memcpy(this->_this->p(), data, size); - } - return; - } -#else - if (PyString_CheckExact(source)) { - int size = PyString_Size(source); - if (size % sizeof(Element) != 0) { - PyErr_Format(PyExc_ValueError, - "str object is not a multiple of %zu bytes", - sizeof(Element)); - return; - } - - int num_elements = size / sizeof(Element); - this->_this->insert(this->_this->begin(), num_elements, Element()); - - // Hope there aren't any constructors or destructors involved here. - if (size != 0) { - const char *data = PyString_AsString(source); - memcpy(this->_this->p(), data, size); - } - return; - } -#endif - // Now construct the internal list by copying the elements one-at-a-time // from Python. - PyObject *push_back = PyObject_GetAttrString(self, "push_back"); + PyObject *dict = ((Dtool_PyInstDef *)self)->_My_Type->_PyType.tp_dict; + PyObject *push_back = PyDict_GetItemString(dict, "push_back"); if (push_back == NULL) { PyErr_BadArgument(); return; @@ -174,19 +107,20 @@ __init__(PyObject *self, PyObject *source) { // We need to initialize the this pointer before we can call push_back. ((Dtool_PyInstDef *)self)->_ptr_to_object = (void *)this->_this; - int size = PySequence_Size(source); - for (int i = 0; i < size; ++i) { + Py_ssize_t size = PySequence_Size(source); + this->_this->reserve(size); + for (Py_ssize_t i = 0; i < size; ++i) { PyObject *item = PySequence_GetItem(source, i); if (item == NULL) { return; } - PyObject *result = PyObject_CallFunctionObjArgs(push_back, item, NULL); + PyObject *result = PyObject_CallFunctionObjArgs(push_back, self, item, NULL); Py_DECREF(item); if (result == NULL) { // Unable to add item--probably it wasn't of the appropriate type. PyErr_Print(); PyErr_Format(PyExc_TypeError, - "Element %d in sequence passed to PointerToArray " + "Element %zd in sequence passed to PointerToArray " "constructor could not be added", i); return; } @@ -213,15 +147,110 @@ __setitem__(size_t n, const Element &value) { } /** - * This special constructor accepts a Python list of elements, or a Python - * string (or a bytes object, in Python 3). + * This returns the entire contents of the vector as a block of raw data in a + * string (or bytes object, in Python 3). + * + * @deprecated use memoryview(pta) or bytearray(pta) instead. */ template -INLINE void Extension >:: -__init__(PyObject *self, PyObject *source) { - PointerToArray array; - invoke_extension(&array).__init__(self, source); - *(this->_this) = MOVE(array); +INLINE PyObject *Extension >:: +get_data() const { +#if PY_MAJOR_VERSION >= 3 + return PyBytes_FromStringAndSize((char *)this->_this->p(), sizeof(Element) * this->_this->size()); +#else + return PyString_FromStringAndSize((char *)this->_this->p(), sizeof(Element) * this->_this->size()); +#endif +} + +/** + * This method exists mainly to access the data of the array easily from a + * high-level language such as Python. + * + * This replaces the entire contents of the vector from a block of raw data + * in a string (or bytes object, in Python 3). + */ +template +INLINE void Extension >:: +set_data(PyObject *data) { +#if PY_VERSION_HEX >= 0x02060000 + if (PyObject_CheckBuffer(data)) { + // User passed a buffer object. + Py_buffer view; + if (PyObject_GetBuffer(data, &view, PyBUF_CONTIG_RO) == -1) { + PyErr_SetString(PyExc_TypeError, + "PointerToArray.set_data() requires a contiguous buffer"); + return; + } + + if (view.itemsize != 1 && view.itemsize != sizeof(Element)) { + PyErr_SetString(PyExc_TypeError, + "buffer.itemsize does not match PointerToArray element size"); + return; + } + + if (view.len % sizeof(Element) != 0) { + PyErr_Format(PyExc_ValueError, + "byte buffer is not a multiple of %zu bytes", + sizeof(Element)); + return; + } + + if (view.len > 0) { + this->_this->resize(view.len / sizeof(Element)); + memcpy(this->_this->p(), view.buf, view.len); + } else { + this->_this->clear(); + } + + PyBuffer_Release(&view); + } else { + Dtool_Raise_TypeError("PointerToArray.set_data() requires a buffer object"); + } +#else + // In Python 2.5 we didn't have the new buffer protocol, only str. + if (PyString_CheckExact(data)) { + int size = PyString_Size(data); + if (size % sizeof(Element) != 0) { + PyErr_Format(PyExc_ValueError, + "str object is not a multiple of %zu bytes", + sizeof(Element)); + return; + } + + int num_elements = size / sizeof(Element); + this->_this->insert(this->_this->begin(), num_elements, Element()); + + // Hope there aren't any constructors or destructors involved here. + if (size != 0) { + const char *ptr = PyString_AsString(data); + memcpy(this->_this->p(), ptr, size); + } else { + this->_this->clear(); + } + } else { + Dtool_Raise_TypeError("PointerToArray.set_data() requires a str"); + } +#endif +} + +/** + * This returns the contents of a portion of the vector--from element (n) + * through element (n + count - 1)--as a block of raw data in a string (or + * bytes object, in Python 3). + * + * @deprecated use memoryview(pta) or bytearray(pta) instead. + */ +template +INLINE PyObject *Extension >:: +get_subdata(size_t n, size_t count) const { + n = min(n, this->_this->size()); + count = max(count, n); + count = min(count, this->_this->size() - n); +#if PY_MAJOR_VERSION >= 3 + return PyBytes_FromStringAndSize((char *)(this->_this->p() + n), sizeof(Element) * count); +#else + return PyString_FromStringAndSize((char *)(this->_this->p() + n), sizeof(Element) * count); +#endif } /** @@ -233,6 +262,42 @@ __getitem__(size_t n) const { return (*this->_this)[n]; } +/** + * This returns the entire contents of the vector as a block of raw data in a + * string (or bytes object, in Python 3). + * + * @deprecated use memoryview(pta) or bytearray(pta) instead. + */ +template +INLINE PyObject *Extension >:: +get_data() const { +#if PY_MAJOR_VERSION >= 3 + return PyBytes_FromStringAndSize((char *)this->_this->p(), sizeof(Element) * this->_this->size()); +#else + return PyString_FromStringAndSize((char *)this->_this->p(), sizeof(Element) * this->_this->size()); +#endif +} + +/** + * This returns the contents of a portion of the vector--from element (n) + * through element (n + count - 1)--as a block of raw data in a string (or + * bytes object, in Python 3). + * + * @deprecated use memoryview(pta) or bytearray(pta) instead. + */ +template +INLINE PyObject *Extension >:: +get_subdata(size_t n, size_t count) const { + n = min(n, this->_this->size()); + count = max(count, n); + count = min(count, this->_this->size() - n); +#if PY_MAJOR_VERSION >= 3 + return PyBytes_FromStringAndSize((char *)(this->_this->p() + n), sizeof(Element) * count); +#else + return PyString_FromStringAndSize((char *)(this->_this->p() + n), sizeof(Element) * count); +#endif +} + /** * This is used to implement the buffer protocol, in order to allow efficient * access to the array data through a Python multiview object. @@ -461,6 +526,9 @@ __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { #endif } +/** + * Specialization on __getbuffer__ for LMatrix3f. + */ template<> INLINE int Extension >:: __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { @@ -488,6 +556,9 @@ __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { #endif } +/** + * Specialization on __getbuffer__ for LMatrix3d. + */ template<> INLINE int Extension >:: __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { @@ -515,6 +586,9 @@ __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { #endif } +/** + * Specialization on __getbuffer__ for UnalignedLMatrix4f. + */ template<> INLINE int Extension >:: __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { @@ -542,6 +616,9 @@ __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { #endif } +/** + * Specialization on __getbuffer__ for UnalignedLMatrix4d. + */ template<> INLINE int Extension >:: __getbuffer__(PyObject *self, Py_buffer *view, int flags) const { diff --git a/panda/src/express/pointerToArray_ext.h b/panda/src/express/pointerToArray_ext.h index 9fea54cbc4..469b449fed 100644 --- a/panda/src/express/pointerToArray_ext.h +++ b/panda/src/express/pointerToArray_ext.h @@ -36,18 +36,29 @@ public: INLINE const Element &__getitem__(size_t n) const; INLINE void __setitem__(size_t n, const Element &value); + INLINE PyObject *get_data() const; + INLINE void set_data(PyObject *data); + INLINE PyObject *get_subdata(size_t n, size_t count) const; + INLINE int __getbuffer__(PyObject *self, Py_buffer *view, int flags); INLINE void __releasebuffer__(PyObject *self, Py_buffer *view) const; }; template<> - INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags); +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags); + template<> - INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags); +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags); + template<> - INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags); +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags); + template<> - INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags); +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags); /** * This class defines the extension methods for ConstPointerToArray, which are @@ -59,22 +70,30 @@ template<> template class Extension > : public ExtensionBase > { public: - INLINE void __init__(PyObject *self, PyObject *source); - INLINE const Element &__getitem__(size_t n) const; + INLINE PyObject *get_data() const; + INLINE PyObject *get_subdata(size_t n, size_t count) const; + INLINE int __getbuffer__(PyObject *self, Py_buffer *view, int flags) const; INLINE void __releasebuffer__(PyObject *self, Py_buffer *view) const; }; template<> - INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; + template<> - INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; + template<> - INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; + template<> - INLINE int Extension >::__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; +INLINE int Extension >:: +__getbuffer__(PyObject *self, Py_buffer *view, int flags) const; #ifdef _MSC_VER // Ugh... MSVC needs this because they still don't have a decent linker. From 8ed85c80c8e6d7769ff67f450eebe216bb539301 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 6 Oct 2017 23:59:17 +0200 Subject: [PATCH 183/254] linmath: permit single-argument/fill value for UnalignedLVecBase4 --- panda/src/linmath/lvecBase4_src.I | 21 +++++++++++++++++++++ panda/src/linmath/lvecBase4_src.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/panda/src/linmath/lvecBase4_src.I b/panda/src/linmath/lvecBase4_src.I index 70a376a3bf..464cd6fa12 100644 --- a/panda/src/linmath/lvecBase4_src.I +++ b/panda/src/linmath/lvecBase4_src.I @@ -903,6 +903,14 @@ FLOATNAME(UnalignedLVecBase4)(const FLOATNAME(LVecBase4) ©) { set(copy[0], copy[1], copy[2], copy[3]); } +/** + * + */ +INLINE_LINMATH FLOATNAME(UnalignedLVecBase4):: +FLOATNAME(UnalignedLVecBase4)(FLOATTYPE fill_value) { + fill(fill_value); +} + /** * */ @@ -912,6 +920,19 @@ FLOATNAME(UnalignedLVecBase4)(FLOATTYPE x, FLOATTYPE y, FLOATTYPE z, FLOATTYPE w set(x, y, z, w); } +/** + * Sets each element of the vector to the indicated fill_value. This is + * particularly useful for initializing to zero. + */ +INLINE_LINMATH void FLOATNAME(UnalignedLVecBase4):: +fill(FLOATTYPE fill_value) { + TAU_PROFILE("void UnalignedLVecBase4::fill()", " ", TAU_USER); + _v(0) = fill_value; + _v(1) = fill_value; + _v(2) = fill_value; + _v(3) = fill_value; +} + /** * */ diff --git a/panda/src/linmath/lvecBase4_src.h b/panda/src/linmath/lvecBase4_src.h index b6e1a4df35..fdd81dad4b 100644 --- a/panda/src/linmath/lvecBase4_src.h +++ b/panda/src/linmath/lvecBase4_src.h @@ -230,8 +230,10 @@ PUBLISHED: INLINE_LINMATH FLOATNAME(UnalignedLVecBase4)() DEFAULT_CTOR; INLINE_LINMATH FLOATNAME(UnalignedLVecBase4)(const FLOATNAME(LVecBase4) ©); + INLINE_LINMATH FLOATNAME(UnalignedLVecBase4)(FLOATTYPE fill_value); INLINE_LINMATH FLOATNAME(UnalignedLVecBase4)(FLOATTYPE x, FLOATTYPE y, FLOATTYPE z, FLOATTYPE w); + INLINE_LINMATH void fill(FLOATTYPE fill_value); INLINE_LINMATH void set(FLOATTYPE x, FLOATTYPE y, FLOATTYPE z, FLOATTYPE w); INLINE_LINMATH FLOATTYPE operator [](int i) const; From 0493b07f45a13ebab825cf8490ef3ee1d88a52c2 Mon Sep 17 00:00:00 2001 From: rdb Date: Sat, 7 Oct 2017 12:24:28 +0200 Subject: [PATCH 184/254] ppython: fix compile error on clang 4 --- direct/src/directbase/ppython.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/direct/src/directbase/ppython.cxx b/direct/src/directbase/ppython.cxx index 65f1272c8a..63ab21f3e9 100644 --- a/direct/src/directbase/ppython.cxx +++ b/direct/src/directbase/ppython.cxx @@ -98,7 +98,7 @@ int main(int argc, char *argv[]) { int sts = 0; PyObject* m = PyImport_ImportModule(IMPORT_MODULE_STR); - if (m <= 0) { + if (m == 0) { PyErr_Print(); sts = 1; } From 0e2b14cf4c659ef424cc78553b3d01ea8dcb49e4 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 8 Oct 2017 15:56:30 +0200 Subject: [PATCH 185/254] pgraph: custom binding for set_shader_input() Should be faster and more reliable at PTA handling We no longer need the interrogate perf hack for the first-arg InternalName Fixes: #161 --- .../interfaceMakerPythonNative.cxx | 72 +-- panda/src/pgraph/nodePath.h | 7 +- panda/src/pgraph/nodePath_ext.cxx | 201 +------ panda/src/pgraph/nodePath_ext.h | 1 + panda/src/pgraph/p3pgraph_ext_composite.cxx | 2 + panda/src/pgraph/shaderAttrib.h | 6 + panda/src/pgraph/shaderAttrib_ext.cxx | 71 +++ panda/src/pgraph/shaderAttrib_ext.h | 38 ++ panda/src/pgraph/shaderInput.h | 9 +- panda/src/pgraph/shaderInput_ext.cxx | 539 ++++++++++++++++++ panda/src/pgraph/shaderInput_ext.h | 37 ++ 11 files changed, 738 insertions(+), 245 deletions(-) create mode 100644 panda/src/pgraph/shaderAttrib_ext.cxx create mode 100644 panda/src/pgraph/shaderAttrib_ext.h create mode 100644 panda/src/pgraph/shaderInput_ext.cxx create mode 100644 panda/src/pgraph/shaderInput_ext.h diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index 7b9aa8487a..9f8820ffee 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -4389,57 +4389,6 @@ write_function_forset(ostream &out, std::sort(remaps.begin(), remaps.end(), RemapCompareLess); std::vector::const_iterator sii; - // Check if all of them have an InternalName pointer as first parameter. - // This is a dirty hack, of course, to work around an awkward overload - // resolution problem in NodePath::set_shader_input() (while perhaps also - // improving its performance). If I had more time I'd create a better - // solution. - bool first_internalname = false; - string first_pexpr2(first_pexpr); - if (first_pexpr.empty() && args_type != AT_no_args) { - first_internalname = true; - - for (sii = remaps.begin(); sii != remaps.end(); ++sii) { - remap = (*sii); - if (remap->_parameters.size() > (size_t)remap->_has_this) { - ParameterRemap *param = remap->_parameters[(size_t)remap->_has_this]._remap; - string param_name = param->get_orig_type()->get_local_name(&parser); - - if (param_name != "CPT_InternalName" && - param_name != "InternalName const *" && - param_name != "InternalName *") { - // Aw. - first_internalname = false; - break; - } - } else { - first_internalname = false; - break; - } - } - if (first_internalname) { - // Yeah, all remaps have a first InternalName parameter, so process - // that and remove it from the args tuple. - if (args_type == AT_single_arg) { - // Bit of a weird case, but whatever. - indent(out, indent_level) << "PyObject *name_obj = arg;\n"; - args_type = AT_no_args; - } else if (min_num_args == 2 && max_num_args == 2) { - indent(out, indent_level) << "PyObject *name_obj = PyTuple_GET_ITEM(args, 0);\n"; - indent(out, indent_level) << "PyObject *arg = PyTuple_GET_ITEM(args, 1);\n"; - args_type = AT_single_arg; - } else { - indent(out, indent_level) << "PyObject *name_obj = PyTuple_GET_ITEM(args, 0);\n"; - indent(out, indent_level) << "args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));\n"; - return_flags |= RF_decref_args; - } - indent(out, indent_level) << "PT(InternalName) name;\n"; - indent(out, indent_level) << "if (Dtool_Coerce_InternalName(name_obj, name)) {\n"; - indent_level += 2; - first_pexpr2 = "name"; - } - } - int num_coercion_possible = 0; sii = remaps.begin(); while (sii != remaps.end()) { @@ -4474,7 +4423,7 @@ write_function_forset(ostream &out, write_function_instance(out, remap, min_num_args, max_num_args, expected_params, indent_level + 2, false, false, args_type, return_flags, - check_exceptions, first_pexpr2); + check_exceptions, first_pexpr); indent(out, indent_level) << "}\n\n"; } @@ -4507,28 +4456,11 @@ write_function_forset(ostream &out, write_function_instance(out, remap, min_num_args, max_num_args, ignore_expected_params, indent_level + 2, true, false, args_type, return_flags, - check_exceptions, first_pexpr2); + check_exceptions, first_pexpr); indent(out, indent_level) << "}\n\n"; } } - - if (first_internalname) { - indent_level -= 2; - if (report_errors) { - indent(out, indent_level) << "} else {\n"; - - string class_name = remap->_cpptype->get_simple_name(); - ostringstream msg; - msg << classNameFromCppName(class_name, false) << "." - << methodNameFromCppName(remap, class_name, false) - << "() first argument must be str or InternalName"; - - error_raise_return(out, indent_level + 2, return_flags, - "TypeError", msg.str()); - } - indent(out, indent_level) << "}\n"; - } } else { // There is only one possible overload with this number of parameters. // Just call it. diff --git a/panda/src/pgraph/nodePath.h b/panda/src/pgraph/nodePath.h index e6eaca10cd..85eb068d55 100644 --- a/panda/src/pgraph/nodePath.h +++ b/panda/src/pgraph/nodePath.h @@ -630,9 +630,12 @@ PUBLISHED: void clear_shader(); void set_shader_input(ShaderInput input); - INLINE void set_shader_input(CPT_InternalName id, Texture *tex, int priority=0); + INLINE void set_shader_input(CPT_InternalName id, Texture *tex, const SamplerState &sampler, int priority=0); INLINE void set_shader_input(CPT_InternalName id, Texture *tex, bool read, bool write, int z=-1, int n=0, int priority=0); + +public: + INLINE void set_shader_input(CPT_InternalName id, Texture *tex, int priority=0); INLINE void set_shader_input(CPT_InternalName id, ShaderBuffer *buf, int priority=0); INLINE void set_shader_input(CPT_InternalName id, const NodePath &np, int priority=0); INLINE void set_shader_input(CPT_InternalName id, const PTA_float &v, int priority=0); @@ -659,6 +662,8 @@ PUBLISHED: INLINE void set_shader_input(CPT_InternalName id, PN_stdfloat n1, PN_stdfloat n2=0, PN_stdfloat n3=0, PN_stdfloat n4=0, int priority=0); +PUBLISHED: + EXTENSION(void set_shader_input(CPT_InternalName, PyObject *, int priority=0)); EXTENSION(void set_shader_inputs(PyObject *args, PyObject *kwargs)); void clear_shader_input(CPT_InternalName id); diff --git a/panda/src/pgraph/nodePath_ext.cxx b/panda/src/pgraph/nodePath_ext.cxx index 1d1449b423..4c0eba1ab0 100644 --- a/panda/src/pgraph/nodePath_ext.cxx +++ b/panda/src/pgraph/nodePath_ext.cxx @@ -13,6 +13,7 @@ #include "nodePath_ext.h" #include "typedWritable_ext.h" +#include "shaderInput_ext.h" #include "shaderAttrib.h" #ifdef HAVE_PYTHON @@ -25,35 +26,7 @@ extern struct Dtool_PyTypedObject Dtool_LPoint3d; #else extern struct Dtool_PyTypedObject Dtool_LPoint3f; #endif -extern struct Dtool_PyTypedObject Dtool_Texture; extern struct Dtool_PyTypedObject Dtool_NodePath; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_float; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_double; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_int; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4f; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3f; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2f; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLMatrix4f; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_LMatrix3f; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4d; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3d; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2d; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLMatrix4d; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_LMatrix3d; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4i; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3i; -extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2i; -extern struct Dtool_PyTypedObject Dtool_LVecBase4f; -extern struct Dtool_PyTypedObject Dtool_LVecBase3f; -extern struct Dtool_PyTypedObject Dtool_LVecBase2f; -extern struct Dtool_PyTypedObject Dtool_LVecBase4d; -extern struct Dtool_PyTypedObject Dtool_LVecBase3d; -extern struct Dtool_PyTypedObject Dtool_LVecBase2d; -extern struct Dtool_PyTypedObject Dtool_LVecBase4i; -extern struct Dtool_PyTypedObject Dtool_LVecBase3i; -extern struct Dtool_PyTypedObject Dtool_LVecBase2i; -extern struct Dtool_PyTypedObject Dtool_ShaderBuffer; -extern struct Dtool_PyTypedObject Dtool_ParamValueBase; #endif // CPPPARSER /** @@ -241,6 +214,28 @@ py_decode_NodePath_from_bam_stream_persist(PyObject *unpickler, const string &da return NodePath::decode_from_bam_stream(data, reader); } +/** + * Sets a single shader input. + */ +void Extension:: +set_shader_input(CPT_InternalName name, PyObject *value, int priority) { + PT(PandaNode) node = _this->node(); + CPT(RenderAttrib) prev_attrib = node->get_attrib(ShaderAttrib::get_class_slot()); + PT(ShaderAttrib) attrib; + if (prev_attrib == nullptr) { + attrib = new ShaderAttrib(); + } else { + attrib = new ShaderAttrib(*(const ShaderAttrib *)prev_attrib.p()); + } + + ShaderInput &input = attrib->_inputs[name]; + invoke_extension(&input).__init__(move(name), value); + + if (!_PyErr_OCCURRED()) { + node->set_attrib(ShaderAttrib::return_new(attrib)); + } +} + /** * Sets multiple shader inputs at the same time. This can be significantly * more efficient if many inputs need to be set at the same time. @@ -278,153 +273,13 @@ set_shader_inputs(PyObject *args, PyObject *kwargs) { } CPT_InternalName name(string(buffer, length)); - ShaderInput input(nullptr, 0); - - if (PyTuple_CheckExact(value)) { - // A tuple is interpreted as a vector. - Py_ssize_t size = PyTuple_GET_SIZE(value); - if (size > 4) { - Dtool_Raise_TypeError("NodePath.set_shader_inputs tuple input should not have more than 4 scalars"); - return; - } - // If any of them is a float, we are storing it as a float vector. - bool is_float = false; - for (Py_ssize_t i = 0; i < size; ++i) { - if (PyFloat_CheckExact(PyTuple_GET_ITEM(value, i))) { - is_float = true; - break; - } - } - if (is_float) { - LVecBase4 vec(0); - for (Py_ssize_t i = 0; i < size; ++i) { - vec[i] = (PN_stdfloat)PyFloat_AsDouble(PyTuple_GET_ITEM(value, i)); - } - input = ShaderInput(move(name), vec); - } else { - LVecBase4i vec(0); - for (Py_ssize_t i = 0; i < size; ++i) { - vec[i] = (int)PyLong_AsLong(PyTuple_GET_ITEM(value, i)); - } - input = ShaderInput(move(name), vec); - } - - } else if (DtoolCanThisBeAPandaInstance(value)) { - Dtool_PyInstDef *inst = (Dtool_PyInstDef *)value; - void *ptr; - - if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_Texture))) { - input = ShaderInput(move(name), (Texture *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_NodePath))) { - input = ShaderInput(move(name), *(const NodePath *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_float))) { - input = ShaderInput(move(name), *(const PTA_float *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_double))) { - input = ShaderInput(move(name), *(const PTA_double *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_int))) { - input = ShaderInput(move(name), *(const PTA_int *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4f))) { - input = ShaderInput(move(name), *(const PTA_LVecBase4f *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3f))) { - input = ShaderInput(move(name), *(const PTA_LVecBase3f *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2f))) { - input = ShaderInput(move(name), *(const PTA_LVecBase2f *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLMatrix4f))) { - input = ShaderInput(move(name), *(const PTA_LMatrix4f *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LMatrix3f))) { - input = ShaderInput(move(name), *(const PTA_LMatrix3f *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4d))) { - input = ShaderInput(move(name), *(const PTA_LVecBase4d *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3d))) { - input = ShaderInput(move(name), *(const PTA_LVecBase3d *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2d))) { - input = ShaderInput(move(name), *(const PTA_LVecBase2d *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLMatrix4d))) { - input = ShaderInput(move(name), *(const PTA_LMatrix4d *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LMatrix3d))) { - input = ShaderInput(move(name), *(const PTA_LMatrix3d *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4i))) { - input = ShaderInput(move(name), *(const PTA_LVecBase4i *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3i))) { - input = ShaderInput(move(name), *(const PTA_LVecBase3i *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2i))) { - input = ShaderInput(move(name), *(const PTA_LVecBase2i *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4f))) { - input = ShaderInput(move(name), *(const LVecBase4f *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3f))) { - input = ShaderInput(move(name), *(const LVecBase3f *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2f))) { - input = ShaderInput(move(name), *(const LVecBase2f *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4d))) { - input = ShaderInput(move(name), *(const LVecBase4d *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3d))) { - input = ShaderInput(move(name), *(const LVecBase3d *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2d))) { - input = ShaderInput(move(name), *(const LVecBase2d *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4i))) { - input = ShaderInput(move(name), *(const LVecBase4i *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3i))) { - input = ShaderInput(move(name), *(const LVecBase3i *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2i))) { - input = ShaderInput(move(name), *(const LVecBase2i *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_ShaderBuffer))) { - input = ShaderInput(move(name), (ShaderBuffer *)ptr); - - } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_ParamValueBase))) { - input = ShaderInput(move(name), (ParamValueBase *)ptr); - - } else { - Dtool_Raise_TypeError("unknown type passed to NodePath.set_shader_inputs"); - return; - } - - } else if (PyFloat_Check(value)) { - input = ShaderInput(move(name), LVecBase4(PyFloat_AS_DOUBLE(value), 0, 0, 0)); - -#if PY_MAJOR_VERSION < 3 - } else if (PyInt_Check(value)) { - input = ShaderInput(move(name), LVecBase4i((int)PyInt_AS_LONG(value), 0, 0, 0)); -#endif - - } else if (PyLong_Check(value)) { - input = ShaderInput(move(name), LVecBase4i((int)PyLong_AsLong(value), 0, 0, 0)); - - } else { - Dtool_Raise_TypeError("unknown type passed to NodePath.set_shader_inputs"); - return; - } - - attrib->_inputs[input.get_name()] = move(input); + ShaderInput &input = attrib->_inputs[name]; + invoke_extension(&input).__init__(move(name), value); } - node->set_attrib(ShaderAttrib::return_new(attrib)); + if (!_PyErr_OCCURRED()) { + node->set_attrib(ShaderAttrib::return_new(attrib)); + } } /** diff --git a/panda/src/pgraph/nodePath_ext.h b/panda/src/pgraph/nodePath_ext.h index 44c78378db..aa83f8be42 100644 --- a/panda/src/pgraph/nodePath_ext.h +++ b/panda/src/pgraph/nodePath_ext.h @@ -49,6 +49,7 @@ public: // This is defined to implement cycle detection in Python tags. INLINE int __traverse__(visitproc visit, void *arg); + void set_shader_input(CPT_InternalName id, PyObject *value, int priority=0); void set_shader_inputs(PyObject *args, PyObject *kwargs); PyObject *get_tight_bounds(const NodePath &other = NodePath()) const; diff --git a/panda/src/pgraph/p3pgraph_ext_composite.cxx b/panda/src/pgraph/p3pgraph_ext_composite.cxx index 6dc854b914..d16f600c0a 100644 --- a/panda/src/pgraph/p3pgraph_ext_composite.cxx +++ b/panda/src/pgraph/p3pgraph_ext_composite.cxx @@ -2,4 +2,6 @@ #include "nodePathCollection_ext.cxx" #include "pandaNode_ext.cxx" #include "renderState_ext.cxx" +#include "shaderAttrib_ext.cxx" +#include "shaderInput_ext.cxx" #include "transformState_ext.cxx" diff --git a/panda/src/pgraph/shaderAttrib.h b/panda/src/pgraph/shaderAttrib.h index 7f704cc10f..cb1eec37d9 100644 --- a/panda/src/pgraph/shaderAttrib.h +++ b/panda/src/pgraph/shaderAttrib.h @@ -73,6 +73,7 @@ PUBLISHED: // Shader Inputs CPT(RenderAttrib) set_shader_input(ShaderInput input) const; +public: INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, Texture *tex, int priority=0) const; INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const NodePath &np, int priority=0) const; INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const PTA_float &v, int priority=0) const; @@ -90,6 +91,10 @@ PUBLISHED: INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, double n1=0, double n2=0, double n3=0, double n4=1, int priority=0) const; +PUBLISHED: + EXTENSION(CPT(RenderAttrib) set_shader_input(CPT_InternalName, PyObject *, int priority=0) const); + EXTENSION(CPT(RenderAttrib) set_shader_inputs(PyObject *args, PyObject *kwargs) const); + CPT(RenderAttrib) set_instance_count(int instance_count) const; CPT(RenderAttrib) set_flag(int flag, bool value) const; @@ -150,6 +155,7 @@ private: Inputs _inputs; friend class Extension; + friend class Extension; PUBLISHED: static int get_class_slot() { diff --git a/panda/src/pgraph/shaderAttrib_ext.cxx b/panda/src/pgraph/shaderAttrib_ext.cxx new file mode 100644 index 0000000000..b98badf71b --- /dev/null +++ b/panda/src/pgraph/shaderAttrib_ext.cxx @@ -0,0 +1,71 @@ +/** + * 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 shaderAttrib_ext.cxx + * @author rdb + * @date 2017-10-08 + */ + +#include "shaderAttrib_ext.h" +#include "shaderInput_ext.h" + +#ifdef HAVE_PYTHON + +/** + * Returns a new ShaderAttrib with the given shader input set. + */ +CPT(RenderAttrib) Extension:: +set_shader_input(CPT_InternalName name, PyObject *value, int priority) const { + ShaderAttrib *attrib = new ShaderAttrib(*_this); + + ShaderInput &input = attrib->_inputs[name]; + invoke_extension(&input).__init__(move(name), value); + + return ShaderAttrib::return_new(attrib); +} + +/** + * Returns a new ShaderAttrib with the given shader inputs set. This is a + * more efficient way to set multiple shader inputs than calling + * set_shader_input multiple times. + */ +CPT(RenderAttrib) Extension:: +set_shader_inputs(PyObject *args, PyObject *kwargs) const { + if (PyObject_Size(args) > 0) { + Dtool_Raise_TypeError("ShaderAttrib.set_shader_inputs takes only keyword arguments"); + return nullptr; + } + + ShaderAttrib *attrib = new ShaderAttrib(*_this); + + PyObject *key, *value; + Py_ssize_t pos = 0; + + while (PyDict_Next(kwargs, &pos, &key, &value)) { + char *buffer; + Py_ssize_t length; +#if PY_MAJOR_VERSION >= 3 + buffer = (char *)PyUnicode_AsUTF8AndSize(key, &length); + if (buffer == nullptr) { +#else + if (PyString_AsStringAndSize(key, &buffer, &length) == -1) { +#endif + Dtool_Raise_TypeError("ShaderAttrib.set_shader_inputs accepts only string keywords"); + delete attrib; + return nullptr; + } + + CPT_InternalName name(string(buffer, length)); + ShaderInput &input = attrib->_inputs[name]; + invoke_extension(&input).__init__(move(name), value); + } + + return ShaderAttrib::return_new(attrib); +} + +#endif // HAVE_PYTHON diff --git a/panda/src/pgraph/shaderAttrib_ext.h b/panda/src/pgraph/shaderAttrib_ext.h new file mode 100644 index 0000000000..abf4fca751 --- /dev/null +++ b/panda/src/pgraph/shaderAttrib_ext.h @@ -0,0 +1,38 @@ +/** + * 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 shaderAttrib_ext.h + * @author rdb + * @date 2017-10-08 + */ + +#ifndef SHADERATTRIB_EXT_H +#define SHADERATTRIB_EXT_H + +#include "dtoolbase.h" + +#ifdef HAVE_PYTHON + +#include "extension.h" +#include "shaderAttrib.h" +#include "py_panda.h" + +/** + * This class defines the extension methods for ShaderAttrib, which are called + * instead of any C++ methods with the same prototype. + */ +template<> +class Extension : public ExtensionBase { +public: + CPT(RenderAttrib) set_shader_input(CPT_InternalName id, PyObject *value, int priority=0) const; + CPT(RenderAttrib) set_shader_inputs(PyObject *args, PyObject *kwargs) const; +}; + +#endif // HAVE_PYTHON + +#endif // SHADERATTRIB_EXT_H diff --git a/panda/src/pgraph/shaderInput.h b/panda/src/pgraph/shaderInput.h index ebf630fcaa..1947dc0f86 100644 --- a/panda/src/pgraph/shaderInput.h +++ b/panda/src/pgraph/shaderInput.h @@ -46,7 +46,11 @@ PUBLISHED: }; static const ShaderInput &get_blank(); - INLINE ShaderInput(CPT_InternalName name, int priority=0); + INLINE explicit ShaderInput(CPT_InternalName name, int priority=0); + + EXTENSION(explicit ShaderInput(CPT_InternalName name, PyObject *value, int priority=0)); + +public: INLINE ShaderInput(CPT_InternalName name, Texture *tex, int priority=0); INLINE ShaderInput(CPT_InternalName name, ParamValueBase *param, int priority=0); INLINE ShaderInput(CPT_InternalName name, ShaderBuffer *buf, int priority=0); @@ -83,6 +87,8 @@ PUBLISHED: INLINE ShaderInput(CPT_InternalName name, const LVecBase2i &vec, int priority=0); ShaderInput(CPT_InternalName name, const NodePath &np, int priority=0); + +PUBLISHED: ShaderInput(CPT_InternalName name, Texture *tex, bool read, bool write, int z=-1, int n=0, int priority=0); ShaderInput(CPT_InternalName name, Texture *tex, const SamplerState &sampler, int priority=0); @@ -132,6 +138,7 @@ private: int _type; friend class ShaderAttrib; + friend class Extension; }; #include "shaderInput.I" diff --git a/panda/src/pgraph/shaderInput_ext.cxx b/panda/src/pgraph/shaderInput_ext.cxx new file mode 100644 index 0000000000..00f42d7d53 --- /dev/null +++ b/panda/src/pgraph/shaderInput_ext.cxx @@ -0,0 +1,539 @@ +/** + * 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 shaderInput_ext.cxx + * @author rdb + * @date 2017-10-06 + */ + +#include "shaderInput_ext.h" +#include "paramNodePath.h" + +#ifdef HAVE_PYTHON + +#ifndef CPPPARSER +extern struct Dtool_PyTypedObject Dtool_Texture; +extern struct Dtool_PyTypedObject Dtool_NodePath; +extern struct Dtool_PyTypedObject Dtool_PointerToVoid; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_float; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_double; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_int; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLMatrix4f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LMatrix3f; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLMatrix4d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LMatrix3d; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_UnalignedLVecBase4i; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase3i; +extern struct Dtool_PyTypedObject Dtool_PointerToArray_LVecBase2i; +extern struct Dtool_PyTypedObject Dtool_LMatrix4f; +extern struct Dtool_PyTypedObject Dtool_LMatrix3f; +extern struct Dtool_PyTypedObject Dtool_LMatrix4d; +extern struct Dtool_PyTypedObject Dtool_LMatrix3d; +extern struct Dtool_PyTypedObject Dtool_LVecBase4f; +extern struct Dtool_PyTypedObject Dtool_LVecBase3f; +extern struct Dtool_PyTypedObject Dtool_LVecBase2f; +extern struct Dtool_PyTypedObject Dtool_LVecBase4d; +extern struct Dtool_PyTypedObject Dtool_LVecBase3d; +extern struct Dtool_PyTypedObject Dtool_LVecBase2d; +extern struct Dtool_PyTypedObject Dtool_LVecBase4i; +extern struct Dtool_PyTypedObject Dtool_LVecBase3i; +extern struct Dtool_PyTypedObject Dtool_LVecBase2i; +extern struct Dtool_PyTypedObject Dtool_ShaderBuffer; +extern struct Dtool_PyTypedObject Dtool_ParamValueBase; +#endif // CPPPARSER + +/** + * Sets a shader input from an arbitrary Python object. + */ +void Extension:: +__init__(CPT_InternalName name, PyObject *value, int priority) { + _this->_name = move(name); + _this->_priority = priority; + + if (PyTuple_CheckExact(value) && PyTuple_GET_SIZE(value) <= 4) { + // A tuple is interpreted as a vector. + Py_ssize_t size = PyTuple_GET_SIZE(value); + + // If any of them is a float, we are storing it as a float vector. + bool is_float = false; + for (Py_ssize_t i = 0; i < size; ++i) { + if (PyFloat_CheckExact(PyTuple_GET_ITEM(value, i))) { + is_float = true; + break; + } + } + if (is_float) { + LVecBase4 vec(0); + for (Py_ssize_t i = 0; i < size; ++i) { + vec[i] = (PN_stdfloat)PyFloat_AsDouble(PyTuple_GET_ITEM(value, i)); + } + _this->_type = ShaderInput::M_vector; + _this->_stored_ptr = vec; + _this->_stored_vector = vec; + } else { + LVecBase4i vec(0); + for (Py_ssize_t i = 0; i < size; ++i) { + vec[i] = (int)PyLong_AsLong(PyTuple_GET_ITEM(value, i)); + } + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = vec; + _this->_stored_vector = LCAST(PN_stdfloat, vec); + } + + } else if (DtoolCanThisBeAPandaInstance(value)) { + Dtool_PyInstDef *inst = (Dtool_PyInstDef *)value; + void *ptr; + + if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_Texture))) { + _this->_type = ShaderInput::M_texture; + _this->_value = (Texture *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_NodePath))) { + _this->_type = ShaderInput::M_nodepath; + _this->_value = new ParamNodePath(*(const NodePath *)ptr); + + } else if (inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToVoid)) { + if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_float))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_float *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_double))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_double *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_int))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_int *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4f))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase4f *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3f))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase3f *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2f))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase2f *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLMatrix4f))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LMatrix4f *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LMatrix3f))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LMatrix3f *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4d))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase4d *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3d))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase3d *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2d))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase2d *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLMatrix4d))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LMatrix4d *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LMatrix3d))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LMatrix3d *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_UnalignedLVecBase4i))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase4i *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase3i))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase3i *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_PointerToArray_LVecBase2i))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const PTA_LVecBase2i *)ptr; + + } else { + Dtool_Raise_TypeError("unknown type passed to ShaderInput"); + return; + } + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LMatrix4f))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const LMatrix4f *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LMatrix3f))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const LMatrix3f *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LMatrix4d))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const LMatrix4d *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LMatrix3d))) { + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = *(const LMatrix3d *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4f))) { + const LVecBase4f &vec = *(const LVecBase4f *)ptr; + _this->_type = ShaderInput::M_vector; + _this->_stored_ptr = vec; + _this->_stored_vector = LCAST(PN_stdfloat, vec); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3f))) { + const LVecBase3f &vec = *(const LVecBase3f *)ptr; + _this->_type = ShaderInput::M_vector; + _this->_stored_ptr = vec; + _this->_stored_vector.set(vec[0], vec[1], vec[2], 0); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2f))) { + const LVecBase2f &vec = *(const LVecBase2f *)ptr; + _this->_type = ShaderInput::M_vector; + _this->_stored_ptr = vec; + _this->_stored_vector.set(vec[0], vec[1], 0, 0); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4d))) { + const LVecBase4d &vec = *(const LVecBase4d *)ptr; + _this->_type = ShaderInput::M_vector; + _this->_stored_ptr = vec; + _this->_stored_vector = LCAST(PN_stdfloat, vec); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3d))) { + const LVecBase3d &vec = *(const LVecBase3d *)ptr; + _this->_type = ShaderInput::M_vector; + _this->_stored_ptr = vec; + _this->_stored_vector.set(vec[0], vec[1], vec[2], 0); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2d))) { + const LVecBase2d &vec = *(const LVecBase2d *)ptr; + _this->_type = ShaderInput::M_vector; + _this->_stored_ptr = vec; + _this->_stored_vector.set(vec[0], vec[1], 0, 0); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase4i))) { + const LVecBase4i &vec = *(const LVecBase4i *)ptr; + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = vec; + _this->_stored_vector = LCAST(PN_stdfloat, vec); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase3i))) { + const LVecBase3i &vec = *(const LVecBase3i *)ptr; + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = vec; + _this->_stored_vector.set(vec[0], vec[1], vec[2], 0); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_LVecBase2i))) { + const LVecBase2i &vec = *(const LVecBase2i *)ptr; + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = vec; + _this->_stored_vector.set(vec[0], vec[1], 0, 0); + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_ShaderBuffer))) { + _this->_type = ShaderInput::M_buffer; + _this->_value = (ShaderBuffer *)ptr; + + } else if ((ptr = inst->_My_Type->_Dtool_UpcastInterface(value, &Dtool_ParamValueBase))) { + _this->_type = ShaderInput::M_param; + _this->_value = (ParamValueBase *)ptr; + + } else { + Dtool_Raise_TypeError("unknown type passed to ShaderInput"); + return; + } + + } else if (PyFloat_Check(value)) { + LVecBase4 vec(PyFloat_AS_DOUBLE(value), 0, 0, 0); + _this->_type = ShaderInput::M_vector; + _this->_stored_ptr = vec; + _this->_stored_vector = vec; + +#if PY_MAJOR_VERSION < 3 + } else if (PyInt_Check(value)) { + LVecBase4i vec((int)PyInt_AS_LONG(value), 0, 0, 0); + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = vec; + _this->_stored_vector.set((PN_stdfloat)vec[0], 0, 0, 0); +#endif + + } else if (PyLong_Check(value)) { + LVecBase4i vec((int)PyLong_AsLong(value), 0, 0, 0); + _this->_type = ShaderInput::M_numeric; + _this->_stored_ptr = vec; + _this->_stored_vector.set((PN_stdfloat)vec[0], 0, 0, 0); + + } else if (PySequence_Check(value) && !PyUnicode_CheckExact(value)) { + // Iterate over the sequence to make sure all have the same type. + PyObject *fast = PySequence_Fast(value, "unknown type passed to ShaderInput"); + if (fast == nullptr) { + return; + } + + Py_ssize_t num_items = PySequence_Fast_GET_SIZE(value); + if (num_items <= 0) { + // We can't determine the type of a list of size 0. + _this->_type = ShaderInput::M_numeric; + Py_DECREF(fast); + return; + } + + bool has_float = false; + Py_ssize_t known_itemsize = -1; + + PyObject **items = PySequence_Fast_ITEMS(fast); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + + if (PySequence_Check(item)) { + Py_ssize_t itemsize = PySequence_Size(item); + if (known_itemsize >= 0 && itemsize != known_itemsize) { + Dtool_Raise_TypeError("inconsistent sequence length among elements of sequence passed to ShaderInput"); + Py_DECREF(fast); + return; + } + known_itemsize = itemsize; + + // Check their types. + for (Py_ssize_t j = 0; j < itemsize; ++j) { + PyObject *subitem = PySequence_ITEM(item, j); + if (PyFloat_CheckExact(subitem)) { + Py_DECREF(subitem); + has_float = true; + break; + } else if (PyLongOrInt_Check(subitem)) { + } else { + Dtool_Raise_TypeError("unknown element type in sequence passed as element of sequence passed to ShaderInput"); + Py_DECREF(subitem); + Py_DECREF(fast); + break; + } + Py_DECREF(subitem); + } + } else if (PyFloat_CheckExact(item)) { + has_float = true; + } else if (PyLongOrInt_Check(item)) { + } else { + Dtool_Raise_TypeError("unknown element type in sequence passed to ShaderInput"); + Py_DECREF(fast); + return; + } + } + + // Now that we have verified the dimensions and type of the PTA, we can + // read in the actual elements. + switch (known_itemsize) { + case -1: + if (has_float) { + PTA_float pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + pta.push_back(PyFloat_AsDouble(items[i])); + } + _this->_stored_ptr = pta; + } else { + PTA_int pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + pta.push_back((int)PyLongOrInt_AS_LONG(items[i])); + } + _this->_stored_ptr = pta; + } + break; + + case 1: + if (has_float) { + PTA_float pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + if (PySequence_Check(item)) { + PyObject *subitem = PySequence_ITEM(item, 0); + pta.push_back(PyFloat_AsDouble(subitem)); + Py_DECREF(subitem); + } else { + pta.push_back(PyFloat_AsDouble(item)); + } + } + _this->_stored_ptr = pta; + } else { + PTA_int pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + if (PySequence_Check(item)) { + PyObject *subitem = PySequence_ITEM(item, 0); + pta.push_back((int)PyLongOrInt_AS_LONG(subitem)); + Py_DECREF(subitem); + } else { + pta.push_back((int)PyLongOrInt_AS_LONG(item)); + } + } + _this->_stored_ptr = pta; + } + break; + + case 2: + if (has_float) { + PTA_LVecBase2f pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + if (PySequence_Check(item)) { + PyObject *subitem0 = PySequence_ITEM(item, 0); + PyObject *subitem1 = PySequence_ITEM(item, 1); + pta.push_back(LVecBase2f(PyFloat_AsDouble(subitem0), + PyFloat_AsDouble(subitem1))); + Py_DECREF(subitem0); + Py_DECREF(subitem1); + } else { + pta.push_back(PyFloat_AsDouble(item)); + } + } + _this->_stored_ptr = pta; + } else { + PTA_LVecBase2i pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + if (PySequence_Check(item)) { + PyObject *subitem0 = PySequence_ITEM(item, 0); + PyObject *subitem1 = PySequence_ITEM(item, 1); + pta.push_back(LVecBase2i((int)PyLongOrInt_AS_LONG(subitem0), + (int)PyLongOrInt_AS_LONG(subitem1))); + Py_DECREF(subitem0); + Py_DECREF(subitem1); + } else { + pta.push_back((int)PyLongOrInt_AS_LONG(item)); + } + } + _this->_stored_ptr = pta; + } + break; + + case 3: + if (has_float) { + PTA_LVecBase3f pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + if (PySequence_Check(item)) { + PyObject *subitem0 = PySequence_ITEM(item, 0); + PyObject *subitem1 = PySequence_ITEM(item, 1); + PyObject *subitem2 = PySequence_ITEM(item, 2); + pta.push_back(LVecBase3f(PyFloat_AsDouble(subitem0), + PyFloat_AsDouble(subitem1), + PyFloat_AsDouble(subitem2))); + Py_DECREF(subitem0); + Py_DECREF(subitem1); + Py_DECREF(subitem2); + } else { + pta.push_back(PyFloat_AsDouble(item)); + } + } + _this->_stored_ptr = pta; + } else { + PTA_LVecBase3i pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + if (PySequence_Check(item)) { + PyObject *subitem0 = PySequence_ITEM(item, 0); + PyObject *subitem1 = PySequence_ITEM(item, 1); + PyObject *subitem2 = PySequence_ITEM(item, 2); + pta.push_back(LVecBase3i((int)PyLongOrInt_AS_LONG(subitem0), + (int)PyLongOrInt_AS_LONG(subitem1), + (int)PyLongOrInt_AS_LONG(subitem2))); + Py_DECREF(subitem0); + Py_DECREF(subitem1); + Py_DECREF(subitem2); + } else { + pta.push_back((int)PyLongOrInt_AS_LONG(item)); + } + } + _this->_stored_ptr = pta; + } + break; + + case 4: + if (has_float) { + PTA_LVecBase4f pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + if (PySequence_Check(item)) { + PyObject *subitem0 = PySequence_ITEM(item, 0); + PyObject *subitem1 = PySequence_ITEM(item, 1); + PyObject *subitem2 = PySequence_ITEM(item, 2); + PyObject *subitem3 = PySequence_ITEM(item, 3); + pta.push_back(LVecBase4f(PyFloat_AsDouble(subitem0), + PyFloat_AsDouble(subitem1), + PyFloat_AsDouble(subitem2), + PyFloat_AsDouble(subitem3))); + Py_DECREF(subitem0); + Py_DECREF(subitem1); + Py_DECREF(subitem2); + Py_DECREF(subitem3); + } else { + pta.push_back(PyFloat_AsDouble(item)); + } + } + _this->_stored_ptr = pta; + } else { + PTA_LVecBase4i pta; + pta.reserve(num_items); + for (Py_ssize_t i = 0; i < num_items; ++i) { + PyObject *item = items[i]; + if (PySequence_Check(item)) { + PyObject *subitem0 = PySequence_ITEM(item, 0); + PyObject *subitem1 = PySequence_ITEM(item, 1); + PyObject *subitem2 = PySequence_ITEM(item, 2); + PyObject *subitem3 = PySequence_ITEM(item, 3); + pta.push_back(LVecBase4i((int)PyLongOrInt_AS_LONG(subitem0), + (int)PyLongOrInt_AS_LONG(subitem1), + (int)PyLongOrInt_AS_LONG(subitem2), + (int)PyLongOrInt_AS_LONG(subitem3))); + Py_DECREF(subitem0); + Py_DECREF(subitem1); + Py_DECREF(subitem2); + Py_DECREF(subitem3); + } else { + pta.push_back((int)PyLongOrInt_AS_LONG(item)); + } + } + _this->_stored_ptr = pta; + } + break; + + case 0: + Dtool_Raise_TypeError("sequence passed to ShaderInput contains an empty sequence"); + break; + + default: + Dtool_Raise_TypeError("sequence passed to ShaderInput contains a sequence of more than 4 elements"); + break; + } + + _this->_type = ShaderInput::M_numeric; + + Py_DECREF(fast); + + } else { + Dtool_Raise_TypeError("unknown type passed to ShaderInput"); + } +} + +#endif // HAVE_PYTHON diff --git a/panda/src/pgraph/shaderInput_ext.h b/panda/src/pgraph/shaderInput_ext.h new file mode 100644 index 0000000000..c624a45ef8 --- /dev/null +++ b/panda/src/pgraph/shaderInput_ext.h @@ -0,0 +1,37 @@ +/** + * 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 shaderInput_ext.h + * @author rdb + * @date 2017-10-06 + */ + +#ifndef SHADERINPUT_EXT_H +#define SHADERINPUT_EXT_H + +#include "dtoolbase.h" + +#ifdef HAVE_PYTHON + +#include "extension.h" +#include "shaderInput.h" +#include "py_panda.h" + +/** + * This class defines the extension methods for NodePath, which are called + * instead of any C++ methods with the same prototype. + */ +template<> +class Extension : public ExtensionBase { +public: + void __init__(CPT_InternalName name, PyObject *value, int priority=0); +}; + +#endif // HAVE_PYTHON + +#endif // SHADERINPUT_EXT_H From bf190f73064542fbb21e3ff5d0281d2306bbba82 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 8 Oct 2017 23:56:25 +0200 Subject: [PATCH 186/254] interrogate: support MAKE_MAP_PROPERTY --- dtool/src/cppparser/cppBison.cxx.prebuilt | 9088 +++++++++-------- dtool/src/cppparser/cppBison.yxx | 277 +- dtool/src/cppparser/cppMakeProperty.cxx | 36 +- dtool/src/cppparser/cppMakeProperty.h | 71 +- dtool/src/dtoolbase/dtoolbase.h | 2 + dtool/src/dtoolutil/executionEnvironment.h | 4 + dtool/src/interrogate/interfaceMaker.cxx | 14 +- dtool/src/interrogate/interfaceMaker.h | 4 +- .../interfaceMakerPythonNative.cxx | 532 +- .../interrogate/interfaceMakerPythonNative.h | 4 + dtool/src/interrogate/interrogateBuilder.cxx | 137 +- dtool/src/interrogatedb/interrogateElement.I | 10 + dtool/src/interrogatedb/interrogateElement.h | 4 + dtool/src/interrogatedb/py_panda.cxx | 218 +- dtool/src/interrogatedb/py_panda.h | 29 +- panda/src/chan/animGroup.h | 5 +- panda/src/chan/partGroup.h | 4 +- panda/src/gobj/geomVertexFormat.h | 3 + panda/src/gobj/texture.h | 2 + panda/src/gobj/transformBlend.I | 11 + panda/src/gobj/transformBlend.h | 6 + panda/src/pgraph/camera.h | 4 + panda/src/pgraph/nodePath.h | 3 + panda/src/pgraph/renderState.h | 2 + panda/src/pgraph/shaderInput.I | 8 + panda/src/pgraph/shaderInput.h | 1 + panda/src/pgraph/textureAttrib.h | 6 + 27 files changed, 5650 insertions(+), 4835 deletions(-) diff --git a/dtool/src/cppparser/cppBison.cxx.prebuilt b/dtool/src/cppparser/cppBison.cxx.prebuilt index a0d5622887..c8b8754035 100644 --- a/dtool/src/cppparser/cppBison.cxx.prebuilt +++ b/dtool/src/cppparser/cppBison.cxx.prebuilt @@ -857,16 +857,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 104 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 7000 +#define YYLAST 7153 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 170 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 109 +#define YYNNTS 110 /* YYNRULES -- Number of rules. */ -#define YYNRULES 757 +#define YYNRULES 761 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 1539 +#define YYNSTATES 1557 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ @@ -927,82 +927,83 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 448, 448, 449, 453, 460, 461, 462, 466, 467, - 471, 475, 479, 492, 491, 503, 504, 505, 506, 507, - 508, 509, 522, 531, 535, 543, 547, 551, 562, 583, - 613, 630, 658, 695, 717, 750, 772, 783, 797, 796, - 811, 815, 820, 824, 835, 839, 843, 847, 851, 855, - 859, 863, 867, 871, 875, 879, 884, 888, 895, 896, - 900, 901, 902, 907, 906, 922, 932, 931, 948, 956, - 964, 975, 991, 990, 1005, 1020, 1029, 1044, 1043, 1068, - 1067, 1095, 1094, 1125, 1124, 1143, 1142, 1163, 1162, 1194, - 1193, 1219, 1232, 1236, 1240, 1244, 1257, 1261, 1265, 1269, - 1273, 1278, 1283, 1287, 1291, 1295, 1302, 1306, 1310, 1314, - 1318, 1322, 1326, 1330, 1334, 1338, 1342, 1346, 1350, 1354, - 1358, 1362, 1366, 1370, 1374, 1378, 1382, 1386, 1390, 1394, - 1398, 1402, 1406, 1410, 1414, 1418, 1422, 1426, 1430, 1434, - 1438, 1442, 1446, 1450, 1454, 1461, 1462, 1463, 1467, 1469, - 1468, 1476, 1477, 1481, 1482, 1486, 1492, 1501, 1502, 1506, - 1510, 1514, 1518, 1524, 1530, 1536, 1543, 1548, 1557, 1561, - 1566, 1574, 1586, 1590, 1604, 1619, 1624, 1629, 1634, 1639, - 1644, 1649, 1654, 1660, 1659, 1690, 1700, 1710, 1714, 1718, - 1727, 1731, 1736, 1740, 1745, 1753, 1758, 1766, 1770, 1775, - 1779, 1784, 1792, 1797, 1805, 1809, 1816, 1820, 1827, 1831, - 1835, 1839, 1843, 1850, 1854, 1858, 1862, 1866, 1870, 1877, - 1878, 1879, 1883, 1886, 1887, 1888, 1892, 1897, 1903, 1909, - 1914, 1920, 1926, 1930, 1941, 1945, 1955, 1959, 1963, 1968, - 1973, 1978, 1983, 1988, 1993, 2001, 2005, 2009, 2014, 2019, - 2024, 2029, 2034, 2039, 2044, 2050, 2058, 2063, 2068, 2073, - 2078, 2083, 2088, 2093, 2098, 2103, 2109, 2117, 2121, 2126, - 2131, 2136, 2141, 2146, 2151, 2156, 2161, 2169, 2173, 2178, - 2183, 2188, 2193, 2198, 2203, 2208, 2213, 2218, 2224, 2231, - 2238, 2248, 2252, 2260, 2264, 2268, 2272, 2276, 2292, 2308, - 2317, 2321, 2331, 2338, 2349, 2353, 2361, 2365, 2369, 2373, - 2377, 2393, 2409, 2427, 2436, 2440, 2450, 2457, 2461, 2469, - 2473, 2489, 2505, 2514, 2524, 2531, 2535, 2543, 2547, 2552, - 2556, 2564, 2565, 2566, 2567, 2572, 2571, 2596, 2595, 2625, - 2626, 2633, 2634, 2638, 2639, 2643, 2647, 2651, 2655, 2659, - 2663, 2667, 2671, 2675, 2679, 2686, 2694, 2698, 2702, 2707, - 2715, 2719, 2726, 2727, 2732, 2739, 2740, 2745, 2753, 2757, - 2761, 2768, 2772, 2776, 2784, 2783, 2806, 2805, 2828, 2829, - 2833, 2839, 2846, 2855, 2856, 2857, 2861, 2865, 2869, 2873, - 2877, 2881, 2886, 2891, 2896, 2901, 2905, 2910, 2919, 2924, - 2932, 2936, 2940, 2948, 2958, 2958, 2968, 2969, 2973, 2974, - 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, - 2984, 2984, 2985, 2985, 2985, 2985, 2986, 2986, 2986, 2986, - 2986, 2987, 2987, 2987, 2988, 2988, 2988, 2988, 2988, 2989, - 2989, 2989, 2989, 2989, 2990, 2990, 2991, 2991, 2991, 2991, - 2991, 2992, 2992, 2992, 2992, 2992, 2993, 2993, 2993, 2993, - 2994, 2994, 2994, 2994, 2994, 2995, 2995, 2995, 2995, 2995, - 2996, 2996, 2996, 2996, 2996, 2996, 2997, 2997, 2997, 2997, - 2997, 2998, 2998, 2998, 2998, 2999, 2999, 2999, 2999, 3000, - 3000, 3000, 3000, 3000, 3001, 3001, 3001, 3001, 3002, 3002, - 3002, 3002, 3002, 3003, 3003, 3003, 3003, 3004, 3004, 3004, - 3004, 3004, 3005, 3005, 3008, 3008, 3008, 3008, 3008, 3008, - 3008, 3008, 3008, 3008, 3008, 3009, 3009, 3009, 3009, 3009, - 3009, 3009, 3009, 3009, 3009, 3010, 3010, 3014, 3018, 3025, - 3029, 3036, 3040, 3047, 3051, 3055, 3059, 3063, 3067, 3071, - 3075, 3087, 3091, 3095, 3099, 3103, 3107, 3111, 3115, 3119, - 3123, 3127, 3131, 3135, 3139, 3143, 3147, 3151, 3155, 3159, - 3163, 3167, 3171, 3175, 3179, 3183, 3187, 3191, 3195, 3199, - 3203, 3207, 3215, 3219, 3223, 3227, 3231, 3235, 3239, 3249, - 3259, 3265, 3271, 3277, 3283, 3289, 3295, 3302, 3309, 3316, - 3323, 3329, 3335, 3339, 3351, 3355, 3359, 3363, 3367, 3378, - 3389, 3393, 3397, 3401, 3405, 3409, 3413, 3417, 3421, 3425, - 3429, 3433, 3437, 3441, 3445, 3449, 3453, 3457, 3461, 3465, - 3469, 3473, 3477, 3481, 3485, 3489, 3493, 3497, 3501, 3505, - 3509, 3516, 3520, 3524, 3528, 3532, 3536, 3540, 3544, 3548, - 3554, 3560, 3564, 3570, 3577, 3581, 3585, 3589, 3593, 3597, - 3601, 3605, 3609, 3613, 3617, 3621, 3625, 3629, 3633, 3637, - 3641, 3655, 3659, 3663, 3667, 3671, 3675, 3679, 3683, 3695, - 3699, 3703, 3707, 3711, 3722, 3733, 3737, 3741, 3745, 3749, - 3753, 3757, 3761, 3765, 3769, 3773, 3777, 3781, 3785, 3789, - 3793, 3797, 3801, 3805, 3809, 3813, 3817, 3821, 3825, 3829, - 3833, 3837, 3841, 3845, 3849, 3856, 3860, 3864, 3868, 3872, - 3876, 3880, 3884, 3888, 3894, 3900, 3908, 3912, 3916, 3920, - 3927, 3937, 3943, 3949, 3959, 3971, 3979, 3983, 4013, 4017, - 4021, 4025, 4029, 4033, 4039, 4043, 4047, 4051, 4055, 4066, - 4070, 4074, 4078, 4086, 4090, 4094, 4100, 4111 + 0, 449, 449, 450, 454, 461, 462, 463, 467, 468, + 472, 476, 480, 493, 492, 504, 505, 506, 507, 508, + 509, 510, 523, 532, 536, 544, 548, 552, 573, 600, + 621, 650, 686, 698, 719, 755, 777, 813, 835, 846, + 860, 859, 874, 878, 883, 887, 898, 902, 906, 910, + 914, 918, 922, 926, 930, 934, 938, 942, 947, 951, + 958, 959, 963, 964, 965, 970, 969, 985, 995, 994, + 1011, 1019, 1027, 1038, 1054, 1053, 1068, 1083, 1092, 1107, + 1106, 1131, 1130, 1158, 1157, 1188, 1187, 1206, 1205, 1226, + 1225, 1257, 1256, 1282, 1295, 1299, 1303, 1307, 1320, 1324, + 1328, 1332, 1336, 1341, 1346, 1350, 1354, 1358, 1365, 1369, + 1373, 1377, 1381, 1385, 1389, 1393, 1397, 1401, 1405, 1409, + 1413, 1417, 1421, 1425, 1429, 1433, 1437, 1441, 1445, 1449, + 1453, 1457, 1461, 1465, 1469, 1473, 1477, 1481, 1485, 1489, + 1493, 1497, 1501, 1505, 1509, 1513, 1517, 1524, 1525, 1526, + 1530, 1532, 1531, 1539, 1540, 1544, 1545, 1549, 1555, 1564, + 1565, 1569, 1573, 1577, 1581, 1587, 1593, 1599, 1606, 1611, + 1620, 1624, 1629, 1637, 1649, 1653, 1667, 1682, 1687, 1692, + 1697, 1702, 1707, 1712, 1717, 1723, 1722, 1753, 1763, 1773, + 1777, 1781, 1790, 1794, 1802, 1806, 1811, 1815, 1820, 1828, + 1833, 1841, 1845, 1850, 1854, 1859, 1867, 1872, 1880, 1884, + 1891, 1895, 1902, 1906, 1910, 1914, 1918, 1925, 1929, 1933, + 1937, 1941, 1945, 1952, 1953, 1954, 1958, 1961, 1962, 1963, + 1967, 1972, 1978, 1984, 1989, 1995, 2001, 2005, 2016, 2020, + 2030, 2034, 2038, 2043, 2048, 2053, 2058, 2063, 2068, 2076, + 2080, 2084, 2089, 2094, 2099, 2104, 2109, 2114, 2119, 2125, + 2133, 2138, 2143, 2148, 2153, 2158, 2163, 2168, 2173, 2178, + 2184, 2192, 2196, 2201, 2206, 2211, 2216, 2221, 2226, 2231, + 2236, 2244, 2248, 2253, 2258, 2263, 2268, 2273, 2278, 2283, + 2288, 2293, 2299, 2306, 2313, 2323, 2327, 2335, 2339, 2343, + 2347, 2351, 2367, 2383, 2392, 2396, 2406, 2413, 2424, 2428, + 2436, 2440, 2444, 2448, 2452, 2468, 2484, 2502, 2511, 2515, + 2525, 2532, 2536, 2544, 2548, 2564, 2580, 2589, 2599, 2606, + 2610, 2618, 2622, 2627, 2631, 2639, 2640, 2641, 2642, 2647, + 2646, 2671, 2670, 2700, 2701, 2708, 2709, 2713, 2714, 2718, + 2722, 2726, 2730, 2734, 2738, 2742, 2746, 2750, 2754, 2761, + 2769, 2773, 2777, 2782, 2790, 2794, 2801, 2802, 2807, 2814, + 2815, 2820, 2828, 2832, 2836, 2843, 2847, 2851, 2859, 2858, + 2881, 2880, 2903, 2904, 2908, 2914, 2921, 2930, 2931, 2932, + 2936, 2940, 2944, 2948, 2952, 2956, 2961, 2966, 2971, 2976, + 2980, 2985, 2994, 2999, 3007, 3011, 3015, 3023, 3033, 3033, + 3043, 3044, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, + 3056, 3057, 3058, 3059, 3059, 3059, 3060, 3060, 3060, 3060, + 3061, 3061, 3061, 3061, 3061, 3062, 3062, 3062, 3063, 3063, + 3063, 3063, 3063, 3064, 3064, 3064, 3064, 3064, 3065, 3065, + 3066, 3066, 3066, 3066, 3066, 3067, 3067, 3067, 3067, 3067, + 3068, 3068, 3068, 3068, 3069, 3069, 3069, 3069, 3069, 3070, + 3070, 3070, 3070, 3070, 3071, 3071, 3071, 3071, 3071, 3071, + 3072, 3072, 3072, 3072, 3072, 3073, 3073, 3073, 3073, 3074, + 3074, 3074, 3074, 3075, 3075, 3075, 3075, 3075, 3076, 3076, + 3076, 3076, 3077, 3077, 3077, 3077, 3077, 3078, 3078, 3078, + 3078, 3079, 3079, 3079, 3079, 3079, 3080, 3080, 3083, 3083, + 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3084, + 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3085, + 3085, 3089, 3093, 3100, 3104, 3111, 3115, 3122, 3126, 3130, + 3134, 3138, 3142, 3146, 3150, 3162, 3166, 3170, 3174, 3178, + 3182, 3186, 3190, 3194, 3198, 3202, 3206, 3210, 3214, 3218, + 3222, 3226, 3230, 3234, 3238, 3242, 3246, 3250, 3254, 3258, + 3262, 3266, 3270, 3274, 3278, 3282, 3290, 3294, 3298, 3302, + 3306, 3310, 3314, 3324, 3334, 3340, 3346, 3352, 3358, 3364, + 3370, 3377, 3384, 3391, 3398, 3404, 3410, 3414, 3426, 3430, + 3434, 3438, 3442, 3453, 3464, 3468, 3472, 3476, 3480, 3484, + 3488, 3492, 3496, 3500, 3504, 3508, 3512, 3516, 3520, 3524, + 3528, 3532, 3536, 3540, 3544, 3548, 3552, 3556, 3560, 3564, + 3568, 3572, 3576, 3580, 3584, 3591, 3595, 3599, 3603, 3607, + 3611, 3615, 3619, 3623, 3629, 3635, 3639, 3645, 3652, 3656, + 3660, 3664, 3668, 3672, 3676, 3680, 3684, 3688, 3692, 3696, + 3700, 3704, 3708, 3712, 3716, 3730, 3734, 3738, 3742, 3746, + 3750, 3754, 3758, 3770, 3774, 3778, 3782, 3786, 3797, 3808, + 3812, 3816, 3820, 3824, 3828, 3832, 3836, 3840, 3844, 3848, + 3852, 3856, 3860, 3864, 3868, 3872, 3876, 3880, 3884, 3888, + 3892, 3896, 3900, 3904, 3908, 3912, 3916, 3920, 3924, 3931, + 3935, 3939, 3943, 3947, 3951, 3955, 3959, 3963, 3969, 3975, + 3983, 3987, 3991, 3995, 4002, 4012, 4018, 4024, 4034, 4046, + 4054, 4058, 4088, 4092, 4096, 4100, 4104, 4108, 4114, 4118, + 4122, 4126, 4130, 4141, 4145, 4149, 4153, 4161, 4165, 4169, + 4175, 4186 }; #endif @@ -1057,8 +1058,9 @@ static const char *const yytname[] = "template_formal_parameter", "template_formal_parameter_type", "instance_identifier", "$@14", "instance_identifier_and_maybe_trailing_return_type", - "maybe_trailing_return_type", "function_parameter_list", - "function_parameters", "formal_parameter_list", "formal_parameters", + "maybe_trailing_return_type", "maybe_comma_identifier", + "function_parameter_list", "function_parameters", + "formal_parameter_list", "formal_parameters", "template_parameter_maybe_initialize", "maybe_initialize", "maybe_initialize_or_constructor_body", "maybe_initialize_or_function_body", "structure_init", @@ -1106,12 +1108,12 @@ static const yytype_uint16 yytoknum[] = }; # endif -#define YYPACT_NINF -918 +#define YYPACT_NINF -923 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-918))) + (!!((Yystate) == (-923))) -#define YYTABLE_NINF -753 +#define YYTABLE_NINF -757 #define yytable_value_is_error(Yytable_value) \ 0 @@ -1120,160 +1122,162 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 328, -918, 3448, 5658, 36, 4726, -918, -918, -918, -918, - -918, -918, -918, -918, -50, -112, -100, -83, -71, -51, - -98, -22, -52, -918, -918, 11, 56, 78, 95, 116, - 121, 154, 162, 167, 174, 178, 185, 195, 198, 207, - 215, 231, 259, 267, 5969, -918, -918, 13, 269, 285, - 10, 296, -918, 290, 292, 295, 3448, 3448, 3448, 3448, - 3448, 1577, 1319, 3448, 4528, -918, 81, -918, -918, -918, - -918, -918, -918, -918, -918, 5768, 321, -918, -30, -918, - -918, 3803, 4177, 4177, -918, 5453, 325, -918, 4177, -918, - -918, 87, 87, -918, -918, -918, -918, 163, 111, -918, - -918, -918, -918, -918, -918, 6089, 342, -918, 6860, 6860, - 6860, -918, 6860, 5109, 6860, -101, -918, 6851, 347, 348, - 350, 351, 6860, 1165, 237, 368, 373, 6860, 6860, 360, - 6687, 6860, 6860, 5777, 6860, 6860, -918, -918, -918, -918, - 3942, -918, -918, -918, -918, -918, 3448, 3448, 5658, 3448, - 3448, 3448, 3448, 5658, 3448, 5658, 3448, 5658, 3448, 5658, - 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, 5658, - 5658, 5658, 5658, 5658, 3448, -918, -918, 364, 5453, 366, - 370, 5453, -918, -918, 5658, 3448, 3448, 372, 5197, 5658, - 1577, 3448, 3448, 50, 50, 50, 50, 50, -50, -100, - -83, -71, -51, -22, 11, 78, 4083, 5386, 5645, 6631, - 295, 371, -110, 4528, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, 5453, 5453, -116, 390, - -918, -918, 50, 3448, 3448, 3448, 3448, 3448, 3448, 3448, - 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, - 3448, 3448, 3448, 3448, 2510, 3448, -918, -918, 87, 87, - 2644, -918, -918, -918, 4177, -918, -918, -918, -918, 5658, - -918, 384, 1154, 401, 87, 87, 401, 401, 4839, 377, - -918, 385, -918, -918, -918, -918, -918, -918, 867, 404, - 4526, -918, 5453, 510, 419, 403, 2237, 5112, 6860, -918, - -918, -918, -918, 6860, -918, -918, -918, -918, 6779, 1693, - -918, 5453, 5453, 5453, 5453, -918, -918, 435, -918, -918, - -918, -918, -918, 3448, -918, 4035, -918, 424, -918, 4121, - -918, 5453, 4, -918, -918, 439, 422, -918, 426, 5854, - 5453, 427, -918, 5453, -918, -9, 440, -918, -918, -918, - -918, 2568, -918, -918, 428, 446, -918, 434, 436, 438, - 441, 442, 447, 468, 459, 470, 462, 463, 464, 466, - 486, 471, -72, 487, 472, 473, 477, 478, 479, 480, - 481, 483, 484, 488, 489, 3448, -918, 5658, 3448, -918, - 6665, 497, 491, 492, 5453, 493, 494, 506, 498, 4247, - 499, 500, 3448, 3448, -918, 621, -918, 2434, 503, 3448, - -918, -918, 3772, 4892, 1052, 1052, 1444, 1444, 1031, 1031, - -918, 2800, 4908, 4924, 4964, 1444, 1444, 75, 75, 50, - 50, 50, -918, -918, -67, 2256, -918, -918, 502, 4268, - 504, 401, 509, 520, 5453, 401, 401, 401, 401, 401, - 515, -918, 377, -918, 377, -918, 515, 515, -918, 401, - 6089, 5744, 5627, 401, 401, 523, 20, -918, 392, 532, - -918, 3448, 5453, 496, -918, -918, -918, -918, 867, -13, - 153, 161, 6089, 526, 232, -918, -918, -918, 546, 6860, - 6089, 1717, -50, 531, 4286, -918, -918, -918, 535, 551, - 552, 555, 557, 6163, -918, 4190, 5400, 383, 542, -9, - -918, -918, 561, -918, 5658, -918, 17, 2778, 5993, 1081, - -918, 5658, -918, 548, 278, -918, -918, 2376, -918, -918, - 310, -918, 564, 4526, -918, -918, -918, -918, -918, -918, - -918, 558, -918, 560, -918, -918, -918, -918, 5658, -918, - 5658, -918, 5658, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, 4305, 544, 549, -918, 562, -918, - -918, 559, -918, -918, 565, -918, -918, -918, -918, 50, - 4528, -918, 5453, 390, 5501, 978, -918, 4528, 3448, -918, - -918, -918, -918, -918, 515, 401, -918, 515, 515, 515, - 515, 515, 3448, -39, 680, 5768, 392, 532, -918, 38, - 66, -918, -918, 5532, 571, 392, 392, 392, 392, 392, - 392, -126, -918, -918, 573, 5453, 532, 532, 532, 532, - 532, 532, -77, 566, 4528, -918, 189, -918, 591, 690, - 2237, -918, 663, 6089, -918, -918, -918, -918, -918, -918, - -918, -918, 576, 586, 587, -918, -918, 5969, -918, -918, - 590, 18, 594, -918, 582, 3448, 3448, 3448, 3448, 1577, - 3448, 608, 59, -918, -918, 4546, -918, 81, -918, 6860, - 6860, 6235, -918, 781, 782, 784, 785, -918, -918, 218, - 648, -918, -918, -918, -918, 5415, -918, 641, 652, 4476, - -918, 1139, -918, -918, 17, -918, 310, -918, 653, 5501, - 643, 310, 5501, 639, 4341, 1081, 649, 1081, 1081, 1081, - 1081, 1081, 0, -918, -918, 645, 6307, -918, -918, -918, - 5453, 183, -918, 640, -918, 661, 664, 2912, 3068, 655, - 310, 310, 3875, 310, 310, 310, 310, -918, -5, 411, - -918, 867, -918, 3448, 3448, 650, 651, 656, -918, -918, - -918, 3448, -918, 3448, -918, 657, -918, 5883, 6089, -918, - -918, -918, -918, -918, -918, 660, -918, -918, 673, -918, - 4528, 515, 662, 666, 5627, 392, 532, -126, -77, 668, - 670, 978, -918, -918, 392, 671, 671, 671, 671, 671, - 148, 3448, -918, 532, -918, 672, 672, 672, 672, 672, - 200, 3448, -918, 676, -918, 3448, -918, 669, 4359, 6379, - -918, 689, -918, -918, 5658, 5658, 5658, 678, 5658, 679, - 5283, 5658, 1577, 50, 50, 50, 50, 681, -65, 50, - -918, -918, 3582, 3448, 3448, 3448, 3448, 3448, 3448, 3448, - 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, 3448, - 3448, 3448, 3448, 3448, 3046, 3448, -918, -918, -918, -918, - -23, 674, 697, 698, 6451, 12, -918, 1139, 6739, 5400, - 5453, 696, 692, 1139, 1139, 1139, 1139, 1139, 1139, -25, - 672, -918, 411, -918, 682, 310, 316, 683, -918, -918, - 301, 1081, 687, 687, 687, 687, 687, -918, 3448, -918, - -918, 5501, 686, 354, -918, 52, 707, 708, -918, 2070, - -918, -918, -918, 2912, 693, 710, 4528, -918, -918, 310, - 344, 344, 849, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, 695, - 705, -918, -918, 344, 344, 344, 398, 858, -918, 3448, - -918, 2376, 718, -918, 591, 53, 97, -918, -918, -918, - 132, 150, -918, 5969, 87, 818, 1059, -918, -918, 5501, - -918, -126, -77, -918, -918, 5501, 5501, -918, 671, 711, - 712, 672, 713, 720, 3336, -918, -918, -918, 5165, 733, - 743, -918, 714, 738, 745, 3448, 747, 5453, 739, 742, - 748, 746, 4456, 3448, -918, -918, -918, 3772, 4892, 1052, - 1052, 1444, 1444, 1031, 1031, -918, 4510, 4908, 4924, 4964, - 1444, 1444, 75, 75, 50, 50, 50, -918, -918, 216, - 3601, 6523, 889, 761, 901, 903, 904, -918, 767, -25, - 672, -918, -918, -918, -918, -918, -918, 5658, 1139, 3721, - -918, -918, 769, -918, -918, 433, 753, -918, -918, 687, - 5501, 759, 764, -918, -918, 5453, 3448, 3448, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - -918, -918, -918, -918, -918, -918, -918, -918, -918, -918, - 765, -918, 3180, 344, -918, -918, -918, -918, -918, 1717, - 762, 3068, 310, -918, -918, -918, -918, 978, 87, -918, - -918, -918, -4, 768, 770, -918, -918, 771, 773, 5501, - -918, 5501, -918, -918, 6002, 6061, 6075, 5453, 508, -918, - -918, 919, -918, 5165, -918, 776, 778, 777, 783, 803, - -918, -918, 806, -918, -918, 50, 3448, -918, -918, -918, - 217, -918, 222, 805, 225, -918, -918, -918, 808, 819, - 820, 821, 19, 824, 3721, 3721, 3721, 3721, 3721, 1577, - 3721, 4607, -918, 310, 1275, 809, -918, 1275, 5501, 826, - -918, -918, 817, -918, 827, 831, 1890, -918, 2912, 4528, - 833, -918, -918, 839, -918, 836, -918, -918, -918, -918, - -918, 840, 841, 5618, -918, 5618, -918, 5618, -918, -918, - 5618, 5618, 5618, -918, 6595, -918, 3448, 3448, -918, 3448, - -918, 3448, 4528, 1000, 864, 1005, 868, 869, 1008, 872, - 5658, 5658, 5658, 5658, 859, 5314, 5658, 105, 105, 105, - 105, 105, 856, 228, 105, 3721, 3721, 3721, 3721, 3721, - 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, 3721, - 3721, 3721, 3721, 3721, 3314, 3448, -918, -918, 5501, 860, - -918, 1275, -918, -918, 1018, -918, 870, -918, -918, -918, - 978, 978, 978, -918, -918, -918, -918, -918, -918, -918, - -918, -918, 233, 242, 246, 249, 874, -918, 888, -918, - -918, 251, -918, 876, 880, 887, 890, 5453, 879, 883, - 894, 3721, -918, 4718, 4948, 3957, 3957, 1821, 1821, 1352, - 1352, -918, 4564, 334, 4981, 4990, 169, 169, 105, 105, - 105, -918, -918, 272, 3806, 5501, 885, -918, 1275, -918, - -918, 1275, 891, -918, -918, -918, 1275, 1275, -918, -918, - -918, -918, 907, 1042, 1046, 909, -918, 895, 896, 897, - 899, -918, -918, 902, 105, 3721, -918, -918, 910, -918, - 1275, -918, -918, 912, 913, -918, 3448, 3448, 3448, -918, - 3448, 4607, -918, 978, 915, 932, 273, 287, 289, 294, - 978, -918, -918, -918, -918, -918, -918, -918, -918 + 136, -923, 3707, 5786, 58, 4877, -923, -923, -923, -923, + -923, -923, -923, -923, -63, -85, -54, 20, 66, 72, + -79, 78, -12, -923, -923, 81, 129, 142, 146, 164, + 177, 187, 196, 203, 210, 227, 230, 232, 240, 242, + 244, 250, 266, 268, 6097, -923, -923, 100, 281, 287, + 23, 300, -923, 295, 304, 307, 3707, 3707, 3707, 3707, + 3707, 1818, 2827, 3707, 3915, -923, 326, -923, -923, -923, + -923, -923, -923, -923, -923, 5896, 310, -923, -3, -923, + -923, 4202, 7012, 7012, -923, 5440, 311, -923, 7012, -923, + -923, 337, 337, -923, -923, -923, -923, 15, 61, -923, + -923, -923, -923, -923, -923, 809, 314, -923, 6988, 6988, + 6988, -923, 6988, 5317, 6988, 170, -923, 6979, 319, 322, + 324, 335, 338, 6988, 5237, 312, 321, 341, 6988, 6988, + 340, 6815, 6988, 6988, 5905, 6988, 6988, -923, -923, -923, + -923, 4341, -923, -923, -923, -923, -923, 3707, 3707, 5786, + 3707, 3707, 3707, 3707, 5786, 3707, 5786, 3707, 5786, 3707, + 5786, 5786, 5786, 5786, 5786, 5786, 5786, 5786, 5786, 5786, + 5786, 5786, 5786, 5786, 5786, 3707, -923, -923, 342, 5440, + 343, 346, 5440, -923, -923, 5786, 3707, 3707, 347, 5405, + 5786, 1818, 3707, 3707, 76, 76, 76, 76, 76, -63, + -54, 20, 66, 72, 78, 81, 142, 4482, 5509, 5883, + 6759, 307, 339, -88, 3915, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, 5440, 5440, -104, + 362, -923, -923, 76, 3707, 3707, 3707, 3707, 3707, 3707, + 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, + 3707, 3707, 3707, 3707, 3707, 2769, 3707, -923, -923, 337, + 337, 2903, -923, -923, -923, 7012, -923, -923, -923, -923, + 5786, -923, 357, 417, 236, 337, 337, 236, 236, 4990, + 353, -923, 358, -923, -923, -923, -923, -923, -923, 4576, + 371, 5178, -923, 5440, 474, 379, 361, 2496, 5320, 6988, + -923, -923, -923, -923, 6988, -923, -923, -923, -923, 6907, + 5284, -923, 5440, 5440, 5440, 5440, 5440, -923, -923, 382, + -923, -923, -923, -923, -923, 3707, -923, 4434, -923, 376, + -923, 4520, -923, 5440, 223, -923, -923, 104, 370, -923, + 374, 5982, 5440, 397, -923, 5440, -923, 198, 387, -923, + -923, -923, -923, 4617, -923, -923, 396, 418, -923, 400, + 402, 403, 404, 405, 407, 419, 408, 420, 411, 412, + 415, 422, 436, 426, -73, 437, 433, 434, 435, 439, + 440, 443, 448, 449, 450, 460, 462, 3707, -923, 5786, + 3707, -923, 6793, 446, 463, 464, 5440, 466, 467, 479, + 471, 4205, 472, 473, 3707, 3707, -923, 581, -923, 947, + 476, 3707, -923, -923, 4171, 5000, 5113, 5113, 1867, 1867, + 276, 276, -923, 2653, 5043, 2049, 1570, 1867, 1867, 293, + 293, 76, 76, 76, -923, -923, -72, 1648, -923, -923, + 475, 4589, 480, 236, 477, 486, 5440, 236, 236, 236, + 236, 236, 482, -923, 353, -923, 353, -923, 482, 482, + -923, 236, 809, 5872, 5757, 236, 236, 483, 33, -923, + 1286, 355, -923, 3707, 5440, 481, -923, -923, -923, -923, + 4576, -26, -22, -16, 809, 487, 86, -923, -923, -923, + 501, 6988, 809, 3841, -63, 489, 4646, -923, -923, -923, + 506, 509, 510, 511, 512, 515, 6291, -923, 3860, 5608, + 199, 500, 198, -923, -923, 517, -923, 5786, -923, 29, + 3037, 6121, 1306, -923, 5786, -923, 502, 190, -923, -923, + 2635, -923, -923, 1069, -923, 518, 5178, -923, -923, -923, + -923, -923, -923, -923, 504, -923, 505, -923, -923, -923, + -923, 5786, -923, 5786, -923, 5786, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, 4667, 513, 514, + -923, 507, -923, -923, 519, -923, -923, 508, -923, -923, + -923, -923, 76, 3915, -923, 5440, 362, 5637, 5228, -923, + 3915, 3707, -923, -923, -923, -923, -923, 482, 236, -923, + 482, 482, 482, 482, 482, 3707, -99, 622, 5896, 1286, + 355, -923, -69, -29, -923, -923, 5666, 522, 1286, 1286, + 1286, 1286, 1286, 1286, -61, -923, -923, 524, 5440, 355, + 355, 355, 355, 355, 355, -6, 520, 3915, -923, -15, + -923, 540, 639, 2496, -923, 612, 809, -923, -923, -923, + -923, -923, -923, -923, -923, 528, 544, 545, -923, -923, + 6097, -923, -923, 546, 32, 547, -923, 539, 3707, 3707, + 3707, 3707, 1818, 3707, 542, 80, -923, -923, 4758, -923, + 326, -923, 6988, 6988, 6363, -923, 696, 704, 709, 715, + 716, -923, -923, 378, 561, -923, -923, -923, -923, 1185, + -923, 571, 582, 1562, -923, 1175, -923, -923, 29, -923, + 1069, -923, 583, 5637, 574, 1069, 5637, 564, 4685, 1306, + 575, 1306, 1306, 1306, 1306, 1306, 49, -923, -923, 570, + 6435, -923, -923, -923, 5440, 105, -923, 577, -923, 593, + 594, 3171, 3059, 586, 1069, 1069, 4274, 1069, 1069, 1069, + 1069, -923, 11, 209, -923, 4576, -923, 3707, 3707, 580, + 584, 587, -923, -923, -923, 3707, -923, 3707, -923, 588, + -923, 6011, 809, -923, -923, -923, -923, -923, -923, 591, + -923, -923, 601, -923, 3915, 482, 579, 596, 5757, 1286, + 355, -61, -6, 597, 598, 5228, -923, -923, 1286, 604, + 604, 604, 604, 604, 157, 3707, -923, 355, -923, 605, + 605, 605, 605, 605, 233, 3707, -923, 608, -923, 3707, + -923, 600, 4703, 6507, -923, 614, -923, -923, 5786, 5786, + 5786, 611, 5786, 613, 5491, 5786, 1818, 76, 76, 76, + 76, 610, -67, 76, -923, -923, 3981, 3707, 3707, 3707, + 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, + 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3707, 3305, 3707, + -923, -923, -923, -923, -59, 633, 635, 636, 638, 6579, + 13, -923, 1175, 6867, 5608, 5440, 637, 630, 1175, 1175, + 1175, 1175, 1175, 1175, -2, 605, -923, 209, -923, 626, + 1069, 216, 627, -923, -923, 253, 1306, 634, 634, 634, + 634, 634, -923, 3707, -923, -923, 5637, 631, 277, -923, + -43, 652, 653, -923, 2318, -923, -923, -923, 3171, 640, + 656, 3915, -923, -923, 1069, 302, 302, 796, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, 643, 642, -923, -923, 302, 302, + 302, 237, 808, -923, 3707, -923, 2635, 668, -923, 540, + -55, -47, -923, -923, -923, -41, -21, -923, 6097, 337, + 768, 367, -923, -923, 5637, -923, -61, -6, -923, -923, + 5637, 5637, -923, 604, 654, 648, 605, 658, 659, 3327, + -923, -923, -923, 5299, 677, 680, -923, 663, 675, 676, + 3707, 682, 5440, 667, 673, 684, 679, 4740, 3707, -923, + -923, -923, 4171, 5000, 5113, 5113, 1867, 1867, 276, 276, + -923, 3595, 5043, 2049, 1570, 1867, 1867, 293, 293, 76, + 76, 76, -923, -923, 6, 1837, 6651, 831, 694, 836, + 681, -923, 839, 840, 842, -923, 706, -2, 605, -923, + -923, -923, -923, -923, -923, 5786, 1175, 4120, -923, -923, + 714, -923, -923, 256, 707, -923, -923, 634, 5637, 701, + 710, -923, -923, 5440, 3707, 3707, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, -923, -923, + -923, -923, -923, -923, -923, -923, -923, -923, 708, -923, + 3439, 302, -923, -923, -923, -923, -923, 3841, 711, 3059, + 1069, -923, -923, -923, -923, 5228, 337, -923, -923, -923, + 5, 712, 717, -923, -923, 718, 728, 5637, -923, 5637, + -923, -923, 6130, 6189, 6203, 5440, 297, -923, -923, 862, + -923, 5299, -923, 731, 735, 734, 737, 736, -923, -923, + 740, -923, -923, 76, 3707, -923, -923, -923, 17, -923, + 760, 730, 42, 742, 53, -923, -923, -923, 745, 727, + 759, 761, 40, 763, 4120, 4120, 4120, 4120, 4120, 1818, + 4120, 1494, -923, 1069, 965, 756, -923, 965, 5637, 757, + -923, -923, 758, -923, 771, 762, 2118, -923, 3171, 3915, + 764, -923, -923, 793, -923, 775, -923, -923, -923, -923, + -923, 776, 777, 6217, -923, 6217, -923, 6217, -923, -923, + 6217, 6217, 6217, -923, 6723, -923, 3707, 3707, -923, 3707, + -923, 3707, 3915, 934, 797, 940, -923, 942, 805, 806, + 946, 813, 5786, 5786, 5786, 5786, 799, 5522, 5786, 124, + 124, 124, 124, 124, 807, 62, 124, 4120, 4120, 4120, + 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, + 4120, 4120, 4120, 4120, 4120, 4120, 3573, 3707, -923, -923, + 5637, 812, -923, 965, -923, -923, 969, -923, 819, -923, + -923, -923, 5228, 5228, 5228, -923, -923, -923, -923, -923, + -923, -923, -923, -923, 91, 96, 99, 135, 841, -923, + 821, 850, -923, -923, 137, -923, 833, 844, 845, 846, + 5440, 838, 847, 851, 4120, -923, 4356, 5059, 1194, 1194, + 1898, 1898, 699, 699, -923, 1391, 5075, 5099, 1449, 430, + 430, 124, 124, 124, -923, -923, 138, 1945, 5637, 848, + -923, 965, -923, -923, 965, 849, -923, -923, -923, 965, + 965, -923, -923, -923, -923, 998, 852, 867, 1007, 1009, + 872, -923, 857, 858, 863, 864, -923, -923, 868, 124, + 4120, -923, -923, 865, -923, 965, -923, -923, 880, -923, + 870, 871, -923, 3707, 3707, 3707, -923, 3707, 1494, -923, + 5228, -923, 885, 886, 139, 150, 155, 171, 5228, -923, + -923, -923, -923, -923, -923, -923, -923 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1281,192 +1285,194 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 0, 757, 0, 0, 0, 757, 5, 645, 641, 644, - 753, 754, 647, 648, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 643, 649, 0, 0, 0, 0, 0, + 0, 761, 0, 0, 0, 761, 5, 649, 645, 648, + 757, 758, 651, 652, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 647, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 651, 650, 0, 0, 0, - 0, 0, 642, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 757, 0, 3, 582, 646, 292, 303, 302, - 386, 387, 389, 390, 371, 0, 0, 401, 368, 400, - 395, 392, 391, 394, 372, 0, 0, 373, 393, 403, - 388, 757, 757, 4, 294, 295, 296, 0, 357, 757, - 291, 383, 384, 385, 1, 0, 0, 21, 757, 757, - 757, 22, 757, 757, 757, 0, 38, 757, 0, 0, - 0, 0, 757, 0, 0, 0, 0, 757, 757, 0, - 757, 757, 757, 0, 757, 757, 6, 17, 7, 19, - 0, 15, 16, 18, 69, 40, 757, 757, 0, 757, - 757, 757, 757, 0, 757, 0, 757, 0, 757, 0, + 0, 0, 0, 0, 0, 655, 654, 0, 0, 0, + 0, 0, 646, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 761, 0, 3, 586, 650, 296, 307, 306, + 390, 391, 393, 394, 375, 0, 0, 405, 372, 404, + 399, 396, 395, 398, 376, 0, 0, 377, 397, 407, + 392, 761, 761, 4, 298, 299, 300, 0, 361, 761, + 295, 387, 388, 389, 1, 0, 0, 21, 761, 761, + 761, 22, 761, 761, 761, 0, 40, 761, 0, 0, + 0, 0, 0, 761, 0, 0, 0, 0, 761, 761, + 0, 761, 761, 761, 0, 761, 761, 6, 17, 7, + 19, 0, 15, 16, 18, 71, 42, 761, 761, 0, + 761, 761, 761, 761, 0, 761, 0, 761, 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 757, 318, 324, 0, 0, 0, - 606, 0, 757, 317, 0, 757, 757, 0, 0, 0, - 0, 757, 757, 615, 613, 612, 614, 611, 292, 386, - 387, 389, 390, 401, 400, 395, 392, 391, 394, 393, - 388, 0, 0, 541, 738, 739, 740, 748, 741, 744, - 742, 746, 745, 743, 747, 727, 728, 0, 0, 757, - 733, 726, 610, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 761, 322, 328, 0, 0, + 0, 610, 0, 761, 321, 0, 761, 761, 0, 0, + 0, 0, 761, 761, 619, 617, 616, 618, 615, 296, + 390, 391, 393, 394, 405, 404, 399, 396, 395, 398, + 397, 392, 0, 0, 545, 742, 743, 744, 752, 745, + 748, 746, 750, 749, 747, 751, 731, 732, 0, 0, + 761, 737, 730, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 755, 756, 757, 757, - 0, 369, 370, 402, 392, 397, 396, 399, 293, 0, - 398, 0, 278, 757, 757, 757, 757, 757, 757, 0, - 327, 277, 329, 757, 749, 750, 751, 752, 0, 359, - 0, 331, 0, 0, 58, 60, 0, 757, 757, 52, - 41, 51, 53, 757, 42, 148, 47, 23, 757, 0, - 45, 0, 0, 0, 0, 50, 757, 0, 26, 25, - 24, 48, 44, 0, 152, 0, 151, 0, 54, 0, - 20, 0, 0, 46, 49, 326, 305, 316, 0, 0, - 0, 0, 13, 0, 66, 0, 325, 63, 307, 308, - 309, 357, 757, 304, 0, 540, 539, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 759, 760, 761, + 761, 0, 373, 374, 406, 396, 401, 400, 403, 297, + 0, 402, 0, 282, 761, 761, 761, 761, 761, 761, + 0, 331, 281, 333, 761, 753, 754, 755, 756, 0, + 363, 0, 335, 0, 0, 60, 62, 0, 761, 761, + 54, 43, 53, 55, 761, 44, 150, 49, 23, 761, + 0, 47, 0, 0, 0, 0, 0, 52, 761, 0, + 26, 25, 24, 50, 46, 0, 154, 0, 153, 0, + 56, 0, 20, 0, 0, 48, 51, 330, 309, 320, + 0, 0, 0, 0, 13, 0, 68, 0, 329, 65, + 311, 312, 313, 361, 761, 308, 0, 544, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 319, 0, 757, 321, + 0, 0, 0, 0, 0, 0, 0, 0, 323, 0, + 761, 325, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 644, 735, 738, 0, + 761, 0, 733, 210, 628, 629, 630, 631, 632, 633, + 636, 637, 643, 0, 625, 626, 627, 634, 635, 623, + 624, 620, 621, 622, 642, 641, 0, 0, 332, 334, + 0, 0, 0, 761, 283, 0, 272, 761, 761, 761, + 761, 761, 288, 271, 0, 284, 0, 285, 287, 286, + 195, 761, 0, 0, 0, 761, 761, 0, 196, 199, + 761, 0, 194, 761, 369, 0, 366, 365, 360, 364, + 0, 742, 743, 744, 0, 0, 746, 339, 301, 341, + 0, 761, 0, 761, 309, 0, 0, 45, 41, 761, + 0, 0, 0, 0, 0, 0, 761, 378, 0, 761, + 330, 309, 0, 329, 74, 0, 384, 0, 79, 81, + 0, 0, 761, 310, 0, 761, 0, 0, 408, 217, + 0, 70, 67, 0, 316, 363, 0, 593, 592, 609, + 599, 595, 597, 598, 0, 605, 0, 604, 658, 594, + 659, 0, 661, 0, 662, 0, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 601, 0, 0, 0, + 324, 0, 600, 603, 0, 607, 606, 0, 612, 613, + 602, 596, 587, 546, 736, 0, 761, 761, 761, 94, + 211, 0, 640, 639, 304, 303, 305, 289, 761, 273, + 278, 274, 275, 277, 276, 761, 0, 0, 0, 761, + 0, 236, 0, 0, 761, 198, 0, 0, 761, 761, + 761, 761, 761, 761, 761, 250, 249, 0, 260, 0, + 0, 0, 0, 0, 0, 761, 0, 542, 541, 370, + 359, 302, 0, 0, 761, 761, 0, 57, 61, 723, + 719, 722, 725, 726, 202, 0, 0, 0, 721, 727, + 0, 729, 728, 0, 0, 0, 720, 0, 0, 0, + 0, 0, 0, 0, 0, 203, 238, 206, 239, 675, + 724, 201, 761, 761, 761, 380, 0, 0, 0, 0, + 0, 382, 761, 0, 0, 171, 172, 173, 159, 0, + 160, 0, 156, 161, 157, 761, 170, 155, 0, 76, + 0, 386, 0, 761, 0, 0, 761, 0, 0, 761, + 0, 761, 761, 761, 761, 761, 0, 241, 240, 0, + 761, 83, 408, 212, 0, 0, 69, 0, 761, 0, + 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 66, 761, 761, 174, 0, 314, 0, 0, 0, + 0, 0, 326, 327, 611, 0, 608, 0, 734, 0, + 101, 0, 0, 95, 103, 98, 102, 97, 99, 0, + 96, 100, 0, 189, 638, 279, 0, 0, 0, 761, + 0, 761, 761, 0, 0, 761, 197, 200, 761, 255, + 251, 252, 254, 253, 0, 761, 230, 0, 261, 266, + 262, 263, 265, 264, 0, 761, 233, 290, 367, 0, + 336, 0, 0, 761, 344, 761, 343, 64, 0, 0, + 0, 685, 0, 0, 0, 0, 0, 693, 692, 691, + 690, 0, 0, 689, 63, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 640, 731, 734, 0, 757, 0, - 729, 206, 624, 625, 626, 627, 628, 629, 632, 633, - 639, 0, 621, 622, 623, 630, 631, 619, 620, 616, - 617, 618, 638, 637, 0, 0, 328, 330, 0, 0, - 0, 757, 279, 0, 268, 757, 757, 757, 757, 757, - 284, 267, 0, 280, 0, 281, 283, 282, 191, 757, - 0, 0, 0, 757, 757, 0, 192, 195, 757, 0, - 190, 757, 365, 0, 362, 361, 356, 360, 0, 738, - 739, 740, 0, 0, 742, 335, 297, 337, 0, 757, - 0, 757, 305, 0, 0, 43, 39, 757, 0, 0, - 0, 0, 0, 757, 374, 0, 757, 326, 305, 0, - 325, 72, 0, 380, 0, 77, 79, 0, 0, 757, - 306, 0, 757, 0, 0, 404, 213, 0, 68, 65, - 0, 312, 359, 0, 589, 588, 605, 595, 591, 593, - 594, 0, 601, 0, 600, 654, 590, 655, 0, 657, - 0, 658, 0, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 597, 0, 0, 0, 320, 0, 596, - 599, 0, 603, 602, 0, 608, 609, 598, 592, 583, - 542, 732, 0, 757, 757, 757, 92, 207, 0, 636, - 635, 300, 299, 301, 285, 757, 269, 274, 270, 271, - 273, 272, 757, 0, 0, 0, 757, 0, 232, 0, - 0, 757, 194, 0, 0, 757, 757, 757, 757, 757, - 757, 757, 246, 245, 0, 256, 0, 0, 0, 0, - 0, 0, 757, 0, 538, 537, 366, 355, 298, 0, - 0, 757, 757, 0, 55, 59, 719, 715, 718, 721, - 722, 198, 0, 0, 0, 717, 723, 0, 725, 724, - 0, 0, 0, 716, 0, 0, 0, 0, 0, 0, - 0, 0, 199, 234, 202, 235, 671, 720, 197, 757, - 757, 757, 376, 0, 0, 0, 0, 378, 757, 0, - 0, 169, 170, 171, 157, 0, 158, 0, 154, 159, - 155, 757, 168, 153, 0, 74, 0, 382, 0, 757, - 0, 0, 757, 0, 0, 757, 0, 757, 757, 757, - 757, 757, 0, 237, 236, 0, 757, 81, 404, 208, - 0, 0, 67, 0, 757, 0, 0, 757, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 757, 757, - 172, 0, 310, 0, 0, 0, 0, 0, 322, 323, - 607, 0, 604, 0, 730, 0, 99, 0, 0, 93, - 101, 96, 100, 95, 97, 0, 94, 98, 0, 187, - 634, 275, 0, 0, 0, 757, 0, 757, 757, 0, - 0, 757, 193, 196, 757, 251, 247, 248, 250, 249, - 0, 757, 226, 0, 257, 262, 258, 259, 261, 260, - 0, 757, 229, 286, 363, 0, 332, 0, 0, 757, - 340, 757, 339, 62, 0, 0, 0, 681, 0, 0, - 0, 0, 0, 689, 688, 687, 686, 0, 0, 685, - 61, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 57, 56, 379, 757, - 0, 0, 0, 0, 757, 0, 37, 757, 757, 0, - 162, 160, 0, 757, 757, 757, 757, 757, 757, 757, - 166, 73, 757, 381, 0, 0, 0, 0, 314, 313, - 0, 757, 242, 238, 239, 241, 240, 87, 757, 315, - 14, 757, 0, 0, 8, 0, 0, 0, 214, 405, - 406, 216, 217, 757, 0, 220, 222, 219, 215, 0, - 179, 175, 0, 116, 117, 118, 119, 120, 121, 124, - 125, 140, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 144, 143, 127, 126, 113, 115, - 114, 122, 123, 111, 112, 108, 109, 110, 107, 0, - 0, 106, 173, 176, 178, 177, 0, 0, 183, 757, - 185, 0, 0, 70, 311, 0, 0, 656, 659, 660, - 0, 0, 757, 0, 757, 0, 0, 404, 276, 757, - 233, 757, 757, 227, 230, 757, 757, 287, 252, 255, - 0, 263, 266, 0, 367, 334, 333, 336, 0, 0, - 342, 341, 0, 0, 0, 757, 0, 0, 0, 0, - 0, 0, 0, 0, 714, 200, 203, 698, 699, 700, - 701, 702, 703, 706, 707, 713, 0, 695, 696, 697, - 704, 705, 693, 694, 690, 691, 692, 712, 711, 0, - 0, 757, 0, 0, 0, 0, 0, 375, 0, 757, - 167, 147, 145, 150, 146, 156, 163, 0, 757, 0, - 164, 204, 0, 75, 757, 0, 0, 757, 89, 243, - 757, 0, 0, 209, 404, 0, 757, 757, 211, 212, - 408, 409, 413, 410, 418, 411, 412, 414, 415, 416, - 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 486, - 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, 513, 757, 530, 531, 532, - 523, 535, 519, 520, 518, 525, 526, 514, 515, 516, - 517, 524, 522, 529, 527, 533, 528, 521, 534, 407, - 0, 218, 221, 180, 174, 142, 141, 182, 186, 757, - 0, 207, 0, 586, 585, 587, 584, 757, 757, 188, - 105, 102, 0, 0, 0, 228, 231, 0, 0, 757, - 253, 757, 264, 364, 746, 0, 745, 0, 0, 343, - 345, 735, 757, 0, 680, 0, 0, 0, 0, 0, - 678, 677, 0, 683, 684, 672, 0, 710, 709, 377, - 0, 27, 0, 0, 0, 36, 165, 161, 0, 0, + 59, 58, 383, 761, 0, 761, 0, 0, 0, 761, + 0, 39, 761, 761, 0, 164, 162, 0, 761, 761, + 761, 761, 761, 761, 761, 168, 75, 761, 385, 0, + 0, 0, 0, 318, 317, 0, 761, 246, 242, 243, + 245, 244, 89, 761, 319, 14, 761, 0, 0, 8, + 0, 0, 0, 218, 409, 410, 220, 221, 761, 0, + 224, 226, 223, 219, 0, 181, 177, 0, 118, 119, + 120, 121, 122, 123, 126, 127, 142, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 146, + 145, 129, 128, 115, 117, 116, 124, 125, 113, 114, + 110, 111, 112, 109, 0, 0, 108, 175, 178, 180, + 179, 0, 0, 185, 761, 187, 0, 0, 72, 315, + 0, 0, 660, 663, 664, 0, 0, 761, 0, 761, + 0, 0, 408, 280, 761, 237, 761, 761, 231, 234, + 761, 761, 291, 256, 259, 0, 267, 270, 0, 371, + 338, 337, 340, 0, 0, 346, 345, 0, 0, 0, + 761, 0, 0, 0, 0, 0, 0, 0, 0, 718, + 204, 207, 702, 703, 704, 705, 706, 707, 710, 711, + 717, 0, 699, 700, 701, 708, 709, 697, 698, 694, + 695, 696, 716, 715, 0, 0, 761, 0, 0, 0, + 0, 192, 0, 0, 0, 379, 0, 761, 169, 149, + 147, 152, 148, 158, 165, 0, 761, 0, 166, 208, + 0, 77, 761, 0, 0, 761, 91, 247, 761, 0, + 0, 213, 408, 0, 761, 761, 215, 216, 412, 413, + 417, 414, 422, 415, 416, 418, 419, 420, 421, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 490, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 761, 534, 535, 536, 527, 539, + 523, 524, 522, 529, 530, 518, 519, 520, 521, 528, + 526, 533, 531, 537, 532, 525, 538, 411, 0, 222, + 225, 182, 176, 144, 143, 184, 188, 761, 0, 211, + 0, 590, 589, 591, 588, 761, 761, 190, 107, 104, + 0, 0, 0, 232, 235, 0, 0, 761, 257, 761, + 268, 368, 750, 0, 749, 0, 0, 347, 349, 739, + 761, 0, 684, 0, 0, 0, 0, 0, 682, 681, + 0, 687, 688, 676, 0, 714, 713, 381, 0, 32, + 193, 0, 0, 0, 0, 38, 167, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 205, 543, 0, 78, 0, 83, 80, 757, 0, - 244, 757, 0, 9, 0, 0, 0, 223, 757, 224, - 0, 181, 71, 0, 189, 0, 103, 652, 757, 757, - 757, 0, 0, 0, 348, 0, 347, 0, 346, 736, - 0, 0, 0, 737, 757, 344, 0, 0, 682, 0, - 679, 0, 708, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 558, 556, 555, - 557, 554, 0, 0, 553, 0, 0, 0, 0, 0, + 0, 209, 547, 0, 80, 0, 85, 82, 761, 0, + 248, 761, 0, 9, 0, 0, 0, 227, 761, 228, + 0, 183, 73, 0, 191, 0, 105, 656, 761, 761, + 761, 0, 0, 0, 352, 0, 351, 0, 350, 740, + 0, 0, 0, 741, 761, 348, 0, 0, 686, 0, + 683, 0, 712, 0, 0, 0, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 562, + 560, 559, 561, 558, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 76, 85, 757, 0, - 757, 82, 210, 12, 10, 536, 0, 757, 404, 104, - 757, 757, 757, 757, 757, 354, 353, 352, 351, 350, - 349, 338, 0, 0, 0, 0, 0, 28, 0, 33, - 35, 0, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 581, 567, 568, 569, 570, 571, 572, 573, - 574, 580, 0, 564, 565, 566, 562, 563, 559, 560, - 561, 579, 578, 0, 0, 757, 0, 757, 88, 11, - 225, 184, 0, 290, 289, 288, 254, 265, 675, 674, - 676, 673, 0, 0, 0, 0, 552, 0, 0, 0, - 0, 550, 549, 0, 544, 0, 577, 576, 0, 757, - 90, 653, 29, 0, 0, 31, 0, 0, 0, 551, - 0, 575, 757, 757, 0, 0, 0, 0, 0, 0, - 757, 84, 34, 32, 547, 546, 548, 545, 86 + 0, 0, 0, 0, 0, 0, 0, 0, 78, 87, + 761, 0, 761, 84, 214, 12, 10, 540, 0, 761, + 408, 106, 761, 761, 761, 761, 761, 358, 357, 356, + 355, 354, 353, 342, 0, 0, 0, 0, 761, 33, + 0, 0, 35, 37, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 585, 571, 572, 573, 574, + 575, 576, 577, 578, 584, 0, 568, 569, 570, 566, + 567, 563, 564, 565, 583, 582, 0, 0, 761, 0, + 761, 90, 11, 229, 186, 0, 294, 293, 292, 258, + 269, 679, 678, 680, 677, 0, 0, 0, 0, 0, + 0, 556, 0, 0, 0, 0, 554, 553, 0, 548, + 0, 581, 580, 0, 761, 92, 657, 193, 0, 28, + 0, 0, 30, 0, 0, 0, 555, 0, 579, 761, + 761, 34, 0, 0, 0, 0, 0, 0, 761, 86, + 36, 31, 551, 550, 552, 549, 88 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -918, -918, -304, -918, -28, -918, -918, 774, -103, -918, - 1012, -428, 445, -89, -918, -918, -145, -918, -918, -214, - -918, -918, -918, 772, -918, -918, -918, -918, -918, -308, - -918, -918, -105, -918, -918, -918, -918, 221, 408, -634, - -918, -701, -745, -479, -918, -135, -918, 39, -463, -918, - -500, -917, -918, -436, 265, -649, -409, -59, -158, -88, - -61, 22, -279, -635, 788, 793, -163, -133, -918, -130, - -918, -918, -918, -918, -162, -124, -918, -457, -918, -918, - 16, 21, -918, -918, -918, -918, 48, 47, -918, -918, - -726, -918, -96, -918, -589, -107, -60, 175, 517, 145, - -918, -918, -918, 706, 206, -47, 152, -468, -1 + -923, -923, -309, -923, -65, -923, -923, 733, -118, -923, + 89, -439, 393, -115, -923, -923, -210, -923, -923, -277, + -923, -923, -923, 719, -923, -923, -923, -923, -923, -592, + -923, -923, -109, -923, -923, -923, -923, 165, 352, -663, + -923, -698, -738, -396, -585, -923, -194, -923, -23, -522, + -923, -505, -922, -923, -461, 211, -607, 246, 44, -136, + -82, 332, 197, -282, -642, 724, 1215, -147, -116, -923, + -71, -923, -923, -923, -923, -225, -64, -923, -463, -923, + -923, -33, -7, -923, -923, -923, -923, -36, -42, -923, + -923, -702, -923, -156, -923, -571, -124, -60, 377, 306, + 305, -923, -923, -923, 655, -90, 1188, 245, -488, -1 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 4, 5, 913, 914, 137, 522, 138, 139, 308, - 140, 293, 294, 141, 530, 524, 747, 330, 706, 891, - 344, 709, 712, 345, 911, 1408, 1475, 1090, 1318, 585, - 972, 1073, 142, 327, 697, 698, 699, 700, 701, 748, - 1239, 749, 778, 465, 466, 671, 672, 1080, 410, 732, - 528, 924, 925, 467, 674, 722, 795, 805, 279, 280, - 91, 92, 346, 180, 347, 93, 290, 94, 641, 95, - 642, 821, 1019, 1020, 1269, 96, 97, 476, 472, 473, - 98, 99, 143, 688, 869, 144, 100, 101, 102, 103, - 733, 734, 919, 1229, 633, 354, 355, 1311, 213, 65, - 675, 676, 228, 229, 1270, 1271, 622, 66, 145 + -1, 4, 5, 918, 919, 138, 525, 139, 140, 309, + 141, 294, 295, 142, 533, 527, 751, 332, 710, 896, + 346, 713, 716, 347, 916, 1420, 1488, 1098, 1328, 588, + 977, 1081, 143, 329, 701, 702, 703, 704, 705, 752, + 1247, 753, 782, 1070, 467, 468, 674, 675, 1088, 412, + 736, 531, 929, 930, 469, 677, 726, 799, 809, 280, + 281, 91, 92, 348, 181, 349, 93, 291, 94, 644, + 95, 645, 825, 1024, 1025, 1277, 96, 97, 478, 474, + 475, 98, 99, 144, 692, 873, 145, 100, 101, 102, + 103, 737, 738, 924, 1237, 636, 356, 357, 1321, 214, + 65, 678, 679, 229, 230, 1278, 1279, 625, 66, 146 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1474,1352 +1480,1387 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 6, 212, 912, 980, 282, 892, 1230, 348, 305, 705, - 349, 1335, 503, 782, 258, 230, 350, 493, 256, 390, - 257, 638, 827, 677, 409, 187, 608, 324, 767, 261, - 710, 407, 604, 829, 1374, 612, 104, 403, 268, 801, - 357, 326, 359, 360, 361, 362, 1007, 364, 307, 366, - 510, 368, 148, 408, 639, 673, 404, 153, 295, 621, - 181, 231, 645, -749, 149, 182, 900, 384, 902, 903, - 904, 905, 906, 409, 841, 550, 317, 896, 392, 393, - 403, 150, 403, 241, 400, 401, 332, 256, 811, 257, - 281, 281, 183, 151, 551, 262, 146, 259, 291, 589, - 271, 1034, 272, 155, 273, 765, 930, 931, 241, 973, - 974, 975, 976, 152, 147, 450, 452, 454, 456, 457, - 764, 284, 285, 286, 1062, 1079, 602, 783, 265, 266, - 267, 386, 994, -749, 389, 270, -749, 525, 1393, 526, - 801, 527, 154, 1063, 977, 356, 356, 274, 356, 356, - 356, 356, 513, 356, 514, 356, 351, 356, 802, 978, - 979, 352, 1336, 348, 907, 908, 349, 613, 184, 812, - 436, 437, 350, 356, 188, 156, 711, 793, 1068, 405, - 406, 291, 830, 1375, 356, 356, 453, 455, 353, 533, - 356, 356, 348, 681, 434, 349, 348, 787, 1096, 349, - 403, 350, 1393, 602, 789, 350, 842, 796, 797, 798, - 799, 800, 1010, 253, 254, 255, 1097, 468, 726, 1243, - 157, 875, 1013, 287, 10, 442, 11, 275, 411, -750, - 894, 602, 790, 897, 250, 251, 252, -751, 253, 254, - 255, 276, 158, 486, 403, 488, 277, 916, 917, 983, - 289, 278, 1089, 265, 266, 267, 270, 281, 281, 159, - 288, 1085, 498, 1244, 499, 500, 501, 502, 1403, 1404, - 1405, 1253, 451, 281, 281, 451, 451, 470, 519, 403, - 160, 566, 474, 594, 512, 161, 982, 597, 598, 599, - 600, 601, 889, 520, 984, 1233, 523, 403, 1245, -750, - 469, 603, -750, 791, 531, 609, 610, -751, -752, 283, - -751, 265, 351, 801, 1009, 6, 1246, 352, 162, 1091, - 284, 285, 286, 739, 1003, 1004, 163, 740, 1400, 1401, - 1402, 164, 1403, 1404, 1405, 477, 814, 819, 165, 815, - 995, 351, 166, 567, 353, 351, 352, 571, 1000, 167, - 352, 291, 1387, 1388, 1389, 1390, 1391, 1392, 1248, 168, - 230, 817, 169, 403, 1363, 811, 1012, 1393, 1322, 1365, - 741, 170, 1368, 353, 677, 403, 1001, 353, -752, 171, - 403, -752, 1287, 1364, 874, 1008, 318, 356, 1366, 403, - 1240, 1369, 1083, 403, 1452, 172, 403, 596, 1494, 1488, - 606, 468, 284, 285, 286, 614, 673, 586, 1489, 615, - 632, 1416, 1490, 295, 443, 1491, 444, 1495, 445, 403, - 403, 742, 287, 173, 728, 636, 729, 730, 731, 1082, - 468, 174, 1092, 185, 403, 295, 403, 781, 1506, 1534, - 451, 403, 487, 295, 451, 451, 451, 451, 451, 186, - 743, 189, 616, 1535, 190, 1536, 191, 715, 451, 192, - 1537, 446, 451, 451, 744, 1088, 908, 623, 1069, 745, - 635, 1, 2, 3, 746, 796, 797, 798, 799, 800, - 978, 979, 1086, 607, 469, 260, 752, 1396, 1397, 269, - 678, 1398, 1399, 1400, 1401, 1402, 6, 1403, 1404, 1405, - 1094, 1095, 1333, 532, 287, 703, 296, 348, 978, 979, - 349, 311, 312, 469, 313, 314, 350, 319, 724, 64, - 1254, 6, 320, 468, 323, 477, 1257, 1258, 385, -91, - 387, -91, 617, -91, 388, 405, 394, 402, 1255, 1256, - 409, 447, 471, 441, 785, 624, 618, 625, 788, 626, - -267, 619, 468, 478, 702, 448, 620, 525, 489, 526, - 449, 981, 978, 979, 1237, 1061, 490, 491, 806, 807, - 808, 809, 810, 193, 194, 195, 196, 197, 804, 506, - 232, 504, 411, 470, 779, -91, 516, -91, 529, -91, - 517, 521, 627, 403, 451, 534, 295, 978, 979, 1315, - 535, 635, 536, 515, 537, 623, 469, 538, 539, 838, - 586, 1319, 892, 540, 623, 623, 623, 623, 623, 623, - 411, 1350, 1351, 1352, 541, 542, 543, 786, 544, 545, - 546, 411, 547, 548, 552, 469, 581, 549, 553, 554, - 6, 822, 890, 555, 556, 557, 558, 559, 468, 560, - 561, 468, 881, 568, 562, 563, 351, 569, 570, 572, - 573, 352, 574, 637, 575, 577, 578, 584, 591, 1008, - 593, 723, 628, 181, -269, 1483, 1484, 1485, 182, 595, - 602, 682, 750, 915, 1247, 487, 629, 6, 353, 611, - 640, 630, 1482, 985, 986, 643, 631, 679, 683, 684, - 623, 990, 685, 991, 686, 183, 704, 399, 470, 707, - 759, 470, 727, 751, 724, 760, 724, 724, 724, 724, - 724, 295, 753, 468, 754, 762, 761, 1002, 784, 763, - 794, 469, 803, 920, 469, 813, 927, -358, 816, 820, - 824, 825, 826, 702, 1011, 828, 832, 779, 411, 831, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 677, 435, 1074, 840, 1071, 1314, 439, 1531, 1317, - 1341, 468, 1342, 181, 623, 1538, 411, 411, 182, 1072, - 779, 870, 871, 623, 872, 873, 876, 878, 477, 879, - 635, 893, 895, 673, 1059, 898, 469, 918, 901, 921, - 635, 909, 922, 494, 929, 183, 987, 988, 1070, 997, - 1021, 1064, 989, 992, 996, 806, 807, 808, 809, 810, - 999, 998, 1005, 1076, 1006, 1015, 801, 811, 1018, 1409, - 505, -276, 1025, 1027, 1065, 1066, 1077, 1033, 1084, 1087, - 468, 1078, 908, 1093, 211, 1098, 1099, 1232, 750, 1234, - 1231, 1235, 1238, 750, 469, 1242, 1250, 723, 6, 723, - 723, 723, 723, 723, 1236, 1259, 623, 1261, 475, 1272, - 1274, 1260, 623, 623, 623, 623, 623, 623, 1081, 1262, - 1273, 411, 750, 750, 1275, 750, 750, 750, 750, 1290, - 724, 1276, 564, 1278, 1282, 1280, 1249, 635, 1281, 1291, - 470, 1292, 1283, 1293, 1294, 1295, 1313, 1316, 1277, 579, - 580, 70, 927, 71, 72, 73, 587, 702, 1320, 1476, - 1321, 1331, 1327, 469, 1353, 1337, 1338, 1339, 468, 1340, - 1356, 358, 1357, 1358, 468, 468, 363, 1359, 365, 1252, - 367, 80, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 264, 1354, 1360, - 1361, 1367, 1370, 1407, 1371, 1372, 1373, 391, 635, 1376, - 1279, 396, 397, 398, 1412, 1418, 82, 83, 634, 1324, - 1325, 586, 1410, 281, 1413, 766, 1508, 1414, 470, 1417, - 411, 411, 1419, 88, 470, 470, 1423, 1424, 90, 181, - 1436, 767, 1437, 1411, 182, 1438, 1439, 1440, 1441, 1011, - 1442, 469, 1451, 1447, 356, 768, 1477, 469, 469, 468, - 1420, 1421, 1422, 1479, 714, 1493, 1497, 1480, 769, 770, - 1492, 183, 1496, 1498, 738, 1501, 1499, 750, 915, 1502, - 1503, 1509, 1513, 723, 771, 1512, 1514, 1515, 1511, 1516, - 1517, 1518, 440, 1532, 241, 1519, 1520, 1323, 1081, 214, - 215, 216, 237, 238, 239, 240, 1522, 623, 1524, 1525, - 1533, 750, 496, 586, 772, 241, 586, 773, 823, 470, - 774, 284, 285, 286, 716, 356, 356, 1332, 717, 1406, - 1075, 509, 1478, 877, 1330, 780, 775, 1036, 1296, 1481, - 1326, 1355, 469, 583, 0, 1486, 1487, 511, 776, 634, - 299, 300, 301, 217, 302, 304, 306, 0, 0, 310, - 0, 0, 777, 0, 315, 218, 219, 0, 0, 321, - 322, 718, 325, 328, 329, 0, 333, 334, 0, 284, - 285, 286, 882, 0, 625, 0, 883, 818, 0, 0, - 1334, 0, 0, 0, 214, 215, 216, 0, 0, 1510, - 0, 220, 221, 0, 222, 214, 215, 216, 468, 223, - 565, 224, 833, 834, 835, 836, 0, 839, 248, 249, - 250, 251, 252, 287, 253, 254, 255, 0, 468, 884, - 468, 1523, 0, 0, 0, 920, 0, 246, 247, 248, - 249, 250, 251, 252, 1530, 253, 254, 255, 217, 0, - 1349, 719, 0, 0, 1312, 1251, 0, 0, 0, 217, - 218, 219, 0, 0, 0, 720, 0, 0, 678, 0, - 721, 218, 219, 0, 0, 0, 779, 281, 0, 1383, - 0, 287, 0, 0, 926, 0, 0, 468, 470, 0, - 470, 469, 0, 0, 0, 0, 220, 221, 0, 222, - 0, 6, 0, 0, 223, 0, 224, 220, 221, 885, - 222, 469, 0, 469, 0, 223, 0, 224, 0, 0, - 0, 0, 766, 886, 0, 0, 1432, 1433, 887, 1434, - 0, 1435, 0, 888, 0, 0, 0, 708, 0, 304, - 310, 316, 0, 0, 725, 495, 0, 470, 634, -268, - 586, 0, 768, 0, 0, 0, 0, 927, 634, 214, - 215, 216, 1014, 0, 0, 769, 770, 586, 586, 586, - 469, 755, 0, 756, 1473, 757, 0, 468, 0, 1032, - 0, 771, 0, 0, 0, 0, 0, 0, 0, 0, - 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, - 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, - 1057, 772, 1060, 217, 773, 1393, 0, 774, 0, 0, - 0, 0, 0, 0, 750, 218, 219, 0, 0, 0, - 1500, 0, 0, 775, 0, 0, 0, 470, 0, 586, - 0, 0, 0, 0, 468, 776, 586, 0, 0, 779, - 779, 779, 586, 586, 0, 634, 0, 0, 0, 777, - 469, 220, 221, 0, 222, 0, 0, 0, 0, 223, - 926, 224, 0, 0, 0, 0, 0, 0, 0, 1312, - 1312, 1312, 1312, 1312, 0, 1312, 1526, 1527, 1528, 0, - 1529, 0, 837, 0, 0, 750, 239, 240, 0, 225, - 1344, 1346, 1348, 226, 470, 0, 586, 241, 227, 1377, - 1378, 1379, 1380, 1381, 0, 1384, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 634, 469, 1241, 0, - 0, 644, 0, 0, 0, 0, 0, 0, 586, 1398, - 1399, 1400, 1401, 1402, 0, 1403, 1404, 1405, 0, 0, - 0, 586, 779, 0, 0, 0, 0, 0, 0, 779, - 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, - 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1425, - 1285, 1426, 0, 1427, 0, 0, 1428, 1429, 1430, 0, - 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, - 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 0, - 7, 8, 9, 10, 0, 11, 12, 13, 198, 68, - 0, 0, 0, 0, 0, 0, 1312, 0, 0, 0, - 0, 248, 249, 250, 251, 252, 0, 253, 254, 255, - 0, 0, 0, 0, 0, 0, 0, 1022, 1023, 1024, - 0, 1026, 0, 1029, 1030, 1031, 1504, 15, 69, 0, - 0, 199, 0, 200, 201, 202, 74, 75, 0, 20, - 76, 0, 0, 203, 22, 0, 0, 78, 0, 0, - 1312, 0, 23, 24, 204, 0, 0, 0, 26, 0, - 0, 205, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 206, 0, 0, - 1521, 0, 0, 0, 0, 44, 0, 45, 0, 46, - 0, 866, 867, 0, 47, 0, 207, 208, 50, 0, - 0, 51, 84, 214, 215, 216, 52, 0, 0, 53, - 85, 86, 87, 209, 0, 0, 89, 0, 210, 0, - 646, 647, 648, 10, 0, 11, 649, 650, 67, 68, - 0, 56, 651, 0, 57, 58, 59, 0, 0, 60, - 0, 61, 62, 0, 0, 63, 0, 0, 0, 1329, - 0, 0, 0, 0, 0, 0, 0, 217, 0, 0, - 0, 0, 0, 0, 460, 0, 0, 652, 69, 218, - 219, 70, 0, 71, 72, 73, 74, 461, 0, 653, - 76, 0, 0, 77, 654, 0, 0, 78, 0, 0, - 0, 0, 655, 656, 79, 0, 0, 0, 0, 0, - 0, 80, 0, 1362, 0, 220, 221, 0, 222, 0, - 0, 0, 0, 223, 0, 224, 0, 81, 0, 0, - 0, 0, 0, 0, 0, 657, 0, 658, 0, 659, - 0, 0, 0, 462, 660, 0, 82, 83, 661, 497, - 0, 662, 84, 1391, 1392, 926, 663, 0, 0, 664, - 85, 86, 87, 88, 1393, 0, 89, 0, 90, 0, + 6, 213, 769, 611, 306, 680, 1238, 709, 184, 506, + 283, 182, 897, 326, 985, 495, 328, 641, 831, 257, + 1345, 258, 795, 607, 359, 350, 361, 362, 363, 364, + 917, 366, 676, 368, 786, 370, 392, 183, 188, 266, + 267, 268, 714, 409, 771, 642, 271, 833, 615, 513, + -753, 386, 901, 648, -754, 1386, 262, 1012, 104, 405, + -755, 232, 394, 395, 768, 410, 605, 787, 402, 403, + 351, 285, 286, 287, 553, 405, 154, 352, 406, 149, + 405, 935, 936, 147, 978, 979, 980, 981, 1067, 411, + 282, 282, 405, 554, 592, 845, 605, 793, 292, 1039, + 405, 148, 806, 1104, 805, 355, 405, 1068, 353, 242, + 150, 1251, 905, 816, 907, 908, 909, 910, 911, 1252, + -753, 1105, 263, -753, -754, 1253, 405, -754, 899, 999, + -755, 902, 818, -755, 354, 819, 605, 794, 452, 454, + 456, 458, 459, 156, 411, 1254, 358, 358, 1087, 358, + 358, 358, 358, 405, 358, 797, 358, 1405, 358, 815, + 982, 284, -756, 805, 1373, 266, 267, 268, 271, 921, + 922, 1346, 1295, 288, 358, 983, 984, 438, 439, 1076, + 616, 350, 292, 1374, 151, 358, 358, 189, 715, 1377, + 684, 358, 358, 455, 457, 436, 834, 300, 301, 302, + 1380, 303, 305, 307, 1387, 880, 311, 536, 1378, 405, + 289, 350, 317, 912, 913, 350, 730, 323, 324, 1381, + 327, 330, 331, 266, 335, 336, 351, 846, 1465, 413, + 152, 987, -756, 352, 1015, -756, 153, 1093, 405, 254, + 255, 256, 155, 405, 1018, 157, 405, 479, 988, 445, + -93, 446, -93, 447, -93, 185, 351, 1501, 282, 282, + 351, 355, 1502, 352, 353, 1503, 569, 352, 518, 1008, + 1009, 1241, 260, 453, 282, 282, 453, 453, 472, 1, + 2, 3, 405, 476, 1509, 405, 405, 1415, 1416, 1417, + 354, 355, 989, 158, 353, 355, 448, 405, 353, 1097, + 1261, 1504, 405, 1510, 1521, 1552, 159, 597, 64, 242, + 160, 600, 601, 602, 603, 604, 1553, 6, 405, 308, + 354, 1554, 805, 1014, 354, 606, 242, 1005, 161, 612, + 613, 1100, 257, 1000, 258, 823, 732, 1555, 733, 734, + 735, 162, 1099, 290, 528, -93, 529, -93, 530, -93, + 272, 163, 273, 292, 274, 528, 1256, 529, 680, 986, + 164, 821, 194, 195, 196, 197, 198, 165, 627, 233, + 628, 516, 629, 517, 166, 1090, 449, 215, 216, 217, + 983, 984, 1094, 879, 10, 676, 11, 305, 311, 358, + 450, 167, 1091, 497, 168, 451, 169, 275, 815, 1017, + 1332, 983, 984, 1245, 170, 1255, 171, 259, 172, 589, + 1360, 1361, 1362, 1248, 173, 630, 1428, 1096, 913, 1262, + 983, 984, 1325, 1102, 1103, 1265, 1266, 215, 216, 217, + 174, 218, 175, 249, 250, 251, 252, 253, 479, 254, + 255, 256, 453, 219, 220, 186, 453, 453, 453, 453, + 453, 187, 251, 252, 253, 190, 254, 255, 256, 191, + 453, 320, 785, 1405, 453, 453, 983, 984, 192, 626, + 321, 193, 638, 706, 261, 270, 471, 276, 297, 221, + 222, 218, 223, 312, 1263, 1264, 313, 224, 314, 225, + 322, 277, 681, 219, 220, 631, 278, 401, 6, 315, + 1324, 279, 316, 1327, 325, 404, 387, 389, 707, 632, + 390, 396, 411, 1329, 633, 635, 443, 1343, 473, 634, + 480, 728, 491, -271, 6, 493, 492, 350, 507, 221, + 222, 509, 223, 1259, 519, 532, 489, 224, 520, 225, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 524, 437, 537, 1066, 405, 538, 441, 539, 540, + 541, 542, 351, 543, 545, 544, 546, 547, 548, 352, + 647, 549, -272, 551, 555, 413, 472, 783, 550, 1412, + 1413, 1414, 552, 1415, 1416, 1417, 584, 453, 535, 556, + 557, 558, 571, 496, 638, 559, 560, 355, 626, 561, + 353, 470, 842, 589, 562, 563, 564, 626, 626, 626, + 626, 626, 626, 413, 184, 897, 565, 182, 566, 572, + 573, 508, 575, 576, 413, 577, 354, 578, 580, 581, + 587, 594, -273, 6, 826, 598, 596, 605, 640, 614, + 646, 643, 685, 183, 792, 682, 686, 687, 688, 689, + 610, 471, 690, 706, 708, 711, 731, 755, 757, 758, + 788, 765, 767, 522, 810, 811, 812, 813, 814, 763, + 764, 798, 1351, 807, 1352, 766, -362, 820, 824, 817, + 471, 6, 828, 567, 1496, 1497, 1498, 990, 991, 829, + 830, 832, 835, 836, 626, 995, 874, 996, 844, 881, + 582, 583, 472, 479, 875, 472, 624, 590, 728, 876, + 728, 728, 728, 728, 728, 877, 878, 883, 1495, 884, + 903, 898, 1405, 900, 906, 184, 914, 925, 182, 1423, + 932, 926, 927, 1421, 923, 934, 992, 1002, 1003, 895, + 993, 783, 413, 994, 997, 1001, 1432, 1433, 1434, 680, + 1004, 1010, 1011, 1023, 183, 1079, 1020, 727, 1080, 805, + 815, 870, 871, -280, 1082, 1030, 1038, 1032, 754, 637, + 1069, 489, 1072, 1073, 471, 1074, 676, 1085, 626, 1086, + 413, 413, 1092, 1095, 783, 609, 470, 626, 1101, 913, + 1106, 1107, 1549, 1240, 638, 790, 1242, 1239, 1064, 1243, + 1556, 1244, 1246, 471, 638, 1250, 1258, 1268, 1267, 215, + 216, 217, 1269, 1280, 1026, 470, 718, 1281, 1270, 1282, + 1491, 1283, 1284, 1288, 1007, 1489, 742, 1494, 1286, 1289, + 1290, 1298, 1299, 1499, 1500, 1291, 1300, 1301, 706, 1302, + 1303, 1016, 1304, 719, 1305, 791, 1410, 1411, 1412, 1413, + 1414, 1323, 1415, 1416, 1417, 800, 801, 802, 803, 804, + 1330, 1326, 6, 218, 1071, 1337, 1331, 1363, 1376, 1347, + 1341, 626, 1383, 1348, 1349, 219, 220, 626, 626, 626, + 626, 626, 626, 1089, 1350, 1366, 413, 784, 1525, 1367, + 1368, 1369, 1370, 1523, 1371, 728, 1285, 1375, 1379, 1382, + 471, 637, 638, 471, 1384, 472, 1385, 1257, 1388, 470, + 1419, 221, 222, 1422, 223, 1424, 1078, 932, 1426, 224, + 1429, 225, 1540, 810, 811, 812, 813, 814, 1425, 1430, + 789, 1431, 1435, 1436, 1448, 1449, 293, 1548, 470, 822, + 1450, 894, 1451, 1452, 1453, 754, 1454, 215, 216, 217, + 754, 1455, 184, 1460, 727, 182, 727, 727, 727, 727, + 727, 1364, 327, 1464, 837, 838, 839, 840, 1490, 843, + 1334, 1335, 770, 638, 1492, 471, 1493, 1507, 1505, 754, + 754, 183, 754, 754, 754, 754, 589, 1508, 282, 1511, + 1512, 1513, 1514, 472, 1516, 413, 413, 1518, 1527, 472, + 472, 218, 772, 1517, 1524, 1529, 1526, 1530, 1528, 1531, + 1532, 1533, 1534, 219, 220, 773, 774, 1535, 1541, 358, + 1536, 1539, 1537, 1550, 1551, 1006, 1542, 1543, 1333, 827, + 1342, 775, 498, 471, 1013, 470, 1418, 931, 470, 1083, + 512, 882, 1506, 1340, 1306, 514, 1365, 1041, 1336, 221, + 222, 0, 223, 0, 586, 0, 0, 224, 0, 225, + 0, 776, 0, 0, 777, 0, 1089, 778, 0, 285, + 286, 287, 743, 0, 0, 626, 744, 0, 0, 0, + 0, 589, 0, 779, 589, 0, 0, 472, 0, 0, + 0, 585, 0, 358, 358, 780, 228, 0, 0, 0, + 0, 637, 0, 471, 0, 0, 0, 0, 0, 781, + 470, 637, 0, 0, 0, 1019, 0, 0, 1077, 745, + 1016, 0, 0, 0, 0, 800, 801, 802, 803, 804, + 0, 0, 1037, 0, 0, 754, 0, 0, 0, 0, + 0, 727, 0, 1042, 1043, 1044, 1045, 1046, 1047, 1048, + 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1060, 1061, 1062, 1344, 1065, 0, 0, 470, 754, + 746, 288, 1354, 1356, 1358, 285, 286, 287, 887, 0, + 628, 0, 888, 0, 0, 695, 696, 697, 0, 0, + 0, 471, 0, 0, 0, 0, 0, 471, 471, 747, + 0, 0, 0, 925, 1401, 1402, 1403, 1404, 0, 637, + 0, 0, 0, 748, 0, 0, 0, 1405, 749, 0, + 0, 0, 0, 750, 931, 889, 0, 0, 0, 70, + 0, 71, 72, 73, 0, 0, 681, 0, 470, 0, + 231, 77, 0, 0, 783, 282, 0, 0, 0, 1395, + 0, 0, 79, 1437, 0, 1438, 472, 1439, 472, 80, + 1440, 1441, 1442, 269, 0, 0, 212, 0, 0, 6, + 0, 0, 0, 0, 0, 81, 0, 288, 0, 0, + 637, 0, 1249, 296, 0, 471, 285, 286, 287, 617, + 0, 0, 0, 618, 82, 83, 1444, 1445, 0, 1446, + 0, 1447, 319, 0, 0, 890, 285, 286, 287, 720, + 0, 88, 334, 721, 89, 0, 90, 472, 0, 891, + 589, 0, 1013, 0, 892, 0, 470, 932, 0, 893, + 0, 0, 470, 470, 1293, 0, 619, 589, 589, 589, + 0, 1410, 1411, 1412, 1413, 1414, 1486, 1415, 1416, 1417, + 0, 0, 0, 0, 360, 0, 722, 388, 0, 365, + 391, 367, 0, 369, 0, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 0, 0, 1322, 0, 0, 0, 0, 0, 288, 0, + 393, 0, 0, 0, 398, 399, 400, 1397, 1398, 1399, + 1400, 1401, 1402, 1403, 1404, 407, 408, 0, 288, 472, + 0, 589, 0, 0, 1405, 0, 620, 0, 589, 0, + 470, 783, 783, 783, 589, 589, 0, 0, 0, 0, + 621, 0, 0, 0, 471, 622, 723, 1071, 0, 0, + 623, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 724, 444, 0, 0, 471, 725, 471, 1399, 1400, 1401, + 1402, 1403, 1404, 1544, 1545, 1546, 0, 1547, 0, 488, + 0, 490, 1405, 0, 0, 442, 0, 472, 0, 589, + 0, 0, 0, 0, 0, 754, 0, 0, 500, 0, + 501, 502, 503, 504, 505, 0, 0, 0, 0, 0, + 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 0, 0, + 0, 515, 0, 589, 0, 471, 0, 1405, 0, 0, + 523, 0, 0, 526, 0, 0, 0, 0, 589, 783, + 1520, 534, 1406, 1407, 1408, 1409, 1339, 783, 1410, 1411, + 1412, 1413, 1414, 0, 1415, 1416, 1417, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 754, 0, + 0, 0, 215, 216, 217, 0, 0, 885, 0, 470, + 570, 0, 0, 0, 574, 0, 0, 0, 236, 237, + 238, 239, 240, 241, 0, 0, 0, 231, 0, 470, + 1372, 470, 0, 242, 568, 0, 1410, 1411, 1412, 1413, + 1414, 0, 1415, 1416, 1417, 0, 0, 471, 0, 1322, + 1322, 1322, 1322, 1322, 0, 1322, 218, 0, 0, 0, + 0, 0, 0, 0, 599, 0, 0, 0, 219, 220, + 0, 0, 0, 0, 931, 1406, 1407, 1408, 1409, 0, + 296, 1410, 1411, 1412, 1413, 1414, 0, 1415, 1416, 1417, + 470, 0, 639, 0, 234, 235, 236, 237, 238, 239, + 240, 241, 296, 0, 221, 222, 0, 223, 0, 0, + 296, 242, 224, 0, 225, 471, 0, 0, 0, 0, + 0, 1389, 1390, 1391, 1392, 1393, 0, 1396, 0, 0, + 0, 0, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, + 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, + 1322, 0, 0, 1487, 756, 247, 248, 249, 250, 251, + 252, 253, 712, 254, 255, 256, 0, 0, 0, 729, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1297, 665, 0, 0, 666, 667, 0, 0, 0, 668, - 0, 669, 0, 0, 0, 670, 0, 0, 0, 0, - 325, 0, 0, 1100, 1101, 1102, 1103, 1104, 1105, 1106, - 1107, 1108, 1109, 1110, 0, 1111, 1112, 1113, 1114, 1115, - 1116, 1117, 1118, 1119, 1120, 1121, 0, 0, 0, 0, - 0, 0, 1474, 1122, 1123, 1124, 1125, 1126, 1127, 1128, - 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, - 1139, 1140, 0, 0, 1141, 1142, 1143, 1144, 1145, 1146, - 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 0, - 1156, 0, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, - 1165, 0, 1166, 1167, 1168, 0, 0, 0, 1398, 1399, - 1400, 1401, 1402, 0, 1403, 1404, 1405, 0, 0, 0, - 1169, 0, 0, 0, 0, 0, 1170, 1171, 1172, 0, - 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, + 0, 0, 470, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 759, 0, 760, 1322, + 761, 0, 0, 407, 1466, 1467, 1468, 1469, 1470, 1471, + 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, + 1482, 1483, 1484, 0, 0, 0, 0, 0, 0, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 0, 254, 255, 256, 0, 0, 808, 593, 0, 0, + 470, 7, 8, 9, 10, 1322, 11, 12, 13, 199, + 68, 0, 0, 0, 296, 0, 0, 0, 0, 0, + 0, 1519, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 234, 235, 236, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 0, 15, 69, + 242, 0, 200, 0, 201, 202, 203, 74, 75, 0, + 20, 76, 0, 0, 204, 22, 0, 841, 78, 240, + 241, 886, 0, 23, 24, 205, 0, 1538, 0, 26, + 242, 0, 206, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 207, 0, + 1403, 1404, 920, 0, 0, 0, 44, 0, 45, 0, + 46, 1405, 0, 0, 0, 47, 0, 208, 209, 50, + 0, 0, 51, 84, 0, 0, 0, 52, 0, 0, + 53, 85, 86, 87, 210, 0, 0, 89, 0, 211, + 296, 234, 235, 236, 237, 238, 239, 240, 241, 0, + 0, 0, 56, 0, 0, 57, 58, 59, 242, 0, + 60, 0, 61, 62, 0, 0, 63, 0, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 0, + 254, 255, 256, 0, 0, 0, 1296, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 249, 250, 251, 252, 253, 0, + 254, 255, 256, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1027, 1028, 1029, 0, 1031, 0, 1034, + 1035, 1036, 0, 0, 0, 1410, 1411, 1412, 1413, 1414, + 0, 1415, 1416, 1417, 0, 0, 0, 236, 237, 238, + 239, 240, 241, 1084, 0, 0, 0, 0, 0, 0, + 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 0, 254, 255, + 256, 0, 0, 0, 1522, 0, 0, 0, 0, 0, + 0, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 0, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 0, 0, 0, 0, 0, 0, + 0, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, + 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, + 0, 0, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, + 1157, 1158, 1159, 1160, 1161, 1162, 1163, 0, 1164, 1260, + 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 0, + 1174, 1175, 1176, 246, 247, 248, 249, 250, 251, 252, + 253, 0, 254, 255, 256, 0, 0, 0, 1177, 0, + 1287, 0, 0, 0, 1178, 1179, 1180, 0, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, - 1203, 1204, 1205, 0, 0, 0, 1206, 1207, 1208, 1209, - 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, - 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1415, 1227, 1228, + 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, + 1213, 0, 0, 0, 1214, 1215, 1216, 1217, 1218, 1219, + 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, + 1230, 1231, 1232, 1233, 1234, 1427, 1235, 1236, 0, 0, + 0, 920, 0, 0, 0, 0, 0, 0, 0, 0, + 1307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1100, 1101, 1102, 1103, 1104, 1105, 1106, - 1107, 1108, 1109, 1110, 0, 1111, 1112, 1113, 1114, 1115, - 1116, 1117, 1118, 1119, 1120, 1121, 0, 0, 0, 0, - 0, 0, 1382, 1122, 1123, 1124, 1125, 1126, 1127, 1128, - 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, - 1139, 1140, 0, 0, 1141, 1142, 1143, 1144, 1145, 1146, - 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 0, - 1156, 0, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, - 1165, 0, 1166, 1167, 1168, 0, 0, 0, 0, 0, - 0, 0, 0, 1443, 1444, 1445, 1446, 0, 1449, 1450, - 1169, 0, 0, 0, 0, 0, 1170, 1171, 1172, 0, - 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, + 0, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, + 1117, 1118, 0, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 0, 0, 0, 0, 0, 0, + 0, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, + 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, + 0, 0, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, + 1157, 1158, 1159, 1160, 1161, 1162, 1163, 0, 1164, 0, + 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 0, + 1174, 1175, 1176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1177, 0, + 0, 0, 0, 0, 1178, 1179, 1180, 0, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, - 1203, 1204, 1205, 0, 0, 0, 1206, 1207, 1208, 1209, - 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, - 1220, 1221, 1222, 1223, 1224, 1225, 1226, 0, 1227, 1228, - 7, 8, 9, 10, 0, 11, 12, 13, 492, 0, + 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, + 1213, 0, 0, 1359, 1214, 1215, 1216, 1217, 1218, 1219, + 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, + 1230, 1231, 1232, 1233, 1234, 0, 1235, 1236, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 8, 9, 10, 0, 11, 12, 13, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 233, 234, 235, 236, 237, 238, 239, 240, - 0, 0, 0, 0, 0, 0, 0, 15, 337, 241, - 0, 199, 0, 200, 201, 202, 74, 0, 0, 20, - 338, 0, 0, 203, 22, 0, 0, 78, 0, 0, - 0, 0, 23, 24, 204, 0, 0, 0, 26, 0, - 0, 205, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 206, 0, 0, + 0, 0, 0, 0, 1394, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 339, 0, 0, + 200, 0, 201, 202, 203, 74, 0, 0, 20, 340, + 0, 0, 204, 22, 0, 0, 78, 0, 0, 0, + 0, 23, 24, 205, 0, 0, 0, 26, 0, 0, + 206, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 207, 1456, 1457, 1458, + 1459, 0, 1462, 1463, 44, 0, 45, 0, 46, 0, + 0, 0, 0, 47, 0, 208, 209, 50, 0, 0, + 51, 84, 0, 0, 0, 52, 0, 0, 53, 342, + 343, 87, 210, 0, 0, 89, 0, 211, 7, 8, + 9, 10, 0, 11, 12, 13, 14, 0, 1515, 0, + 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, + 61, 62, 0, 0, 63, 0, 0, 0, 0, 234, + 235, 236, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 242, 0, 0, 16, + 0, 17, 18, 19, 0, 0, 0, 20, 0, 739, + 740, 21, 22, 0, 0, 0, 0, 0, 0, 0, + 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, + 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, + 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, + 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, + 14, 741, 0, 0, 0, 0, 0, 0, 0, 56, + 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, + 62, 0, 591, 63, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 0, 254, 255, 256, 15, + 0, 0, 0, 16, 0, 17, 18, 19, 0, 0, + 0, 20, 0, 0, 0, 21, 22, 215, 216, 217, + 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, + 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, + 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, + 50, 218, 0, 51, 0, 0, 0, 0, 52, 0, + 0, 53, 0, 219, 220, 54, 7, 8, 9, 10, + 55, 11, 12, 13, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, + 0, 60, 0, 61, 62, 435, 0, 63, 0, 221, + 222, 0, 223, 0, 0, 0, 0, 224, 0, 225, + 0, 0, 0, 15, 440, 0, 0, 16, 0, 17, + 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, + 22, 0, 0, 0, 0, 0, 0, 226, 23, 24, + 25, 227, 0, 0, 26, 0, 228, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, + 0, 44, 0, 45, 0, 46, 0, 0, 0, 0, + 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, + 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, + 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, + 57, 58, 59, 0, 0, 60, 0, 61, 62, 0, + 0, 63, 0, 0, 0, 234, 235, 236, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 15, 717, 0, + 0, 16, 242, 17, 18, 19, 0, 0, 0, 20, + 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, + 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, + 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, - 0, 0, 0, 0, 47, 0, 207, 208, 50, 0, - 0, 51, 84, 0, 0, 0, 52, 0, 0, 53, - 340, 341, 87, 209, 0, 0, 89, 0, 210, 7, - 8, 9, 10, 0, 11, 12, 13, 14, 0, 0, + 0, 0, 0, 0, 47, 0, 48, 49, 50, 0, + 0, 51, 0, 0, 0, 0, 52, 0, 0, 53, + 0, 0, 0, 54, 7, 8, 9, 10, 55, 11, + 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, - 0, 61, 62, 0, 0, 63, 0, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 0, 253, - 254, 255, 0, 0, 0, 590, 15, 0, 0, 0, - 16, 0, 17, 18, 19, 0, 0, 0, 20, 0, - 735, 736, 21, 22, 214, 215, 216, 0, 0, 0, - 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, - 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, - 0, 0, 0, 47, 0, 48, 49, 50, 217, 0, - 51, 0, 0, 0, 0, 52, 0, 0, 53, 0, - 218, 219, 54, 7, 8, 9, 10, 55, 11, 12, - 13, 14, 737, 0, 0, 0, 0, 0, 0, 0, - 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, - 61, 62, 0, 0, 63, 0, 220, 221, 0, 222, - 0, 0, 0, 0, 223, 0, 224, 0, 0, 0, - 15, 0, 0, 0, 16, 0, 17, 18, 19, 0, - 0, 0, 20, 0, 0, 0, 21, 22, 479, 480, - 481, 0, 0, 0, 0, 23, 24, 25, 582, 0, - 0, 26, 0, 227, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, - 45, 0, 46, 0, 0, 0, 0, 47, 0, 48, - 49, 50, 217, 0, 51, 0, 0, 0, 0, 52, - 0, 0, 53, 0, 218, 219, 54, 7, 8, 9, - 10, 55, 11, 12, 13, 14, 0, 0, 0, 0, - 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, - 0, 0, 60, 0, 61, 62, 433, 0, 63, 0, - 484, 221, 0, 222, 0, 0, 0, 0, 223, 0, - 224, 0, 0, 0, 15, 438, 0, 0, 16, 0, - 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, - 21, 22, 0, 0, 0, 0, 0, 288, 0, 23, - 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, - 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, - 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, - 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, - 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, - 0, 0, 63, 0, 0, 0, 233, 234, 235, 236, - 237, 238, 239, 240, 0, 0, 0, 0, 15, 713, - 0, 0, 16, 241, 17, 18, 19, 0, 0, 0, - 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, - 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, - 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, - 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, - 0, 0, 51, 0, 0, 0, 0, 52, 0, 0, - 53, 0, 0, 0, 54, 7, 8, 9, 10, 55, - 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, - 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, - 60, 0, 61, 62, 0, 0, 63, 0, 0, 588, - 0, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 15, 253, 254, 255, 16, 0, 17, 18, - 19, 0, 0, 0, 20, 0, 0, 0, 21, 22, - 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, - 0, 0, 0, 26, 0, 0, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, - 44, 0, 45, 0, 46, 0, 0, 0, 0, 47, - 0, 48, 49, 50, 0, 0, 51, 0, 0, 0, - 0, 52, 0, 0, 53, 0, 0, 0, 54, 7, - 8, 9, 10, 55, 11, 12, 13, 14, 923, 0, - 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, - 58, 59, 0, 0, 60, 0, 61, 62, 0, 0, - 63, 0, 0, 0, 233, 234, 235, 236, 237, 238, - 239, 240, 0, 0, 0, 0, 15, 0, 0, 0, - 16, 241, 17, 18, 19, 0, 0, 0, 20, 0, - 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, - 0, 23, 24, 25, 0, 0, 0, 26, 0, 0, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, - 0, 0, 0, 0, 44, 0, 45, 0, 46, 0, - 0, 0, 0, 47, 0, 48, 49, 50, 0, 0, - 51, 0, 0, 0, 0, 52, 0, 0, 53, 0, - 0, 0, 54, 7, 8, 9, 10, 55, 11, 12, - 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, - 56, 0, 0, 57, 58, 59, 0, 0, 60, 0, - 61, 62, 1058, 0, 63, 0, 928, 0, 0, 242, + 0, 61, 62, 0, 0, 63, 0, 933, 0, 0, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 15, 253, 254, 255, 16, 0, 17, 18, 19, 0, - 0, 0, 20, 0, 0, 0, 21, 22, 0, 0, - 0, 0, 0, 0, 0, 23, 24, 25, 0, 0, - 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, - 45, 0, 46, 0, 0, 0, 0, 47, 0, 48, - 49, 50, 0, 0, 51, 0, 0, 0, 0, 52, - 0, 0, 53, 0, 0, 0, 54, 7, 8, 9, - 10, 55, 11, 12, 13, 14, 1328, 0, 0, 0, - 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, - 0, 0, 60, 0, 61, 62, 0, 0, 63, 0, - 0, 0, 233, 234, 235, 236, 237, 238, 239, 240, - 0, 0, 0, 0, 15, 0, 0, 0, 16, 241, - 17, 18, 19, 0, 0, 0, 20, 0, 0, 0, - 21, 22, 0, 0, 0, 0, 0, 0, 0, 23, - 24, 25, 0, 0, 0, 26, 0, 0, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 45, 0, 46, 0, 0, 0, - 0, 47, 0, 48, 49, 50, 0, 0, 51, 0, - 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, - 54, 7, 8, 9, 10, 55, 11, 12, 13, 14, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, - 0, 57, 58, 59, 0, 0, 60, 0, 61, 62, - 1472, 0, 63, 1263, 0, 0, 0, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 15, 253, - 254, 255, 16, 0, 17, 18, 19, 0, 0, 0, - 20, 0, 0, 0, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 23, 24, 25, 0, 0, 0, 26, - 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 0, - 0, 0, 0, 0, 0, 0, 44, 0, 45, 0, - 46, 0, 0, 0, 0, 47, 0, 48, 49, 50, - 0, 0, 51, 0, 0, 0, 0, 52, 0, 0, - 53, 0, 0, 0, 54, 646, 647, 648, 10, 55, - 11, 649, 650, 67, 68, 0, 0, 1035, 0, 0, - 0, 0, 56, 0, 0, 57, 58, 59, 0, 0, - 60, 0, 61, 62, 0, 0, 63, 233, 234, 235, - 236, 237, 238, 239, 240, 0, 0, 0, 0, 460, - 0, 0, 652, 69, 241, 0, 70, 0, 71, 72, - 73, 74, 461, 0, 653, 76, 0, 0, 77, 654, - 0, 0, 78, 0, 0, 0, 0, 655, 656, 79, - 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, - 657, 0, 658, 0, 659, 0, 0, 0, 462, 660, - 0, 82, 83, 661, 0, 0, 662, 84, 0, 0, - 0, 663, 0, 0, 664, 85, 86, 87, 88, 0, - 0, 89, 0, 90, 7, 8, 9, 10, 0, 11, - 12, 13, 0, 0, 0, 0, 665, 0, 0, 666, - 667, 0, 0, 0, 668, 0, 669, 0, 0, 0, - 670, 0, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 0, 253, 254, 255, 0, 0, 0, - 1288, 1298, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1299, 0, 0, 0, 0, 1300, 234, - 235, 236, 237, 238, 239, 240, 23, 24, 0, 0, - 0, 0, 26, 0, 0, 241, 28, 29, 30, 31, + 253, 15, 254, 255, 256, 16, 0, 17, 18, 19, + 0, 0, 0, 20, 0, 0, 0, 21, 22, 0, + 0, 0, 0, 0, 0, 0, 23, 24, 25, 0, + 0, 0, 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 0, 233, 234, 235, 236, 237, 238, 239, 240, - 0, 45, 0, 46, 0, 0, 0, 0, 1301, 241, - 0, 0, 1302, 0, 0, 1303, 0, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 70, 0, 71, - 72, 73, 0, 0, 0, 0, 0, 0, 0, 263, - 0, 0, 0, 0, 0, 1304, 0, 0, 1305, 1306, - 1307, 932, 0, 1308, 0, 1309, 62, 80, 0, 1310, - 0, 933, 934, 935, 936, 937, 938, 939, 940, 0, - 0, 0, 0, 264, 0, 0, 0, 0, 941, 0, - 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, - 952, 953, 82, 83, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 0, 253, 254, 255, 0, 88, - 954, 0, 0, 0, 90, 0, 0, 0, 0, 0, - 0, 0, 335, 336, 0, 0, 0, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 0, 253, - 254, 255, 0, 0, 0, 1507, 0, 1389, 1390, 1391, - 1392, 0, 0, 955, 0, 0, 0, 0, 0, 0, - 1393, 0, 0, 337, 0, 0, 70, 0, 71, 72, - 73, 74, 0, 0, 0, 338, 0, 0, 77, 0, - 0, 0, 78, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 956, 0, 0, 957, 80, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 968, 0, 969, - 970, 0, 81, 971, 0, 335, 336, 0, 0, 0, - 0, 0, 0, 339, 0, 0, 0, 0, 0, 0, - 0, 82, 83, 0, 0, 0, 0, 84, 0, 0, - 0, 0, 0, 0, 0, 340, 341, 87, 88, 0, - 0, 89, 0, 90, 0, 0, 337, 0, 342, 70, - 0, 71, 72, 73, 74, 0, 0, 0, 338, 0, - 0, 77, 0, 0, 343, 78, 0, 0, 0, 0, - 0, 0, 79, 0, 1398, 1399, 1400, 1401, 1402, 80, - 1403, 1404, 1405, 0, 0, 0, 0, 0, 0, 0, - 0, 507, 508, 0, 0, 81, 0, 70, 0, 71, - 72, 73, 0, 0, 0, 0, 339, 0, 0, 263, - 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, - 84, 0, 0, 0, 0, 0, 0, 80, 340, 341, - 87, 88, 337, 0, 89, 70, 90, 71, 72, 73, - 74, 0, 0, 264, 338, 0, 0, 77, 0, 0, - 0, 78, 0, 0, 0, 0, 0, 343, 79, 0, - 0, 0, 82, 83, 0, 80, 233, 234, 235, 236, - 237, 238, 239, 240, 0, 0, 0, 0, 0, 88, - 0, 81, 0, 241, 90, 0, 0, 0, 0, 0, - 0, 70, 339, 71, 72, 73, 0, 0, 0, 0, - 82, 83, 0, 0, 0, 0, 84, 174, 0, 0, - 0, 0, 0, 0, 340, 341, 87, 88, 0, 0, - 89, 80, 90, 233, 234, 235, 236, 237, 238, 239, - 240, 0, 0, 0, 0, 0, 0, 264, 0, 0, - 241, 0, 0, 343, 233, 234, 235, 236, 237, 238, - 239, 240, 0, 0, 0, 0, 82, 83, 0, 0, - 0, 241, 233, 234, 235, 236, 237, 238, 239, 240, - 0, 0, 0, 88, 0, 0, 0, 0, 90, 241, - 0, 233, 234, 235, 236, 237, 238, 239, 240, 0, - 0, 0, 0, 0, 0, 0, 0, 689, 241, 0, - 0, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 0, 253, 254, 255, 690, 233, 234, 235, - 236, 237, 238, 239, 240, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 241, 233, 234, 235, 236, 237, - 238, 239, 240, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 0, - 253, 254, 255, 576, 0, 0, 0, 0, 0, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 0, 253, 254, 255, 592, 0, 0, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 0, 253, - 254, 255, 680, 0, 0, 0, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 0, 253, 254, - 255, 758, 233, 234, 235, 236, 237, 238, 239, 240, - 0, 0, 0, 0, 0, 0, 214, 215, 216, 241, - 0, 880, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 0, 253, 254, 255, 899, 0, 0, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 0, 253, 254, 255, 1016, 233, 234, 235, 236, - 237, 238, 239, 240, 0, 0, 479, 480, 481, 0, - 217, 0, 0, 241, 233, 234, 235, 236, 237, 238, - 239, 240, 218, 219, 0, 0, 0, 0, 0, 0, - 0, 241, 843, 844, 845, 846, 847, 848, 849, 850, - 0, 0, 0, 482, 0, 483, 0, 0, 0, 851, - 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 220, 221, - 217, 222, 0, 0, 0, 0, 223, 1393, 224, 0, - 0, 0, 218, 219, 0, 0, 0, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 0, 253, - 254, 255, 1284, 1385, 1386, 1387, 1388, 1389, 1390, 1391, - 1392, 0, 0, 0, 0, 0, 0, 0, 484, 221, - 1393, 222, 0, 0, 0, 0, 223, 0, 224, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1286, - 0, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 485, 253, 254, 255, 0, 0, 0, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 0, 253, 254, 255, 0, 0, 0, 852, 853, 854, - 855, 856, 857, 858, 859, 860, 861, 862, 0, 863, - 864, 865, 0, 1505, 0, 1394, 1395, 1396, 1397, 0, - 0, 1398, 1399, 1400, 1401, 1402, -2, 1403, 1404, 1405, - 0, 0, 0, 0, 0, 1386, 1387, 1388, 1389, 1390, - 1391, 1392, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1393, 0, 0, 0, 0, 0, 0, 1394, 1395, - 1396, 1397, 0, 0, 1398, 1399, 1400, 1401, 1402, 0, - 1403, 1404, 1405, 105, 0, 106, 0, 0, 107, 108, - 0, 0, 0, 0, 0, 0, 109, 110, 0, 0, - 0, 0, 0, 0, 0, 111, 0, 112, 113, 114, - 115, 0, 0, 0, 116, 0, 0, 0, 0, 117, + 42, 43, 0, 0, 0, 0, 0, 0, 0, 44, + 0, 45, 0, 46, 0, 0, 0, 0, 47, 0, + 48, 49, 50, 0, 0, 51, 0, 0, 0, 0, + 52, 0, 0, 53, 0, 0, 0, 54, 7, 8, + 9, 10, 55, 11, 12, 13, 14, 928, 0, 0, + 0, 0, 0, 0, 0, 56, 0, 0, 57, 58, + 59, 0, 0, 60, 0, 61, 62, 0, 0, 63, + 0, 0, 0, 234, 235, 236, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 15, 0, 0, 0, 16, + 242, 17, 18, 19, 0, 0, 0, 20, 0, 0, + 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, + 23, 24, 25, 0, 0, 0, 26, 0, 0, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 0, 0, 0, 0, + 0, 0, 0, 44, 0, 45, 0, 46, 0, 0, + 0, 0, 47, 0, 48, 49, 50, 0, 0, 51, + 0, 0, 0, 0, 52, 0, 0, 53, 0, 0, + 0, 54, 7, 8, 9, 10, 55, 11, 12, 13, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 56, + 0, 0, 57, 58, 59, 0, 0, 60, 0, 61, + 62, 1063, 0, 63, 1271, 0, 0, 0, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 15, + 254, 255, 256, 16, 0, 17, 18, 19, 0, 0, + 0, 20, 0, 0, 0, 21, 22, 0, 0, 0, + 0, 0, 0, 0, 23, 24, 25, 0, 0, 0, + 26, 0, 0, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 0, 0, 0, 0, 0, 0, 0, 44, 0, 45, + 0, 46, 0, 0, 0, 0, 47, 0, 48, 49, + 50, 0, 0, 51, 0, 0, 0, 0, 52, 0, + 0, 53, 0, 0, 0, 54, 7, 8, 9, 10, + 55, 11, 12, 13, 14, 1338, 0, 0, 0, 0, + 0, 0, 0, 56, 0, 0, 57, 58, 59, 0, + 0, 60, 0, 61, 62, 0, 0, 63, 0, 0, + 0, 234, 235, 236, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 15, 0, 0, 0, 16, 242, 17, + 18, 19, 0, 0, 0, 20, 0, 0, 0, 21, + 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, + 25, 0, 0, 0, 26, 0, 0, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, + 0, 44, 0, 45, 0, 46, 0, 0, 0, 0, + 47, 0, 48, 49, 50, 0, 0, 51, 0, 0, + 0, 0, 52, 0, 0, 53, 0, 0, 0, 54, + 7, 8, 9, 10, 55, 11, 12, 13, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, + 57, 58, 59, 0, 0, 60, 0, 61, 62, 1485, + 0, 63, 0, 0, 1294, 0, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 15, 254, 255, + 256, 16, 0, 17, 18, 19, 0, 0, 0, 20, + 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, + 0, 0, 23, 24, 25, 0, 0, 0, 26, 0, + 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 0, 0, + 0, 0, 0, 0, 0, 44, 0, 45, 0, 46, + 0, 0, 0, 0, 47, 0, 48, 49, 50, 0, + 0, 51, 0, 0, 0, 0, 52, 0, 0, 53, + 0, 0, 0, 54, 649, 650, 651, 10, 55, 11, + 652, 653, 67, 68, 0, 0, 654, 0, 0, 0, + 0, 56, 0, 0, 57, 58, 59, 0, 0, 60, + 0, 61, 62, 0, 0, 63, 234, 235, 236, 237, + 238, 239, 240, 241, 0, 0, 0, 0, 462, 0, + 0, 655, 69, 242, 0, 70, 0, 71, 72, 73, + 74, 463, 0, 656, 76, 0, 0, 77, 657, 0, + 0, 78, 0, 0, 0, 0, 658, 659, 79, 0, + 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, + 0, 234, 235, 236, 237, 238, 239, 240, 241, 0, + 0, 81, 0, 0, 0, 0, 0, 0, 242, 660, + 0, 661, 0, 662, 0, 0, 0, 464, 663, 0, + 82, 83, 664, 0, 0, 665, 84, 0, 0, 0, + 666, 0, 0, 667, 85, 86, 87, 88, 0, 0, + 89, 0, 90, 0, 649, 650, 651, 10, 0, 11, + 652, 653, 67, 68, 0, 668, 1040, 0, 669, 670, + 0, 0, 0, 671, 0, 672, 0, 693, 0, 673, + 0, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 0, 254, 255, 256, 694, 0, 462, 0, + 0, 655, 69, 0, 0, 70, 0, 71, 72, 73, + 74, 463, 0, 656, 76, 0, 0, 77, 657, 0, + 0, 78, 0, 0, 0, 0, 658, 659, 79, 0, + 0, 0, 0, 0, 0, 80, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 0, 254, 255, + 256, 81, 0, 0, 0, 0, 0, 0, 0, 660, + 0, 661, 0, 662, 0, 0, 0, 464, 663, 0, + 82, 83, 664, 0, 0, 665, 84, 0, 0, 0, + 666, 0, 0, 667, 85, 86, 87, 88, 0, 0, + 89, 0, 90, 7, 8, 9, 10, 0, 11, 12, + 13, 0, 0, 0, 0, 668, 0, 0, 669, 670, + 0, 0, 0, 671, 0, 672, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 126, 127, 0, 0, 0, 0, 0, 128, 129, - 67, 68, 130, 131, 458, 0, 459, 132, 0, 0, - 0, 0, 0, 133, 134, 0, 135, 0, 0, 0, - 1395, 1396, 1397, 0, 136, 1398, 1399, 1400, 1401, 1402, - 0, 1403, 1404, 1405, 0, 0, 460, 0, 0, 0, - 69, 0, 0, 70, 0, 71, 72, 73, 74, 461, - 0, 0, 76, 0, 0, 77, 0, 0, 0, 78, - 235, 236, 237, 238, 239, 240, 79, 0, 0, 0, - 0, 0, 0, 80, 0, 241, 235, 236, 237, 238, - 239, 240, 0, 0, 0, 0, 0, 0, 0, 81, - 0, 241, 235, 236, 237, 238, 239, 240, 0, 0, - 0, 0, 0, 0, 0, 462, 0, 241, 82, 83, - 0, 0, 0, 0, 84, 0, 1387, 1388, 1389, 1390, - 1391, 1392, 85, 86, 87, 88, 0, 0, 89, 0, - 90, 1393, 235, 236, 237, 238, 239, 240, 0, 0, - 0, 0, 0, 463, 0, 0, 0, 241, 464, 1387, - 1388, 1389, 1390, 1391, 1392, 0, 0, 0, 1387, 1388, - 1389, 1390, 1391, 1392, 1393, 0, 0, 0, 0, 0, - 0, 0, 0, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 0, 253, 254, 255, 0, 0, - 0, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 0, 253, 254, 255, 0, 0, 0, 0, 245, 246, - 247, 248, 249, 250, 251, 252, 0, 253, 254, 255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1395, 1396, 1397, 0, 0, 1398, 1399, 1400, 1401, 1402, - 0, 1403, 1404, 1405, 0, 303, 0, 0, 303, 246, - 247, 248, 249, 250, 251, 252, 0, 253, 254, 255, - 0, 0, 0, 0, 0, 1397, 0, 0, 1398, 1399, - 1400, 1401, 1402, 0, 1403, 1404, 1405, 1398, 1399, 1400, - 1401, 1402, 0, 1403, 1404, 1405, 105, 0, 106, 105, - 0, 106, 108, 0, 0, 108, 0, 0, 0, 109, - 110, 0, 109, 110, 0, 214, 215, 216, 0, 0, - 112, 113, 114, 112, 297, 114, 0, 0, 0, 0, - 0, 0, 298, 0, 0, 298, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 395, 67, 68, - 0, 0, 0, 0, 0, 122, 0, 0, 122, 0, - 0, 0, 0, 0, 0, 127, 0, 0, 127, 217, - 0, 128, 0, 0, 128, 130, 131, 0, 0, 131, - 0, 218, 219, 0, 0, 0, 0, 134, 69, 135, - 134, 70, 135, 71, 72, 73, 74, 75, 0, 0, - 76, 0, 0, 77, 0, 0, 0, 78, 0, 0, - 0, 0, 0, 0, 79, 0, 0, 220, 1264, 1265, - 1266, 80, 0, 0, 0, 223, 0, 224, 0, 0, - 0, 0, 0, 1028, 67, 68, 0, 81, 1267, 0, - 0, 0, 0, 1268, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 83, 0, 0, - 0, 0, 84, 0, 1448, 67, 68, 0, 0, 0, - 85, 86, 87, 88, 69, 0, 89, 70, 90, 71, - 72, 73, 74, 75, 0, 0, 76, 0, 0, 77, - 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, - 79, 0, 0, 0, 0, 69, 0, 80, 70, 0, - 71, 72, 73, 74, 75, 0, 0, 76, 0, 0, - 77, 0, 0, 81, 78, 0, 0, 0, 0, 0, - 0, 79, 0, 0, 0, 0, 0, 0, 80, 0, - 0, 0, 82, 83, 0, 0, 0, 0, 84, 0, - 691, 692, 693, 0, 81, 0, 85, 86, 87, 88, - 0, 0, 89, 0, 90, 691, 692, 693, 0, 0, + 1308, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1309, 0, 0, 0, 0, 1310, 235, 236, + 237, 238, 239, 240, 241, 23, 24, 0, 0, 0, + 0, 26, 0, 0, 242, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 0, 234, 235, 236, 237, 238, 239, 240, 241, 0, + 45, 0, 46, 0, 0, 0, 0, 1311, 242, 0, + 0, 1312, 0, 0, 1313, 0, 0, 0, 0, 52, + 0, 0, 0, 0, 0, 0, 70, 0, 71, 72, + 73, 0, 0, 0, 0, 0, 0, 0, 264, 0, + 0, 0, 0, 0, 1314, 0, 0, 1315, 1316, 1317, + 937, 0, 1318, 0, 1319, 62, 80, 0, 1320, 0, + 938, 939, 940, 941, 942, 943, 944, 945, 0, 0, + 0, 0, 265, 0, 0, 0, 0, 946, 0, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 82, 83, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 0, 254, 255, 256, 0, 88, 959, + 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, + 0, 337, 338, 0, 0, 0, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 0, 254, 255, + 256, 579, 0, 1398, 1399, 1400, 1401, 1402, 1403, 1404, + 0, 0, 960, 0, 0, 0, 0, 0, 0, 1405, + 0, 0, 339, 0, 0, 70, 0, 71, 72, 73, + 74, 0, 0, 0, 340, 0, 0, 77, 0, 0, + 0, 78, 0, 0, 0, 0, 0, 0, 79, 0, + 0, 961, 0, 0, 962, 80, 963, 964, 965, 966, + 967, 968, 969, 970, 971, 972, 973, 0, 974, 975, + 0, 81, 976, 0, 337, 338, 0, 0, 0, 0, + 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, + 82, 83, 0, 0, 0, 0, 84, 0, 0, 0, + 0, 0, 0, 0, 342, 343, 87, 88, 0, 0, + 89, 0, 90, 0, 0, 339, 0, 344, 70, 0, + 71, 72, 73, 74, 0, 0, 0, 340, 0, 0, + 77, 0, 0, 345, 78, 0, 0, 0, 1407, 1408, + 1409, 79, 0, 1410, 1411, 1412, 1413, 1414, 80, 1415, + 1416, 1417, 0, 0, 0, 0, 0, 0, 0, 0, + 510, 511, 0, 0, 81, 0, 70, 0, 71, 72, + 73, 0, 0, 0, 0, 341, 0, 0, 264, 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, - 70, 0, 71, 72, 73, 0, 0, 85, 86, 87, - 88, 0, 0, 89, 70, 90, 71, 72, 73, 694, - 695, 0, 0, 214, 215, 216, 77, 0, 0, 70, - 80, 71, 72, 73, 0, 0, 0, 79, 0, 0, - 0, 77, 0, 0, 80, 0, 264, 0, 0, 0, - 0, 0, 79, 0, 0, 0, 0, 0, 0, 80, - 81, 0, 0, 0, 0, 82, 83, 0, 0, 0, - 0, 0, 67, 68, 0, 81, 458, 217, 0, 82, - 83, 0, 88, 0, 0, 0, 0, 90, 0, 218, - 219, 0, 0, 696, 82, 83, 88, 0, 0, 89, - 0, 90, 0, 67, 68, 0, 0, 792, 460, 0, - 185, 88, 69, 0, 89, 70, 90, 71, 72, 73, - 74, 461, 0, 0, 76, 220, 221, 77, 222, 0, - 0, 78, 0, 223, 0, 224, 0, 0, 79, 460, - 0, 0, 0, 69, 0, 80, 70, 0, 71, 72, - 73, 74, 461, 0, 0, 76, 0, 0, 77, 0, - 0, 81, 78, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 0, 0, 0, 0, 80, 462, 0, 0, - 82, 83, 0, 0, 0, 0, 84, 0, 214, 215, - 216, 0, 81, 0, 85, 86, 87, 88, 67, 68, - 89, 0, 90, 0, 0, 0, 0, 0, 462, 0, - 0, 82, 83, 0, 0, 0, 0, 84, 0, 0, - 0, 0, 0, 0, 0, 85, 86, 87, 88, 67, - 68, 89, 0, 90, 460, 0, 0, 0, 69, 0, - 0, 70, 217, 71, 72, 73, 74, 461, 0, 0, - 76, 0, 0, 77, 218, 219, 0, 78, 0, 70, - 0, 71, 72, 73, 79, 0, 0, 0, 0, 69, - 0, 80, 70, 0, 71, 72, 73, 74, 75, 0, - 0, 76, 0, 0, 77, 0, 0, 81, 78, 80, - 220, 221, 0, 222, 0, 79, 0, 0, 223, 0, - 224, 0, 80, 462, 0, 264, 82, 83, 0, 0, - 0, 1267, 84, 0, 0, 67, 68, 0, 81, 0, - 85, 86, 87, 88, 82, 83, 89, 0, 90, 0, - 0, 0, 0, 0, 0, 0, 0, 82, 83, 67, - 68, 88, 0, 84, 0, 0, 90, 214, 215, 216, - 0, 85, 86, 87, 88, 69, 0, 89, 70, 90, - 71, 72, 73, 74, 0, 0, 0, 76, 0, 186, - 77, 0, 0, 0, 78, 0, 0, 0, 0, 69, - 0, 79, 70, 0, 71, 72, 73, 74, 80, 0, - 0, 76, 0, 0, 77, 0, 0, 0, 78, 0, - 0, 217, 0, 0, 81, 79, 0, 0, 0, 0, - 0, 0, 80, 218, 219, 0, 0, 0, 0, 0, - 605, 0, 0, 82, 83, 67, 0, 0, 81, 84, - 0, 0, 0, 0, 0, 0, 0, 85, 86, 87, - 88, 0, 0, 89, 331, 90, 0, 82, 83, 220, - 221, 0, 222, 84, 175, 0, 0, 223, 0, 224, - 0, 85, 86, 87, 88, 69, 0, 89, 70, 90, - 71, 72, 73, 74, 518, 0, 0, 76, 0, 0, - 77, 0, 0, 0, 78, 0, 0, 0, 0, 0, - 0, 79, 0, 0, 176, 0, 0, 70, 80, 71, - 72, 73, 74, 993, 0, 0, 177, 0, 0, 77, - 0, 0, 0, 78, 81, 0, 0, 0, 0, 0, - 79, 0, 0, 0, 0, 0, 0, 80, 0, 0, - 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, - 175, 0, 0, 81, 0, 0, 0, 85, 86, 87, - 88, 0, 0, 89, 0, 90, 0, 0, 0, 0, - 0, 0, 82, 83, 67, 0, 0, 0, 84, 0, - 0, 0, 214, 215, 216, 0, 178, 179, 87, 88, - 176, 0, 89, 70, 90, 71, 72, 73, 74, 0, - 0, 0, 177, 0, 0, 77, 0, 0, 0, 78, - 0, 0, 0, 0, 69, 0, 79, 70, 0, 71, - 72, 73, 74, 80, 0, 0, 76, 0, 0, 77, - 0, 0, 0, 78, 0, 0, 217, 0, 0, 81, - 79, 214, 215, 216, 0, 0, 0, 80, 218, 219, - 0, 0, 0, 0, 0, 214, 215, 216, 82, 83, - 0, 0, 0, 81, 84, 0, 0, 0, 0, 214, - 215, 216, 178, 179, 87, 88, 0, 0, 89, 0, - 90, 0, 82, 83, 220, 221, 0, 222, 84, 0, - 0, 0, 223, 0, 224, 217, 85, 86, 87, 88, - 0, 0, 89, 0, 90, 1267, 0, 218, 219, 217, - 1343, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 218, 219, 217, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 218, 219, 0, 0, 0, - 0, 0, 0, 220, 221, 0, 222, 0, 0, 0, - 0, 223, 0, 224, 0, 0, 0, 220, 221, 0, - 222, 0, 0, 0, 1267, 223, 0, 224, 0, 1345, - 0, 220, 221, 0, 222, 0, 0, 0, 1267, 223, - 105, 224, 106, 1347, 0, 107, 108, 0, 0, 0, - 0, 0, 0, 109, 110, 0, 292, 0, 0, 0, - 0, 0, 111, 0, 112, 113, 114, 115, 0, 0, - 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 80, 342, 343, 87, + 88, 339, 0, 89, 70, 90, 71, 72, 73, 74, + 0, 0, 265, 340, 0, 0, 77, 477, 0, 0, + 78, 0, 0, 0, 0, 0, 345, 79, 0, 0, + 0, 82, 83, 0, 80, 234, 235, 236, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 0, 88, 0, + 81, 0, 242, 90, 0, 0, 0, 481, 482, 483, + 70, 341, 71, 72, 73, 0, 0, 0, 0, 82, + 83, 0, 0, 0, 0, 84, 175, 0, 0, 0, + 0, 0, 0, 342, 343, 87, 88, 0, 0, 89, + 80, 90, 234, 235, 236, 237, 238, 239, 240, 241, + 0, 0, 0, 0, 0, 0, 265, 0, 0, 242, + 0, 218, 345, 234, 235, 236, 237, 238, 239, 240, + 241, 0, 0, 219, 220, 82, 83, 0, 0, 0, + 242, 234, 235, 236, 237, 238, 239, 240, 241, 0, + 0, 0, 88, 0, 0, 0, 0, 90, 242, 234, + 235, 236, 237, 238, 239, 240, 241, 0, 0, 486, + 222, 0, 223, 0, 0, 0, 242, 224, 0, 225, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 0, 254, 255, 256, 595, 234, 235, 236, 237, + 238, 239, 240, 241, 0, 0, 289, 0, 0, 0, + 0, 0, 0, 242, 847, 848, 849, 850, 851, 852, + 853, 854, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 855, 0, 0, 0, 0, 0, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 0, 254, + 255, 256, 683, 0, 0, 0, 0, 0, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 0, + 254, 255, 256, 762, 0, 0, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 0, 254, 255, + 256, 904, 0, 0, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 0, 254, 255, 256, 1021, + 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, - 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, - 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, - 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, - 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, - 0, 136, 0, 116, 0, 0, 0, 0, 117, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 687, 0, 0, 0, 0, 0, 0, 118, 119, 120, - 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, - 126, 127, 0, 0, 105, 0, 106, 128, 129, 107, - 108, 130, 131, 0, 0, 0, 132, 109, 110, 0, - 0, 0, 133, 134, 0, 135, 111, 0, 112, 113, - 114, 115, 0, 136, 0, 116, 0, 0, 0, 0, + 0, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 0, 254, 255, 256, 1292, 0, 0, 856, + 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, + 0, 867, 868, 869, 105, 0, 106, 0, 0, 107, + 108, 0, 0, 0, 0, 0, 0, 109, 110, 0, + 0, 0, 0, 0, 0, 0, 111, 0, 112, 113, + 114, 115, 0, 0, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 868, 0, 0, 0, 0, 0, 0, 118, - 119, 120, 121, 122, 123, 0, 0, 0, 0, 0, - 124, 125, 126, 127, 0, 0, 105, 0, 106, 128, - 129, 107, 108, 130, 131, 0, 0, 0, 132, 109, - 110, 0, 0, 0, 133, 134, 0, 135, 111, 0, - 112, 113, 114, 115, 0, 136, 0, 116, 0, 0, - 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 910, 0, 0, 0, 0, 0, - 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, - 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, - 106, 128, 129, 107, 108, 130, 131, 0, 0, 0, - 132, 109, 110, 0, 0, 0, 133, 134, 0, 135, - 111, 0, 112, 113, 114, 115, 0, 136, 0, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 119, + 120, 121, 122, 123, 124, 0, 0, 0, 0, 0, + 125, 126, 127, 128, 0, 0, 0, 0, 0, 129, + 130, 67, 68, 131, 132, 460, 0, 461, 133, 0, + 0, 0, 0, 0, 134, 135, 0, 136, 236, 237, + 238, 239, 240, 241, 0, 137, 0, 0, 0, 0, + 0, 0, 0, 242, 0, 0, 0, 462, 0, 0, + 0, 69, 0, 0, 70, 0, 71, 72, 73, 74, + 463, 0, 0, 76, 0, 0, 77, 0, 0, 0, + 78, 236, 237, 238, 239, 240, 241, 79, 0, 0, + 0, 0, 0, 0, 80, 0, 242, 1399, 1400, 1401, + 1402, 1403, 1404, 0, 0, 0, 0, 0, 0, 0, + 81, 0, 1405, 1399, 1400, 1401, 1402, 1403, 1404, 0, + 0, 0, 0, 0, 0, 0, 464, 0, 1405, 82, + 83, 0, 0, 0, 0, 84, 0, 1399, 1400, 1401, + 1402, 1403, 1404, 85, 86, 87, 88, 0, 0, 89, + 0, 90, 1405, 238, 239, 240, 241, 0, 0, 0, + 0, 0, 0, 0, 465, 0, 242, 0, 0, 466, + 0, 0, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 0, 254, 255, 256, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 481, 482, + 483, 0, 0, 0, 0, 0, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 0, 254, 255, 256, 0, + 0, 1407, 1408, 1409, 0, 0, 1410, 1411, 1412, 1413, + 1414, 0, 1415, 1416, 1417, 484, 0, 485, 1408, 1409, + 0, 0, 1410, 1411, 1412, 1413, 1414, 0, 1415, 1416, + 1417, 0, 218, 0, 0, 770, 0, 215, 216, 217, + 0, 0, 0, 1409, 219, 220, 1410, 1411, 1412, 1413, + 1414, 771, 1415, 1416, 1417, 0, 0, 0, 247, 248, + 249, 250, 251, 252, 253, 772, 254, 255, 256, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 773, 774, + 486, 222, 0, 223, 215, 216, 217, 0, 224, 0, + 225, 218, 0, 0, 775, 0, 0, 0, 0, 215, + 216, 217, 0, 219, 220, 0, 0, 0, 0, 0, + 0, 0, 0, 304, 487, 0, 304, 0, 0, 0, + 0, 0, 0, 0, 776, 0, 0, 777, 0, 0, + 778, 0, 0, 0, 0, 0, 0, 0, 218, 221, + 222, 0, 223, 0, 0, 0, 779, 224, 0, 225, + 219, 220, 0, 218, 105, 0, 106, 105, 780, 106, + 108, 0, 0, 108, 0, 219, 220, 109, 110, 0, + 109, 110, 781, 318, 0, 0, 0, 0, 112, 113, + 114, 112, 298, 114, 0, 0, 221, 222, 0, 223, + 299, 0, 0, 299, 224, 0, 225, 0, 0, 0, + 0, 221, 1272, 1273, 1274, 397, 67, 68, 0, 224, + 0, 225, 0, 123, 0, 0, 123, 0, 0, 0, + 499, 0, 1275, 128, 0, 0, 128, 1276, 0, 129, + 0, 0, 129, 131, 132, 0, 0, 132, 0, 0, + 215, 216, 217, 0, 0, 135, 69, 136, 135, 70, + 136, 71, 72, 73, 74, 75, 0, 0, 76, 0, + 0, 77, 0, 0, 0, 78, 0, 0, 0, 0, + 0, 0, 79, 0, 0, 0, 0, 0, 0, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1033, 67, 68, 218, 81, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 219, 220, 0, 0, + 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, + 84, 0, 1461, 67, 68, 0, 0, 0, 85, 86, + 87, 88, 69, 0, 89, 70, 90, 71, 72, 73, + 74, 75, 221, 222, 76, 223, 0, 77, 0, 0, + 224, 78, 225, 70, 0, 71, 72, 73, 79, 0, + 0, 0, 0, 69, 0, 80, 70, 0, 71, 72, + 73, 74, 75, 0, 0, 76, 0, 0, 77, 0, + 0, 81, 78, 80, 0, 0, 0, 0, 0, 79, + 0, 0, 0, 0, 0, 0, 80, 0, 0, 265, + 82, 83, 0, 0, 0, 0, 84, 0, 695, 696, + 697, 0, 81, 0, 85, 86, 87, 88, 82, 83, + 89, 0, 90, 0, 0, 0, 0, 0, 0, 0, + 0, 82, 83, 0, 0, 88, 0, 84, 67, 68, + 90, 0, 460, 0, 0, 85, 86, 87, 88, 0, + 0, 89, 70, 90, 71, 72, 73, 698, 699, 0, + 0, 0, 0, 186, 77, 0, 0, 67, 68, 0, + 0, 796, 0, 0, 462, 79, 0, 0, 69, 0, + 0, 70, 80, 71, 72, 73, 74, 463, 0, 0, + 76, 0, 0, 77, 0, 0, 0, 78, 81, 0, + 0, 0, 0, 462, 79, 0, 0, 69, 0, 0, + 70, 80, 71, 72, 73, 74, 463, 82, 83, 76, + 0, 0, 77, 0, 0, 0, 78, 81, 0, 0, + 0, 700, 0, 79, 88, 0, 0, 89, 0, 90, + 80, 0, 0, 464, 0, 0, 82, 83, 0, 0, + 0, 0, 84, 0, 0, 0, 81, 0, 67, 68, + 85, 86, 87, 88, 0, 0, 89, 0, 90, 0, + 0, 0, 464, 0, 0, 82, 83, 0, 0, 0, + 0, 84, 0, 0, 0, 0, 0, 67, 68, 85, + 86, 87, 88, 0, 462, 89, 0, 90, 69, 0, + 0, 70, 0, 71, 72, 73, 74, 463, 0, 0, + 76, 0, 0, 77, 0, 0, 0, 78, 0, 0, + 0, 0, 0, 0, 79, 0, 0, 69, 0, 0, + 70, 80, 71, 72, 73, 74, 75, 0, 0, 76, + 0, 0, 77, 0, 0, 0, 78, 81, 0, 0, + 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 80, 0, 0, 464, 0, 0, 82, 83, 0, 0, + 0, 0, 84, 67, 68, 0, 81, 0, 0, 0, + 85, 86, 87, 88, 0, 0, 89, 0, 90, 0, + 0, 0, 0, 0, 0, 82, 83, 67, 68, 0, + 0, 84, 0, 0, 0, 215, 216, 217, 0, 85, + 86, 87, 88, 69, 0, 89, 70, 90, 71, 72, + 73, 74, 0, 0, 0, 76, 0, 70, 77, 71, + 72, 73, 78, 0, 0, 0, 0, 69, 0, 79, + 70, 0, 71, 72, 73, 74, 80, 0, 0, 76, + 0, 0, 77, 0, 0, 0, 78, 80, 0, 218, + 0, 0, 81, 79, 0, 0, 0, 0, 0, 0, + 80, 219, 220, 265, 0, 0, 0, 0, 608, 0, + 0, 82, 83, 67, 0, 0, 81, 84, 0, 0, + 0, 0, 82, 83, 0, 85, 86, 87, 88, 0, + 0, 89, 333, 90, 0, 82, 83, 221, 222, 88, + 223, 84, 176, 0, 90, 224, 0, 225, 0, 85, + 86, 87, 88, 69, 0, 89, 70, 90, 71, 72, + 73, 74, 521, 0, 0, 76, 0, 187, 77, 0, + 0, 0, 78, 0, 0, 0, 0, 0, 0, 79, + 0, 0, 177, 0, 0, 70, 80, 71, 72, 73, + 74, 998, 0, 0, 178, 0, 0, 77, 0, 0, + 0, 78, 81, 0, 0, 0, 0, 0, 79, 0, + 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, + 0, 82, 83, 0, 0, 0, 0, 84, 176, 0, + 0, 81, 0, 0, 0, 85, 86, 87, 88, 0, + 0, 89, 0, 90, 0, 0, 0, 0, 0, 0, + 82, 83, 67, 0, 0, 0, 84, 0, 0, 0, + 215, 216, 217, 0, 179, 180, 87, 88, 177, 0, + 89, 70, 90, 71, 72, 73, 74, 0, 0, 0, + 178, 0, 0, 77, 0, 0, 0, 78, 0, 0, + 0, 0, 69, 0, 79, 70, 0, 71, 72, 73, + 74, 80, 0, 0, 76, 0, 0, 77, 0, 0, + 0, 78, 0, 0, 218, 0, 0, 81, 79, 215, + 216, 217, 0, 0, 0, 80, 219, 220, 0, 0, + 0, 0, 0, 215, 216, 217, 82, 83, 0, 0, + 0, 81, 84, 0, 0, 0, 0, 215, 216, 217, + 179, 180, 87, 88, 0, 0, 89, 0, 90, 0, + 82, 83, 221, 222, 0, 223, 84, 0, 0, 0, + 224, 0, 225, 218, 85, 86, 87, 88, 0, 0, + 89, 0, 90, 1275, 0, 219, 220, 218, 1353, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, + 220, 218, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 219, 220, 0, 0, 0, 0, 0, + 0, 221, 222, 0, 223, 0, 0, 0, 0, 224, + 0, 225, 0, 0, 0, 221, 222, 0, 223, 0, + 0, 0, 1275, 224, 0, 225, 0, 1355, 0, 221, + 222, 0, 223, 0, 0, 0, 1275, 224, 105, 225, + 106, 1357, 0, 107, 108, 0, 0, 0, 0, 0, + 1275, 109, 110, 0, 0, 0, 0, 0, 0, 0, + 111, 0, 112, 113, 114, 115, 0, 0, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1017, 0, 0, 0, - 0, 0, 0, 118, 119, 120, 121, 122, 123, 0, - 0, 0, 0, 0, 124, 125, 126, 127, 0, 0, - 105, 0, 106, 128, 129, 107, 108, 130, 131, 0, - 0, 0, 132, 109, 110, 0, 0, 0, 133, 134, - 0, 135, 111, 0, 112, 113, 114, 115, 0, 136, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 118, 119, 120, 121, 122, 123, 124, 0, + 0, 0, 0, 0, 125, 126, 127, 128, 0, 0, + 105, 0, 106, 129, 130, 107, 108, 131, 132, 0, + 0, 0, 133, 109, 110, 0, 0, 0, 134, 135, + 0, 136, 111, 0, 112, 113, 114, 115, 0, 137, 0, 116, 0, 0, 0, 0, 117, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1067, 0, - 0, 0, 0, 0, 0, 118, 119, 120, 121, 122, - 123, 0, 0, 0, 0, 0, 124, 125, 126, 127, - 0, 0, 105, 0, 106, 128, 129, 107, 108, 130, - 131, 0, 0, 0, 132, 109, 110, 0, 0, 0, - 133, 134, 0, 135, 111, 0, 112, 113, 114, 115, - 0, 136, 0, 116, 0, 214, 215, 216, 117, 0, - 0, 0, 0, 0, 0, 70, 0, 71, 72, 73, - 1289, 0, 0, 0, 0, 0, 0, 118, 119, 120, - 121, 122, 123, 0, 0, 0, 0, 0, 124, 125, - 126, 127, 482, 0, 483, 80, 0, 128, 129, 0, - 0, 130, 131, 0, 0, 0, 132, 0, 0, 217, - 0, 264, 133, 134, 105, 135, 106, 0, 0, 0, - 108, 218, 219, 136, 0, 0, 0, 109, 110, 0, - 82, 83, 0, 0, 0, 0, 0, 0, 112, 297, - 114, 0, 1431, 0, 0, 116, 0, 88, 0, 0, - 298, 0, 90, 0, 0, 0, 0, 220, 221, 0, - 222, 0, 0, 0, 0, 223, 105, 224, 106, 0, - 0, 0, 108, 122, 0, 191, 0, 0, 0, 109, - 110, 0, 0, 127, 0, 0, 0, 0, 0, 128, - 112, 113, 114, 0, 131, 0, 0, 116, 0, 0, - 0, 0, 298, 0, 133, 134, 105, 135, 106, 0, - 0, 107, 108, 0, 0, 0, 0, 0, 0, 109, - 110, 0, -149, 0, 0, 122, 0, 0, 111, 0, - 112, 113, 114, 115, 0, 127, 0, 116, 0, 0, - 0, 128, 117, 0, 0, 130, 131, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 133, 134, 0, 135, - 0, 118, 119, 120, 121, 122, 123, 0, 0, 0, - 0, 0, 124, 125, 126, 127, 0, 0, 105, 0, - 106, 128, 129, 0, 108, 130, 131, 105, 0, 106, - 132, 109, 110, 108, 0, 0, 133, 134, 0, 135, - 109, 110, 112, 297, 114, 0, 0, 0, 0, 0, - 0, 112, 297, 114, 298, 0, 0, 0, 0, 0, - 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 122, 309, 0, - 0, 0, 0, 0, 0, 0, 122, 127, 0, 0, - 0, 0, 0, 128, 0, 0, 127, 0, 131, 0, - 0, 0, 128, 0, 0, 0, 0, 131, 0, 134, - 0, 135, 0, 0, 0, 0, 0, 0, 134, 0, - 135 + 0, 0, 0, 0, 0, 0, 0, 0, 691, 0, + 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, + 124, 0, 0, 0, 0, 0, 125, 126, 127, 128, + 0, 0, 105, 0, 106, 129, 130, 107, 108, 131, + 132, 0, 0, 0, 133, 109, 110, 0, 0, 0, + 134, 135, 0, 136, 111, 0, 112, 113, 114, 115, + 0, 137, 0, 116, 0, 0, 0, 0, 117, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 872, 0, 0, 0, 0, 0, 118, 119, 120, 121, + 122, 123, 124, 0, 0, 0, 0, 0, 125, 126, + 127, 128, 0, 0, 105, 0, 106, 129, 130, 107, + 108, 131, 132, 0, 0, 0, 133, 109, 110, 0, + 0, 0, 134, 135, 0, 136, 111, 0, 112, 113, + 114, 115, 0, 137, 0, 116, 0, 0, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 915, 0, 0, 0, 0, 0, 118, 119, + 120, 121, 122, 123, 124, 0, 0, 0, 0, 0, + 125, 126, 127, 128, 0, 0, 105, 0, 106, 129, + 130, 107, 108, 131, 132, 0, 0, 0, 133, 109, + 110, 0, 0, 0, 134, 135, 0, 136, 111, 0, + 112, 113, 114, 115, 0, 137, 0, 116, 0, 0, + 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1022, 0, 0, 0, 0, 0, + 118, 119, 120, 121, 122, 123, 124, 0, 0, 0, + 0, 0, 125, 126, 127, 128, 0, 0, 105, 0, + 106, 129, 130, 107, 108, 131, 132, 0, 0, 0, + 133, 109, 110, 0, 0, 0, 134, 135, 0, 136, + 111, 0, 112, 113, 114, 115, 0, 137, 0, 116, + 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1075, 0, 0, 0, + 0, 0, 118, 119, 120, 121, 122, 123, 124, 0, + 0, 0, 0, 0, 125, 126, 127, 128, 0, 0, + 105, 0, 106, 129, 130, 107, 108, 131, 132, 0, + 0, 0, 133, 109, 110, 0, 0, 0, 134, 135, + 0, 136, 111, 0, 112, 113, 114, 115, 0, 137, + 0, 116, 0, 215, 216, 217, 117, 0, 0, 0, + 0, 0, 0, 70, 0, 71, 72, 73, 1297, 0, + 0, 0, 0, 0, 118, 119, 120, 121, 122, 123, + 124, 0, 0, 0, 0, 0, 125, 126, 127, 128, + 484, 0, 485, 80, 0, 129, 130, 0, 0, 131, + 132, 0, 0, 0, 133, 0, 0, 218, 0, 265, + 134, 135, 105, 136, 106, 0, 0, 0, 108, 219, + 220, 137, 0, 0, 0, 109, 110, 0, 82, 83, + 0, 0, 0, 0, 0, 0, 112, 298, 114, 0, + 1443, 0, 0, 116, 0, 88, 0, 0, 299, 0, + 90, 0, 0, 0, 0, 221, 222, 0, 223, 0, + 0, 0, 0, 224, 105, 225, 106, 0, 0, 0, + 108, 123, 0, 192, 0, 0, 0, 109, 110, 0, + 0, 128, 0, 0, 0, 0, 0, 129, 112, 113, + 114, 0, 132, 0, 0, 116, 0, 0, 0, 0, + 299, 0, 134, 135, 105, 136, 106, 0, 0, 107, + 108, 0, 0, 0, 0, 0, 0, 109, 110, 0, + -151, 0, 0, 123, 0, 0, 111, 0, 112, 113, + 114, 115, 0, 128, 0, 116, 0, 0, 0, 129, + 117, 0, 0, 131, 132, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 134, 135, 0, 136, 118, 119, + 120, 121, 122, 123, 124, 0, 0, 0, 0, 0, + 125, 126, 127, 128, 0, 0, 105, 0, 106, 129, + 130, 0, 108, 131, 132, 105, 0, 106, 133, 109, + 110, 108, 0, 0, 134, 135, 0, 136, 109, 110, + 112, 298, 114, 0, 0, 0, 0, 0, 0, 112, + 298, 114, 299, 0, 0, 0, 70, 0, 71, 72, + 73, 299, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 123, 310, 0, 0, 0, + 0, 0, 0, 0, 123, 128, 80, 0, 0, 0, + 0, 129, 0, 0, 128, 0, 132, 0, 0, 0, + 129, 0, 265, 0, 0, 132, 0, 135, 0, 136, + 0, 0, 0, 0, 0, 0, 135, 0, 136, 0, + 0, 82, 83, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, + 0, 0, 0, 90 }; static const yytype_int16 yycheck[] = { - 1, 61, 728, 748, 92, 706, 923, 140, 113, 509, - 140, 15, 316, 602, 75, 62, 140, 296, 6, 182, - 8, 478, 657, 491, 150, 15, 462, 130, 33, 59, - 13, 147, 460, 15, 15, 15, 0, 147, 85, 165, - 147, 130, 149, 150, 151, 152, 791, 154, 149, 156, - 329, 158, 164, 169, 482, 491, 166, 155, 105, 468, - 44, 62, 490, 76, 164, 44, 715, 174, 717, 718, - 719, 720, 721, 150, 15, 147, 123, 711, 185, 186, - 147, 164, 147, 33, 191, 192, 133, 6, 165, 8, - 91, 92, 44, 164, 166, 125, 146, 75, 99, 166, - 13, 166, 15, 155, 17, 584, 740, 741, 33, 743, - 744, 745, 746, 164, 164, 273, 274, 275, 276, 277, - 583, 10, 11, 12, 147, 150, 165, 166, 81, 82, - 83, 178, 767, 146, 181, 88, 149, 146, 33, 148, - 165, 150, 164, 166, 149, 146, 147, 60, 149, 150, - 151, 152, 148, 154, 150, 156, 140, 158, 621, 164, - 165, 140, 166, 296, 164, 165, 296, 147, 155, 632, - 258, 259, 296, 174, 164, 164, 159, 613, 166, 226, - 227, 182, 164, 164, 185, 186, 274, 275, 140, 352, - 191, 192, 325, 497, 254, 325, 329, 606, 146, 329, - 147, 325, 33, 165, 166, 329, 147, 616, 617, 618, - 619, 620, 801, 163, 164, 165, 164, 278, 522, 166, - 164, 689, 811, 112, 6, 272, 8, 140, 229, 76, - 709, 165, 166, 712, 159, 160, 161, 76, 163, 164, - 165, 154, 164, 290, 147, 292, 159, 64, 65, 749, - 98, 164, 901, 206, 207, 208, 209, 258, 259, 164, - 149, 895, 309, 166, 311, 312, 313, 314, 163, 164, - 165, 997, 273, 274, 275, 276, 277, 278, 339, 147, - 164, 388, 283, 441, 331, 164, 749, 445, 446, 447, - 448, 449, 701, 340, 751, 929, 343, 147, 166, 146, - 278, 459, 149, 611, 351, 463, 464, 146, 76, 146, - 149, 264, 296, 165, 166, 316, 166, 296, 164, 908, - 10, 11, 12, 13, 787, 788, 164, 17, 159, 160, - 161, 164, 163, 164, 165, 288, 147, 641, 164, 150, - 768, 325, 164, 390, 296, 329, 325, 394, 784, 164, - 329, 352, 18, 19, 20, 21, 22, 23, 993, 164, - 407, 640, 164, 147, 147, 165, 166, 33, 1094, 147, - 60, 164, 147, 325, 842, 147, 785, 329, 146, 164, - 147, 149, 166, 166, 688, 794, 149, 388, 166, 147, - 979, 166, 892, 147, 166, 164, 147, 444, 147, 166, - 461, 462, 10, 11, 12, 13, 842, 408, 166, 17, - 469, 1328, 166, 460, 13, 166, 15, 166, 17, 147, - 147, 111, 112, 164, 146, 472, 148, 149, 150, 892, - 491, 164, 911, 164, 147, 482, 147, 595, 166, 166, - 441, 147, 290, 490, 445, 446, 447, 448, 449, 164, - 140, 155, 60, 166, 164, 166, 164, 518, 459, 164, - 166, 60, 463, 464, 154, 164, 165, 468, 877, 159, - 471, 143, 144, 145, 164, 884, 885, 886, 887, 888, - 164, 165, 166, 461, 462, 164, 533, 153, 154, 164, - 491, 157, 158, 159, 160, 161, 497, 163, 164, 165, - 146, 147, 1247, 351, 112, 506, 164, 640, 164, 165, - 640, 164, 164, 491, 164, 164, 640, 149, 519, 2, - 999, 522, 149, 584, 164, 478, 1005, 1006, 164, 146, - 164, 148, 140, 150, 164, 582, 164, 166, 1001, 1002, - 150, 140, 165, 159, 605, 13, 154, 15, 607, 17, - 165, 159, 613, 149, 506, 154, 164, 146, 48, 148, - 159, 150, 164, 165, 166, 869, 147, 164, 627, 628, - 629, 630, 631, 56, 57, 58, 59, 60, 625, 155, - 63, 146, 583, 584, 585, 146, 164, 148, 148, 150, - 164, 164, 60, 147, 595, 167, 643, 164, 165, 166, - 166, 602, 166, 164, 166, 606, 584, 166, 166, 669, - 611, 1090, 1313, 166, 615, 616, 617, 618, 619, 620, - 621, 113, 114, 115, 156, 166, 156, 605, 166, 166, - 166, 632, 166, 147, 147, 613, 15, 166, 166, 166, - 641, 642, 701, 166, 166, 166, 166, 166, 709, 166, - 166, 712, 699, 156, 166, 166, 640, 166, 166, 166, - 166, 640, 156, 167, 166, 166, 166, 164, 166, 1078, - 166, 519, 140, 657, 165, 1420, 1421, 1422, 657, 159, - 165, 146, 530, 730, 992, 533, 154, 688, 640, 166, - 164, 159, 1418, 753, 754, 149, 164, 166, 147, 147, - 701, 761, 147, 763, 147, 657, 164, 190, 709, 148, - 166, 712, 164, 149, 715, 166, 717, 718, 719, 720, - 721, 768, 164, 784, 164, 166, 164, 786, 48, 164, - 159, 709, 159, 734, 712, 169, 737, 146, 48, 76, - 164, 155, 155, 695, 803, 155, 164, 748, 749, 155, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 1239, 255, 878, 166, 878, 1084, 260, 1523, 1087, - 1259, 842, 1261, 767, 785, 1530, 787, 788, 767, 878, - 791, 10, 10, 794, 10, 10, 148, 156, 751, 147, - 801, 148, 159, 1239, 864, 166, 784, 167, 159, 148, - 811, 166, 148, 296, 159, 767, 166, 166, 877, 146, - 821, 147, 166, 166, 164, 884, 885, 886, 887, 888, - 164, 169, 164, 880, 164, 166, 165, 165, 149, 1318, - 323, 165, 164, 164, 147, 147, 150, 166, 166, 166, - 911, 159, 165, 167, 61, 148, 148, 147, 706, 10, - 167, 166, 4, 711, 842, 147, 48, 715, 869, 717, - 718, 719, 720, 721, 169, 164, 877, 164, 11, 146, - 166, 169, 883, 884, 885, 886, 887, 888, 889, 169, - 147, 892, 740, 741, 156, 743, 744, 745, 746, 10, - 901, 156, 385, 156, 156, 166, 994, 908, 166, 148, - 911, 10, 166, 10, 10, 148, 147, 164, 1025, 402, - 403, 54, 923, 56, 57, 58, 409, 879, 169, 1408, - 166, 169, 167, 911, 15, 167, 166, 166, 999, 166, - 164, 148, 164, 166, 1005, 1006, 153, 164, 155, 996, - 157, 84, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 100, 1272, 166, - 164, 166, 164, 164, 155, 155, 155, 184, 979, 155, - 1027, 188, 189, 190, 167, 146, 119, 120, 471, 1096, - 1097, 992, 166, 994, 167, 17, 1475, 166, 999, 166, - 1001, 1002, 166, 136, 1005, 1006, 166, 166, 141, 993, - 10, 33, 148, 1321, 993, 10, 148, 148, 10, 1078, - 148, 999, 166, 164, 1025, 47, 166, 1005, 1006, 1090, - 1338, 1339, 1340, 15, 517, 147, 156, 167, 60, 61, - 166, 993, 166, 156, 527, 166, 156, 895, 1095, 166, - 156, 166, 10, 901, 76, 148, 10, 148, 167, 164, - 164, 164, 269, 148, 33, 166, 164, 1095, 1069, 10, - 11, 12, 20, 21, 22, 23, 166, 1078, 166, 166, - 148, 929, 308, 1084, 106, 33, 1087, 109, 643, 1090, - 112, 10, 11, 12, 13, 1096, 1097, 1242, 17, 1313, - 879, 329, 1410, 695, 1239, 588, 128, 842, 1069, 1417, - 1206, 1273, 1090, 407, -1, 1423, 1424, 329, 140, 602, - 108, 109, 110, 64, 112, 113, 114, -1, -1, 117, - -1, -1, 154, -1, 122, 76, 77, -1, -1, 127, - 128, 60, 130, 131, 132, -1, 134, 135, -1, 10, - 11, 12, 13, -1, 15, -1, 17, 640, -1, -1, - 1248, -1, -1, -1, 10, 11, 12, -1, -1, 1477, - -1, 112, 113, -1, 115, 10, 11, 12, 1239, 120, - 387, 122, 665, 666, 667, 668, -1, 670, 157, 158, - 159, 160, 161, 112, 163, 164, 165, -1, 1259, 60, - 1261, 1509, -1, -1, -1, 1206, -1, 155, 156, 157, - 158, 159, 160, 161, 1522, 163, 164, 165, 64, -1, - 1267, 140, -1, -1, 1079, 166, -1, -1, -1, 64, - 76, 77, -1, -1, -1, 154, -1, -1, 1239, -1, - 159, 76, 77, -1, -1, -1, 1247, 1248, -1, 1309, - -1, 112, -1, -1, 737, -1, -1, 1318, 1259, -1, - 1261, 1239, -1, -1, -1, -1, 112, 113, -1, 115, - -1, 1272, -1, -1, 120, -1, 122, 112, 113, 140, - 115, 1259, -1, 1261, -1, 120, -1, 122, -1, -1, - -1, -1, 17, 154, -1, -1, 1356, 1357, 159, 1359, - -1, 1361, -1, 164, -1, -1, -1, 514, -1, 297, - 298, 146, -1, -1, 521, 303, -1, 1318, 801, 165, - 1321, -1, 47, -1, -1, -1, -1, 1328, 811, 10, - 11, 12, 815, -1, -1, 60, 61, 1338, 1339, 1340, - 1318, 548, -1, 550, 1404, 552, -1, 1408, -1, 832, - -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, - 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, - 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, - 863, 106, 865, 64, 109, 33, -1, 112, -1, -1, - -1, -1, -1, -1, 1242, 76, 77, -1, -1, -1, - 1447, -1, -1, 128, -1, -1, -1, 1408, -1, 1410, - -1, -1, -1, -1, 1475, 140, 1417, -1, -1, 1420, - 1421, 1422, 1423, 1424, -1, 908, -1, -1, -1, 154, - 1408, 112, 113, -1, 115, -1, -1, -1, -1, 120, - 923, 122, -1, -1, -1, -1, -1, -1, -1, 1304, - 1305, 1306, 1307, 1308, -1, 1310, 1516, 1517, 1518, -1, - 1520, -1, 669, -1, -1, 1313, 22, 23, -1, 150, - 1264, 1265, 1266, 154, 1475, -1, 1477, 33, 159, 1304, - 1305, 1306, 1307, 1308, -1, 1310, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 979, 1475, 981, -1, - -1, 489, -1, -1, -1, -1, -1, -1, 1509, 157, - 158, 159, 160, 161, -1, 163, 164, 165, -1, -1, - -1, 1522, 1523, -1, -1, -1, -1, -1, -1, 1530, - 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, - 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1343, - 1033, 1345, -1, 1347, -1, -1, 1350, 1351, 1352, -1, - 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, - 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, -1, - 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, - -1, -1, -1, -1, -1, -1, 1451, -1, -1, -1, - -1, 157, 158, 159, 160, 161, -1, 163, 164, 165, - -1, -1, -1, -1, -1, -1, -1, 824, 825, 826, - -1, 828, -1, 830, 831, 832, 1451, 50, 51, -1, - -1, 54, -1, 56, 57, 58, 59, 60, -1, 62, - 63, -1, -1, 66, 67, -1, -1, 70, -1, -1, - 1505, -1, 75, 76, 77, -1, -1, -1, 81, -1, - -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, - 1505, -1, -1, -1, -1, 108, -1, 110, -1, 112, - -1, 679, 680, -1, 117, -1, 119, 120, 121, -1, - -1, 124, 125, 10, 11, 12, 129, -1, -1, 132, - 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, - 3, 4, 5, 6, -1, 8, 9, 10, 11, 12, - -1, 154, 15, -1, 157, 158, 159, -1, -1, 162, - -1, 164, 165, -1, -1, 168, -1, -1, -1, 1232, - -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, - -1, -1, -1, -1, 47, -1, -1, 50, 51, 76, - 77, 54, -1, 56, 57, 58, 59, 60, -1, 62, - 63, -1, -1, 66, 67, -1, -1, 70, -1, -1, - -1, -1, 75, 76, 77, -1, -1, -1, -1, -1, - -1, 84, -1, 1286, -1, 112, 113, -1, 115, -1, - -1, -1, -1, 120, -1, 122, -1, 100, -1, -1, - -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, - -1, -1, -1, 116, 117, -1, 119, 120, 121, 146, - -1, 124, 125, 22, 23, 1328, 129, -1, -1, 132, - 133, 134, 135, 136, 33, -1, 139, -1, 141, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1077, 154, -1, -1, 157, 158, -1, -1, -1, 162, - -1, 164, -1, -1, -1, 168, -1, -1, -1, -1, - 878, -1, -1, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, -1, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, - -1, -1, 1405, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, -1, -1, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, - 70, -1, 72, 73, 74, 75, 76, 77, 78, 79, - 80, -1, 82, 83, 84, -1, -1, -1, 157, 158, + 1, 61, 587, 464, 113, 493, 928, 512, 44, 318, + 92, 44, 710, 131, 752, 297, 131, 480, 660, 6, + 15, 8, 614, 462, 148, 141, 150, 151, 152, 153, + 732, 155, 493, 157, 605, 159, 183, 44, 15, 81, + 82, 83, 13, 147, 33, 484, 88, 15, 15, 331, + 76, 175, 715, 492, 76, 15, 59, 795, 0, 147, + 76, 62, 186, 187, 586, 169, 165, 166, 192, 193, + 141, 10, 11, 12, 147, 147, 155, 141, 166, 164, + 147, 744, 745, 146, 747, 748, 749, 750, 147, 150, + 91, 92, 147, 166, 166, 15, 165, 166, 99, 166, + 147, 164, 624, 146, 165, 141, 147, 166, 141, 33, + 164, 166, 719, 635, 721, 722, 723, 724, 725, 166, + 146, 164, 125, 149, 146, 166, 147, 149, 713, 771, + 146, 716, 147, 149, 141, 150, 165, 166, 274, 275, + 276, 277, 278, 155, 150, 166, 147, 148, 150, 150, + 151, 152, 153, 147, 155, 616, 157, 33, 159, 165, + 149, 146, 76, 165, 147, 207, 208, 209, 210, 64, + 65, 166, 166, 112, 175, 164, 165, 259, 260, 166, + 147, 297, 183, 166, 164, 186, 187, 164, 159, 147, + 499, 192, 193, 275, 276, 255, 164, 108, 109, 110, + 147, 112, 113, 114, 164, 693, 117, 354, 166, 147, + 149, 327, 123, 164, 165, 331, 525, 128, 129, 166, + 131, 132, 133, 265, 135, 136, 297, 147, 166, 230, + 164, 753, 146, 297, 805, 149, 164, 900, 147, 163, + 164, 165, 164, 147, 815, 164, 147, 289, 753, 13, + 146, 15, 148, 17, 150, 155, 327, 166, 259, 260, + 331, 297, 166, 327, 297, 166, 390, 331, 164, 791, + 792, 934, 75, 274, 275, 276, 277, 278, 279, 143, + 144, 145, 147, 284, 147, 147, 147, 163, 164, 165, + 297, 327, 755, 164, 327, 331, 60, 147, 331, 906, + 1002, 166, 147, 166, 166, 166, 164, 443, 2, 33, + 164, 447, 448, 449, 450, 451, 166, 318, 147, 149, + 327, 166, 165, 166, 331, 461, 33, 788, 164, 465, + 466, 916, 6, 772, 8, 644, 146, 166, 148, 149, + 150, 164, 913, 98, 146, 146, 148, 148, 150, 150, + 13, 164, 15, 354, 17, 146, 998, 148, 846, 150, + 164, 643, 56, 57, 58, 59, 60, 164, 13, 63, + 15, 148, 17, 150, 164, 897, 140, 10, 11, 12, + 164, 165, 166, 692, 6, 846, 8, 298, 299, 390, + 154, 164, 897, 304, 164, 159, 164, 60, 165, 166, + 1102, 164, 165, 166, 164, 997, 164, 75, 164, 410, + 113, 114, 115, 984, 164, 60, 1338, 164, 165, 1004, + 164, 165, 166, 146, 147, 1010, 1011, 10, 11, 12, + 164, 64, 164, 157, 158, 159, 160, 161, 480, 163, + 164, 165, 443, 76, 77, 164, 447, 448, 449, 450, + 451, 164, 159, 160, 161, 155, 163, 164, 165, 164, + 461, 149, 598, 33, 465, 466, 164, 165, 164, 470, + 149, 164, 473, 509, 164, 164, 279, 140, 164, 112, + 113, 64, 115, 164, 1006, 1007, 164, 120, 164, 122, + 149, 154, 493, 76, 77, 140, 159, 191, 499, 164, + 1092, 164, 164, 1095, 164, 166, 164, 164, 509, 154, + 164, 164, 150, 1098, 159, 471, 159, 1255, 165, 164, + 149, 522, 48, 165, 525, 164, 147, 643, 146, 112, + 113, 155, 115, 166, 164, 148, 291, 120, 164, 122, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 164, 256, 167, 873, 147, 166, 261, 166, 166, + 166, 166, 643, 166, 166, 156, 156, 166, 166, 643, + 491, 166, 165, 147, 147, 586, 587, 588, 166, 159, + 160, 161, 166, 163, 164, 165, 15, 598, 353, 166, + 166, 166, 156, 297, 605, 166, 166, 643, 609, 166, + 643, 279, 672, 614, 166, 166, 166, 618, 619, 620, + 621, 622, 623, 624, 660, 1323, 166, 660, 166, 166, + 166, 325, 166, 166, 635, 156, 643, 166, 166, 166, + 164, 166, 165, 644, 645, 159, 166, 165, 167, 166, + 149, 164, 146, 660, 610, 166, 147, 147, 147, 147, + 463, 464, 147, 699, 164, 148, 164, 149, 164, 164, + 48, 164, 164, 341, 630, 631, 632, 633, 634, 166, + 166, 159, 1267, 159, 1269, 166, 146, 48, 76, 169, + 493, 692, 164, 387, 1432, 1433, 1434, 757, 758, 155, + 155, 155, 155, 164, 705, 765, 10, 767, 166, 148, + 404, 405, 713, 755, 10, 716, 470, 411, 719, 10, + 721, 722, 723, 724, 725, 10, 10, 156, 1430, 147, + 166, 148, 33, 159, 159, 771, 166, 738, 771, 1331, + 741, 148, 148, 1328, 167, 159, 166, 146, 169, 705, + 166, 752, 753, 166, 166, 164, 1348, 1349, 1350, 1247, + 164, 164, 164, 149, 771, 883, 166, 522, 883, 165, + 165, 682, 683, 165, 883, 164, 166, 164, 533, 473, + 147, 536, 147, 147, 587, 147, 1247, 150, 789, 159, + 791, 792, 166, 166, 795, 463, 464, 798, 167, 165, + 148, 148, 1540, 147, 805, 608, 10, 167, 868, 166, + 1548, 169, 4, 616, 815, 147, 48, 169, 164, 10, + 11, 12, 164, 146, 825, 493, 520, 147, 169, 166, + 1422, 156, 156, 166, 790, 1420, 530, 1429, 156, 166, + 156, 10, 148, 1435, 1436, 166, 10, 166, 884, 10, + 10, 807, 10, 521, 148, 609, 157, 158, 159, 160, + 161, 147, 163, 164, 165, 619, 620, 621, 622, 623, + 169, 164, 873, 64, 875, 167, 166, 15, 148, 167, + 169, 882, 155, 166, 166, 76, 77, 888, 889, 890, + 891, 892, 893, 894, 166, 164, 897, 591, 1490, 164, + 166, 164, 166, 1488, 164, 906, 1030, 147, 166, 164, + 713, 605, 913, 716, 155, 916, 155, 999, 155, 587, + 164, 112, 113, 166, 115, 167, 882, 928, 166, 120, + 166, 122, 1524, 889, 890, 891, 892, 893, 167, 146, + 608, 166, 166, 166, 10, 148, 137, 1539, 616, 643, + 10, 705, 10, 148, 148, 710, 10, 10, 11, 12, + 715, 148, 998, 164, 719, 998, 721, 722, 723, 724, + 725, 1280, 883, 166, 668, 669, 670, 671, 166, 673, + 1104, 1105, 17, 984, 15, 788, 167, 166, 147, 744, + 745, 998, 747, 748, 749, 750, 997, 147, 999, 166, + 156, 156, 156, 1004, 166, 1006, 1007, 156, 10, 1010, + 1011, 64, 47, 166, 166, 148, 167, 10, 166, 10, + 148, 164, 164, 76, 77, 60, 61, 164, 148, 1030, + 166, 166, 164, 148, 148, 789, 166, 166, 1103, 646, + 1250, 76, 309, 846, 798, 713, 1323, 741, 716, 884, + 331, 699, 1448, 1247, 1077, 331, 1281, 846, 1214, 112, + 113, -1, 115, -1, 409, -1, -1, 120, -1, 122, + -1, 106, -1, -1, 109, -1, 1077, 112, -1, 10, + 11, 12, 13, -1, -1, 1086, 17, -1, -1, -1, + -1, 1092, -1, 128, 1095, -1, -1, 1098, -1, -1, + -1, 154, -1, 1104, 1105, 140, 159, -1, -1, -1, + -1, 805, -1, 916, -1, -1, -1, -1, -1, 154, + 788, 815, -1, -1, -1, 819, -1, -1, 882, 60, + 1086, -1, -1, -1, -1, 889, 890, 891, 892, 893, + -1, -1, 836, -1, -1, 900, -1, -1, -1, -1, + -1, 906, -1, 847, 848, 849, 850, 851, 852, 853, + 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, + 864, 865, 866, 867, 1256, 869, -1, -1, 846, 934, + 111, 112, 1272, 1273, 1274, 10, 11, 12, 13, -1, + 15, -1, 17, -1, -1, 10, 11, 12, -1, -1, + -1, 1004, -1, -1, -1, -1, -1, 1010, 1011, 140, + -1, -1, -1, 1214, 20, 21, 22, 23, -1, 913, + -1, -1, -1, 154, -1, -1, -1, 33, 159, -1, + -1, -1, -1, 164, 928, 60, -1, -1, -1, 54, + -1, 56, 57, 58, -1, -1, 1247, -1, 916, -1, + 62, 66, -1, -1, 1255, 1256, -1, -1, -1, 1319, + -1, -1, 77, 1353, -1, 1355, 1267, 1357, 1269, 84, + 1360, 1361, 1362, 85, -1, -1, 61, -1, -1, 1280, + -1, -1, -1, -1, -1, 100, -1, 112, -1, -1, + 984, -1, 986, 105, -1, 1098, 10, 11, 12, 13, + -1, -1, -1, 17, 119, 120, 1366, 1367, -1, 1369, + -1, 1371, 124, -1, -1, 140, 10, 11, 12, 13, + -1, 136, 134, 17, 139, -1, 141, 1328, -1, 154, + 1331, -1, 1086, -1, 159, -1, 1004, 1338, -1, 164, + -1, -1, 1010, 1011, 1038, -1, 60, 1348, 1349, 1350, + -1, 157, 158, 159, 160, 161, 1416, 163, 164, 165, + -1, -1, -1, -1, 149, -1, 60, 179, -1, 154, + 182, 156, -1, 158, -1, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + -1, -1, 1087, -1, -1, -1, -1, -1, 112, -1, + 185, -1, -1, -1, 189, 190, 191, 16, 17, 18, + 19, 20, 21, 22, 23, 227, 228, -1, 112, 1420, + -1, 1422, -1, -1, 33, -1, 140, -1, 1429, -1, + 1098, 1432, 1433, 1434, 1435, 1436, -1, -1, -1, -1, + 154, -1, -1, -1, 1247, 159, 140, 1448, -1, -1, + 164, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 154, 273, -1, -1, 1267, 159, 1269, 18, 19, 20, + 21, 22, 23, 1533, 1534, 1535, -1, 1537, -1, 291, + -1, 293, 33, -1, -1, 270, -1, 1488, -1, 1490, + -1, -1, -1, -1, -1, 1250, -1, -1, 310, -1, + 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, + 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, + -1, 333, -1, 1524, -1, 1328, -1, 33, -1, -1, + 342, -1, -1, 345, -1, -1, -1, -1, 1539, 1540, + 149, 353, 151, 152, 153, 154, 1240, 1548, 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, -1, -1, - 100, -1, -1, -1, -1, -1, 106, 107, 108, -1, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, -1, -1, -1, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + -1, -1, -1, -1, -1, -1, -1, -1, 1323, -1, + -1, -1, 10, 11, 12, -1, -1, 15, -1, 1247, + 392, -1, -1, -1, 396, -1, -1, -1, 18, 19, + 20, 21, 22, 23, -1, -1, -1, 409, -1, 1267, + 1294, 1269, -1, 33, 389, -1, 157, 158, 159, 160, + 161, -1, 163, 164, 165, -1, -1, 1420, -1, 1314, + 1315, 1316, 1317, 1318, -1, 1320, 64, -1, -1, -1, + -1, -1, -1, -1, 446, -1, -1, -1, 76, 77, + -1, -1, -1, -1, 1338, 151, 152, 153, 154, -1, + 462, 157, 158, 159, 160, 161, -1, 163, 164, 165, + 1328, -1, 474, -1, 16, 17, 18, 19, 20, 21, + 22, 23, 484, -1, 112, 113, -1, 115, -1, -1, + 492, 33, 120, -1, 122, 1488, -1, -1, -1, -1, + -1, 1314, 1315, 1316, 1317, 1318, -1, 1320, -1, -1, + -1, -1, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, + 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, + 1415, -1, -1, 1417, 536, 155, 156, 157, 158, 159, + 160, 161, 517, 163, 164, 165, -1, -1, -1, 524, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, -1, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, - -1, -1, 1309, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, -1, -1, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, - 70, -1, 72, 73, 74, 75, 76, 77, 78, 79, - 80, -1, 82, 83, 84, -1, -1, -1, -1, -1, - -1, -1, -1, 1370, 1371, 1372, 1373, -1, 1375, 1376, - 100, -1, -1, -1, -1, -1, 106, 107, 108, -1, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, -1, -1, -1, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, -1, 168, 169, - 3, 4, 5, 6, -1, 8, 9, 10, 11, -1, + -1, -1, 1420, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 551, -1, 553, 1464, + 555, -1, -1, 585, 1397, 1398, 1399, 1400, 1401, 1402, + 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, + 1413, 1414, 1415, -1, -1, -1, -1, -1, -1, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, -1, -1, 628, 169, -1, -1, + 1488, 3, 4, 5, 6, 1520, 8, 9, 10, 11, + 12, -1, -1, -1, 646, -1, -1, -1, -1, -1, + -1, 1464, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, + 23, -1, -1, -1, -1, -1, -1, -1, 50, 51, + 33, -1, 54, -1, 56, 57, 58, 59, 60, -1, + 62, 63, -1, -1, 66, 67, -1, 672, 70, 22, + 23, 703, -1, 75, 76, 77, -1, 1520, -1, 81, + 33, -1, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, + 22, 23, 734, -1, -1, -1, 108, -1, 110, -1, + 112, 33, -1, -1, -1, 117, -1, 119, 120, 121, + -1, -1, 124, 125, -1, -1, -1, 129, -1, -1, + 132, 133, 134, 135, 136, -1, -1, 139, -1, 141, + 772, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, -1, 154, -1, -1, 157, 158, 159, 33, -1, + 162, -1, 164, 165, -1, -1, 168, -1, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, 164, 165, -1, -1, -1, 169, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 157, 158, 159, 160, 161, -1, + 163, 164, 165, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 828, 829, 830, -1, 832, -1, 834, + 835, 836, -1, -1, -1, 157, 158, 159, 160, 161, + -1, 163, 164, 165, -1, -1, -1, 18, 19, 20, + 21, 22, 23, 885, -1, -1, -1, -1, -1, -1, + -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, -1, -1, -1, 169, -1, -1, -1, -1, -1, + -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, -1, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, + -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + -1, -1, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, -1, 70, 1001, + 72, 73, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, 164, 165, -1, -1, -1, 100, -1, + 1032, -1, -1, -1, 106, 107, 108, -1, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, -1, -1, -1, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, -1, -1, + -1, 1103, -1, -1, -1, -1, -1, -1, -1, -1, + 1085, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, -1, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, + -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + -1, -1, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, -1, 70, -1, + 72, 73, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 100, -1, + -1, -1, -1, -1, 106, 107, 108, -1, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, -1, -1, 1275, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, -1, 168, 169, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, + 4, 5, 6, -1, 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, -1, -1, -1, -1, -1, 50, 51, 33, - -1, 54, -1, 56, 57, 58, 59, -1, -1, 62, - 63, -1, -1, 66, 67, -1, -1, 70, -1, -1, + -1, -1, -1, -1, 1319, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 50, 51, -1, -1, + 54, -1, 56, 57, 58, 59, -1, -1, 62, 63, + -1, -1, 66, 67, -1, -1, 70, -1, -1, -1, + -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 1382, 1383, 1384, + 1385, -1, 1387, 1388, 108, -1, 110, -1, 112, -1, + -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, + 124, 125, -1, -1, -1, 129, -1, -1, 132, 133, + 134, 135, 136, -1, -1, 139, -1, 141, 3, 4, + 5, 6, -1, 8, 9, 10, 11, -1, 1460, -1, + 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, + 164, 165, -1, -1, 168, -1, -1, -1, -1, 16, + 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, + -1, -1, -1, -1, -1, 50, 33, -1, -1, 54, + -1, 56, 57, 58, -1, -1, -1, 62, -1, 64, + 65, 66, 67, -1, -1, -1, -1, -1, -1, -1, + 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, + -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, + -1, -1, 117, -1, 119, 120, 121, -1, -1, 124, + -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, + -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, + 11, 146, -1, -1, -1, -1, -1, -1, -1, 154, + -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, + 165, -1, 149, 168, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, 50, + -1, -1, -1, 54, -1, 56, 57, 58, -1, -1, + -1, 62, -1, -1, -1, 66, 67, 10, 11, 12, + -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, + 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, + -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, + 121, 64, -1, 124, -1, -1, -1, -1, 129, -1, + -1, 132, -1, 76, 77, 136, 3, 4, 5, 6, + 141, 8, 9, 10, 11, -1, -1, -1, -1, -1, + -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, + -1, 162, -1, 164, 165, 166, -1, 168, -1, 112, + 113, -1, 115, -1, -1, -1, -1, 120, -1, 122, + -1, -1, -1, 50, 51, -1, -1, 54, -1, 56, + 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, + 67, -1, -1, -1, -1, -1, -1, 150, 75, 76, + 77, 154, -1, -1, 81, -1, 159, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, + -1, 108, -1, 110, -1, 112, -1, -1, -1, -1, + 117, -1, 119, 120, 121, -1, -1, 124, -1, -1, + -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, + 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, + 157, 158, 159, -1, -1, 162, -1, 164, 165, -1, + -1, 168, -1, -1, -1, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, 50, 51, -1, + -1, 54, 33, 56, 57, 58, -1, -1, -1, 62, + -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, -1, - -1, 124, 125, -1, -1, -1, 129, -1, -1, 132, - 133, 134, 135, 136, -1, -1, 139, -1, 141, 3, - 4, 5, 6, -1, 8, 9, 10, 11, -1, -1, + -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, + -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, + 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, - -1, 164, 165, -1, -1, 168, -1, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - 164, 165, -1, -1, -1, 169, 50, -1, -1, -1, - 54, -1, 56, 57, 58, -1, -1, -1, 62, -1, - 64, 65, 66, 67, 10, 11, 12, -1, -1, -1, - -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, - -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, - -1, -1, -1, 117, -1, 119, 120, 121, 64, -1, - 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, - 76, 77, 136, 3, 4, 5, 6, 141, 8, 9, - 10, 11, 146, -1, -1, -1, -1, -1, -1, -1, - 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, - 164, 165, -1, -1, 168, -1, 112, 113, -1, 115, - -1, -1, -1, -1, 120, -1, 122, -1, -1, -1, - 50, -1, -1, -1, 54, -1, 56, 57, 58, -1, - -1, -1, 62, -1, -1, -1, 66, 67, 10, 11, - 12, -1, -1, -1, -1, 75, 76, 77, 154, -1, - -1, 81, -1, 159, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, - 110, -1, 112, -1, -1, -1, -1, 117, -1, 119, - 120, 121, 64, -1, 124, -1, -1, -1, -1, 129, - -1, -1, 132, -1, 76, 77, 136, 3, 4, 5, - 6, 141, 8, 9, 10, 11, -1, -1, -1, -1, - -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, - -1, -1, 162, -1, 164, 165, 166, -1, 168, -1, - 112, 113, -1, 115, -1, -1, -1, -1, 120, -1, - 122, -1, -1, -1, 50, 51, -1, -1, 54, -1, - 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, - 66, 67, -1, -1, -1, -1, -1, 149, -1, 75, - 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, - -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, - -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, - -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, - 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, - -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, - -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, - -1, -1, 168, -1, -1, -1, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, 50, 51, - -1, -1, 54, 33, 56, 57, 58, -1, -1, -1, - 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, - -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, - -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, - -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, - 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, - -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, - 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, - 8, 9, 10, 11, -1, -1, -1, -1, -1, -1, - -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, - 162, -1, 164, 165, -1, -1, 168, -1, -1, 149, - -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 50, 163, 164, 165, 54, -1, 56, 57, - 58, -1, -1, -1, 62, -1, -1, -1, 66, 67, - -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, -1, -1, 81, -1, -1, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, -1, -1, -1, -1, -1, -1, -1, - 108, -1, 110, -1, 112, -1, -1, -1, -1, 117, - -1, 119, 120, 121, -1, -1, 124, -1, -1, -1, - -1, 129, -1, -1, 132, -1, -1, -1, 136, 3, - 4, 5, 6, 141, 8, 9, 10, 11, 146, -1, - -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, - 158, 159, -1, -1, 162, -1, 164, 165, -1, -1, - 168, -1, -1, -1, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, -1, 50, -1, -1, -1, - 54, 33, 56, 57, 58, -1, -1, -1, 62, -1, - -1, -1, 66, 67, -1, -1, -1, -1, -1, -1, - -1, 75, 76, 77, -1, -1, -1, 81, -1, -1, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, -1, -1, -1, - -1, -1, -1, -1, 108, -1, 110, -1, 112, -1, - -1, -1, -1, 117, -1, 119, 120, 121, -1, -1, - 124, -1, -1, -1, -1, 129, -1, -1, 132, -1, - -1, -1, 136, 3, 4, 5, 6, 141, 8, 9, - 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, - 154, -1, -1, 157, 158, 159, -1, -1, 162, -1, - 164, 165, 166, -1, 168, -1, 148, -1, -1, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 50, 163, 164, 165, 54, -1, 56, 57, 58, -1, - -1, -1, 62, -1, -1, -1, 66, 67, -1, -1, - -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, - -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, -1, -1, -1, -1, -1, -1, -1, 108, -1, - 110, -1, 112, -1, -1, -1, -1, 117, -1, 119, - 120, 121, -1, -1, 124, -1, -1, -1, -1, 129, - -1, -1, 132, -1, -1, -1, 136, 3, 4, 5, - 6, 141, 8, 9, 10, 11, 146, -1, -1, -1, - -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, - -1, -1, 162, -1, 164, 165, -1, -1, 168, -1, - -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, -1, -1, 50, -1, -1, -1, 54, 33, - 56, 57, 58, -1, -1, -1, 62, -1, -1, -1, - 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, 81, -1, -1, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, -1, -1, -1, -1, -1, - -1, -1, 108, -1, 110, -1, 112, -1, -1, -1, - -1, 117, -1, 119, 120, 121, -1, -1, 124, -1, - -1, -1, -1, 129, -1, -1, 132, -1, -1, -1, - 136, 3, 4, 5, 6, 141, 8, 9, 10, 11, - -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, - -1, 157, 158, 159, -1, -1, 162, -1, 164, 165, - 166, -1, 168, 147, -1, -1, -1, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 50, 163, - 164, 165, 54, -1, 56, 57, 58, -1, -1, -1, - 62, -1, -1, -1, 66, 67, -1, -1, -1, -1, - -1, -1, -1, 75, 76, 77, -1, -1, -1, 81, - -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, -1, - -1, -1, -1, -1, -1, -1, 108, -1, 110, -1, - 112, -1, -1, -1, -1, 117, -1, 119, 120, 121, - -1, -1, 124, -1, -1, -1, -1, 129, -1, -1, - 132, -1, -1, -1, 136, 3, 4, 5, 6, 141, - 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, - -1, -1, 154, -1, -1, 157, 158, 159, -1, -1, - 162, -1, 164, 165, -1, -1, 168, 16, 17, 18, - 19, 20, 21, 22, 23, -1, -1, -1, -1, 47, - -1, -1, 50, 51, 33, -1, 54, -1, 56, 57, - 58, 59, 60, -1, 62, 63, -1, -1, 66, 67, - -1, -1, 70, -1, -1, -1, -1, 75, 76, 77, - -1, -1, -1, -1, -1, -1, 84, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 100, -1, -1, -1, -1, -1, -1, -1, - 108, -1, 110, -1, 112, -1, -1, -1, 116, 117, - -1, 119, 120, 121, -1, -1, 124, 125, -1, -1, - -1, 129, -1, -1, 132, 133, 134, 135, 136, -1, - -1, 139, -1, 141, 3, 4, 5, 6, -1, 8, - 9, 10, -1, -1, -1, -1, 154, -1, -1, 157, - 158, -1, -1, -1, 162, -1, 164, -1, -1, -1, - 168, -1, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, -1, 163, 164, 165, -1, -1, -1, - 169, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 62, -1, -1, -1, -1, 67, 17, - 18, 19, 20, 21, 22, 23, 75, 76, -1, -1, - -1, -1, 81, -1, -1, 33, 85, 86, 87, 88, + -1, 164, 165, -1, -1, 168, -1, 148, -1, -1, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 50, 163, 164, 165, 54, -1, 56, 57, 58, + -1, -1, -1, 62, -1, -1, -1, 66, 67, -1, + -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, + -1, -1, 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, -1, 16, 17, 18, 19, 20, 21, 22, 23, - -1, 110, -1, 112, -1, -1, -1, -1, 117, 33, - -1, -1, 121, -1, -1, 124, -1, -1, -1, -1, - 129, -1, -1, -1, -1, -1, -1, 54, -1, 56, - 57, 58, -1, -1, -1, -1, -1, -1, -1, 66, + 99, 100, -1, -1, -1, -1, -1, -1, -1, 108, + -1, 110, -1, 112, -1, -1, -1, -1, 117, -1, + 119, 120, 121, -1, -1, 124, -1, -1, -1, -1, + 129, -1, -1, 132, -1, -1, -1, 136, 3, 4, + 5, 6, 141, 8, 9, 10, 11, 146, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, - 159, 6, -1, 162, -1, 164, 165, 84, -1, 168, + 159, -1, -1, 162, -1, 164, 165, -1, -1, 168, + -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, + 23, -1, -1, -1, -1, 50, -1, -1, -1, 54, + 33, 56, 57, 58, -1, -1, -1, 62, -1, -1, + -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, + 75, 76, 77, -1, -1, -1, 81, -1, -1, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, -1, -1, -1, -1, + -1, -1, -1, 108, -1, 110, -1, 112, -1, -1, + -1, -1, 117, -1, 119, 120, 121, -1, -1, 124, + -1, -1, -1, -1, 129, -1, -1, 132, -1, -1, + -1, 136, 3, 4, 5, 6, 141, 8, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, -1, 154, + -1, -1, 157, 158, 159, -1, -1, 162, -1, 164, + 165, 166, -1, 168, 147, -1, -1, -1, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 50, + 163, 164, 165, 54, -1, 56, 57, 58, -1, -1, + -1, 62, -1, -1, -1, 66, 67, -1, -1, -1, + -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, + 81, -1, -1, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + -1, -1, -1, -1, -1, -1, -1, 108, -1, 110, + -1, 112, -1, -1, -1, -1, 117, -1, 119, 120, + 121, -1, -1, 124, -1, -1, -1, -1, 129, -1, + -1, 132, -1, -1, -1, 136, 3, 4, 5, 6, + 141, 8, 9, 10, 11, 146, -1, -1, -1, -1, + -1, -1, -1, 154, -1, -1, 157, 158, 159, -1, + -1, 162, -1, 164, 165, -1, -1, 168, -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, - -1, -1, -1, 100, -1, -1, -1, -1, 33, -1, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 119, 120, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, -1, 163, 164, 165, -1, 136, - 65, -1, -1, -1, 141, -1, -1, -1, -1, -1, - -1, -1, 10, 11, -1, -1, -1, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - 164, 165, -1, -1, -1, 169, -1, 20, 21, 22, - 23, -1, -1, 108, -1, -1, -1, -1, -1, -1, - 33, -1, -1, 51, -1, -1, 54, -1, 56, 57, - 58, 59, -1, -1, -1, 63, -1, -1, 66, -1, - -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, - -1, -1, 147, -1, -1, 150, 84, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, -1, 164, - 165, -1, 100, 168, -1, 10, 11, -1, -1, -1, - -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, - -1, 119, 120, -1, -1, -1, -1, 125, -1, -1, - -1, -1, -1, -1, -1, 133, 134, 135, 136, -1, - -1, 139, -1, 141, -1, -1, 51, -1, 146, 54, - -1, 56, 57, 58, 59, -1, -1, -1, 63, -1, - -1, 66, -1, -1, 162, 70, -1, -1, -1, -1, - -1, -1, 77, -1, 157, 158, 159, 160, 161, 84, - 163, 164, 165, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, -1, -1, 100, -1, 54, -1, 56, - 57, 58, -1, -1, -1, -1, 111, -1, -1, 66, - -1, -1, -1, -1, 119, 120, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, 84, 133, 134, - 135, 136, 51, -1, 139, 54, 141, 56, 57, 58, - 59, -1, -1, 100, 63, -1, -1, 66, -1, -1, - -1, 70, -1, -1, -1, -1, -1, 162, 77, -1, - -1, -1, 119, 120, -1, 84, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, -1, -1, -1, 136, - -1, 100, -1, 33, 141, -1, -1, -1, -1, -1, - -1, 54, 111, 56, 57, 58, -1, -1, -1, -1, - 119, 120, -1, -1, -1, -1, 125, 164, -1, -1, - -1, -1, -1, -1, 133, 134, 135, 136, -1, -1, - 139, 84, 141, 16, 17, 18, 19, 20, 21, 22, - 23, -1, -1, -1, -1, -1, -1, 100, -1, -1, - 33, -1, -1, 162, 16, 17, 18, 19, 20, 21, - 22, 23, -1, -1, -1, -1, 119, 120, -1, -1, - -1, 33, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, -1, 136, -1, -1, -1, -1, 141, 33, + -1, -1, -1, 50, -1, -1, -1, 54, 33, 56, + 57, 58, -1, -1, -1, 62, -1, -1, -1, 66, + 67, -1, -1, -1, -1, -1, -1, -1, 75, 76, + 77, -1, -1, -1, 81, -1, -1, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, -1, -1, -1, -1, -1, -1, + -1, 108, -1, 110, -1, 112, -1, -1, -1, -1, + 117, -1, 119, 120, 121, -1, -1, 124, -1, -1, + -1, -1, 129, -1, -1, 132, -1, -1, -1, 136, + 3, 4, 5, 6, 141, 8, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, + 157, 158, 159, -1, -1, 162, -1, 164, 165, 166, + -1, 168, -1, -1, 149, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 50, 163, 164, + 165, 54, -1, 56, 57, 58, -1, -1, -1, 62, + -1, -1, -1, 66, 67, -1, -1, -1, -1, -1, + -1, -1, 75, 76, 77, -1, -1, -1, 81, -1, + -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, -1, -1, + -1, -1, -1, -1, -1, 108, -1, 110, -1, 112, + -1, -1, -1, -1, 117, -1, 119, 120, 121, -1, + -1, 124, -1, -1, -1, -1, 129, -1, -1, 132, + -1, -1, -1, 136, 3, 4, 5, 6, 141, 8, + 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, + -1, 154, -1, -1, 157, 158, 159, -1, -1, 162, + -1, 164, 165, -1, -1, 168, 16, 17, 18, 19, + 20, 21, 22, 23, -1, -1, -1, -1, 47, -1, + -1, 50, 51, 33, -1, 54, -1, 56, 57, 58, + 59, 60, -1, 62, 63, -1, -1, 66, 67, -1, + -1, 70, -1, -1, -1, -1, 75, 76, 77, -1, + -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, - -1, -1, -1, -1, -1, -1, -1, 147, 33, -1, + -1, 100, -1, -1, -1, -1, -1, -1, 33, 108, + -1, 110, -1, 112, -1, -1, -1, 116, 117, -1, + 119, 120, 121, -1, -1, 124, 125, -1, -1, -1, + 129, -1, -1, 132, 133, 134, 135, 136, -1, -1, + 139, -1, 141, -1, 3, 4, 5, 6, -1, 8, + 9, 10, 11, 12, -1, 154, 15, -1, 157, 158, + -1, -1, -1, 162, -1, 164, -1, 147, -1, 168, -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, 164, 165, 166, 16, 17, 18, - 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 33, 16, 17, 18, 19, 20, - 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 33, -1, -1, -1, -1, -1, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, - 163, 164, 165, 166, -1, -1, -1, -1, -1, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, 166, -1, -1, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - 164, 165, 166, -1, -1, -1, 151, 152, 153, 154, + 160, 161, -1, 163, 164, 165, 166, -1, 47, -1, + -1, 50, 51, -1, -1, 54, -1, 56, 57, 58, + 59, 60, -1, 62, 63, -1, -1, 66, 67, -1, + -1, 70, -1, -1, -1, -1, 75, 76, 77, -1, + -1, -1, -1, -1, -1, 84, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, - 165, 166, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, -1, -1, -1, -1, 10, 11, 12, 33, - -1, 15, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, -1, 163, 164, 165, 166, -1, -1, + 165, 100, -1, -1, -1, -1, -1, -1, -1, 108, + -1, 110, -1, 112, -1, -1, -1, 116, 117, -1, + 119, 120, 121, -1, -1, 124, 125, -1, -1, -1, + 129, -1, -1, 132, 133, 134, 135, 136, -1, -1, + 139, -1, 141, 3, 4, 5, 6, -1, 8, 9, + 10, -1, -1, -1, -1, 154, -1, -1, 157, 158, + -1, -1, -1, 162, -1, 164, -1, -1, -1, 168, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 62, -1, -1, -1, -1, 67, 17, 18, + 19, 20, 21, 22, 23, 75, 76, -1, -1, -1, + -1, 81, -1, -1, 33, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, + 110, -1, 112, -1, -1, -1, -1, 117, 33, -1, + -1, 121, -1, -1, 124, -1, -1, -1, -1, 129, + -1, -1, -1, -1, -1, -1, 54, -1, 56, 57, + 58, -1, -1, -1, -1, -1, -1, -1, 66, -1, + -1, -1, -1, -1, 154, -1, -1, 157, 158, 159, + 6, -1, 162, -1, 164, 165, 84, -1, 168, -1, + 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, + -1, -1, 100, -1, -1, -1, -1, 33, -1, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 119, 120, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, 163, 164, 165, -1, 136, 65, + -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, + -1, 10, 11, -1, -1, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, 166, -1, 17, 18, 19, 20, 21, 22, 23, + -1, -1, 108, -1, -1, -1, -1, -1, -1, 33, + -1, -1, 51, -1, -1, 54, -1, 56, 57, 58, + 59, -1, -1, -1, 63, -1, -1, 66, -1, -1, + -1, 70, -1, -1, -1, -1, -1, -1, 77, -1, + -1, 147, -1, -1, 150, 84, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, -1, 164, 165, + -1, 100, 168, -1, 10, 11, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, + 119, 120, -1, -1, -1, -1, 125, -1, -1, -1, + -1, -1, -1, -1, 133, 134, 135, 136, -1, -1, + 139, -1, 141, -1, -1, 51, -1, 146, 54, -1, + 56, 57, 58, 59, -1, -1, -1, 63, -1, -1, + 66, -1, -1, 162, 70, -1, -1, -1, 152, 153, + 154, 77, -1, 157, 158, 159, 160, 161, 84, 163, + 164, 165, -1, -1, -1, -1, -1, -1, -1, -1, + 10, 11, -1, -1, 100, -1, 54, -1, 56, 57, + 58, -1, -1, -1, -1, 111, -1, -1, 66, -1, + -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, + -1, -1, -1, -1, -1, -1, 84, 133, 134, 135, + 136, 51, -1, 139, 54, 141, 56, 57, 58, 59, + -1, -1, 100, 63, -1, -1, 66, 11, -1, -1, + 70, -1, -1, -1, -1, -1, 162, 77, -1, -1, + -1, 119, 120, -1, 84, 16, 17, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, -1, 136, -1, + 100, -1, 33, 141, -1, -1, -1, 10, 11, 12, + 54, 111, 56, 57, 58, -1, -1, -1, -1, 119, + 120, -1, -1, -1, -1, 125, 164, -1, -1, -1, + -1, -1, -1, 133, 134, 135, 136, -1, -1, 139, + 84, 141, 16, 17, 18, 19, 20, 21, 22, 23, + -1, -1, -1, -1, -1, -1, 100, -1, -1, 33, + -1, 64, 162, 16, 17, 18, 19, 20, 21, 22, + 23, -1, -1, 76, 77, 119, 120, -1, -1, -1, + 33, 16, 17, 18, 19, 20, 21, 22, 23, -1, + -1, -1, 136, -1, -1, -1, -1, 141, 33, 16, + 17, 18, 19, 20, 21, 22, 23, -1, -1, 112, + 113, -1, 115, -1, -1, -1, 33, 120, -1, 122, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, 16, 17, 18, 19, - 20, 21, 22, 23, -1, -1, 10, 11, 12, -1, - 64, -1, -1, 33, 16, 17, 18, 19, 20, 21, - 22, 23, 76, 77, -1, -1, -1, -1, -1, -1, - -1, 33, 16, 17, 18, 19, 20, 21, 22, 23, - -1, -1, -1, 47, -1, 49, -1, -1, -1, 33, - 16, 17, 18, 19, 20, 21, 22, 23, 112, 113, - 64, 115, -1, -1, -1, -1, 120, 33, 122, -1, - -1, -1, 76, 77, -1, -1, -1, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - 164, 165, 166, 16, 17, 18, 19, 20, 21, 22, - 23, -1, -1, -1, -1, -1, -1, -1, 112, 113, - 33, 115, -1, -1, -1, -1, 120, -1, 122, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, - -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 146, 163, 164, 165, -1, -1, -1, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, -1, -1, -1, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - 164, 165, -1, 149, -1, 151, 152, 153, 154, -1, - -1, 157, 158, 159, 160, 161, 0, 163, 164, 165, - -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, + 20, 21, 22, 23, -1, -1, 149, -1, -1, -1, + -1, -1, -1, 33, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, -1, 151, 152, - 153, 154, -1, -1, 157, 158, 159, 160, 161, -1, - 163, 164, 165, 47, -1, 49, -1, -1, 52, 53, - -1, -1, -1, -1, -1, -1, 60, 61, -1, -1, - -1, -1, -1, -1, -1, 69, -1, 71, 72, 73, - 74, -1, -1, -1, 78, -1, -1, -1, -1, 83, + -1, 33, -1, -1, -1, -1, -1, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 164, 165, 166, -1, -1, -1, -1, -1, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, 164, 165, 166, -1, -1, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, 164, + 165, 166, -1, -1, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, 166, + -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 102, 103, - 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, - 114, 115, 116, -1, -1, -1, -1, -1, 122, 123, - 11, 12, 126, 127, 15, -1, 17, 131, -1, -1, - -1, -1, -1, 137, 138, -1, 140, -1, -1, -1, - 152, 153, 154, -1, 148, 157, 158, 159, 160, 161, - -1, 163, 164, 165, -1, -1, 47, -1, -1, -1, - 51, -1, -1, 54, -1, 56, 57, 58, 59, 60, - -1, -1, 63, -1, -1, 66, -1, -1, -1, 70, - 18, 19, 20, 21, 22, 23, 77, -1, -1, -1, - -1, -1, -1, 84, -1, 33, 18, 19, 20, 21, - 22, 23, -1, -1, -1, -1, -1, -1, -1, 100, - -1, 33, 18, 19, 20, 21, 22, 23, -1, -1, - -1, -1, -1, -1, -1, 116, -1, 33, 119, 120, - -1, -1, -1, -1, 125, -1, 18, 19, 20, 21, - 22, 23, 133, 134, 135, 136, -1, -1, 139, -1, - 141, 33, 18, 19, 20, 21, 22, 23, -1, -1, - -1, -1, -1, 154, -1, -1, -1, 33, 159, 18, - 19, 20, 21, 22, 23, -1, -1, -1, 18, 19, - 20, 21, 22, 23, 33, -1, -1, -1, -1, -1, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, + -1, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, 164, 165, 166, -1, -1, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, 47, -1, 49, -1, -1, 52, + 53, -1, -1, -1, -1, -1, -1, 60, 61, -1, + -1, -1, -1, -1, -1, -1, 69, -1, 71, 72, + 73, 74, -1, -1, -1, 78, -1, -1, -1, -1, + 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, 102, + 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, + 113, 114, 115, 116, -1, -1, -1, -1, -1, 122, + 123, 11, 12, 126, 127, 15, -1, 17, 131, -1, + -1, -1, -1, -1, 137, 138, -1, 140, 18, 19, + 20, 21, 22, 23, -1, 148, -1, -1, -1, -1, + -1, -1, -1, 33, -1, -1, -1, 47, -1, -1, + -1, 51, -1, -1, 54, -1, 56, 57, 58, 59, + 60, -1, -1, 63, -1, -1, 66, -1, -1, -1, + 70, 18, 19, 20, 21, 22, 23, 77, -1, -1, + -1, -1, -1, -1, 84, -1, 33, 18, 19, 20, + 21, 22, 23, -1, -1, -1, -1, -1, -1, -1, + 100, -1, 33, 18, 19, 20, 21, 22, 23, -1, + -1, -1, -1, -1, -1, -1, 116, -1, 33, 119, + 120, -1, -1, -1, -1, 125, -1, 18, 19, 20, + 21, 22, 23, 133, 134, 135, 136, -1, -1, 139, + -1, 141, 33, 20, 21, 22, 23, -1, -1, -1, + -1, -1, -1, -1, 154, -1, 33, -1, -1, 159, + -1, -1, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, 164, 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, -1, 163, 164, 165, -1, -1, - -1, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, 164, 165, -1, -1, -1, -1, 154, 155, - 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 152, 153, 154, -1, -1, 157, 158, 159, 160, 161, - -1, 163, 164, 165, -1, 6, -1, -1, 6, 155, - 156, 157, 158, 159, 160, 161, -1, 163, 164, 165, - -1, -1, -1, -1, -1, 154, -1, -1, 157, 158, - 159, 160, 161, -1, 163, 164, 165, 157, 158, 159, - 160, 161, -1, 163, 164, 165, 47, -1, 49, 47, - -1, 49, 53, -1, -1, 53, -1, -1, -1, 60, - 61, -1, 60, 61, -1, 10, 11, 12, -1, -1, - 71, 72, 73, 71, 72, 73, -1, -1, -1, -1, - -1, -1, 83, -1, -1, 83, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, - -1, -1, -1, -1, -1, 106, -1, -1, 106, -1, - -1, -1, -1, -1, -1, 116, -1, -1, 116, 64, - -1, 122, -1, -1, 122, 126, 127, -1, -1, 127, - -1, 76, 77, -1, -1, -1, -1, 138, 51, 140, - 138, 54, 140, 56, 57, 58, 59, 60, -1, -1, - 63, -1, -1, 66, -1, -1, -1, 70, -1, -1, - -1, -1, -1, -1, 77, -1, -1, 112, 113, 114, - 115, 84, -1, -1, -1, 120, -1, 122, -1, -1, - -1, -1, -1, 10, 11, 12, -1, 100, 133, -1, - -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 119, 120, -1, -1, - -1, -1, 125, -1, 10, 11, 12, -1, -1, -1, - 133, 134, 135, 136, 51, -1, 139, 54, 141, 56, - 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, - -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, - 77, -1, -1, -1, -1, 51, -1, 84, 54, -1, - 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, - 66, -1, -1, 100, 70, -1, -1, -1, -1, -1, - -1, 77, -1, -1, -1, -1, -1, -1, 84, -1, - -1, -1, 119, 120, -1, -1, -1, -1, 125, -1, - 10, 11, 12, -1, 100, -1, 133, 134, 135, 136, - -1, -1, 139, -1, 141, 10, 11, 12, -1, -1, - -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, - 54, -1, 56, 57, 58, -1, -1, 133, 134, 135, - 136, -1, -1, 139, 54, 141, 56, 57, 58, 59, - 60, -1, -1, 10, 11, 12, 66, -1, -1, 54, - 84, 56, 57, 58, -1, -1, -1, 77, -1, -1, - -1, 66, -1, -1, 84, -1, 100, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, + 12, -1, -1, -1, -1, -1, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, 164, 165, -1, + -1, 152, 153, 154, -1, -1, 157, 158, 159, 160, + 161, -1, 163, 164, 165, 47, -1, 49, 153, 154, + -1, -1, 157, 158, 159, 160, 161, -1, 163, 164, + 165, -1, 64, -1, -1, 17, -1, 10, 11, 12, + -1, -1, -1, 154, 76, 77, 157, 158, 159, 160, + 161, 33, 163, 164, 165, -1, -1, -1, 155, 156, + 157, 158, 159, 160, 161, 47, 163, 164, 165, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 60, 61, + 112, 113, -1, 115, 10, 11, 12, -1, 120, -1, + 122, 64, -1, -1, 76, -1, -1, -1, -1, 10, + 11, 12, -1, 76, 77, -1, -1, -1, -1, -1, + -1, -1, -1, 6, 146, -1, 6, -1, -1, -1, + -1, -1, -1, -1, 106, -1, -1, 109, -1, -1, + 112, -1, -1, -1, -1, -1, -1, -1, 64, 112, + 113, -1, 115, -1, -1, -1, 128, 120, -1, 122, + 76, 77, -1, 64, 47, -1, 49, 47, 140, 49, + 53, -1, -1, 53, -1, 76, 77, 60, 61, -1, + 60, 61, 154, 146, -1, -1, -1, -1, 71, 72, + 73, 71, 72, 73, -1, -1, 112, 113, -1, 115, + 83, -1, -1, 83, 120, -1, 122, -1, -1, -1, + -1, 112, 113, 114, 115, 10, 11, 12, -1, 120, + -1, 122, -1, 106, -1, -1, 106, -1, -1, -1, + 146, -1, 133, 116, -1, -1, 116, 138, -1, 122, + -1, -1, 122, 126, 127, -1, -1, 127, -1, -1, + 10, 11, 12, -1, -1, 138, 51, 140, 138, 54, + 140, 56, 57, 58, 59, 60, -1, -1, 63, -1, + -1, 66, -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, 84, - 100, -1, -1, -1, -1, 119, 120, -1, -1, -1, - -1, -1, 11, 12, -1, 100, 15, 64, -1, 119, - 120, -1, 136, -1, -1, -1, -1, 141, -1, 76, - 77, -1, -1, 133, 119, 120, 136, -1, -1, 139, - -1, 141, -1, 11, 12, -1, -1, 15, 47, -1, - 164, 136, 51, -1, 139, 54, 141, 56, 57, 58, - 59, 60, -1, -1, 63, 112, 113, 66, 115, -1, - -1, 70, -1, 120, -1, 122, -1, -1, 77, 47, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 64, 100, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 76, 77, -1, -1, + -1, -1, -1, -1, 119, 120, -1, -1, -1, -1, + 125, -1, 10, 11, 12, -1, -1, -1, 133, 134, + 135, 136, 51, -1, 139, 54, 141, 56, 57, 58, + 59, 60, 112, 113, 63, 115, -1, 66, -1, -1, + 120, 70, 122, 54, -1, 56, 57, 58, 77, -1, -1, -1, -1, 51, -1, 84, 54, -1, 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, -1, - -1, 100, 70, -1, -1, -1, -1, -1, -1, 77, - -1, -1, -1, -1, -1, -1, 84, 116, -1, -1, + -1, 100, 70, 84, -1, -1, -1, -1, -1, 77, + -1, -1, -1, -1, -1, -1, 84, -1, -1, 100, 119, 120, -1, -1, -1, -1, 125, -1, 10, 11, - 12, -1, 100, -1, 133, 134, 135, 136, 11, 12, - 139, -1, 141, -1, -1, -1, -1, -1, 116, -1, - -1, 119, 120, -1, -1, -1, -1, 125, -1, -1, - -1, -1, -1, -1, -1, 133, 134, 135, 136, 11, - 12, 139, -1, 141, 47, -1, -1, -1, 51, -1, - -1, 54, 64, 56, 57, 58, 59, 60, -1, -1, - 63, -1, -1, 66, 76, 77, -1, 70, -1, 54, - -1, 56, 57, 58, 77, -1, -1, -1, -1, 51, - -1, 84, 54, -1, 56, 57, 58, 59, 60, -1, - -1, 63, -1, -1, 66, -1, -1, 100, 70, 84, - 112, 113, -1, 115, -1, 77, -1, -1, 120, -1, - 122, -1, 84, 116, -1, 100, 119, 120, -1, -1, - -1, 133, 125, -1, -1, 11, 12, -1, 100, -1, - 133, 134, 135, 136, 119, 120, 139, -1, 141, -1, - -1, -1, -1, -1, -1, -1, -1, 119, 120, 11, - 12, 136, -1, 125, -1, -1, 141, 10, 11, 12, - -1, 133, 134, 135, 136, 51, -1, 139, 54, 141, - 56, 57, 58, 59, -1, -1, -1, 63, -1, 164, - 66, -1, -1, -1, 70, -1, -1, -1, -1, 51, - -1, 77, 54, -1, 56, 57, 58, 59, 84, -1, - -1, 63, -1, -1, 66, -1, -1, -1, 70, -1, - -1, 64, -1, -1, 100, 77, -1, -1, -1, -1, - -1, -1, 84, 76, 77, -1, -1, -1, -1, -1, - 116, -1, -1, 119, 120, 11, -1, -1, 100, 125, - -1, -1, -1, -1, -1, -1, -1, 133, 134, 135, - 136, -1, -1, 139, 107, 141, -1, 119, 120, 112, - 113, -1, 115, 125, 11, -1, -1, 120, -1, 122, - -1, 133, 134, 135, 136, 51, -1, 139, 54, 141, - 56, 57, 58, 59, 60, -1, -1, 63, -1, -1, - 66, -1, -1, -1, 70, -1, -1, -1, -1, -1, - -1, 77, -1, -1, 51, -1, -1, 54, 84, 56, - 57, 58, 59, 60, -1, -1, 63, -1, -1, 66, - -1, -1, -1, 70, 100, -1, -1, -1, -1, -1, - 77, -1, -1, -1, -1, -1, -1, 84, -1, -1, - -1, -1, -1, 119, 120, -1, -1, -1, -1, 125, - 11, -1, -1, 100, -1, -1, -1, 133, 134, 135, - 136, -1, -1, 139, -1, 141, -1, -1, -1, -1, - -1, -1, 119, 120, 11, -1, -1, -1, 125, -1, - -1, -1, 10, 11, 12, -1, 133, 134, 135, 136, - 51, -1, 139, 54, 141, 56, 57, 58, 59, -1, - -1, -1, 63, -1, -1, 66, -1, -1, -1, 70, - -1, -1, -1, -1, 51, -1, 77, 54, -1, 56, - 57, 58, 59, 84, -1, -1, 63, -1, -1, 66, - -1, -1, -1, 70, -1, -1, 64, -1, -1, 100, - 77, 10, 11, 12, -1, -1, -1, 84, 76, 77, - -1, -1, -1, -1, -1, 10, 11, 12, 119, 120, - -1, -1, -1, 100, 125, -1, -1, -1, -1, 10, - 11, 12, 133, 134, 135, 136, -1, -1, 139, -1, - 141, -1, 119, 120, 112, 113, -1, 115, 125, -1, - -1, -1, 120, -1, 122, 64, 133, 134, 135, 136, - -1, -1, 139, -1, 141, 133, -1, 76, 77, 64, - 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 76, 77, 64, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 76, 77, -1, -1, -1, - -1, -1, -1, 112, 113, -1, 115, -1, -1, -1, - -1, 120, -1, 122, -1, -1, -1, 112, 113, -1, - 115, -1, -1, -1, 133, 120, -1, 122, -1, 138, - -1, 112, 113, -1, 115, -1, -1, -1, 133, 120, - 47, 122, 49, 138, -1, 52, 53, -1, -1, -1, - -1, -1, -1, 60, 61, -1, 137, -1, -1, -1, - -1, -1, 69, -1, 71, 72, 73, 74, -1, -1, - -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, + 12, -1, 100, -1, 133, 134, 135, 136, 119, 120, + 139, -1, 141, -1, -1, -1, -1, -1, -1, -1, + -1, 119, 120, -1, -1, 136, -1, 125, 11, 12, + 141, -1, 15, -1, -1, 133, 134, 135, 136, -1, + -1, 139, 54, 141, 56, 57, 58, 59, 60, -1, + -1, -1, -1, 164, 66, -1, -1, 11, 12, -1, + -1, 15, -1, -1, 47, 77, -1, -1, 51, -1, + -1, 54, 84, 56, 57, 58, 59, 60, -1, -1, + 63, -1, -1, 66, -1, -1, -1, 70, 100, -1, + -1, -1, -1, 47, 77, -1, -1, 51, -1, -1, + 54, 84, 56, 57, 58, 59, 60, 119, 120, 63, + -1, -1, 66, -1, -1, -1, 70, 100, -1, -1, + -1, 133, -1, 77, 136, -1, -1, 139, -1, 141, + 84, -1, -1, 116, -1, -1, 119, 120, -1, -1, + -1, -1, 125, -1, -1, -1, 100, -1, 11, 12, + 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, + -1, -1, 116, -1, -1, 119, 120, -1, -1, -1, + -1, 125, -1, -1, -1, -1, -1, 11, 12, 133, + 134, 135, 136, -1, 47, 139, -1, 141, 51, -1, + -1, 54, -1, 56, 57, 58, 59, 60, -1, -1, + 63, -1, -1, 66, -1, -1, -1, 70, -1, -1, + -1, -1, -1, -1, 77, -1, -1, 51, -1, -1, + 54, 84, 56, 57, 58, 59, 60, -1, -1, 63, + -1, -1, 66, -1, -1, -1, 70, 100, -1, -1, + -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, + 84, -1, -1, 116, -1, -1, 119, 120, -1, -1, + -1, -1, 125, 11, 12, -1, 100, -1, -1, -1, + 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, + -1, -1, -1, -1, -1, 119, 120, 11, 12, -1, + -1, 125, -1, -1, -1, 10, 11, 12, -1, 133, + 134, 135, 136, 51, -1, 139, 54, 141, 56, 57, + 58, 59, -1, -1, -1, 63, -1, 54, 66, 56, + 57, 58, 70, -1, -1, -1, -1, 51, -1, 77, + 54, -1, 56, 57, 58, 59, 84, -1, -1, 63, + -1, -1, 66, -1, -1, -1, 70, 84, -1, 64, + -1, -1, 100, 77, -1, -1, -1, -1, -1, -1, + 84, 76, 77, 100, -1, -1, -1, -1, 116, -1, + -1, 119, 120, 11, -1, -1, 100, 125, -1, -1, + -1, -1, 119, 120, -1, 133, 134, 135, 136, -1, + -1, 139, 107, 141, -1, 119, 120, 112, 113, 136, + 115, 125, 11, -1, 141, 120, -1, 122, -1, 133, + 134, 135, 136, 51, -1, 139, 54, 141, 56, 57, + 58, 59, 60, -1, -1, 63, -1, 164, 66, -1, + -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, + -1, -1, 51, -1, -1, 54, 84, 56, 57, 58, + 59, 60, -1, -1, 63, -1, -1, 66, -1, -1, + -1, 70, 100, -1, -1, -1, -1, -1, 77, -1, + -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, + -1, 119, 120, -1, -1, -1, -1, 125, 11, -1, + -1, 100, -1, -1, -1, 133, 134, 135, 136, -1, + -1, 139, -1, 141, -1, -1, -1, -1, -1, -1, + 119, 120, 11, -1, -1, -1, 125, -1, -1, -1, + 10, 11, 12, -1, 133, 134, 135, 136, 51, -1, + 139, 54, 141, 56, 57, 58, 59, -1, -1, -1, + 63, -1, -1, 66, -1, -1, -1, 70, -1, -1, + -1, -1, 51, -1, 77, 54, -1, 56, 57, 58, + 59, 84, -1, -1, 63, -1, -1, 66, -1, -1, + -1, 70, -1, -1, 64, -1, -1, 100, 77, 10, + 11, 12, -1, -1, -1, 84, 76, 77, -1, -1, + -1, -1, -1, 10, 11, 12, 119, 120, -1, -1, + -1, 100, 125, -1, -1, -1, -1, 10, 11, 12, + 133, 134, 135, 136, -1, -1, 139, -1, 141, -1, + 119, 120, 112, 113, -1, 115, 125, -1, -1, -1, + 120, -1, 122, 64, 133, 134, 135, 136, -1, -1, + 139, -1, 141, 133, -1, 76, 77, 64, 138, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, + 77, 64, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 76, 77, -1, -1, -1, -1, -1, + -1, 112, 113, -1, 115, -1, -1, -1, -1, 120, + -1, 122, -1, -1, -1, 112, 113, -1, 115, -1, + -1, -1, 133, 120, -1, 122, -1, 138, -1, 112, + 113, -1, 115, -1, -1, -1, 133, 120, 47, 122, + 49, 138, -1, 52, 53, -1, -1, -1, -1, -1, + 133, 60, 61, -1, -1, -1, -1, -1, -1, -1, + 69, -1, 71, 72, 73, 74, -1, -1, -1, 78, + -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 102, 103, 104, 105, 106, + -1, -1, 101, 102, 103, 104, 105, 106, 107, -1, + -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, + 47, -1, 49, 122, 123, 52, 53, 126, 127, -1, + -1, -1, 131, 60, 61, -1, -1, -1, 137, 138, + -1, 140, 69, -1, 71, 72, 73, 74, -1, 148, + -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, + -1, -1, -1, -1, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 167, -1, -1, -1, -1, -1, -1, 102, 103, 104, + 167, -1, -1, -1, -1, -1, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 167, -1, -1, -1, -1, -1, -1, 102, + -1, -1, 167, -1, -1, -1, -1, -1, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, -1, -1, -1, 131, 60, @@ -2827,219 +2868,216 @@ static const yytype_int16 yycheck[] = 71, 72, 73, 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, -1, -1, -1, -1, - -1, 102, 103, 104, 105, 106, 107, -1, -1, -1, + 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, 148, -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, -1, -1, - -1, -1, -1, 102, 103, 104, 105, 106, 107, -1, + -1, -1, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, 127, -1, -1, -1, 131, 60, 61, -1, -1, -1, 137, 138, -1, 140, 69, -1, 71, 72, 73, 74, -1, 148, - -1, 78, -1, -1, -1, -1, 83, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, - -1, -1, -1, -1, -1, 102, 103, 104, 105, 106, + -1, 78, -1, 10, 11, 12, 83, -1, -1, -1, + -1, -1, -1, 54, -1, 56, 57, 58, 167, -1, + -1, -1, -1, -1, 101, 102, 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, 115, 116, - -1, -1, 47, -1, 49, 122, 123, 52, 53, 126, - 127, -1, -1, -1, 131, 60, 61, -1, -1, -1, - 137, 138, -1, 140, 69, -1, 71, 72, 73, 74, - -1, 148, -1, 78, -1, 10, 11, 12, 83, -1, - -1, -1, -1, -1, -1, 54, -1, 56, 57, 58, - 167, -1, -1, -1, -1, -1, -1, 102, 103, 104, - 105, 106, 107, -1, -1, -1, -1, -1, 113, 114, - 115, 116, 47, -1, 49, 84, -1, 122, 123, -1, - -1, 126, 127, -1, -1, -1, 131, -1, -1, 64, - -1, 100, 137, 138, 47, 140, 49, -1, -1, -1, - 53, 76, 77, 148, -1, -1, -1, 60, 61, -1, - 119, 120, -1, -1, -1, -1, -1, -1, 71, 72, - 73, -1, 167, -1, -1, 78, -1, 136, -1, -1, - 83, -1, 141, -1, -1, -1, -1, 112, 113, -1, - 115, -1, -1, -1, -1, 120, 47, 122, 49, -1, - -1, -1, 53, 106, -1, 164, -1, -1, -1, 60, - 61, -1, -1, 116, -1, -1, -1, -1, -1, 122, - 71, 72, 73, -1, 127, -1, -1, 78, -1, -1, - -1, -1, 83, -1, 137, 138, 47, 140, 49, -1, - -1, 52, 53, -1, -1, -1, -1, -1, -1, 60, - 61, -1, 155, -1, -1, 106, -1, -1, 69, -1, - 71, 72, 73, 74, -1, 116, -1, 78, -1, -1, - -1, 122, 83, -1, -1, 126, 127, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 137, 138, -1, 140, - -1, 102, 103, 104, 105, 106, 107, -1, -1, -1, - -1, -1, 113, 114, 115, 116, -1, -1, 47, -1, - 49, 122, 123, -1, 53, 126, 127, 47, -1, 49, - 131, 60, 61, 53, -1, -1, 137, 138, -1, 140, - 60, 61, 71, 72, 73, -1, -1, -1, -1, -1, - -1, 71, 72, 73, 83, -1, -1, -1, -1, -1, - -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 106, 107, -1, - -1, -1, -1, -1, -1, -1, 106, 116, -1, -1, - -1, -1, -1, 122, -1, -1, 116, -1, 127, -1, - -1, -1, 122, -1, -1, -1, -1, 127, -1, 138, - -1, 140, -1, -1, -1, -1, -1, -1, 138, -1, - 140 + 47, -1, 49, 84, -1, 122, 123, -1, -1, 126, + 127, -1, -1, -1, 131, -1, -1, 64, -1, 100, + 137, 138, 47, 140, 49, -1, -1, -1, 53, 76, + 77, 148, -1, -1, -1, 60, 61, -1, 119, 120, + -1, -1, -1, -1, -1, -1, 71, 72, 73, -1, + 167, -1, -1, 78, -1, 136, -1, -1, 83, -1, + 141, -1, -1, -1, -1, 112, 113, -1, 115, -1, + -1, -1, -1, 120, 47, 122, 49, -1, -1, -1, + 53, 106, -1, 164, -1, -1, -1, 60, 61, -1, + -1, 116, -1, -1, -1, -1, -1, 122, 71, 72, + 73, -1, 127, -1, -1, 78, -1, -1, -1, -1, + 83, -1, 137, 138, 47, 140, 49, -1, -1, 52, + 53, -1, -1, -1, -1, -1, -1, 60, 61, -1, + 155, -1, -1, 106, -1, -1, 69, -1, 71, 72, + 73, 74, -1, 116, -1, 78, -1, -1, -1, 122, + 83, -1, -1, 126, 127, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 137, 138, -1, 140, 101, 102, + 103, 104, 105, 106, 107, -1, -1, -1, -1, -1, + 113, 114, 115, 116, -1, -1, 47, -1, 49, 122, + 123, -1, 53, 126, 127, 47, -1, 49, 131, 60, + 61, 53, -1, -1, 137, 138, -1, 140, 60, 61, + 71, 72, 73, -1, -1, -1, -1, -1, -1, 71, + 72, 73, 83, -1, -1, -1, 54, -1, 56, 57, + 58, 83, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 106, 107, -1, -1, -1, + -1, -1, -1, -1, 106, 116, 84, -1, -1, -1, + -1, 122, -1, -1, 116, -1, 127, -1, -1, -1, + 122, -1, 100, -1, -1, 127, -1, 138, -1, 140, + -1, -1, -1, -1, -1, -1, 138, -1, 140, -1, + -1, 119, 120, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 136, -1, + -1, -1, -1, 141 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 143, 144, 145, 171, 172, 278, 3, 4, 5, + 0, 143, 144, 145, 171, 172, 279, 3, 4, 5, 6, 8, 9, 10, 11, 50, 54, 56, 57, 58, 62, 66, 67, 75, 76, 77, 81, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 108, 110, 112, 117, 119, 120, 121, 124, 129, 132, 136, 141, 154, 157, 158, 159, - 162, 164, 165, 168, 268, 269, 277, 11, 12, 51, + 162, 164, 165, 168, 269, 270, 278, 11, 12, 51, 54, 56, 57, 58, 59, 60, 63, 66, 70, 77, 84, 100, 119, 120, 125, 133, 134, 135, 136, 139, - 141, 230, 231, 235, 237, 239, 245, 246, 250, 251, - 256, 257, 258, 259, 0, 47, 49, 52, 53, 60, - 61, 69, 71, 72, 73, 74, 78, 83, 102, 103, - 104, 105, 106, 107, 113, 114, 115, 116, 122, 123, - 126, 127, 131, 137, 138, 140, 148, 175, 177, 178, - 180, 183, 202, 252, 255, 278, 146, 164, 164, 164, - 164, 164, 164, 155, 164, 155, 164, 164, 164, 164, + 141, 231, 232, 236, 238, 240, 246, 247, 251, 252, + 257, 258, 259, 260, 0, 47, 49, 52, 53, 60, + 61, 69, 71, 72, 73, 74, 78, 83, 101, 102, + 103, 104, 105, 106, 107, 113, 114, 115, 116, 122, + 123, 126, 127, 131, 137, 138, 140, 148, 175, 177, + 178, 180, 183, 202, 253, 256, 279, 146, 164, 164, + 164, 164, 164, 164, 155, 164, 155, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 11, 51, 63, 133, 134, - 233, 250, 251, 256, 155, 164, 164, 15, 164, 155, - 164, 164, 164, 268, 268, 268, 268, 268, 11, 54, - 56, 57, 58, 66, 77, 84, 100, 119, 120, 136, - 141, 235, 266, 268, 10, 11, 12, 64, 76, 77, - 112, 113, 115, 120, 122, 150, 154, 159, 272, 273, - 275, 278, 268, 16, 17, 18, 19, 20, 21, 22, - 23, 33, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 163, 164, 165, 6, 8, 230, 231, - 164, 59, 125, 66, 100, 257, 257, 257, 275, 164, - 257, 13, 15, 17, 60, 140, 154, 159, 164, 228, - 229, 278, 229, 146, 10, 11, 12, 112, 149, 276, - 236, 278, 137, 181, 182, 275, 164, 72, 83, 180, - 180, 180, 180, 6, 180, 202, 180, 149, 179, 107, - 180, 164, 164, 164, 164, 180, 146, 275, 149, 149, - 149, 180, 180, 164, 178, 180, 183, 203, 180, 180, - 187, 107, 275, 180, 180, 10, 11, 51, 63, 111, - 133, 134, 146, 162, 190, 193, 232, 234, 237, 239, - 245, 250, 251, 256, 265, 266, 278, 265, 235, 265, - 265, 265, 265, 235, 265, 235, 265, 235, 265, 235, - 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 235, 235, 235, 265, 164, 275, 164, 164, 275, - 236, 235, 265, 265, 164, 10, 235, 235, 235, 268, - 265, 265, 166, 147, 166, 275, 275, 147, 169, 150, - 218, 278, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 166, 266, 268, 229, 229, 51, 268, - 235, 159, 275, 13, 15, 17, 60, 140, 154, 159, - 228, 278, 228, 229, 228, 229, 228, 228, 15, 17, - 47, 60, 116, 154, 159, 213, 214, 223, 230, 231, - 278, 165, 248, 249, 278, 11, 247, 257, 149, 10, - 11, 12, 47, 49, 112, 146, 275, 276, 275, 48, - 147, 164, 11, 232, 268, 180, 177, 146, 275, 275, - 275, 275, 275, 172, 146, 268, 155, 10, 11, 193, - 232, 234, 275, 148, 150, 164, 164, 164, 60, 230, - 275, 164, 176, 275, 185, 146, 148, 150, 220, 148, - 184, 275, 276, 236, 167, 166, 166, 166, 166, 166, - 166, 156, 166, 156, 166, 166, 166, 166, 147, 166, - 147, 166, 147, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 268, 235, 265, 275, 156, 166, - 166, 275, 166, 166, 156, 166, 166, 166, 166, 268, - 268, 15, 154, 273, 164, 199, 278, 268, 149, 166, - 169, 166, 166, 166, 228, 159, 275, 228, 228, 228, - 228, 228, 165, 228, 181, 116, 230, 231, 223, 228, - 228, 166, 15, 147, 13, 17, 60, 140, 154, 159, - 164, 226, 276, 278, 13, 15, 17, 60, 140, 154, - 159, 164, 227, 264, 268, 278, 275, 167, 247, 181, - 164, 238, 240, 149, 180, 181, 3, 4, 5, 9, - 10, 15, 50, 62, 67, 75, 76, 108, 110, 112, - 117, 121, 124, 129, 132, 154, 157, 158, 162, 164, - 168, 215, 216, 223, 224, 270, 271, 277, 278, 166, - 166, 172, 146, 147, 147, 147, 147, 167, 253, 147, - 166, 10, 11, 12, 59, 60, 133, 204, 205, 206, - 207, 208, 256, 278, 164, 220, 188, 148, 235, 191, - 13, 159, 192, 51, 268, 230, 13, 17, 60, 140, - 154, 159, 225, 276, 278, 235, 172, 164, 146, 148, - 149, 150, 219, 260, 261, 64, 65, 146, 268, 13, - 17, 60, 111, 140, 154, 159, 164, 186, 209, 211, - 276, 149, 275, 164, 164, 235, 235, 235, 166, 166, - 166, 164, 166, 164, 218, 213, 17, 33, 47, 60, - 61, 76, 106, 109, 112, 128, 140, 154, 212, 278, - 268, 228, 264, 166, 48, 230, 231, 226, 227, 166, - 166, 199, 15, 223, 159, 226, 226, 226, 226, 226, - 226, 165, 218, 159, 275, 227, 227, 227, 227, 227, - 227, 165, 218, 169, 147, 150, 48, 232, 268, 172, - 76, 241, 278, 182, 164, 155, 155, 233, 155, 15, - 164, 155, 164, 268, 268, 268, 268, 235, 266, 268, - 166, 15, 147, 16, 17, 18, 19, 20, 21, 22, - 23, 33, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 163, 164, 165, 180, 180, 167, 254, - 10, 10, 10, 10, 172, 277, 148, 208, 156, 147, - 15, 275, 13, 17, 60, 140, 154, 159, 164, 226, - 227, 189, 211, 148, 213, 159, 209, 213, 166, 166, - 225, 159, 225, 225, 225, 225, 225, 164, 165, 166, - 167, 194, 260, 173, 174, 275, 64, 65, 167, 262, - 278, 148, 148, 146, 221, 222, 268, 278, 148, 159, - 209, 209, 6, 16, 17, 18, 19, 20, 21, 22, - 23, 33, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 65, 108, 147, 150, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 164, - 165, 168, 200, 209, 209, 209, 209, 149, 164, 165, - 212, 150, 218, 220, 247, 266, 266, 166, 166, 166, - 266, 266, 166, 60, 233, 181, 164, 146, 169, 164, - 223, 226, 227, 218, 218, 164, 164, 212, 226, 166, - 264, 227, 166, 264, 268, 166, 166, 167, 149, 242, - 243, 278, 235, 235, 235, 164, 235, 164, 10, 235, - 235, 235, 268, 166, 166, 15, 224, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 166, 266, - 268, 172, 147, 166, 147, 147, 147, 167, 166, 226, - 227, 178, 183, 201, 202, 207, 275, 150, 159, 150, - 217, 278, 218, 220, 166, 209, 166, 166, 164, 225, - 197, 264, 213, 167, 146, 147, 146, 164, 148, 148, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 70, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 82, 83, 84, 100, - 106, 107, 108, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 168, 169, 263, - 221, 167, 147, 209, 10, 166, 169, 166, 4, 210, - 264, 268, 147, 166, 166, 166, 166, 199, 233, 229, - 48, 166, 275, 260, 213, 218, 218, 213, 213, 164, - 169, 164, 169, 147, 113, 114, 115, 133, 138, 244, - 274, 275, 146, 147, 166, 156, 156, 265, 156, 275, - 166, 166, 156, 166, 166, 268, 149, 166, 169, 167, - 10, 148, 10, 10, 10, 148, 217, 235, 50, 62, + 164, 164, 164, 164, 164, 164, 11, 51, 63, 133, + 134, 234, 251, 252, 257, 155, 164, 164, 15, 164, + 155, 164, 164, 164, 269, 269, 269, 269, 269, 11, + 54, 56, 57, 58, 66, 77, 84, 100, 119, 120, + 136, 141, 236, 267, 269, 10, 11, 12, 64, 76, + 77, 112, 113, 115, 120, 122, 150, 154, 159, 273, + 274, 276, 279, 269, 16, 17, 18, 19, 20, 21, + 22, 23, 33, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 163, 164, 165, 6, 8, 231, + 232, 164, 59, 125, 66, 100, 258, 258, 258, 276, + 164, 258, 13, 15, 17, 60, 140, 154, 159, 164, + 229, 230, 279, 230, 146, 10, 11, 12, 112, 149, + 277, 237, 279, 137, 181, 182, 276, 164, 72, 83, + 180, 180, 180, 180, 6, 180, 202, 180, 149, 179, + 107, 180, 164, 164, 164, 164, 164, 180, 146, 276, + 149, 149, 149, 180, 180, 164, 178, 180, 183, 203, + 180, 180, 187, 107, 276, 180, 180, 10, 11, 51, + 63, 111, 133, 134, 146, 162, 190, 193, 233, 235, + 238, 240, 246, 251, 252, 257, 266, 267, 279, 266, + 236, 266, 266, 266, 266, 236, 266, 236, 266, 236, + 266, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 236, 236, 266, 164, 276, 164, + 164, 276, 237, 236, 266, 266, 164, 10, 236, 236, + 236, 269, 266, 266, 166, 147, 166, 276, 276, 147, + 169, 150, 219, 279, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 166, 267, 269, 230, 230, + 51, 269, 236, 159, 276, 13, 15, 17, 60, 140, + 154, 159, 229, 279, 229, 230, 229, 230, 229, 229, + 15, 17, 47, 60, 116, 154, 159, 214, 215, 224, + 231, 232, 279, 165, 249, 250, 279, 11, 248, 258, + 149, 10, 11, 12, 47, 49, 112, 146, 276, 277, + 276, 48, 147, 164, 11, 233, 269, 180, 177, 146, + 276, 276, 276, 276, 276, 276, 172, 146, 269, 155, + 10, 11, 193, 233, 235, 276, 148, 150, 164, 164, + 164, 60, 231, 276, 164, 176, 276, 185, 146, 148, + 150, 221, 148, 184, 276, 277, 237, 167, 166, 166, + 166, 166, 166, 166, 156, 166, 156, 166, 166, 166, + 166, 147, 166, 147, 166, 147, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 269, 236, 266, + 276, 156, 166, 166, 276, 166, 166, 156, 166, 166, + 166, 166, 269, 269, 15, 154, 274, 164, 199, 279, + 269, 149, 166, 169, 166, 166, 166, 229, 159, 276, + 229, 229, 229, 229, 229, 165, 229, 181, 116, 231, + 232, 224, 229, 229, 166, 15, 147, 13, 17, 60, + 140, 154, 159, 164, 227, 277, 279, 13, 15, 17, + 60, 140, 154, 159, 164, 228, 265, 269, 279, 276, + 167, 248, 181, 164, 239, 241, 149, 180, 181, 3, + 4, 5, 9, 10, 15, 50, 62, 67, 75, 76, + 108, 110, 112, 117, 121, 124, 129, 132, 154, 157, + 158, 162, 164, 168, 216, 217, 224, 225, 271, 272, + 278, 279, 166, 166, 172, 146, 147, 147, 147, 147, + 147, 167, 254, 147, 166, 10, 11, 12, 59, 60, + 133, 204, 205, 206, 207, 208, 257, 279, 164, 221, + 188, 148, 236, 191, 13, 159, 192, 51, 269, 231, + 13, 17, 60, 140, 154, 159, 226, 277, 279, 236, + 172, 164, 146, 148, 149, 150, 220, 261, 262, 64, + 65, 146, 269, 13, 17, 60, 111, 140, 154, 159, + 164, 186, 209, 211, 277, 149, 276, 164, 164, 236, + 236, 236, 166, 166, 166, 164, 166, 164, 219, 214, + 17, 33, 47, 60, 61, 76, 106, 109, 112, 128, + 140, 154, 212, 279, 269, 229, 265, 166, 48, 231, + 232, 227, 228, 166, 166, 199, 15, 224, 159, 227, + 227, 227, 227, 227, 227, 165, 219, 159, 276, 228, + 228, 228, 228, 228, 228, 165, 219, 169, 147, 150, + 48, 233, 269, 172, 76, 242, 279, 182, 164, 155, + 155, 234, 155, 15, 164, 155, 164, 269, 269, 269, + 269, 236, 267, 269, 166, 15, 147, 16, 17, 18, + 19, 20, 21, 22, 23, 33, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 163, 164, 165, + 180, 180, 167, 255, 10, 10, 10, 10, 10, 172, + 278, 148, 208, 156, 147, 15, 276, 13, 17, 60, + 140, 154, 159, 164, 227, 228, 189, 211, 148, 214, + 159, 209, 214, 166, 166, 226, 159, 226, 226, 226, + 226, 226, 164, 165, 166, 167, 194, 261, 173, 174, + 276, 64, 65, 167, 263, 279, 148, 148, 146, 222, + 223, 269, 279, 148, 159, 209, 209, 6, 16, 17, + 18, 19, 20, 21, 22, 23, 33, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 65, + 108, 147, 150, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 164, 165, 168, 200, 209, 209, + 209, 209, 149, 164, 165, 212, 150, 219, 221, 248, + 267, 267, 166, 166, 166, 267, 267, 166, 60, 234, + 181, 164, 146, 169, 164, 224, 227, 228, 219, 219, + 164, 164, 212, 227, 166, 265, 228, 166, 265, 269, + 166, 166, 167, 149, 243, 244, 279, 236, 236, 236, + 164, 236, 164, 10, 236, 236, 236, 269, 166, 166, + 15, 225, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 166, 267, 269, 172, 147, 166, 147, + 213, 279, 147, 147, 147, 167, 166, 227, 228, 178, + 183, 201, 202, 207, 276, 150, 159, 150, 218, 279, + 219, 221, 166, 209, 166, 166, 164, 226, 197, 265, + 214, 167, 146, 147, 146, 164, 148, 148, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 70, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 82, 83, 84, 100, 106, 107, + 108, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 168, 169, 264, 222, 167, + 147, 209, 10, 166, 169, 166, 4, 210, 265, 269, + 147, 166, 166, 166, 166, 199, 234, 230, 48, 166, + 276, 261, 214, 219, 219, 214, 214, 164, 169, 164, + 169, 147, 113, 114, 115, 133, 138, 245, 275, 276, + 146, 147, 166, 156, 156, 266, 156, 276, 166, 166, + 156, 166, 166, 269, 149, 166, 169, 167, 10, 148, + 10, 166, 10, 10, 10, 148, 218, 236, 50, 62, 67, 117, 121, 124, 154, 157, 158, 159, 162, 164, - 168, 267, 269, 147, 199, 166, 164, 199, 198, 213, - 169, 166, 260, 174, 265, 265, 262, 167, 146, 268, - 215, 169, 186, 212, 229, 15, 166, 167, 166, 166, - 166, 213, 213, 138, 274, 138, 274, 138, 274, 275, - 113, 114, 115, 15, 172, 244, 164, 164, 166, 164, - 166, 164, 268, 147, 166, 147, 166, 166, 147, 166, - 164, 155, 155, 155, 15, 164, 155, 267, 267, 267, - 267, 267, 235, 266, 267, 16, 17, 18, 19, 20, - 21, 22, 23, 33, 151, 152, 153, 154, 157, 158, - 159, 160, 161, 163, 164, 165, 189, 164, 195, 213, - 166, 199, 167, 167, 166, 167, 221, 166, 146, 166, - 199, 199, 199, 166, 166, 274, 274, 274, 274, 274, - 274, 167, 266, 266, 266, 266, 10, 148, 10, 148, - 148, 10, 148, 235, 235, 235, 235, 164, 10, 235, - 235, 166, 166, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 166, 266, 268, 196, 213, 166, 199, 15, - 167, 199, 260, 212, 212, 212, 199, 199, 166, 166, - 166, 166, 166, 147, 147, 166, 166, 156, 156, 156, - 275, 166, 166, 156, 267, 149, 166, 169, 213, 166, - 199, 167, 148, 10, 10, 148, 164, 164, 164, 166, - 164, 267, 166, 199, 166, 166, 266, 266, 266, 266, - 199, 212, 148, 148, 166, 166, 166, 166, 212 + 168, 268, 270, 147, 199, 166, 164, 199, 198, 214, + 169, 166, 261, 174, 266, 266, 263, 167, 146, 269, + 216, 169, 186, 212, 230, 15, 166, 167, 166, 166, + 166, 214, 214, 138, 275, 138, 275, 138, 275, 276, + 113, 114, 115, 15, 172, 245, 164, 164, 166, 164, + 166, 164, 269, 147, 166, 147, 148, 147, 166, 166, + 147, 166, 164, 155, 155, 155, 15, 164, 155, 268, + 268, 268, 268, 268, 236, 267, 268, 16, 17, 18, + 19, 20, 21, 22, 23, 33, 151, 152, 153, 154, + 157, 158, 159, 160, 161, 163, 164, 165, 189, 164, + 195, 214, 166, 199, 167, 167, 166, 167, 222, 166, + 146, 166, 199, 199, 199, 166, 166, 275, 275, 275, + 275, 275, 275, 167, 267, 267, 267, 267, 10, 148, + 10, 10, 148, 148, 10, 148, 236, 236, 236, 236, + 164, 10, 236, 236, 166, 166, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 166, 267, 269, 196, 214, + 166, 199, 15, 167, 199, 261, 212, 212, 212, 199, + 199, 166, 166, 166, 166, 147, 213, 166, 147, 147, + 166, 166, 156, 156, 156, 276, 166, 166, 156, 268, + 149, 166, 169, 214, 166, 199, 167, 10, 166, 148, + 10, 10, 148, 164, 164, 164, 166, 164, 268, 166, + 199, 148, 166, 166, 267, 267, 267, 267, 199, 212, + 148, 148, 166, 166, 166, 166, 212 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -3048,79 +3086,80 @@ static const yytype_uint16 yyr1[] = 0, 170, 171, 171, 171, 172, 172, 172, 173, 173, 174, 174, 174, 176, 175, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 179, 178, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 179, 178, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, - 182, 182, 182, 184, 183, 183, 185, 183, 183, 183, - 186, 186, 188, 187, 187, 189, 189, 191, 190, 192, - 190, 194, 193, 195, 193, 196, 193, 197, 193, 198, - 193, 193, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 200, 200, 200, 200, + 181, 181, 182, 182, 182, 184, 183, 183, 185, 183, + 183, 183, 186, 186, 188, 187, 187, 189, 189, 191, + 190, 192, 190, 194, 193, 195, 193, 196, 193, 197, + 193, 198, 193, 193, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 201, 201, 201, 202, 203, - 202, 202, 202, 204, 204, 205, 205, 206, 206, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, - 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 210, 209, 211, 211, 212, 212, 212, - 213, 213, 213, 213, 213, 214, 214, 215, 215, 215, - 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, - 219, 219, 219, 220, 220, 220, 220, 220, 220, 221, - 221, 221, 222, 222, 222, 222, 223, 223, 223, 223, - 223, 223, 223, 223, 224, 224, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 226, 226, 226, 226, 226, - 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 200, 200, 200, 200, 200, 200, 200, 201, 201, 201, + 202, 203, 202, 202, 202, 204, 204, 205, 205, 206, + 206, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 209, 210, 209, 211, 211, 212, + 212, 212, 213, 213, 214, 214, 214, 214, 214, 215, + 215, 216, 216, 216, 216, 216, 217, 217, 218, 218, + 219, 219, 220, 220, 220, 220, 220, 221, 221, 221, + 221, 221, 221, 222, 222, 222, 223, 223, 223, 223, + 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 231, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, - 233, 233, 233, 233, 233, 234, 234, 235, 235, 235, - 235, 236, 236, 236, 236, 238, 237, 240, 239, 241, - 241, 242, 242, 243, 243, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 245, 246, 246, 246, 246, - 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, - 250, 251, 251, 251, 253, 252, 254, 252, 252, 252, - 255, 255, 255, 256, 256, 256, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 258, 258, 258, 259, 261, 260, 262, 262, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 264, 264, 265, - 265, 266, 266, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 268, 268, 268, 268, 268, 268, 268, 268, + 230, 230, 230, 230, 230, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 232, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 234, 234, 234, 234, 234, 234, 234, 234, 235, + 235, 236, 236, 236, 236, 237, 237, 237, 237, 239, + 238, 241, 240, 242, 242, 243, 243, 244, 244, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 246, + 247, 247, 247, 247, 248, 248, 249, 249, 249, 250, + 250, 250, 251, 251, 251, 252, 252, 252, 254, 253, + 255, 253, 253, 253, 256, 256, 256, 257, 257, 257, + 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, + 258, 258, 258, 258, 259, 259, 259, 260, 262, 261, + 263, 263, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 265, 265, 266, 266, 267, 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 268, 268, 268, 268, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, - 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, - 272, 273, 273, 273, 273, 274, 274, 274, 275, 275, - 275, 275, 275, 275, 275, 275, 275, 275, 275, 276, - 276, 276, 276, 277, 277, 277, 277, 278 + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 273, 273, 273, 273, 273, 274, 274, 274, 274, 275, + 275, 275, 276, 276, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 277, 277, 277, 277, 278, 278, 278, + 278, 279 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -3128,45 +3167,46 @@ static const yytype_uint8 yyr2[] = { 0, 2, 2, 2, 2, 1, 2, 2, 1, 3, 4, 5, 4, 0, 5, 1, 1, 1, 1, 1, - 2, 1, 1, 2, 2, 2, 2, 7, 9, 11, - 9, 11, 13, 9, 13, 9, 7, 5, 0, 3, - 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 4, 5, 5, 1, 3, - 1, 4, 4, 0, 4, 3, 0, 4, 3, 1, - 2, 4, 0, 4, 3, 2, 4, 0, 6, 0, - 6, 0, 7, 0, 11, 0, 12, 0, 8, 0, - 9, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 4, 5, 6, 4, 1, 1, 1, 1, + 2, 1, 1, 2, 2, 2, 2, 8, 11, 9, + 11, 13, 7, 9, 12, 9, 13, 9, 7, 5, + 0, 3, 1, 2, 2, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 4, 5, 5, + 1, 3, 1, 4, 4, 0, 4, 3, 0, 4, + 3, 1, 2, 4, 0, 4, 3, 2, 4, 0, + 6, 0, 6, 0, 7, 0, 11, 0, 12, 0, + 8, 0, 9, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 4, 5, 6, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 2, 1, 1, 1, 1, 1, 2, 0, - 6, 2, 2, 1, 1, 1, 3, 1, 1, 1, - 2, 4, 2, 3, 3, 4, 2, 3, 1, 1, - 1, 1, 1, 2, 3, 2, 2, 2, 2, 2, - 3, 4, 3, 0, 6, 2, 3, 1, 3, 4, - 1, 1, 1, 3, 2, 1, 3, 1, 1, 1, - 3, 2, 1, 3, 1, 2, 1, 2, 1, 3, - 5, 3, 3, 1, 3, 3, 3, 3, 4, 1, - 1, 2, 1, 3, 3, 5, 3, 4, 5, 3, - 4, 5, 2, 4, 1, 1, 1, 1, 2, 2, - 2, 2, 2, 3, 4, 1, 1, 2, 2, 2, - 2, 2, 3, 4, 7, 3, 1, 2, 2, 2, - 2, 2, 2, 3, 4, 7, 3, 1, 1, 2, - 2, 2, 2, 2, 2, 3, 4, 1, 1, 2, - 2, 2, 2, 2, 2, 3, 4, 5, 9, 9, - 9, 1, 1, 2, 1, 1, 1, 3, 4, 4, - 4, 4, 1, 1, 1, 1, 2, 1, 1, 1, - 3, 4, 2, 4, 4, 4, 1, 1, 1, 2, - 3, 2, 4, 4, 1, 1, 1, 2, 3, 2, - 3, 1, 4, 5, 5, 0, 6, 0, 9, 1, - 1, 1, 1, 2, 3, 1, 2, 2, 2, 3, - 3, 3, 3, 3, 3, 4, 3, 1, 4, 2, - 1, 1, 1, 3, 5, 1, 2, 4, 1, 2, - 2, 1, 1, 1, 0, 6, 0, 7, 4, 5, - 3, 5, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 1, 1, 2, 1, 0, 2, 1, 2, 1, 1, + 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, + 2, 0, 6, 2, 2, 1, 1, 1, 3, 1, + 1, 1, 2, 4, 2, 3, 3, 4, 2, 3, + 1, 1, 1, 1, 1, 2, 3, 2, 2, 2, + 2, 2, 3, 4, 3, 0, 6, 2, 3, 1, + 3, 4, 1, 2, 1, 1, 1, 3, 2, 1, + 3, 1, 1, 1, 3, 2, 1, 3, 1, 2, + 1, 2, 1, 3, 5, 3, 3, 1, 3, 3, + 3, 3, 4, 1, 1, 2, 1, 3, 3, 5, + 3, 4, 5, 3, 4, 5, 2, 4, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 3, 4, 1, + 1, 2, 2, 2, 2, 2, 3, 4, 7, 3, + 1, 2, 2, 2, 2, 2, 2, 3, 4, 7, + 3, 1, 1, 2, 2, 2, 2, 2, 2, 3, + 4, 1, 1, 2, 2, 2, 2, 2, 2, 3, + 4, 5, 9, 9, 9, 1, 1, 2, 1, 1, + 1, 3, 4, 4, 4, 4, 1, 1, 1, 1, + 2, 1, 1, 1, 3, 4, 2, 4, 4, 4, + 1, 1, 1, 2, 3, 2, 4, 4, 1, 1, + 1, 2, 3, 2, 3, 1, 4, 5, 5, 0, + 6, 0, 9, 1, 1, 1, 1, 2, 3, 1, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, + 3, 1, 4, 2, 1, 1, 1, 3, 5, 1, + 2, 4, 1, 2, 2, 1, 1, 1, 0, 6, + 0, 7, 4, 5, 3, 5, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 1, 1, 2, 1, 0, 2, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -3179,29 +3219,29 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 3, 1, 4, 7, 7, 7, 7, 4, - 4, 5, 4, 2, 2, 2, 2, 2, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 5, 4, 4, 3, 3, - 3, 3, 1, 4, 7, 7, 7, 7, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 5, 4, 2, 5, 4, 4, - 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 5, 4, 4, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 8, 11, 4, 4, 6, 4, 4, 6, - 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 1, 4, 7, 7, 7, 7, 4, 4, 5, - 4, 2, 5, 4, 4, 2, 2, 2, 2, 2, + 3, 1, 1, 1, 1, 1, 3, 1, 4, 7, + 7, 7, 7, 4, 4, 5, 4, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, + 4, 4, 3, 3, 3, 3, 1, 4, 7, 7, + 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, + 2, 5, 4, 4, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 3, 3, 3, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 4, 2, 3, 1, 2, 1, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 8, 11, 4, 4, + 6, 4, 4, 6, 6, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 1, 4, 7, 7, 7, + 7, 4, 4, 5, 4, 2, 5, 4, 4, 2, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 5, 4, 4, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 0 + 1, 1, 1, 2, 4, 2, 3, 1, 2, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 0 }; @@ -3977,64 +4017,64 @@ yyreduce: switch (yyn) { case 3: -#line 450 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 451 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_expr = (yyvsp[0].u.expr); } -#line 3985 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4025 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 4: -#line 454 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 455 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_type = (yyvsp[0].u.type); } -#line 3993 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4033 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 10: -#line 472 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 473 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { delete (yyvsp[-1].u.expr); } -#line 4001 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4041 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 11: -#line 476 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 477 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { delete (yyvsp[-2].u.expr); } -#line 4009 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4049 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 12: -#line 480 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 481 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { delete (yyvsp[-1].u.expr); } -#line 4017 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4057 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 13: -#line 492 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 493 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { push_storage_class((current_storage_class & ~CPPInstance::SC_c_binding) | ((yyvsp[-1].u.integer) & CPPInstance::SC_c_binding)); } -#line 4026 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4066 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 14: -#line 497 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 498 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_storage_class(); } -#line 4034 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4074 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 21: -#line 510 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 511 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (publish_nest_level != 0) { yyerror("Unclosed __begin_publish", publish_loc); @@ -4047,11 +4087,11 @@ yyreduce: publish_nest_level++; current_scope->set_current_vis(V_published); } -#line 4051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4091 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 22: -#line 523 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 524 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (publish_nest_level != 1) { yyerror("Unmatched __end_publish", (yylsp[0])); @@ -4060,19 +4100,19 @@ yyreduce: } publish_nest_level = 0; } -#line 4064 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4104 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 23: -#line 532 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 533 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_scope->set_current_vis(V_published); } -#line 4072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 24: -#line 536 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 537 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (publish_nest_level > 0) { current_scope->set_current_vis(V_published); @@ -4080,258 +4120,328 @@ yyreduce: current_scope->set_current_vis(V_public); } } -#line 4084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4124 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 25: -#line 544 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 545 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_scope->set_current_vis(V_protected); } -#line 4092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4132 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 26: -#line 548 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 549 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_scope->set_current_vis(V_private); } -#line 4100 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 27: -#line 552 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - - CPPDeclaration *getter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); - } - - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-4].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[-6]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-6])); -} -#line 4115 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 28: -#line 563 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPDeclaration *getter = (yyvsp[-4].u.identifier)->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: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); - - } else { - CPPDeclaration *setter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); - } else { - setter_func = setter->as_function_group(); - } - - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[-8]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); - } -} #line 4140 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 29: -#line 584 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 27: +#line 553 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPDeclaration *getter = (yyvsp[-3].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-3].u.identifier)->get_fully_scoped_name(), (yylsp[-3])); + } else { + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-5].u.identifier), CPPMakeProperty::T_normal, current_scope, (yylsp[-7]).file); + make_property->_get_function = getter->as_function_group(); + + if ((yyvsp[-2].u.identifier) != nullptr) { + CPPDeclaration *setter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + } else { + make_property->_set_function = setter->as_function_group(); + } + } + + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-7])); + } +} +#line 4165 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 28: +#line 574 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *getter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); } else { - CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - CPPFunctionGroup *setter_func = NULL; + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-8].u.identifier), CPPMakeProperty::T_normal, current_scope, (yylsp[-10]).file); + make_property->_get_function = getter->as_function_group(); - if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { + CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } else { - setter_func = setter->as_function_group(); + make_property->_set_function = setter->as_function_group(); } CPPDeclaration *deleter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (deleter == (CPPDeclaration *)NULL || deleter->get_subtype() != CPPDeclaration::ST_function_group) { + if (deleter == nullptr || deleter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("reference to non-existent or invalid delete method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); - deleter = NULL; - } - - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-8].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[-10]).file); - if (deleter) { + } else { make_property->_del_function = deleter->as_function_group(); } + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); } } -#line 4174 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4196 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 30: -#line 614 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 29: +#line 601 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *length_getter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (length_getter == (CPPDeclaration *)NULL || length_getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (length_getter == nullptr || length_getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("reference to non-existent or invalid length method: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); - length_getter = NULL; + length_getter = nullptr; } CPPDeclaration *getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + getter = nullptr; } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), getter->as_function_group(), NULL, current_scope, (yylsp[-8]).file); - make_property->_length_function = length_getter->as_function_group(); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); + if (getter != nullptr && length_getter != nullptr) { + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), CPPMakeProperty::T_sequence, current_scope, (yylsp[-8]).file); + make_property->_get_function = getter->as_function_group(); + make_property->_length_function = length_getter->as_function_group(); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); + } } -#line 4195 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4221 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 31: -#line 631 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 30: +#line 622 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *length_getter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (length_getter == (CPPDeclaration *)NULL || length_getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (length_getter == nullptr || length_getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("reference to non-existent or invalid length method: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); - length_getter = NULL; + length_getter = nullptr; } CPPDeclaration *getter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + getter = nullptr; + } + + if (getter != nullptr && length_getter != nullptr) { + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-8].u.identifier), CPPMakeProperty::T_sequence, current_scope, (yylsp[-10]).file); + make_property->_get_function = getter->as_function_group(); + make_property->_length_function = length_getter->as_function_group(); - } else { CPPDeclaration *setter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - CPPFunctionGroup *setter_func = NULL; - - if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); } else { - setter_func = setter->as_function_group(); + make_property->_set_function = setter->as_function_group(); } - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-8].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[-10]).file); - make_property->_length_function = length_getter->as_function_group(); current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-10])); } } -#line 4227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4254 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 32: -#line 659 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 31: +#line 651 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *length_getter = (yyvsp[-8].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (length_getter == (CPPDeclaration *)NULL || length_getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (length_getter == nullptr || length_getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("reference to non-existent or invalid length method: " + (yyvsp[-8].u.identifier)->get_fully_scoped_name(), (yylsp[-8])); length_getter = NULL; } CPPDeclaration *getter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); + getter = nullptr; + } + + if (getter != nullptr && length_getter != nullptr) { + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-10].u.identifier), CPPMakeProperty::T_sequence, current_scope, (yylsp[-12]).file); + make_property->_get_function = getter->as_function_group(); + make_property->_length_function = length_getter->as_function_group(); - } else { CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - CPPFunctionGroup *setter_func = NULL; - - if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } else { - setter_func = setter->as_function_group(); + make_property->_set_function = setter->as_function_group(); } CPPDeclaration *deleter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (deleter == (CPPDeclaration *)NULL || deleter->get_subtype() != CPPDeclaration::ST_function_group) { + if (deleter == nullptr || deleter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("reference to non-existent or invalid delete method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); - deleter = NULL; - } - - CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-10].u.identifier), getter->as_function_group(), - setter_func, current_scope, (yylsp[-12]).file); - make_property->_length_function = length_getter->as_function_group(); - if (deleter) { + } else { make_property->_del_function = deleter->as_function_group(); } + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); } } -#line 4268 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 33: -#line 696 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPDeclaration *hasser = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (hasser == (CPPDeclaration *)NULL || hasser->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); - } - - CPPDeclaration *getter = (yyvsp[-2].u.identifier)->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: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); - } - - if (hasser && getter) { - CPPMakeProperty *make_property; - make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), - hasser->as_function_group(), - getter->as_function_group(), - NULL, NULL, - current_scope, (yylsp[-8]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); - } -} #line 4294 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 34: -#line 718 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 32: +#line 687 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - CPPDeclaration *hasser = (yyvsp[-8].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (hasser == (CPPDeclaration *)NULL || hasser->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid has-function: " + (yyvsp[-8].u.identifier)->get_fully_scoped_name(), (yylsp[-8])); - } + CPPDeclaration *getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid item getter method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); - CPPDeclaration *getter = (yyvsp[-6].u.identifier)->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: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); - } - - CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); - } - - CPPDeclaration *clearer = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); - if (clearer == (CPPDeclaration *)NULL || clearer->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid clear-function: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); - } - - if (hasser && getter && setter && clearer) { - CPPMakeProperty *make_property; - make_property = new CPPMakeProperty((yyvsp[-10].u.identifier), - hasser->as_function_group(), - getter->as_function_group(), - setter->as_function_group(), - clearer->as_function_group(), - current_scope, (yylsp[-12]).file); - current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); + } else { + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-4].u.identifier), CPPMakeProperty::T_mapping, current_scope, (yylsp[-6]).file); + make_property->_get_function = getter->as_function_group(); + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-6])); } } -#line 4331 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4310 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 33: +#line 699 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPDeclaration *getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + + } else { + CPPMakeProperty *make_property; + make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), CPPMakeProperty::T_mapping, current_scope, (yylsp[-8]).file); + make_property->_get_function = getter->as_function_group(); + + CPPDeclaration *hasser = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (hasser == nullptr || hasser->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid has/find method: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + } else { + make_property->_has_function = hasser->as_function_group(); + } + + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); + } +} +#line 4335 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 34: +#line 720 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPDeclaration *getter = (yyvsp[-5].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-5].u.identifier)->get_fully_scoped_name(), (yylsp[-5])); + + } else { + CPPMakeProperty *make_property = new CPPMakeProperty((yyvsp[-9].u.identifier), CPPMakeProperty::T_mapping, current_scope, (yylsp[-11]).file); + make_property->_get_function = getter->as_function_group(); + + CPPDeclaration *hasser = (yyvsp[-7].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (hasser == nullptr || hasser->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid has/find method: " + (yyvsp[-7].u.identifier)->get_fully_scoped_name(), (yylsp[-7])); + } else { + make_property->_has_function = hasser->as_function_group(); + } + + CPPDeclaration *setter = (yyvsp[-3].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid setter: " + (yyvsp[-3].u.identifier)->get_fully_scoped_name(), (yylsp[-3])); + } else { + make_property->_set_function = setter->as_function_group(); + } + + if ((yyvsp[-2].u.identifier) != nullptr) { + CPPDeclaration *deleter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (deleter == nullptr || deleter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid delete method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + } else { + make_property->_del_function = deleter->as_function_group(); + } + } + + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-11])); + } +} +#line 4375 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 35: -#line 751 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 756 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPDeclaration *getter = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + + } else { + CPPMakeProperty *make_property; + make_property = new CPPMakeProperty((yyvsp[-6].u.identifier), CPPMakeProperty::T_normal, + current_scope, (yylsp[-8]).file); + make_property->_get_function = getter->as_function_group(); + + CPPDeclaration *hasser = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (hasser == nullptr || hasser->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid has/find method: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); + } else { + make_property->_has_function = hasser->as_function_group(); + } + + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-8])); + } +} +#line 4401 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 36: +#line 778 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPDeclaration *getter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid getter: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); + + } else { + CPPMakeProperty *make_property; + make_property = new CPPMakeProperty((yyvsp[-10].u.identifier), CPPMakeProperty::T_normal, + current_scope, (yylsp[-12]).file); + make_property->_get_function = getter->as_function_group(); + + CPPDeclaration *hasser = (yyvsp[-8].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (hasser == nullptr || hasser->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid has/find method: " + (yyvsp[-8].u.identifier)->get_fully_scoped_name(), (yylsp[-8])); + } else { + make_property->_has_function = hasser->as_function_group(); + } + + CPPDeclaration *setter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid setter: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); + } else { + make_property->_set_function = setter->as_function_group(); + } + + CPPDeclaration *clearer = (yyvsp[-2].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + if (clearer == nullptr || clearer->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid clear method: " + (yyvsp[-2].u.identifier)->get_fully_scoped_name(), (yylsp[-2])); + } else { + make_property->_clear_function = clearer->as_function_group(); + } + + current_scope->add_declaration(make_property, global_scope, current_lexer, (yylsp[-12])); + } +} +#line 4441 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 37: +#line 814 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *length_getter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (length_getter == (CPPDeclaration *)NULL || length_getter->get_subtype() != CPPDeclaration::ST_function_group) { @@ -4353,11 +4463,11 @@ yyreduce: current_scope->add_declaration(make_seq, global_scope, current_lexer, (yylsp[-8])); } } -#line 4357 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 36: -#line 773 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 38: +#line 836 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPExpression::Result result = (yyvsp[-4].u.expr)->evaluate(); if (result._type == CPPExpression::RT_error) { @@ -4368,11 +4478,11 @@ yyreduce: yywarning("static_assert failed: " + str.str(), (yylsp[-4])); } } -#line 4372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4482 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 37: -#line 784 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 39: +#line 847 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This alternative version of static_assert was introduced in C++17. CPPExpression::Result result = (yyvsp[-2].u.expr)->evaluate(); @@ -4382,55 +4492,55 @@ yyreduce: yywarning("static_assert failed", (yylsp[-2])); } } -#line 4386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4496 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 38: -#line 797 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 40: +#line 860 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPScope *new_scope = new CPPScope(current_scope, CPPNameComponent("temp"), V_public); push_scope(new_scope); } -#line 4396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4506 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 39: -#line 803 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 41: +#line 866 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { delete current_scope; pop_scope(); } -#line 4405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4515 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 40: -#line 812 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 42: +#line 875 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = 0; } -#line 4413 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4523 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 41: -#line 816 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 43: +#line 879 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This isn't really a storage class, but it helps with parsing. (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_const; } -#line 4422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4532 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 42: -#line 821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 44: +#line 884 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extern; } -#line 4430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4540 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 43: -#line 825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 45: +#line 888 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extern; if ((yyvsp[-1].str) == "C") { @@ -4441,124 +4551,124 @@ yyreduce: yywarning("Ignoring unknown linkage type \"" + (yyvsp[-1].str) + "\"", (yylsp[-1])); } } -#line 4445 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 44: -#line 836 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_static; -} -#line 4453 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 45: -#line 840 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_inline; -} -#line 4461 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4555 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 46: -#line 844 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 899 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_virtual; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_static; } -#line 4469 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4563 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 47: -#line 848 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 903 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_explicit; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_inline; } -#line 4477 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4571 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 48: -#line 852 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 907 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_register; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_virtual; } -#line 4485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4579 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 49: -#line 856 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 911 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_volatile; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_explicit; } -#line 4493 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4587 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 50: -#line 860 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 915 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_mutable; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_register; } -#line 4501 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4595 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 51: -#line 864 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 919 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_constexpr; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_volatile; } -#line 4509 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4603 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 52: -#line 868 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 923 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_blocking; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_mutable; } -#line 4517 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4611 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 53: -#line 872 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 927 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extension; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_constexpr; } -#line 4525 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4619 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 54: -#line 876 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 931 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_thread_local; + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_blocking; } -#line 4533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4627 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 55: -#line 880 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 935 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_extension; +} +#line 4635 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 56: +#line 939 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.integer) = (yyvsp[0].u.integer) | (int)CPPInstance::SC_thread_local; +} +#line 4643 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 57: +#line 943 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Ignore attribute specifiers for now. (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4652 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 56: -#line 885 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 58: +#line 948 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4660 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 57: -#line 889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 59: +#line 952 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = (yyvsp[0].u.integer); } -#line 4558 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4668 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 63: -#line 907 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 65: +#line 970 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We don't need to push/pop type, because we can't nest // type_like_declaration. @@ -4569,19 +4679,19 @@ yyreduce: } push_storage_class((yyvsp[-1].u.integer)); } -#line 4573 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4683 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 64: -#line 918 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 66: +#line 981 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_storage_class(); } -#line 4581 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4691 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 65: -#line 923 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 67: +#line 986 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We don't really care about the storage class here. In fact, it's // not actually legal to define a class or struct using a particular @@ -4590,11 +4700,11 @@ yyreduce: current_scope->add_declaration((yyvsp[-1].u.decl), global_scope, current_lexer, (yylsp[-1])); } -#line 4594 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4704 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 66: -#line 932 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 68: +#line 995 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[0].u.instance) != (CPPInstance *)NULL) { // Push the scope so that the initializers can make use of things defined @@ -4603,11 +4713,11 @@ yyreduce: (yyvsp[0].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-1].u.integer)); } } -#line 4607 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 67: -#line 941 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 69: +#line 1004 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-2].u.instance) != (CPPInstance *)NULL) { pop_scope(); @@ -4615,11 +4725,11 @@ yyreduce: (yyvsp[-2].u.instance)->set_initializer((yyvsp[0].u.expr)); } } -#line 4619 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4729 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 68: -#line 949 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 70: +#line 1012 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-1].u.instance) != (CPPInstance *)NULL) { (yyvsp[-1].u.instance)->_storage_class |= (current_storage_class | (yyvsp[-2].u.integer)); @@ -4627,11 +4737,11 @@ yyreduce: (yyvsp[-1].u.instance)->set_initializer((yyvsp[0].u.expr)); } } -#line 4631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4741 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 70: -#line 965 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 72: +#line 1028 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); @@ -4642,11 +4752,11 @@ yyreduce: inst->set_initializer((yyvsp[0].u.expr)); current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-1])); } -#line 4646 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4756 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 71: -#line 976 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 73: +#line 1039 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { (yyvsp[-3].u.inst_ident)->add_modifier(IIT_const); @@ -4657,11 +4767,11 @@ yyreduce: inst->set_initializer((yyvsp[-2].u.expr)); current_scope->add_declaration(inst, global_scope, current_lexer, (yylsp[-3])); } -#line 4661 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4771 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 72: -#line 991 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 74: +#line 1054 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We don't need to push/pop type, because we can't nest // multiple_var_declarations. @@ -4672,19 +4782,19 @@ yyreduce: } push_storage_class((yyvsp[-1].u.integer)); } -#line 4676 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4786 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 73: -#line 1002 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 75: +#line 1065 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_storage_class(); } -#line 4684 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4794 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 74: -#line 1006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 76: +#line 1069 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-1].u.instance) != (CPPDeclaration *)NULL) { CPPInstance *inst = (yyvsp[-1].u.instance)->as_instance(); @@ -4696,11 +4806,11 @@ yyreduce: } } } -#line 4700 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4810 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 75: -#line 1021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 77: +#line 1084 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); @@ -4709,11 +4819,11 @@ yyreduce: CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-1].u.inst_ident), current_scope, (yylsp[-1]).file); current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-1])); } -#line 4713 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4823 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 76: -#line 1030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 78: +#line 1093 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if (current_storage_class & CPPInstance::SC_const) { (yyvsp[-3].u.inst_ident)->add_modifier(IIT_const); @@ -4722,19 +4832,19 @@ yyreduce: CPPTypedefType *typedef_type = new CPPTypedefType(target_type, (yyvsp[-3].u.inst_ident), current_scope, (yylsp[-3]).file); current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-3])); } -#line 4726 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4836 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 77: -#line 1044 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 79: +#line 1107 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } -#line 4734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4844 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 78: -#line 1048 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 80: +#line 1111 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type; if ((yyvsp[-5].u.identifier)->get_simple_name() == current_scope->get_simple_name() || @@ -4754,19 +4864,19 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } -#line 4758 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4868 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 79: -#line 1068 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 81: +#line 1131 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } -#line 4766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4876 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 80: -#line 1072 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 82: +#line 1135 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); CPPType *type; @@ -4784,19 +4894,19 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } -#line 4788 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4898 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 81: -#line 1095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 83: +#line 1158 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { push_scope((yyvsp[-1].u.identifier)->get_scope(current_scope, global_scope)); } -#line 4796 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4906 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 82: -#line 1099 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 84: +#line 1162 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); if ((yyvsp[-5].u.identifier)->is_scoped()) { @@ -4815,19 +4925,19 @@ yyreduce: (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-5]).file); } } -#line 4819 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4929 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 83: -#line 1125 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 85: +#line 1188 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); } -#line 4827 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4937 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 84: -#line 1129 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 86: +#line 1192 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); CPPType *type = (yyvsp[-10].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); @@ -4841,19 +4951,19 @@ yyreduce: ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-10]).file); } -#line 4845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4955 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 85: -#line 1143 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 87: +#line 1206 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { push_scope((yyvsp[-2].u.inst_ident)->get_scope(current_scope, global_scope)); } -#line 4853 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4963 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 86: -#line 1147 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 88: +#line 1210 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); CPPType *type = (yyvsp[-11].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); @@ -4867,21 +4977,21 @@ yyreduce: ii->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer)); (yyval.u.instance) = new CPPInstance(type, ii, 0, (yylsp[-11]).file); } -#line 4871 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 87: -#line 1163 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 89: +#line 1226 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-3].u.identifier) != NULL) { push_scope((yyvsp[-3].u.identifier)->get_scope(current_scope, global_scope)); } } -#line 4881 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 4991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 88: -#line 1169 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 90: +#line 1232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-7].u.identifier) != NULL) { pop_scope(); @@ -4906,21 +5016,21 @@ yyreduce: (yyval.u.instance) = CPPInstance::make_typecast_function (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 4910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5020 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 89: -#line 1194 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 91: +#line 1257 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-4].u.identifier) != NULL) { push_scope((yyvsp[-4].u.identifier)->get_scope(current_scope, global_scope)); } } -#line 4920 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5030 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 90: -#line 1200 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 92: +#line 1263 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { if ((yyvsp[-8].u.identifier) != NULL) { pop_scope(); @@ -4936,11 +5046,11 @@ yyreduce: (yyval.u.instance) = CPPInstance::make_typecast_function (new CPPInstance((yyvsp[-6].u.type), (yyvsp[-5].u.inst_ident), 0, (yylsp[-5]).file), ident, (yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 4940 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5050 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 91: -#line 1220 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 93: +#line 1283 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *decl = (yyvsp[0].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); @@ -4950,606 +5060,606 @@ yyreduce: (yyval.u.instance) = (CPPInstance *)NULL; } } -#line 4954 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 92: -#line 1233 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = 0; -} -#line 4962 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 93: -#line 1237 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_const_method; -} -#line 4970 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5064 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 94: -#line 1241 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1296 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_volatile_method; + (yyval.u.integer) = 0; } -#line 4978 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 95: -#line 1245 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1300 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_noexcept; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_const_method; } -#line 4986 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5080 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 96: -#line 1258 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1304 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_final; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_volatile_method; } -#line 4994 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5088 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 97: -#line 1262 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1308 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_override; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_noexcept; } -#line 5002 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5096 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 98: -#line 1266 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1321 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_lvalue_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_final; } -#line 5010 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5104 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 99: -#line 1270 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1325 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_rvalue_method; + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_override; } -#line 5018 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 100: -#line 1274 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1329 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_lvalue_method; +} +#line 5120 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 101: +#line 1333 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.integer) = (yyvsp[-1].u.integer) | (int)CPPFunctionType::F_rvalue_method; +} +#line 5128 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 102: +#line 1337 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Used for lambdas, currently ignored. (yyval.u.integer) = (yyvsp[-1].u.integer); } -#line 5027 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5137 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 101: -#line 1279 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 103: +#line 1342 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Used for lambdas in C++17, currently ignored. (yyval.u.integer) = (yyvsp[-1].u.integer); } -#line 5036 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 102: -#line 1284 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-3].u.integer); -} -#line 5044 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 103: -#line 1288 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-4].u.integer); -} -#line 5052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 104: -#line 1292 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.integer) = (yyvsp[-5].u.integer); -} -#line 5060 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 105: -#line 1296 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1347 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.integer) = (yyvsp[-3].u.integer); } -#line 5068 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 105: +#line 1351 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.integer) = (yyvsp[-4].u.integer); +} +#line 5162 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 106: -#line 1303 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1355 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "!"; + (yyval.u.integer) = (yyvsp[-5].u.integer); } -#line 5076 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5170 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 107: -#line 1307 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1359 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "~"; + (yyval.u.integer) = (yyvsp[-3].u.integer); } -#line 5084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5178 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 108: -#line 1311 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1366 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "*"; + (yyval.str) = "!"; } -#line 5092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5186 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 109: -#line 1315 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "/"; + (yyval.str) = "~"; } -#line 5100 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5194 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 110: -#line 1319 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1374 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "%"; + (yyval.str) = "*"; } -#line 5108 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5202 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 111: -#line 1323 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1378 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "+"; + (yyval.str) = "/"; } -#line 5116 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5210 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 112: -#line 1327 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1382 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "-"; + (yyval.str) = "%"; } -#line 5124 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5218 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 113: -#line 1331 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1386 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "|"; + (yyval.str) = "+"; } -#line 5132 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5226 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 114: -#line 1335 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1390 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "&"; + (yyval.str) = "-"; } -#line 5140 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5234 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 115: -#line 1339 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1394 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "^"; + (yyval.str) = "|"; } -#line 5148 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 116: -#line 1343 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1398 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "||"; + (yyval.str) = "&"; } -#line 5156 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5250 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 117: -#line 1347 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1402 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "&&"; + (yyval.str) = "^"; } -#line 5164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5258 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 118: -#line 1351 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1406 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "=="; + (yyval.str) = "||"; } -#line 5172 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5266 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 119: -#line 1355 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1410 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "!="; + (yyval.str) = "&&"; } -#line 5180 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5274 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 120: -#line 1359 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1414 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "<="; + (yyval.str) = "=="; } -#line 5188 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5282 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 121: -#line 1363 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1418 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ">="; + (yyval.str) = "!="; } -#line 5196 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5290 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 122: -#line 1367 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1422 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "<"; + (yyval.str) = "<="; } -#line 5204 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5298 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 123: -#line 1371 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1426 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ">"; + (yyval.str) = ">="; } -#line 5212 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5306 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 124: -#line 1375 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1430 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "<<"; + (yyval.str) = "<"; } -#line 5220 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5314 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 125: -#line 1379 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1434 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ">>"; + (yyval.str) = ">"; } -#line 5228 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5322 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 126: -#line 1383 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1438 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "="; + (yyval.str) = "<<"; } -#line 5236 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5330 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 127: -#line 1387 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1442 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ","; + (yyval.str) = ">>"; } -#line 5244 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5338 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 128: -#line 1391 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1446 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "++"; + (yyval.str) = "="; } -#line 5252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5346 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 129: -#line 1395 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1450 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "--"; + (yyval.str) = ","; } -#line 5260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5354 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 130: -#line 1399 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1454 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "*="; + (yyval.str) = "++"; } -#line 5268 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5362 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 131: -#line 1403 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1458 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "/="; + (yyval.str) = "--"; } -#line 5276 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5370 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 132: -#line 1407 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1462 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "%="; + (yyval.str) = "*="; } -#line 5284 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 133: -#line 1411 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1466 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "+="; + (yyval.str) = "/="; } -#line 5292 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 134: -#line 1415 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1470 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "-="; + (yyval.str) = "%="; } -#line 5300 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5394 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 135: -#line 1419 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1474 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "|="; + (yyval.str) = "+="; } -#line 5308 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5402 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 136: -#line 1423 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1478 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "&="; + (yyval.str) = "-="; } -#line 5316 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5410 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 137: -#line 1427 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1482 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "^="; + (yyval.str) = "|="; } -#line 5324 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5418 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 138: -#line 1431 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1486 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "<<="; + (yyval.str) = "&="; } -#line 5332 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5426 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 139: -#line 1435 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1490 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = ">>="; + (yyval.str) = "^="; } -#line 5340 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5434 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 140: -#line 1439 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1494 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "->"; + (yyval.str) = "<<="; } -#line 5348 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5442 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 141: -#line 1443 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1498 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "[]"; + (yyval.str) = ">>="; } -#line 5356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 142: -#line 1447 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1502 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "()"; + (yyval.str) = "->"; } -#line 5364 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5458 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 143: -#line 1451 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.str) = "new"; + (yyval.str) = "[]"; } -#line 5372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5466 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 144: -#line 1455 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1510 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.str) = "()"; +} +#line 5474 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 145: +#line 1514 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.str) = "new"; +} +#line 5482 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 146: +#line 1518 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.str) = "delete"; } -#line 5380 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5490 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 149: -#line 1469 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 151: +#line 1532 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { push_scope(new CPPTemplateScope(current_scope)); } -#line 5388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5498 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 150: -#line 1473 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 152: +#line 1536 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); } -#line 5396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5506 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 155: -#line 1487 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 157: +#line 1550 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPTemplateScope *ts = current_scope->as_template_scope(); assert(ts != NULL); ts->add_template_parameter((yyvsp[0].u.decl)); } -#line 5406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 156: -#line 1493 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 158: +#line 1556 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPTemplateScope *ts = current_scope->as_template_scope(); assert(ts != NULL); ts->add_template_parameter((yyvsp[0].u.decl)); } -#line 5416 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 159: -#line 1507 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); -} -#line 5424 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 160: -#line 1511 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[0].u.identifier))); -} -#line 5432 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5526 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 161: -#line 1515 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1570 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[-2].u.identifier), (yyvsp[0].u.type))); + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((CPPIdentifier *)NULL)); } -#line 5440 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5534 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 162: -#line 1519 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1574 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[0].u.identifier))); +} +#line 5542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 163: +#line 1578 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type(new CPPClassTemplateParameter((yyvsp[-2].u.identifier), (yyvsp[0].u.type))); +} +#line 5550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 164: +#line 1582 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((CPPIdentifier *)NULL); ctp->_packed = true; (yyval.u.decl) = CPPType::new_type(ctp); } -#line 5450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5560 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 163: -#line 1525 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 165: +#line 1588 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[0].u.identifier)); ctp->_packed = true; (yyval.u.decl) = CPPType::new_type(ctp); } -#line 5460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5570 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 164: -#line 1531 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 166: +#line 1594 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPInstance *inst = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); inst->set_initializer((yyvsp[0].u.expr)); (yyval.u.decl) = inst; } -#line 5470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5580 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 165: -#line 1537 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 167: +#line 1600 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); CPPInstance *inst = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); inst->set_initializer((yyvsp[0].u.expr)); (yyval.u.decl) = inst; } -#line 5481 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5591 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 166: -#line 1544 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 168: +#line 1607 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); (yyval.u.decl) = inst; } -#line 5490 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5600 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 167: -#line 1549 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 169: +#line 1612 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); CPPInstance *inst = new CPPInstance((yyvsp[-1].u.type), (yyvsp[0].u.inst_ident), 0, (yylsp[0]).file); (yyval.u.decl) = inst; } -#line 5500 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5610 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 168: -#line 1558 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 170: +#line 1621 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 5508 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5618 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 169: -#line 1562 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 171: +#line 1625 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { yywarning("Not a type: " + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } -#line 5517 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 170: -#line 1567 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - } - assert((yyval.u.type) != NULL); -} -#line 5529 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 171: -#line 1575 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); - if ((yyval.u.type) == NULL) { - yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); - } - assert((yyval.u.type) != NULL); -} -#line 5541 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5627 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 172: -#line 1587 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1630 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + } + assert((yyval.u.type) != NULL); } -#line 5549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 173: -#line 1591 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1638 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); + if ((yyval.u.type) == NULL) { + yyerror(string("internal error resolving type ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[0])); + } + assert((yyval.u.type) != NULL); +} +#line 5651 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 174: +#line 1650 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); +} +#line 5659 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 175: +#line 1654 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // For an operator function. We implement this simply by building a // ficticious name for the function; in other respects it's just @@ -5563,11 +5673,11 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } -#line 5567 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5677 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 174: -#line 1605 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 176: +#line 1668 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A C++11 literal operator. if (!(yyvsp[-1].str).empty()) { @@ -5582,83 +5692,83 @@ yyreduce: (yyval.u.inst_ident) = new CPPInstanceIdentifier(ident); } -#line 5586 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5696 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 175: -#line 1620 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 177: +#line 1683 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 5595 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5705 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 176: -#line 1625 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 178: +#line 1688 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 5604 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5714 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 177: -#line 1630 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 179: +#line 1693 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 5613 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5723 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 178: -#line 1635 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 180: +#line 1698 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 5622 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5732 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 179: -#line 1640 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 181: +#line 1703 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 5631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5741 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 180: -#line 1645 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 182: +#line 1708 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 5640 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5750 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 181: -#line 1650 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 183: +#line 1713 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 5649 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5759 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 182: -#line 1655 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 184: +#line 1718 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 5658 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5768 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 183: -#line 1660 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 185: +#line 1723 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Create a scope for this function (in case it is a function) CPPScope *scope = new CPPScope((yyvsp[-1].u.inst_ident)->get_scope(current_scope, global_scope), @@ -5671,11 +5781,11 @@ yyreduce: push_scope(scope); } -#line 5675 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5785 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 184: -#line 1673 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 186: +#line 1736 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); @@ -5689,11 +5799,11 @@ yyreduce: (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } } -#line 5693 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5803 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 185: -#line 1691 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 187: +#line 1754 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This is handled a bit awkwardly right now. Ideally it'd be wrapped // up in the instance_identifier rule, but then more needs to happen in @@ -5703,894 +5813,910 @@ yyreduce: } (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); } -#line 5707 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5817 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 186: -#line 1701 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 188: +#line 1764 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Bitfield definition. (yyvsp[-2].u.inst_ident)->_bit_width = (yyvsp[0].u.integer); (yyval.u.inst_ident) = (yyvsp[-2].u.inst_ident); } -#line 5717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 187: -#line 1711 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = NULL; -} -#line 5725 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 188: -#line 1715 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); -} -#line 5733 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5827 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 189: -#line 1719 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1774 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = NULL; +} +#line 5835 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 190: +#line 1778 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); +} +#line 5843 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 191: +#line 1782 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 5742 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 190: -#line 1728 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; -} -#line 5750 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 191: -#line 1732 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_includes_ellipsis = true; -} -#line 5759 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5852 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 192: -#line 1737 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1791 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[0].u.param_list); + (yyval.u.identifier) = NULL; } -#line 5767 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5860 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 193: -#line 1741 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1795 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 5776 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5868 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 194: -#line 1746 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1803 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.param_list) = (yyvsp[-1].u.param_list); - (yyval.u.param_list)->_includes_ellipsis = true; + (yyval.u.param_list) = new CPPParameterList; } -#line 5785 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5876 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 195: -#line 1754 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1807 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); + (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5794 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5885 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 196: -#line 1759 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); -} -#line 5803 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 197: -#line 1767 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; -} -#line 5811 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 198: -#line 1771 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = new CPPParameterList; - (yyval.u.param_list)->_includes_ellipsis = true; -} -#line 5820 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 199: -#line 1776 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1812 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = (yyvsp[0].u.param_list); } -#line 5828 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5893 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 200: -#line 1780 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 197: +#line 1816 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = (yyvsp[-2].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5837 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5902 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 201: -#line 1785 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 198: +#line 1821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = (yyvsp[-1].u.param_list); (yyval.u.param_list)->_includes_ellipsis = true; } -#line 5846 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5911 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 202: -#line 1793 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 199: +#line 1829 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.param_list) = new CPPParameterList; (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 203: -#line 1798 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.param_list) = (yyvsp[-2].u.param_list); - (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); -} -#line 5864 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 204: -#line 1806 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 5872 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 205: -#line 1810 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 5880 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 206: -#line 1817 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 5888 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 207: -#line 1821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 5896 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 208: -#line 1828 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 5904 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 209: -#line 1832 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 5912 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 210: -#line 1836 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} #line 5920 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 211: -#line 1840 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 200: +#line 1834 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); } -#line 5928 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 5929 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 201: +#line 1842 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = new CPPParameterList; +} +#line 5937 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 202: +#line 1846 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_includes_ellipsis = true; +} +#line 5946 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 203: +#line 1851 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = (yyvsp[0].u.param_list); +} +#line 5954 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 204: +#line 1855 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; +} +#line 5963 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 205: +#line 1860 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = (yyvsp[-1].u.param_list); + (yyval.u.param_list)->_includes_ellipsis = true; +} +#line 5972 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 206: +#line 1868 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = new CPPParameterList; + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); +} +#line 5981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 207: +#line 1873 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.param_list) = (yyvsp[-2].u.param_list); + (yyval.u.param_list)->_parameters.push_back((yyvsp[0].u.instance)); +} +#line 5990 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 208: +#line 1881 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (CPPExpression *)NULL; +} +#line 5998 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 209: +#line 1885 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 6006 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 210: +#line 1892 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (CPPExpression *)NULL; +} +#line 6014 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 211: +#line 1896 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 6022 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 212: -#line 1844 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1903 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5936 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6030 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 213: -#line 1851 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1907 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5944 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6038 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 214: -#line 1855 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1911 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5952 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6046 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 215: -#line 1859 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[-1].u.expr); -} -#line 5960 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 216: -#line 1863 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1915 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); } -#line 5968 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6054 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 217: -#line 1867 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 216: +#line 1919 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); } -#line 5976 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6062 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 218: -#line 1871 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 217: +#line 1926 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5984 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6070 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 218: +#line 1930 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (CPPExpression *)NULL; +} +#line 6078 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 219: +#line 1934 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[-1].u.expr); +} +#line 6086 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 220: +#line 1938 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_default()); +} +#line 6094 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 221: +#line 1942 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_delete()); +} +#line 6102 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 222: -#line 1884 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1946 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 5991 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6110 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 226: -#line 1893 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1959 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6000 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 227: -#line 1898 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); -} -#line 6010 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 228: -#line 1904 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); -} -#line 6020 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 229: -#line 1910 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); - (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); -} -#line 6029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6117 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 230: -#line 1915 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1968 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); +} +#line 6126 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 231: +#line 1973 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6039 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6136 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 231: -#line 1921 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 232: +#line 1979 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6049 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 232: -#line 1927 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.instance) = (yyvsp[0].u.instance); -} -#line 6057 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6146 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 233: -#line 1931 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1985 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = (yyvsp[0].u.instance); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6065 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6155 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 234: -#line 1942 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1990 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.instance) = (yyvsp[0].u.instance); + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-1]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6073 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6165 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 235: -#line 1946 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 1996 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyvsp[-1].u.inst_ident)->add_modifier(IIT_const); + (yyval.u.instance) = new CPPInstance((yyvsp[-2].u.type), (yyvsp[-1].u.inst_ident), 0, (yylsp[-2]).file); + (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); +} +#line 6175 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 236: +#line 2002 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.instance) = (yyvsp[0].u.instance); +} +#line 6183 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 237: +#line 2006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.instance) = (yyvsp[0].u.instance); +} +#line 6191 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 238: +#line 2017 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.instance) = (yyvsp[0].u.instance); +} +#line 6199 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 239: +#line 2021 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_parameter)); (yyval.u.instance) = new CPPInstance(type, "expr"); (yyval.u.instance)->set_initializer((yyvsp[0].u.expr)); } -#line 6084 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 236: -#line 1956 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); -} -#line 6092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 237: -#line 1960 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); -} -#line 6100 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 238: -#line 1964 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); -} -#line 6109 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 239: -#line 1969 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); -} -#line 6118 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6210 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 240: -#line 1974 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2031 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); } -#line 6127 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6218 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 241: -#line 1979 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); -} -#line 6136 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 242: -#line 1984 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); -} -#line 6145 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 243: -#line 1989 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); -} -#line 6154 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 244: -#line 1994 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); -} -#line 6163 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 245: -#line 2002 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); -} -#line 6171 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 246: -#line 2006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); } -#line 6179 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6226 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 247: -#line 2010 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 242: +#line 2039 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6188 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6235 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 248: -#line 2015 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 243: +#line 2044 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6197 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6244 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 249: -#line 2020 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 244: +#line 2049 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6206 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6253 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 250: -#line 2025 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 245: +#line 2054 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6215 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6262 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 251: -#line 2030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 246: +#line 2059 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6224 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 252: -#line 2035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 247: +#line 2064 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6233 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6280 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 253: -#line 2040 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 248: +#line 2069 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6242 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6289 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 254: -#line 2045 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); - (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); -} -#line 6252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 255: -#line 2051 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_paren); -} -#line 6261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 256: -#line 2059 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 249: +#line 2077 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; -} -#line 6270 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 257: -#line 2064 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); - (yyval.u.inst_ident)->_packed = true; -} -#line 6279 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 258: -#line 2069 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); -} -#line 6288 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 259: -#line 2074 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); } #line 6297 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 260: -#line 2079 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 250: +#line 2081 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); +} +#line 6305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 251: +#line 2085 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); +} +#line 6314 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 252: +#line 2090 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); +} +#line 6323 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 253: +#line 2095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6306 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6332 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 261: -#line 2084 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 254: +#line 2100 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6315 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6341 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 262: -#line 2089 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 255: +#line 2105 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6324 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6350 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 263: -#line 2094 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 256: +#line 2110 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6333 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6359 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 264: -#line 2099 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 257: +#line 2115 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6342 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6368 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 265: -#line 2104 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 258: +#line 2120 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); } -#line 6352 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 266: -#line 2110 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 259: +#line 2126 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_paren); } -#line 6361 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 267: -#line 2118 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); -} -#line 6369 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 268: -#line 2122 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; -} -#line 6378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 269: -#line 2127 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); - (yyval.u.inst_ident)->_packed = true; -} #line 6387 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 270: -#line 2132 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 260: +#line 2134 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_const); + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; } #line 6396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 271: -#line 2137 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_volatile); -} -#line 6405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 272: -#line 2142 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_pointer); -} -#line 6414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 273: -#line 2147 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_reference); -} -#line 6423 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 274: -#line 2152 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); -} -#line 6432 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 275: -#line 2157 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); - (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); -} -#line 6441 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 276: -#line 2162 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); - (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); -} -#line 6450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 277: -#line 2170 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); -} -#line 6458 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 278: -#line 2174 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); - (yyval.u.inst_ident)->_packed = true; -} -#line 6467 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 279: -#line 2179 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 261: +#line 2139 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); (yyval.u.inst_ident)->_packed = true; } -#line 6476 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 280: -#line 2184 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 262: +#line 2144 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_const); } -#line 6485 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 281: -#line 2189 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 263: +#line 2149 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_volatile); } -#line 6494 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6423 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 282: -#line 2194 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 264: +#line 2154 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); } -#line 6503 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6432 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 283: -#line 2199 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 265: +#line 2159 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); } -#line 6512 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6441 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 284: -#line 2204 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 266: +#line 2164 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); } -#line 6521 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6450 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 285: -#line 2209 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 267: +#line 2169 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); } -#line 6530 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6459 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 286: -#line 2214 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 268: +#line 2174 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); } -#line 6539 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 269: +#line 2179 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-5].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); + (yyval.u.inst_ident)->add_func_modifier((yyvsp[-2].u.param_list), (yyvsp[0].u.integer)); +} +#line 6478 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 270: +#line 2185 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-1].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_paren); +} +#line 6487 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 271: +#line 2193 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); +} +#line 6495 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 272: +#line 2197 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; +} +#line 6504 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 273: +#line 2202 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident)->_packed = true; +} +#line 6513 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 274: +#line 2207 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); +} +#line 6522 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 275: +#line 2212 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); +} +#line 6531 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 276: +#line 2217 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); +} +#line 6540 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 277: +#line 2222 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); +} +#line 6549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 278: +#line 2227 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); +} +#line 6558 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 279: +#line 2232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); +} +#line 6567 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 280: +#line 2237 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); +} +#line 6576 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 281: +#line 2245 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); +} +#line 6584 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 282: +#line 2249 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); + (yyval.u.inst_ident)->_packed = true; +} +#line 6593 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 283: +#line 2254 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = new CPPInstanceIdentifier((yyvsp[0].u.identifier)); + (yyval.u.inst_ident)->_packed = true; +} +#line 6602 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 284: +#line 2259 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_const); +} +#line 6611 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 285: +#line 2264 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_volatile); +} +#line 6620 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 286: +#line 2269 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_pointer); +} +#line 6629 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 287: -#line 2219 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2274 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_reference); +} +#line 6638 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 288: +#line 2279 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); +} +#line 6647 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 289: +#line 2284 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[0].u.inst_ident); + (yyval.u.inst_ident)->add_scoped_pointer_modifier((yyvsp[-2].u.identifier)); +} +#line 6656 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 290: +#line 2289 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.inst_ident) = (yyvsp[-3].u.inst_ident); + (yyval.u.inst_ident)->add_array_modifier((yyvsp[-1].u.expr)); +} +#line 6665 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 291: +#line 2294 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = new CPPInstanceIdentifier((CPPIdentifier *)NULL); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6549 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6675 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 288: -#line 2225 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 292: +#line 2300 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_pointer); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6560 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6686 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 289: -#line 2232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 293: +#line 2307 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_reference); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6571 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6697 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 290: -#line 2239 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 294: +#line 2314 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.inst_ident) = (yyvsp[-6].u.inst_ident); (yyval.u.inst_ident)->add_modifier(IIT_rvalue_reference); (yyval.u.inst_ident)->add_modifier(IIT_paren); (yyval.u.inst_ident)->add_func_modifier((yyvsp[-3].u.param_list), (yyvsp[-1].u.integer), (yyvsp[0].u.type)); } -#line 6582 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6708 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 291: -#line 2249 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 295: +#line 2324 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 6590 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6716 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 292: -#line 2253 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 296: +#line 2328 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.type) == NULL) { @@ -6598,43 +6724,43 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6602 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 293: -#line 2261 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); -} -#line 6610 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 294: -#line 2265 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); -} -#line 6618 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 295: -#line 2269 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); -} -#line 6626 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 296: -#line 2273 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.enum_type)); -} -#line 6634 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6728 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 297: -#line 2277 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2336 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); +} +#line 6736 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 298: +#line 2340 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); +} +#line 6744 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 299: +#line 2344 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.struct_type)); +} +#line 6752 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 300: +#line 2348 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.enum_type)); +} +#line 6760 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 301: +#line 2352 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6650,11 +6776,11 @@ yyreduce: (yyval.u.type) = et; } } -#line 6654 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6780 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 298: -#line 2293 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 302: +#line 2368 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[-2].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6670,11 +6796,11 @@ yyreduce: (yyval.u.type) = et; } } -#line 6674 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6800 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 299: -#line 2309 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 303: +#line 2384 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[-1].u.expr)->determine_type(); if ((yyval.u.type) == (CPPType *)NULL) { @@ -6683,19 +6809,19 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6687 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6813 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 300: -#line 2318 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 304: +#line 2393 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6695 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6821 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 301: -#line 2322 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 305: +#line 2397 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { @@ -6705,19 +6831,19 @@ yyreduce: (yyval.u.type) = enum_type->get_underlying_type(); } } -#line 6709 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6835 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 302: -#line 2332 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 306: +#line 2407 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6717 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6843 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 303: -#line 2339 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 307: +#line 2414 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.type) == NULL) { @@ -6725,19 +6851,19 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6729 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 304: -#line 2350 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 308: +#line 2425 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 6737 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 305: -#line 2354 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 309: +#line 2429 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.decl) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.decl) == NULL) { @@ -6745,43 +6871,43 @@ yyreduce: } assert((yyval.u.decl) != NULL); } -#line 6749 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 306: -#line 2362 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); -} -#line 6757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 307: -#line 2366 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.struct_type)); -} -#line 6765 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 308: -#line 2370 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.struct_type))); -} -#line 6773 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 309: -#line 2374 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.enum_type))); -} -#line 6781 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6875 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 310: -#line 2378 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2437 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); +} +#line 6883 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 311: +#line 2441 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = CPPType::new_type((yyvsp[0].u.struct_type)); +} +#line 6891 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 312: +#line 2445 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.struct_type))); +} +#line 6899 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 313: +#line 2449 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.decl) = new CPPTypeDeclaration(CPPType::new_type((yyvsp[0].u.enum_type))); +} +#line 6907 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 314: +#line 2453 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6797,11 +6923,11 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6801 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6927 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 311: -#line 2394 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 315: +#line 2469 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[-2].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6817,11 +6943,11 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6821 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6947 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 312: -#line 2410 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 316: +#line 2485 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { yywarning(string("C++ does not permit forward declaration of untyped enum ") + (yyvsp[0].u.identifier)->get_fully_scoped_name(), (yylsp[-1])); @@ -6839,11 +6965,11 @@ yyreduce: (yyval.u.decl) = et; } } -#line 6843 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6969 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 313: -#line 2428 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 317: +#line 2503 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.decl) = (yyvsp[-1].u.expr)->determine_type(); if ((yyval.u.decl) == (CPPType *)NULL) { @@ -6852,19 +6978,19 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6856 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6982 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 314: -#line 2437 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 318: +#line 2512 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6864 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 6990 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 315: -#line 2441 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 319: +#line 2516 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { @@ -6874,27 +7000,27 @@ yyreduce: (yyval.u.decl) = enum_type->get_underlying_type(); } } -#line 6878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7004 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 316: -#line 2451 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 320: +#line 2526 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6886 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7012 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 317: -#line 2458 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 321: +#line 2533 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); } -#line 6894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7020 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 318: -#line 2462 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 322: +#line 2537 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if ((yyval.u.type) == NULL) { @@ -6902,19 +7028,19 @@ yyreduce: } assert((yyval.u.type) != NULL); } -#line 6906 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7032 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 319: -#line 2470 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 323: +#line 2545 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } -#line 6914 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7040 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 320: -#line 2474 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 324: +#line 2549 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6930,11 +7056,11 @@ yyreduce: (yyval.u.type) = et; } } -#line 6934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7060 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 321: -#line 2490 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 325: +#line 2565 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); if (type != NULL) { @@ -6950,11 +7076,11 @@ yyreduce: (yyval.u.type) = et; } } -#line 6954 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7080 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 322: -#line 2506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 326: +#line 2581 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[-1].u.expr)->determine_type(); if ((yyval.u.type) == (CPPType *)NULL) { @@ -6963,11 +7089,11 @@ yyreduce: yyerror("could not determine type of " + str.str(), (yylsp[-1])); } } -#line 6967 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7093 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 323: -#line 2515 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 327: +#line 2590 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPEnumType *enum_type = (yyvsp[-1].u.type)->as_enum_type(); if (enum_type == NULL) { @@ -6977,71 +7103,71 @@ yyreduce: (yyval.u.type) = enum_type->get_underlying_type(); } } -#line 6981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7107 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 324: -#line 2525 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 328: +#line 2600 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_auto)); } -#line 6989 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7115 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 325: -#line 2532 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 329: +#line 2607 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.decl) = (yyvsp[0].u.decl); } -#line 6997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 326: -#line 2536 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 330: +#line 2611 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { yyerror(string("unknown type '") + (yyvsp[0].u.identifier)->get_fully_scoped_name() + "'", (yylsp[0])); (yyval.u.decl) = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_unknown)); } -#line 7007 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7133 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 327: -#line 2544 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 331: +#line 2619 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7015 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7141 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 328: -#line 2548 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 332: +#line 2623 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7024 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7150 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 329: -#line 2553 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 333: +#line 2628 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7032 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7158 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 330: -#line 2557 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 334: +#line 2632 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[0].u.inst_ident)->add_modifier(IIT_const); (yyval.u.type) = (yyvsp[0].u.inst_ident)->unroll_type((yyvsp[-1].u.type)); } -#line 7041 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7167 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 335: -#line 2572 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 339: +#line 2647 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPVisibility starting_vis = ((yyvsp[-2].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; @@ -7055,22 +7181,22 @@ yyreduce: push_scope(new_scope); push_struct(st); } -#line 7059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7185 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 336: -#line 2586 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 340: +#line 2661 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.struct_type) = current_struct; current_struct->_incomplete = false; pop_struct(); pop_scope(); } -#line 7070 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7196 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 337: -#line 2596 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 341: +#line 2671 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPVisibility starting_vis = ((yyvsp[-2].u.extension_enum) == CPPExtensionType::T_class) ? V_private : V_public; @@ -7090,253 +7216,253 @@ yyreduce: push_scope(new_scope); push_struct(st); } -#line 7094 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7220 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 338: -#line 2616 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 342: +#line 2691 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.struct_type) = current_struct; current_struct->_incomplete = false; pop_struct(); pop_scope(); } -#line 7105 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7231 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 340: -#line 2627 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 344: +#line 2702 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_struct->_final = true; } -#line 7113 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 345: -#line 2644 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_unknown, false); -} -#line 7121 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 346: -#line 2648 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_public, false); -} -#line 7129 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 347: -#line 2652 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_protected, false); -} -#line 7137 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 348: -#line 2656 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_private, false); -} -#line 7145 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7239 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 349: -#line 2660 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2719 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_public, true); + current_struct->append_derivation((yyvsp[0].u.type), V_unknown, false); } -#line 7153 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7247 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 350: -#line 2664 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2723 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); + current_struct->append_derivation((yyvsp[0].u.type), V_public, false); } -#line 7161 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7255 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 351: -#line 2668 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2727 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_private, true); + current_struct->append_derivation((yyvsp[0].u.type), V_protected, false); } -#line 7169 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7263 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 352: -#line 2672 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2731 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_public, true); + current_struct->append_derivation((yyvsp[0].u.type), V_private, false); } -#line 7177 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 353: -#line 2676 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2735 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); -} -#line 7185 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 354: -#line 2680 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_struct->append_derivation((yyvsp[0].u.type), V_private, true); -} -#line 7193 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 355: -#line 2687 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.enum_type) = current_enum; - current_enum = NULL; -} -#line 7202 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 356: -#line 2695 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_enum = new CPPEnumType((yyvsp[-2].u.extension_enum), NULL, (yyvsp[0].u.type), current_scope, NULL, (yylsp[-2]).file); -} -#line 7210 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 357: -#line 2699 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - current_enum = new CPPEnumType((yyvsp[0].u.extension_enum), NULL, current_scope, NULL, (yylsp[0]).file); -} -#line 7218 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 358: -#line 2703 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[-2].u.identifier)->_names.back(), V_public); - current_enum = new CPPEnumType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), (yyvsp[0].u.type), current_scope, new_scope, (yylsp[-3]).file); -} -#line 7227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 359: -#line 2708 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[0].u.identifier)->_names.back(), V_public); - current_enum = new CPPEnumType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, new_scope, (yylsp[-1]).file); -} -#line 7236 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 360: -#line 2716 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); -} -#line 7244 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 361: -#line 2720 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); -} -#line 7252 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 363: -#line 2728 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[-1].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[-1])); -} -#line 7261 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 364: -#line 2733 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[-3].u.identifier)->get_simple_name(), (yyvsp[-1].u.expr), current_lexer, (yylsp[-3])); -} -#line 7270 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 366: -#line 2741 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[0].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[0])); + current_struct->append_derivation((yyvsp[0].u.type), V_public, true); } #line 7279 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 367: -#line 2746 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 354: +#line 2739 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - assert(current_enum != NULL); - current_enum->add_element((yyvsp[-2].u.identifier)->get_simple_name(), (yyvsp[0].u.expr), current_lexer, (yylsp[-2])); + current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); } -#line 7288 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7287 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 368: -#line 2754 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 355: +#line 2743 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_enum; + current_struct->append_derivation((yyvsp[0].u.type), V_private, true); } -#line 7296 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7295 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 369: -#line 2758 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 356: +#line 2747 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; + current_struct->append_derivation((yyvsp[0].u.type), V_public, true); } -#line 7304 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7303 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 370: + case 357: +#line 2751 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_struct->append_derivation((yyvsp[0].u.type), V_protected, true); +} +#line 7311 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 358: +#line 2755 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_struct->append_derivation((yyvsp[0].u.type), V_private, true); +} +#line 7319 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 359: #line 2762 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; -} -#line 7312 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 371: -#line 2769 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.extension_enum) = CPPExtensionType::T_class; -} -#line 7320 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 372: -#line 2773 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.extension_enum) = CPPExtensionType::T_struct; + (yyval.u.enum_type) = current_enum; + current_enum = NULL; } #line 7328 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 373: -#line 2777 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 360: +#line 2770 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.extension_enum) = CPPExtensionType::T_union; + current_enum = new CPPEnumType((yyvsp[-2].u.extension_enum), NULL, (yyvsp[0].u.type), current_scope, NULL, (yylsp[-2]).file); } #line 7336 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; + case 361: +#line 2774 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + current_enum = new CPPEnumType((yyvsp[0].u.extension_enum), NULL, current_scope, NULL, (yylsp[0]).file); +} +#line 7344 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 362: +#line 2778 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[-2].u.identifier)->_names.back(), V_public); + current_enum = new CPPEnumType((yyvsp[-3].u.extension_enum), (yyvsp[-2].u.identifier), (yyvsp[0].u.type), current_scope, new_scope, (yylsp[-3]).file); +} +#line 7353 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 363: +#line 2783 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + CPPScope *new_scope = new CPPScope(current_scope, (yyvsp[0].u.identifier)->_names.back(), V_public); + current_enum = new CPPEnumType((yyvsp[-1].u.extension_enum), (yyvsp[0].u.identifier), current_scope, new_scope, (yylsp[-1]).file); +} +#line 7362 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 364: +#line 2791 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = CPPType::new_type((yyvsp[0].u.simple_type)); +} +#line 7370 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 365: +#line 2795 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.type) = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); +} +#line 7378 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 367: +#line 2803 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + assert(current_enum != NULL); + current_enum->add_element((yyvsp[-1].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[-1])); +} +#line 7387 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 368: +#line 2808 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + assert(current_enum != NULL); + current_enum->add_element((yyvsp[-3].u.identifier)->get_simple_name(), (yyvsp[-1].u.expr), current_lexer, (yylsp[-3])); +} +#line 7396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 370: +#line 2816 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + assert(current_enum != NULL); + current_enum->add_element((yyvsp[0].u.identifier)->get_simple_name(), NULL, current_lexer, (yylsp[0])); +} +#line 7405 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 371: +#line 2821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + assert(current_enum != NULL); + current_enum->add_element((yyvsp[-2].u.identifier)->get_simple_name(), (yyvsp[0].u.expr), current_lexer, (yylsp[-2])); +} +#line 7414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 372: +#line 2829 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.extension_enum) = CPPExtensionType::T_enum; +} +#line 7422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 373: +#line 2833 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.extension_enum) = CPPExtensionType::T_enum_class; +} +#line 7430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + case 374: -#line 2784 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2837 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.extension_enum) = CPPExtensionType::T_enum_struct; +} +#line 7438 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 375: +#line 2844 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.extension_enum) = CPPExtensionType::T_class; +} +#line 7446 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 376: +#line 2848 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.extension_enum) = CPPExtensionType::T_struct; +} +#line 7454 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 377: +#line 2852 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.extension_enum) = CPPExtensionType::T_union; +} +#line 7462 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 378: +#line 2859 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPScope *scope = (yyvsp[-1].u.identifier)->find_scope(current_scope, global_scope, current_lexer); if (scope == NULL) { @@ -7354,19 +7480,19 @@ yyreduce: current_scope->define_namespace(nspace); push_scope(scope); } -#line 7358 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7484 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 375: -#line 2802 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 379: +#line 2877 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); } -#line 7366 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7492 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 376: -#line 2806 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 380: +#line 2881 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPScope *scope = (yyvsp[-1].u.identifier)->find_scope(current_scope, global_scope, current_lexer); if (scope == NULL) { @@ -7385,143 +7511,143 @@ yyreduce: current_scope->define_namespace(nspace); push_scope(scope); } -#line 7389 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7515 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 377: -#line 2825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 381: +#line 2900 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { pop_scope(); } -#line 7397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7523 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 380: -#line 2834 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 384: +#line 2909 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPUsing *using_decl = new CPPUsing((yyvsp[-1].u.identifier), false, (yylsp[-2]).file); current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-2])); current_scope->add_using(using_decl, global_scope, current_lexer); } -#line 7407 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7533 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 381: -#line 2840 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 385: +#line 2915 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This is really just an alternative way to declare a typedef. CPPTypedefType *typedef_type = new CPPTypedefType((yyvsp[-1].u.type), (yyvsp[-3].u.identifier), current_scope); typedef_type->_using = true; current_scope->add_declaration(CPPType::new_type(typedef_type), global_scope, current_lexer, (yylsp[-4])); } -#line 7418 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7544 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 382: -#line 2847 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 386: +#line 2922 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPUsing *using_decl = new CPPUsing((yyvsp[-1].u.identifier), true, (yylsp[-3]).file); current_scope->add_declaration(using_decl, global_scope, current_lexer, (yylsp[-3])); current_scope->add_using(using_decl, global_scope, current_lexer); } -#line 7428 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 386: -#line 2862 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); -} -#line 7436 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 387: -#line 2866 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); -} -#line 7444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 388: -#line 2870 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); -} -#line 7452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 389: -#line 2874 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); -} -#line 7460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7554 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 390: -#line 2878 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2937 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char32_t); + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_bool); } -#line 7468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7562 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 391: -#line 2882 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 2941 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char); +} +#line 7570 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 392: +#line 2945 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_wchar_t); +} +#line 7578 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 393: +#line 2949 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char16_t); +} +#line 7586 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 394: +#line 2953 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_char32_t); +} +#line 7594 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 395: +#line 2957 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short); } -#line 7477 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7603 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 392: -#line 2887 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 396: +#line 2962 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long); } -#line 7486 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7612 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 393: -#line 2892 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 397: +#line 2967 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned); } -#line 7495 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7621 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 394: -#line 2897 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 398: +#line 2972 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed); } -#line 7504 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7630 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 395: -#line 2902 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 399: +#line 2977 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_int); } -#line 7512 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7638 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 396: -#line 2906 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 400: +#line 2981 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_short; } -#line 7521 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7647 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 397: -#line 2911 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 401: +#line 2986 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = (yyvsp[0].u.simple_type); if ((yyval.u.simple_type)->_flags & CPPSimpleType::F_long) { @@ -7530,189 +7656,189 @@ yyreduce: (yyval.u.simple_type)->_flags |= CPPSimpleType::F_long; } } -#line 7534 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7660 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 398: -#line 2920 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 402: +#line 2995 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_unsigned; } -#line 7543 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7669 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 399: -#line 2925 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 403: +#line 3000 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = (yyvsp[0].u.simple_type); (yyval.u.simple_type)->_flags |= CPPSimpleType::F_signed; } -#line 7552 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7678 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 400: -#line 2933 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 404: +#line 3008 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_float); } -#line 7560 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7686 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 401: -#line 2937 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 405: +#line 3012 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double); } -#line 7568 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7694 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 402: -#line 2941 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 406: +#line 3016 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_double, CPPSimpleType::F_long); } -#line 7577 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 403: -#line 2949 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 407: +#line 3024 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.simple_type) = new CPPSimpleType(CPPSimpleType::T_void); } -#line 7585 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7711 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 404: -#line 2958 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 408: +#line 3033 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_lexer->_resolve_identifiers = false; } -#line 7593 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7719 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 405: -#line 2962 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 409: +#line 3037 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { current_lexer->_resolve_identifiers = true; } -#line 7601 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7727 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 513: -#line 3006 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 517: +#line 3081 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { } -#line 7608 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 537: -#line 3015 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 7616 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 538: -#line 3019 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 7624 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 539: -#line 3026 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (CPPExpression *)NULL; -} -#line 7632 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 540: -#line 3030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = (yyvsp[0].u.expr); -} -#line 7640 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7734 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 541: -#line 3037 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3090 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = (CPPExpression *)NULL; } -#line 7648 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7742 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 542: -#line 3041 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(',', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); -} -#line 7656 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 543: -#line 3048 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3094 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7664 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7750 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 543: +#line 3101 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (CPPExpression *)NULL; +} +#line 7758 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 544: -#line 3052 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3105 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7672 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7766 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 545: -#line 3056 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3112 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7680 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7774 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 546: -#line 3060 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3116 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = new CPPExpression(',', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7688 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7782 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 547: -#line 3064 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3123 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 7696 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7790 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 548: -#line 3068 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3127 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 7704 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7798 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 549: -#line 3072 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3131 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } -#line 7712 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7806 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 550: -#line 3076 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3135 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); +} +#line 7814 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 551: +#line 3139 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); +} +#line 7822 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 552: +#line 3143 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); +} +#line 7830 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 553: +#line 3147 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); +} +#line 7838 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 554: +#line 3151 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (arg == (CPPDeclaration *)NULL) { @@ -7724,307 +7850,307 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 7728 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 551: -#line 3088 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 7736 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 552: -#line 3092 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); -} -#line 7744 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 553: -#line 3096 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); -} -#line 7752 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 554: -#line 3100 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); -} -#line 7760 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7854 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 555: -#line 3104 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3163 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); } -#line 7768 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7862 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 556: -#line 3108 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3167 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); } -#line 7776 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7870 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 557: -#line 3112 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3171 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 7784 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 558: -#line 3116 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3175 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 7792 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7886 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 559: -#line 3120 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3179 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 7800 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7894 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 560: -#line 3124 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3183 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 7808 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7902 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 561: -#line 3128 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3187 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); } -#line 7816 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7910 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 562: -#line 3132 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3191 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 7824 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7918 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 563: -#line 3136 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3195 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7832 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7926 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 564: -#line 3140 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3199 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7840 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7934 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 565: -#line 3144 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3203 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7848 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7942 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 566: -#line 3148 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3207 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7856 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7950 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 567: -#line 3152 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3211 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7864 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7958 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 568: -#line 3156 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3215 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7872 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7966 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 569: -#line 3160 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3219 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7880 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7974 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 570: -#line 3164 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3223 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7888 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7982 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 571: -#line 3168 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3227 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7896 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7990 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 572: -#line 3172 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3231 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7904 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 7998 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 573: -#line 3176 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3235 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7912 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8006 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 574: -#line 3180 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3239 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7920 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8014 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 575: -#line 3184 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3243 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7928 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8022 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 576: -#line 3188 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3247 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7936 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8030 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 577: -#line 3192 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3251 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7944 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8038 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 578: -#line 3196 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3255 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7952 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8046 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 579: -#line 3200 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3259 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7960 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8054 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 580: -#line 3204 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3263 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 7968 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8062 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 581: -#line 3208 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3267 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 7976 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8070 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 582: -#line 3216 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3271 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 7984 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8078 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 583: -#line 3220 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3275 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 7992 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8086 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 584: -#line 3224 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3279 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8000 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8094 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 585: -#line 3228 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3283 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 8008 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8102 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 586: -#line 3232 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3291 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 8016 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8110 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 587: -#line 3236 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3295 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 8024 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8118 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 588: -#line 3240 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3299 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); +} +#line 8126 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 589: +#line 3303 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); +} +#line 8134 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 590: +#line 3307 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); +} +#line 8142 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 591: +#line 3311 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); +} +#line 8150 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 592: +#line 3315 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A constructor call. CPPType *type = (yyvsp[-3].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); @@ -8034,11 +8160,11 @@ yyreduce: assert(type != NULL); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8038 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8164 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 589: -#line 3250 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 593: +#line 3325 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // Aggregate initialization. CPPType *type = (yyvsp[-3].u.identifier)->find_type(current_scope, global_scope, false, current_lexer); @@ -8048,143 +8174,143 @@ yyreduce: assert(type != NULL); (yyval.u.expr) = new CPPExpression(CPPExpression::aggregate_init_op(type, (yyvsp[-1].u.expr))); } -#line 8052 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8178 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 590: -#line 3260 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 594: +#line 3335 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8062 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8188 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 591: -#line 3266 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 595: +#line 3341 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8072 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8198 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 592: -#line 3272 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 596: +#line 3347 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_wchar_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8082 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8208 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 593: -#line 3278 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 597: +#line 3353 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char16_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8092 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8218 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 594: -#line 3284 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 598: +#line 3359 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_char32_t)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8102 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8228 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 595: -#line 3290 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 599: +#line 3365 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_bool)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8112 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8238 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 596: -#line 3296 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 600: +#line 3371 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_short)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8249 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 597: -#line 3303 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 601: +#line 3378 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_long)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8134 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 598: -#line 3310 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 602: +#line 3385 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_unsigned)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8145 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 599: -#line 3317 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 603: +#line 3392 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_int, CPPSimpleType::F_signed)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8156 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8282 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 600: -#line 3324 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 604: +#line 3399 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_float)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8166 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8292 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 601: -#line 3330 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 605: +#line 3405 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = CPPType::new_type(new CPPSimpleType(CPPSimpleType::T_double)); (yyval.u.expr) = new CPPExpression(CPPExpression::construct_op(type, (yyvsp[-1].u.expr))); } -#line 8176 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8302 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 602: -#line 3336 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 606: +#line 3411 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); } -#line 8184 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8310 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 603: -#line 3340 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 607: +#line 3415 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (arg == (CPPDeclaration *)NULL) { @@ -8196,43 +8322,43 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 8200 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 604: -#line 3352 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 8208 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 605: -#line 3356 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); -} -#line 8216 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 606: -#line 3360 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); -} -#line 8224 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 607: -#line 3364 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); -} -#line 8232 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8326 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 608: -#line 3368 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3427 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); +} +#line 8334 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 609: +#line 3431 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); +} +#line 8342 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 610: +#line 3435 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); +} +#line 8350 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 611: +#line 3439 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); +} +#line 8358 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 612: +#line 3443 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); @@ -8243,11 +8369,11 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); } -#line 8247 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8373 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 609: -#line 3379 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 613: +#line 3454 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); @@ -8258,564 +8384,564 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); } -#line 8262 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 610: -#line 3390 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); -} -#line 8270 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 611: -#line 3394 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); -} -#line 8278 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 612: -#line 3398 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); -} -#line 8286 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 613: -#line 3402 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); -} -#line 8294 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 614: -#line 3406 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3465 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 8302 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8396 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 615: -#line 3410 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3469 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 8310 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8404 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 616: -#line 3414 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3473 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 8318 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8412 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 617: -#line 3418 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3477 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 8326 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8420 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 618: -#line 3422 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3481 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_STAR, (yyvsp[0].u.expr)); } -#line 8334 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8428 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 619: -#line 3426 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3485 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 8342 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8436 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 620: -#line 3430 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3489 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8350 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 621: -#line 3434 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3493 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8358 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8452 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 622: -#line 3438 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3497 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8366 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8460 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 623: -#line 3442 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3501 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8374 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8468 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 624: -#line 3446 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3505 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8382 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8476 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 625: -#line 3450 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3509 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8390 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8484 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 626: -#line 3454 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3513 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8398 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8492 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 627: -#line 3458 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3517 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8500 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 628: -#line 3462 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3521 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8508 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 629: -#line 3466 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3525 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8516 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 630: -#line 3470 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3529 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8524 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 631: -#line 3474 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3533 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8438 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8532 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 632: -#line 3478 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3537 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8446 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8540 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 633: -#line 3482 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3541 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8454 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8548 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 634: -#line 3486 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3545 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8462 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8556 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 635: -#line 3490 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3549 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8564 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 636: -#line 3494 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3553 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8478 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8572 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 637: -#line 3498 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3557 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8486 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8580 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 638: -#line 3502 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3561 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8494 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8588 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 639: -#line 3506 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3565 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 8502 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8596 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 640: -#line 3510 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3569 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 8510 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8604 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 641: -#line 3517 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3573 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 8518 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8612 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 642: -#line 3521 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3577 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(true); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8526 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8620 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 643: -#line 3525 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3581 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(false); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8534 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8628 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 644: -#line 3529 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3585 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 8542 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8636 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 645: -#line 3533 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3592 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 8550 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8644 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 646: -#line 3537 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3596 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression(true); } -#line 8558 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8652 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 647: -#line 3541 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3600 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression(false); } -#line 8566 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8660 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 648: -#line 3545 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3604 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 8574 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8668 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 649: -#line 3549 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3608 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); +} +#line 8676 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 650: +#line 3612 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 8684 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 651: +#line 3616 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 8692 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 652: +#line 3620 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); +} +#line 8700 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 653: +#line 3624 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "final". C++11 explicitly permits this. CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8584 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8710 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 650: -#line 3555 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 654: +#line 3630 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "override". C++11 explicitly permits this. CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 8594 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8720 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 651: -#line 3561 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 655: +#line 3636 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); } -#line 8602 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8728 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 652: -#line 3565 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 656: +#line 3640 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-6].u.closure_type)->_flags = (yyvsp[-4].u.integer); (yyvsp[-6].u.closure_type)->_return_type = (yyvsp[-3].u.type); (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[-6].u.closure_type))); } -#line 8612 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8738 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 653: -#line 3571 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 657: +#line 3646 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyvsp[-9].u.closure_type)->_parameters = (yyvsp[-6].u.param_list); (yyvsp[-9].u.closure_type)->_flags = (yyvsp[-4].u.integer); (yyvsp[-9].u.closure_type)->_return_type = (yyvsp[-3].u.type); (yyval.u.expr) = new CPPExpression(CPPExpression::lambda((yyvsp[-9].u.closure_type))); } -#line 8623 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 654: -#line 3578 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[-1].u.type))); -} -#line 8631 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 655: -#line 3582 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[-1].u.type))); -} -#line 8639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 656: -#line 3586 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); -} -#line 8647 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 657: -#line 3590 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-1].u.type))); -} -#line 8655 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8749 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 658: -#line 3594 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3653 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_HAS_VIRTUAL_DESTRUCTOR, (yyvsp[-1].u.type))); } -#line 8663 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8757 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 659: -#line 3598 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3657 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ABSTRACT, (yyvsp[-1].u.type))); } -#line 8671 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8765 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 660: -#line 3602 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3661 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8679 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8773 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 661: -#line 3606 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3665 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CLASS, (yyvsp[-1].u.type))); } -#line 8687 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8781 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 662: -#line 3610 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3669 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-1].u.type))); } -#line 8695 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8789 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 663: -#line 3614 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3673 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONSTRUCTIBLE, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8703 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8797 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 664: -#line 3618 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3677 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_CONVERTIBLE_TO, (yyvsp[-3].u.type), (yyvsp[-1].u.type))); } -#line 8711 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8805 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 665: -#line 3622 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3681 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_DESTRUCTIBLE, (yyvsp[-1].u.type))); } -#line 8719 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8813 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 666: -#line 3626 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3685 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_EMPTY, (yyvsp[-1].u.type))); } -#line 8727 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8821 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 667: -#line 3630 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3689 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_ENUM, (yyvsp[-1].u.type))); } -#line 8735 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8829 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 668: -#line 3634 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3693 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FINAL, (yyvsp[-1].u.type))); } -#line 8743 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8837 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 669: -#line 3638 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3697 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_FUNDAMENTAL, (yyvsp[-1].u.type))); } -#line 8751 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8845 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 670: -#line 3642 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3701 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POD, (yyvsp[-1].u.type))); } -#line 8759 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8853 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 671: -#line 3656 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3705 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_POLYMORPHIC, (yyvsp[-1].u.type))); } -#line 8767 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8861 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 672: -#line 3660 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3709 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_STANDARD_LAYOUT, (yyvsp[-1].u.type))); } -#line 8775 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8869 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 673: -#line 3664 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3713 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_TRIVIAL, (yyvsp[-1].u.type))); } -#line 8783 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8877 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 674: -#line 3668 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3717 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::type_trait(KW_IS_UNION, (yyvsp[-1].u.type))); } -#line 8791 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8885 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 675: -#line 3672 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3731 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); + (yyval.u.expr) = (yyvsp[0].u.expr); } -#line 8799 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8893 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 676: -#line 3676 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3735 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-2].u.type), (yyvsp[0].u.expr))); } -#line 8807 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8901 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 677: -#line 3680 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3739 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_static_cast)); } -#line 8815 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8909 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 678: -#line 3684 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3743 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_dynamic_cast)); +} +#line 8917 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 679: +#line 3747 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_const_cast)); +} +#line 8925 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 680: +#line 3751 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::typecast_op((yyvsp[-4].u.type), (yyvsp[-1].u.expr), CPPExpression::T_reinterpret_cast)); +} +#line 8933 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 681: +#line 3755 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func((yyvsp[-1].u.type))); +} +#line 8941 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 682: +#line 3759 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPDeclaration *arg = (yyvsp[-1].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (arg == (CPPDeclaration *)NULL) { @@ -8827,43 +8953,43 @@ yyreduce: (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_func(arg->as_type())); } } -#line 8831 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 679: -#line 3696 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); -} -#line 8839 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 680: -#line 3700 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); -} -#line 8847 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 681: -#line 3704 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); -} -#line 8855 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 682: -#line 3708 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); -} -#line 8863 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 8957 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 683: -#line 3712 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3771 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::sizeof_ellipsis_func((yyvsp[-1].u.identifier))); +} +#line 8965 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 684: +#line 3775 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::alignof_func((yyvsp[-1].u.type))); +} +#line 8973 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 685: +#line 3779 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[0].u.type))); +} +#line 8981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 686: +#line 3783 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::new_op((yyvsp[-3].u.type), (yyvsp[-1].u.expr))); +} +#line 8989 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 687: +#line 3787 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); @@ -8874,11 +9000,11 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.type), std_type_info)); } -#line 8878 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9004 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 684: -#line 3723 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 688: +#line 3798 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPIdentifier ident(""); ident.add_name("std"); @@ -8889,409 +9015,409 @@ yyreduce: } (yyval.u.expr) = new CPPExpression(CPPExpression::typeid_op((yyvsp[-1].u.expr), std_type_info)); } -#line 8893 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 685: -#line 3734 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); -} -#line 8901 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 686: -#line 3738 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); -} -#line 8909 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 687: -#line 3742 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); -} -#line 8917 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 688: -#line 3746 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); -} -#line 8925 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9019 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 689: -#line 3750 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3809 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NOT, (yyvsp[0].u.expr)); } -#line 8933 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9027 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 690: -#line 3754 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3813 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_NEGATE, (yyvsp[0].u.expr)); } -#line 8941 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9035 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 691: -#line 3758 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3817 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_MINUS, (yyvsp[0].u.expr)); } -#line 8949 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9043 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 692: -#line 3762 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3821 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_PLUS, (yyvsp[0].u.expr)); } -#line 8957 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9051 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 693: -#line 3766 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3825 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(UNARY_REF, (yyvsp[0].u.expr)); } -#line 8965 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9059 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 694: -#line 3770 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3829 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('*', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8973 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9067 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 695: -#line 3774 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3833 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('/', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8981 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9075 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 696: -#line 3778 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3837 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('%', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8989 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9083 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 697: -#line 3782 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3841 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('+', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 8997 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9091 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 698: -#line 3786 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3845 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('-', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9005 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9099 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 699: -#line 3790 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3849 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('|', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9013 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9107 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 700: -#line 3794 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3853 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('^', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9021 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9115 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 701: -#line 3798 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3857 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('&', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9029 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9123 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 702: -#line 3802 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3861 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(OROR, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9037 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9131 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 703: -#line 3806 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3865 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(ANDAND, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9045 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9139 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 704: -#line 3810 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3869 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(EQCOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9053 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9147 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 705: -#line 3814 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3873 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(NECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9061 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9155 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 706: -#line 3818 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3877 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(LECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9069 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9163 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 707: -#line 3822 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3881 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression(GECOMPARE, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9077 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9171 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 708: -#line 3826 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3885 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('<', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9085 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9179 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 709: -#line 3830 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression('>', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9093 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9187 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 710: -#line 3834 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3893 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); + (yyval.u.expr) = new CPPExpression(LSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9101 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9195 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 711: -#line 3838 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3897 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); + (yyval.u.expr) = new CPPExpression(RSHIFT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9109 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9203 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 712: -#line 3842 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3901 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('?', (yyvsp[-4].u.expr), (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9117 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9211 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 713: -#line 3846 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3905 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); + (yyval.u.expr) = new CPPExpression('[', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 9125 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9219 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 714: -#line 3850 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3909 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[-1].u.expr); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-3].u.expr), (yyvsp[-1].u.expr)); } -#line 9133 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9227 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 715: -#line 3857 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3913 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = new CPPExpression('f', (yyvsp[-2].u.expr)); } -#line 9141 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9235 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 716: -#line 3861 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3917 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(true); + (yyval.u.expr) = new CPPExpression('.', (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9149 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9243 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 717: -#line 3865 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3921 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression(false); + (yyval.u.expr) = new CPPExpression(POINTSAT, (yyvsp[-2].u.expr), (yyvsp[0].u.expr)); } -#line 9157 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9251 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 718: -#line 3869 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3925 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); + (yyval.u.expr) = (yyvsp[-1].u.expr); } -#line 9165 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9259 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 719: -#line 3873 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3932 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 9173 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9267 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 720: -#line 3877 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3936 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression(true); } -#line 9181 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9275 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 721: -#line 3881 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3940 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.expr) = new CPPExpression(false); } -#line 9189 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9283 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 722: -#line 3885 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3944 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.integer)); } -#line 9197 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9291 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 723: -#line 3889 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3948 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.real)); +} +#line 9299 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 724: +#line 3952 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 9307 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 725: +#line 3956 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 9315 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 726: +#line 3960 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].u.identifier), current_scope, global_scope, current_lexer); +} +#line 9323 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 727: +#line 3964 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "final". C++11 explicitly permits this. CPPIdentifier *ident = new CPPIdentifier("final", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 9207 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9333 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 724: -#line 3895 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 728: +#line 3970 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // A variable named "override". C++11 explicitly permits this. CPPIdentifier *ident = new CPPIdentifier("override", (yylsp[0])); (yyval.u.expr) = new CPPExpression(ident, current_scope, global_scope, current_lexer); } -#line 9217 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 725: -#line 3901 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); -} -#line 9225 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 726: -#line 3909 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.closure_type) = new CPPClosureType(); -} -#line 9233 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 727: -#line 3913 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_value); -} -#line 9241 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 728: -#line 3917 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_reference); -} -#line 9249 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9343 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 729: -#line 3921 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 3976 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression(CPPExpression::get_nullptr()); +} +#line 9351 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 730: +#line 3984 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.closure_type) = new CPPClosureType(); +} +#line 9359 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 731: +#line 3988 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_value); +} +#line 9367 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 732: +#line 3992 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.closure_type) = new CPPClosureType(CPPClosureType::CT_by_reference); +} +#line 9375 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 733: +#line 3996 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.closure_type) = new CPPClosureType(); (yyvsp[-1].u.capture)->_initializer = (yyvsp[0].u.expr); (yyval.u.closure_type)->_captures.push_back(*(yyvsp[-1].u.capture)); delete (yyvsp[-1].u.capture); } -#line 9260 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9386 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 730: -#line 3928 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 734: +#line 4003 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.closure_type) = (yyvsp[-3].u.closure_type); (yyvsp[-1].u.capture)->_initializer = (yyvsp[0].u.expr); (yyval.u.closure_type)->_captures.push_back(*(yyvsp[-1].u.capture)); delete (yyvsp[-1].u.capture); } -#line 9271 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9397 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 731: -#line 3938 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 735: +#line 4013 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } -#line 9281 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9407 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 732: -#line 3944 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 736: +#line 4019 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; (yyval.u.capture)->_name = (yyvsp[-1].u.identifier)->get_simple_name(); (yyval.u.capture)->_type = CPPClosureType::CT_by_reference; } -#line 9291 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9417 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 733: -#line 3950 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 737: +#line 4025 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); @@ -9301,11 +9427,11 @@ yyreduce: (yyval.u.capture)->_type = CPPClosureType::CT_by_value; } } -#line 9305 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9431 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 734: -#line 3960 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 738: +#line 4035 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.capture) = new CPPClosureType::Capture; (yyval.u.capture)->_name = (yyvsp[0].u.identifier)->get_simple_name(); @@ -9314,11 +9440,11 @@ yyreduce: yywarning("only capture name 'this' may be preceded by an asterisk", (yylsp[0])); } } -#line 9318 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9444 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 735: -#line 3972 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 739: +#line 4047 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPType *type = (yyvsp[0].u.identifier)->find_type(current_scope, global_scope, true); if (type == NULL) { @@ -9326,177 +9452,177 @@ yyreduce: } (yyval.u.type) = type; } -#line 9330 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9456 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 736: -#line 3980 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 740: +#line 4055 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { (yyval.u.type) = CPPType::new_type(new CPPTBDType((yyvsp[0].u.identifier))); } -#line 9338 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9464 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 737: -#line 3984 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 741: +#line 4059 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { CPPClassTemplateParameter *ctp = new CPPClassTemplateParameter((yyvsp[-1].u.identifier)); ctp->_packed = true; (yyval.u.type) = CPPType::new_type(ctp); } -#line 9348 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 738: -#line 4014 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = (yyvsp[0].u.identifier); -} -#line 9356 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 739: -#line 4018 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = (yyvsp[0].u.identifier); -} -#line 9364 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 740: -#line 4022 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = (yyvsp[0].u.identifier); -} -#line 9372 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 741: -#line 4026 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[0])); -} -#line 9380 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9474 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 742: -#line 4030 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4089 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9388 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9482 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 743: -#line 4034 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4093 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.identifier) = (yyvsp[0].u.identifier); +} +#line 9490 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 744: +#line 4097 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.identifier) = (yyvsp[0].u.identifier); +} +#line 9498 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 745: +#line 4101 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.identifier) = new CPPIdentifier("final", (yylsp[0])); +} +#line 9506 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 746: +#line 4105 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); +} +#line 9514 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 747: +#line 4109 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // This is not a keyword in Python, so it is useful to be able to use this // in MAKE_PROPERTY definitions, etc. (yyval.u.identifier) = new CPPIdentifier("signed", (yylsp[0])); } -#line 9398 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 744: -#line 4040 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[0])); -} -#line 9406 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 745: -#line 4044 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[0])); -} -#line 9414 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 746: -#line 4048 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[0])); -} -#line 9422 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ - break; - - case 747: -#line 4052 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ - { - (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[0])); -} -#line 9430 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9524 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 748: -#line 4056 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4115 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("default", (yylsp[0])); + (yyval.u.identifier) = new CPPIdentifier("float", (yylsp[0])); } -#line 9438 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9532 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 749: -#line 4067 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4119 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.identifier) = new CPPIdentifier("public", (yylsp[0])); } -#line 9446 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9540 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 750: -#line 4071 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4123 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.identifier) = new CPPIdentifier("private", (yylsp[0])); } -#line 9454 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9548 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 751: -#line 4075 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4127 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = (yyvsp[0].u.identifier); + (yyval.u.identifier) = new CPPIdentifier("static", (yylsp[0])); } -#line 9462 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9556 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 752: -#line 4079 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4131 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); + (yyval.u.identifier) = new CPPIdentifier("default", (yylsp[0])); } -#line 9470 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9564 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 753: -#line 4087 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4142 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = new CPPExpression((yyvsp[0].str)); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9478 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9572 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 754: -#line 4091 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4146 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { - (yyval.u.expr) = (yyvsp[0].u.expr); + (yyval.u.identifier) = (yyvsp[0].u.identifier); } -#line 9486 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9580 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; case 755: -#line 4095 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ +#line 4150 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.identifier) = (yyvsp[0].u.identifier); +} +#line 9588 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 756: +#line 4154 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.identifier) = new CPPIdentifier("override", (yylsp[0])); +} +#line 9596 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 757: +#line 4162 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = new CPPExpression((yyvsp[0].str)); +} +#line 9604 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 758: +#line 4166 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + { + (yyval.u.expr) = (yyvsp[0].u.expr); +} +#line 9612 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ + break; + + case 759: +#line 4170 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // The right string takes on the literal type of the left. (yyval.u.expr) = (yyvsp[-1].u.expr); (yyval.u.expr)->_str += (yyvsp[0].str); } -#line 9496 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9622 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; - case 756: -#line 4101 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ + case 760: +#line 4176 "dtool/src/cppparser/cppBison.yxx" /* yacc.c:1646 */ { // We have to check that the two literal types match up. (yyval.u.expr) = (yyvsp[-1].u.expr); @@ -9505,11 +9631,11 @@ yyreduce: } (yyval.u.expr)->_str += (yyvsp[0].u.expr)->_str; } -#line 9509 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9635 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ break; -#line 9513 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ +#line 9639 "built/tmp/cppBison.yxx.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 5c834d5851..00e5c87397 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -397,6 +397,7 @@ pop_struct() { %type class_derivation_name %type enum_element_type %type maybe_trailing_return_type +%type maybe_comma_identifier /*%type typedefname*/ %type name %type name_no_final @@ -548,202 +549,264 @@ declaration: { current_scope->set_current_vis(V_private); } - | KW_MAKE_PROPERTY '(' name ',' 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); - } - - CPPMakeProperty *make_property = new CPPMakeProperty($3, getter->as_function_group(), NULL, current_scope, @1.file); - current_scope->add_declaration(make_property, global_scope, current_lexer, @1); -} - | KW_MAKE_PROPERTY '(' name ',' IDENTIFIER ',' IDENTIFIER ')' ';' + | KW_MAKE_PROPERTY '(' name ',' IDENTIFIER maybe_comma_identifier ')' ';' { CPPDeclaration *getter = $5->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || 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; + CPPMakeProperty *make_property = new CPPMakeProperty($3, CPPMakeProperty::T_normal, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); - 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(); + if ($6 != nullptr) { + CPPDeclaration *setter = $6->find_symbol(current_scope, global_scope, current_lexer); + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid setter: " + $6->get_fully_scoped_name(), @6); + } else { + make_property->_set_function = setter->as_function_group(); + } } - CPPMakeProperty *make_property = new CPPMakeProperty($3, getter->as_function_group(), - setter_func, current_scope, @1.file); 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) { + if (getter == nullptr || 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; + CPPMakeProperty *make_property = new CPPMakeProperty($3, CPPMakeProperty::T_normal, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); - if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) { + CPPDeclaration *setter = $7->find_symbol(current_scope, global_scope, current_lexer); + if (setter == nullptr || 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(); + make_property->_set_function = 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) { + if (deleter == nullptr || 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) { + } else { 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) { + if (length_getter == nullptr || 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; + length_getter = nullptr; } CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7); + getter = nullptr; } - 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); + if (getter != nullptr && length_getter != nullptr) { + CPPMakeProperty *make_property = new CPPMakeProperty($3, CPPMakeProperty::T_sequence, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); + 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) { + if (length_getter == nullptr || 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; + length_getter = nullptr; } CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7); + getter = nullptr; + } + + if (getter != nullptr && length_getter != nullptr) { + CPPMakeProperty *make_property = new CPPMakeProperty($3, CPPMakeProperty::T_sequence, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); + make_property->_length_function = length_getter->as_function_group(); - } 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) { + if (setter == nullptr || 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(); + make_property->_set_function = 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) { + if (length_getter == nullptr || 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) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7); + getter = nullptr; + } + + if (getter != nullptr && length_getter != nullptr) { + CPPMakeProperty *make_property = new CPPMakeProperty($3, CPPMakeProperty::T_sequence, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); + make_property->_length_function = length_getter->as_function_group(); - } 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) { + if (setter == nullptr || 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(); + make_property->_set_function = 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) { + if (deleter == nullptr || 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) { + } else { make_property->_del_function = deleter->as_function_group(); } + + current_scope->add_declaration(make_property, global_scope, current_lexer, @1); + } +} + | KW_MAKE_MAP_PROPERTY '(' name ',' IDENTIFIER ')' ';' +{ + CPPDeclaration *getter = $5->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid item getter method: " + $5->get_fully_scoped_name(), @5); + + } else { + CPPMakeProperty *make_property = new CPPMakeProperty($3, CPPMakeProperty::T_mapping, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); + current_scope->add_declaration(make_property, global_scope, current_lexer, @1); + } +} + | KW_MAKE_MAP_PROPERTY '(' name ',' IDENTIFIER ',' IDENTIFIER ')' ';' +{ + CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7); + + } else { + CPPMakeProperty *make_property; + make_property = new CPPMakeProperty($3, CPPMakeProperty::T_mapping, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); + + CPPDeclaration *hasser = $5->find_symbol(current_scope, global_scope, current_lexer); + if (hasser == nullptr || hasser->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid has/find method: " + $5->get_fully_scoped_name(), @5); + } else { + make_property->_has_function = hasser->as_function_group(); + } + + current_scope->add_declaration(make_property, global_scope, current_lexer, @1); + } +} + | KW_MAKE_MAP_PROPERTY '(' name ',' IDENTIFIER ',' IDENTIFIER ',' IDENTIFIER maybe_comma_identifier ')' ';' +{ + CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer); + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7); + + } else { + CPPMakeProperty *make_property = new CPPMakeProperty($3, CPPMakeProperty::T_mapping, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); + + CPPDeclaration *hasser = $5->find_symbol(current_scope, global_scope, current_lexer); + if (hasser == nullptr || hasser->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid has/find method: " + $5->get_fully_scoped_name(), @5); + } else { + make_property->_has_function = hasser->as_function_group(); + } + + CPPDeclaration *setter = $9->find_symbol(current_scope, global_scope, current_lexer); + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("Reference to non-existent or invalid setter: " + $9->get_fully_scoped_name(), @9); + } else { + make_property->_set_function = setter->as_function_group(); + } + + if ($10 != nullptr) { + CPPDeclaration *deleter = $10->find_symbol(current_scope, global_scope, current_lexer); + if (deleter == nullptr || deleter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid delete method: " + $10->get_fully_scoped_name(), @10); + } else { + 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 ')' ';' { - CPPDeclaration *hasser = $5->find_symbol(current_scope, global_scope, current_lexer); - if (hasser == (CPPDeclaration *)NULL || hasser->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid has-function: " + $5->get_fully_scoped_name(), @5); - } - CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7); - } - if (hasser && getter) { + } else { CPPMakeProperty *make_property; - make_property = new CPPMakeProperty($3, - hasser->as_function_group(), - getter->as_function_group(), - NULL, NULL, + make_property = new CPPMakeProperty($3, CPPMakeProperty::T_normal, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); + + CPPDeclaration *hasser = $5->find_symbol(current_scope, global_scope, current_lexer); + if (hasser == nullptr || hasser->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid has/find method: " + $5->get_fully_scoped_name(), @5); + } else { + make_property->_has_function = hasser->as_function_group(); + } + current_scope->add_declaration(make_property, global_scope, current_lexer, @1); } } | KW_MAKE_PROPERTY2 '(' name ',' IDENTIFIER ',' IDENTIFIER ',' IDENTIFIER ',' IDENTIFIER ')' ';' { - CPPDeclaration *hasser = $5->find_symbol(current_scope, global_scope, current_lexer); - if (hasser == (CPPDeclaration *)NULL || hasser->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid has-function: " + $5->get_fully_scoped_name(), @5); - } - CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer); - if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) { + if (getter == nullptr || getter->get_subtype() != CPPDeclaration::ST_function_group) { yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7); - } - CPPDeclaration *setter = $9->find_symbol(current_scope, global_scope, current_lexer); - 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); - } - - CPPDeclaration *clearer = $11->find_symbol(current_scope, global_scope, current_lexer); - if (clearer == (CPPDeclaration *)NULL || clearer->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("Reference to non-existent or invalid clear-function: " + $11->get_fully_scoped_name(), @11); - } - - if (hasser && getter && setter && clearer) { + } else { CPPMakeProperty *make_property; - make_property = new CPPMakeProperty($3, - hasser->as_function_group(), - getter->as_function_group(), - setter->as_function_group(), - clearer->as_function_group(), + make_property = new CPPMakeProperty($3, CPPMakeProperty::T_normal, current_scope, @1.file); + make_property->_get_function = getter->as_function_group(); + + CPPDeclaration *hasser = $5->find_symbol(current_scope, global_scope, current_lexer); + if (hasser == nullptr || hasser->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid has/find method: " + $5->get_fully_scoped_name(), @5); + } else { + make_property->_has_function = hasser->as_function_group(); + } + + CPPDeclaration *setter = $7->find_symbol(current_scope, global_scope, current_lexer); + if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid setter: " + $7->get_fully_scoped_name(), @7); + } else { + make_property->_set_function = setter->as_function_group(); + } + + CPPDeclaration *clearer = $11->find_symbol(current_scope, global_scope, current_lexer); + if (clearer == nullptr || clearer->get_subtype() != CPPDeclaration::ST_function_group) { + yyerror("reference to non-existent or invalid clear method: " + $11->get_fully_scoped_name(), @11); + } else { + make_property->_clear_function = clearer->as_function_group(); + } + current_scope->add_declaration(make_property, global_scope, current_lexer, @1); } } @@ -1723,6 +1786,18 @@ maybe_trailing_return_type: ; +maybe_comma_identifier: + empty +{ + $$ = NULL; +} + | ',' IDENTIFIER +{ + $$ = $2; +} + ; + + function_parameter_list: empty { diff --git a/dtool/src/cppparser/cppMakeProperty.cxx b/dtool/src/cppparser/cppMakeProperty.cxx index c65fcf93b6..745ae8a745 100644 --- a/dtool/src/cppparser/cppMakeProperty.cxx +++ b/dtool/src/cppparser/cppMakeProperty.cxx @@ -18,37 +18,17 @@ * */ CPPMakeProperty:: -CPPMakeProperty(CPPIdentifier *ident, - CPPFunctionGroup *getter, CPPFunctionGroup *setter, +CPPMakeProperty(CPPIdentifier *ident, Type type, CPPScope *current_scope, const CPPFile &file) : CPPDeclaration(file), _ident(ident), - _length_function(NULL), - _has_function(NULL), - _get_function(getter), - _set_function(setter), - _clear_function(NULL), - _del_function(NULL) -{ - _ident->_native_scope = current_scope; -} - -/** - * - */ -CPPMakeProperty:: -CPPMakeProperty(CPPIdentifier *ident, - CPPFunctionGroup *hasser, CPPFunctionGroup *getter, - CPPFunctionGroup *setter, CPPFunctionGroup *clearer, - CPPScope *current_scope, const CPPFile &file) : - CPPDeclaration(file), - _ident(ident), - _length_function(NULL), - _has_function(hasser), - _get_function(getter), - _set_function(setter), - _clear_function(clearer), - _del_function(NULL) + _type(type), + _length_function(nullptr), + _has_function(nullptr), + _get_function(nullptr), + _set_function(nullptr), + _clear_function(nullptr), + _del_function(nullptr) { _ident->_native_scope = current_scope; } diff --git a/dtool/src/cppparser/cppMakeProperty.h b/dtool/src/cppparser/cppMakeProperty.h index 44a1a5671a..52ba3641bf 100644 --- a/dtool/src/cppparser/cppMakeProperty.h +++ b/dtool/src/cppparser/cppMakeProperty.h @@ -23,16 +23,72 @@ * This is a MAKE_PROPERTY() declaration appearing within a class body. It * means to generate a property within Python, replacing (for instance) * get_something()/set_something() with a synthetic 'something' attribute. + * + * This is an example of a simple property (MAKE_PROPERTY is defined as + * the built-in __make_property): + * @@code + * Thing get_thing() const; + * void set_thing(const Thing &); + * + * MAKE_PROPERTY(thing, get_thing, set_thing); + * @@endcode + * The setter may be omitted to make the property read-only. + * + * There is also a secondary macro that allows the property to be set to a + * cleared state using separate clear functions. In the scripting language, + * this would be represented by a "null" value, or an "optional" construct in + * languages that have no notion of a null value. + * + * @@code + * bool has_thing() const; + * Thing get_thing() const; + * void set_thing(const Thing &); + * void clear_thing(); + * MAKE_PROPERTY2(thing, has_thing, get_thing, set_thing, clear_thing); + * @@endcode + * As with MAKE_PROPERTY, both the setter and clearer can be omitted to create + * a read-only property. + * + * Thirdly, there is a variant called MAKE_SEQ_PROPERTY. It takes a length + * function as argument and the getter and setter take an index as first + * argument: + * @@code + * size_t get_num_things() const; + * Thing &get_thing(size_t i) const; + * void set_thing(size_t i, Thing value) const; + * void remove_thing(size_t i) const; + * + * MAKE_SEQ_PROPERTY(get_num_things, get_thing, set_thing, remove_thing); + * @@endcode + * + * Lastly, there is the possibility to have properties with key/value + * associations, often called a "map" or "dictionary" in scripting languages: + * @@code + * bool has_thing(string key) const; + * Thing &get_thing(string key) const; + * void set_thing(string key, Thing value) const; + * void clear_thing(string key) const; + * + * MAKE_MAP_PROPERTY(things, has_thing, get_thing, set_thing, clear_thing); + * @@endcode + * You may also replace the "has" function with a "find" function that returns + * an index. If the returned index is negative (or in the case of an unsigned + * integer, the maximum value), the item is assumed not to be present in the + * mapping. + * + * It is also possible to use both MAKE_SEQ_PROPERTY and MAKE_MAP_PROPERTY on + * the same property name. This implies that this property has both a + * sequence and mapping interface. */ class CPPMakeProperty : public CPPDeclaration { public: - CPPMakeProperty(CPPIdentifier *ident, - CPPFunctionGroup *getter, CPPFunctionGroup *setter, - CPPScope *current_scope, const CPPFile &file); + enum Type { + T_normal = 0x0, + T_sequence = 0x1, + T_mapping = 0x2, + }; - CPPMakeProperty(CPPIdentifier *ident, - CPPFunctionGroup *hasser, CPPFunctionGroup *getter, - CPPFunctionGroup *setter, CPPFunctionGroup *clearer, + CPPMakeProperty(CPPIdentifier *ident, Type type, CPPScope *current_scope, const CPPFile &file); virtual string get_simple_name() const; @@ -46,8 +102,7 @@ public: virtual CPPMakeProperty *as_make_property(); CPPIdentifier *_ident; - // If length_function is not NULL, this is actually a sequence property, - // and the other functions take an additional index argument. + Type _type; CPPFunctionGroup *_length_function; CPPFunctionGroup *_has_function; CPPFunctionGroup *_get_function; diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index a3cb5f0614..5afa70df03 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -456,6 +456,7 @@ typedef struct _object PyObject; #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_PROPERTY(property_name, ...) __make_seq_property(property_name, __VA_ARGS__) +#define MAKE_MAP_PROPERTY(property_name, ...) __make_map_property(property_name, __VA_ARGS__) #define EXTENSION(x) __extension x #define EXTEND __extension #else @@ -466,6 +467,7 @@ typedef struct _object PyObject; #define MAKE_PROPERTY2(property_name, ...) #define MAKE_SEQ(seq_name, num_name, element_name) #define MAKE_SEQ_PROPERTY(property_name, ...) +#define MAKE_MAP_PROPERTY(property_name, ...) #define EXTENSION(x) #define EXTEND #endif diff --git a/dtool/src/dtoolutil/executionEnvironment.h b/dtool/src/dtoolutil/executionEnvironment.h index f2f5472193..f954a1e44d 100644 --- a/dtool/src/dtoolutil/executionEnvironment.h +++ b/dtool/src/dtoolutil/executionEnvironment.h @@ -51,6 +51,10 @@ PUBLISHED: static Filename get_cwd(); +PUBLISHED: + MAKE_MAP_PROPERTY(environment_variables, has_environment_variable, + get_environment_variable, set_environment_variable); + MAKE_SEQ_PROPERTY(args, get_num_args, get_arg); MAKE_PROPERTY(binary_name, get_binary_name, set_binary_name); MAKE_PROPERTY(dtool_name, get_dtool_name, set_dtool_name); diff --git a/dtool/src/interrogate/interfaceMaker.cxx b/dtool/src/interrogate/interfaceMaker.cxx index 5c2e589e3c..9cc7b96973 100644 --- a/dtool/src/interrogate/interfaceMaker.cxx +++ b/dtool/src/interrogate/interfaceMaker.cxx @@ -75,8 +75,8 @@ InterfaceMaker::MakeSeq:: MakeSeq(const string &name, const InterrogateMakeSeq &imake_seq) : _name(name), _imake_seq(imake_seq), - _length_getter(NULL), - _element_getter(NULL) + _length_getter(nullptr), + _element_getter(nullptr) { } @@ -86,12 +86,10 @@ MakeSeq(const string &name, const InterrogateMakeSeq &imake_seq) : InterfaceMaker::Property:: Property(const InterrogateElement &ielement) : _ielement(ielement), - _length_function(NULL), - _getter(NULL), - _setter(NULL), - _has_function(NULL), - _clear_function(NULL), - _deleter(NULL), + _length_function(nullptr), + _has_function(nullptr), + _clear_function(nullptr), + _deleter(nullptr), _has_this(false) { } diff --git a/dtool/src/interrogate/interfaceMaker.h b/dtool/src/interrogate/interfaceMaker.h index eb23e28430..2dbea5921e 100644 --- a/dtool/src/interrogate/interfaceMaker.h +++ b/dtool/src/interrogate/interfaceMaker.h @@ -126,9 +126,9 @@ public: Property(const InterrogateElement &ielement); const InterrogateElement &_ielement; + vector _getter_remaps; + vector _setter_remaps; Function *_length_function; - Function *_getter; - Function *_setter; Function *_has_function; Function *_clear_function; Function *_deleter; diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index 9f8820ffee..a5e5295e4e 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -2640,8 +2640,7 @@ write_module_class(ostream &out, Object *obj) { for (pit = obj->_properties.begin(); pit != obj->_properties.end(); ++pit) { Property *property = (*pit); const InterrogateElement &ielem = property->_ielement; - if (!property->_has_this || - property->_getter == NULL || !is_function_legal(property->_getter)) { + if (!property->_has_this || property->_getter_remaps.empty()) { continue; } @@ -2652,8 +2651,7 @@ write_module_class(ostream &out, Object *obj) { string getter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter"; string setter = "NULL"; - if (property->_length_function == NULL && - property->_setter != NULL && is_function_legal(property->_setter)) { + if (!ielem.is_sequence() && !ielem.is_mapping() && !property->_setter_remaps.empty()) { setter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter"; } @@ -3190,8 +3188,7 @@ write_module_class(ostream &out, Object *obj) { for (pit = obj->_properties.begin(); pit != obj->_properties.end(); ++pit) { Property *property = (*pit); const InterrogateElement &ielem = property->_ielement; - if (property->_has_this || - property->_getter == NULL || !is_function_legal(property->_getter)) { + if (property->_has_this || property->_getter_remaps.empty()) { continue; } @@ -3200,8 +3197,7 @@ write_module_class(ostream &out, Object *obj) { string getter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter"; string setter = "NULL"; - if (property->_length_function == NULL && - property->_setter != NULL && is_function_legal(property->_setter)) { + if (!ielem.is_sequence() && !ielem.is_mapping() && !property->_setter_remaps.empty()) { setter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter"; } @@ -5997,7 +5993,7 @@ write_function_instance(ostream &out, FunctionRemap *remap, // this for coercion constructors since they are called by other wrapper // functions which already check this on their own. Generated getters // obviously can't raise asserts. - if (watch_asserts && (return_flags & RF_coerced) == 0 && + if (watch_asserts && (return_flags & (RF_coerced | RF_raise_keyerror)) == 0 && remap->_type != FunctionRemap::T_getter && remap->_type != FunctionRemap::T_setter) { out << "#ifndef NDEBUG\n"; @@ -6126,6 +6122,27 @@ write_function_instance(ostream &out, FunctionRemap *remap, indent(out, indent_level) << "manage = true;\n"; indent(out, indent_level) << "return true;\n"; } + + } else if (return_flags & RF_raise_keyerror) { + CPPType *orig_type = remap->_return_type->get_orig_type(); + + if (TypeManager::is_bool(orig_type) || TypeManager::is_pointer(orig_type)) { + indent(out, indent_level) << "if (!" << return_expr << ") {\n"; + } else if (TypeManager::is_unsigned_integer(orig_type)) { + indent(out, indent_level) << "if ((int)" << return_expr << " == -1) {\n"; + } else if (TypeManager::is_integer(orig_type)) { + indent(out, indent_level) << "if (" << return_expr << " < 0) {\n"; + } else { + indent(out, indent_level) << "if (false) {\n"; + } + + if (args_type == AT_single_arg) { + indent(out, indent_level) << " PyErr_SetObject(PyExc_KeyError, arg);\n"; + } else { + indent(out, indent_level) << " PyErr_SetObject(PyExc_KeyError, key);\n"; + } + error_return(out, indent_level + 2, return_flags); + indent(out, indent_level) << "}\n"; } // Close the extra braces opened earlier. @@ -6398,19 +6415,21 @@ write_make_seq(ostream &out, Object *obj, const std::string &ClassName, */ void InterfaceMakerPythonNative:: write_getset(ostream &out, Object *obj, Property *property) { + // We keep around this empty vector for passing to get_call_str. + const vector_string pexprs; string ClassName = make_safe_name(obj->_itype.get_scoped_name()); std::string cClassName = obj->_itype.get_true_name(); const InterrogateElement &ielem = property->_ielement; - if (property->_length_function != NULL) { + FunctionRemap *len_remap = nullptr; + if (property->_length_function != nullptr) { // This is actually a sequence. Wrap this with a special class. - FunctionRemap *len_remap = property->_length_function->_remaps.front(); - vector_string pexprs; + len_remap = property->_length_function->_remaps.front(); out << "/**\n" - " * sequence length function for property " << cClassName << "::" << ielem.get_name() << "\n" + " * sequence length function for property " << ielem.get_scoped_name() << "\n" " */\n" "static Py_ssize_t Dtool_" + ClassName + "_" + ielem.get_name() + "_Len(PyObject *self) {\n"; if (property->_length_function->_has_this) { @@ -6424,72 +6443,72 @@ write_getset(ostream &out, Object *obj, Property *property) { 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) { + if (property->_getter_remaps.empty()) { + return; + } + + if (ielem.is_sequence()) { + out << + "/**\n" + " * sequence getter for property " << ielem.get_scoped_name() << "\n" + " */\n" + "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Sequence_Getitem(PyObject *self, Py_ssize_t index) {\n"; + + if (property->_has_this) { 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"; - if (property->_getter->_has_this || - (property->_has_function && property->_has_function->_has_this)) { - out << - " " << 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) { - if (property->_has_function->_has_this) { - out << " if (!local_this->" << property->_has_function->_ifunc.get_name() << "(index)) {\n"; - } else { - out << " if (!" << cClassName << "::" << property->_has_function->_ifunc.get_name() << "(index)) {\n"; - } - out << " Py_INCREF(Py_None);\n" - << " return Py_None;\n" - << " }\n"; - } - - std::set 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"; + " " << 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 remaps; + + // Extract only the getters that take one integral 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 && + TypeManager::is_integer(remap->_parameters[(size_t)remap->_has_this]._remap->get_new_type())) { + 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"; + if (!property->_setter_remaps.empty()) { + out << "static int Dtool_" + ClassName + "_" + ielem.get_name() + "_Sequence_Setitem(PyObject *self, Py_ssize_t index, PyObject *arg) {\n"; if (property->_has_this) { out << " " << cClassName << " *local_this = NULL;\n"; out << " if (!Dtool_Call_ExtractThisPointer_NonConst(self, Dtool_" << ClassName << ", (void **)&local_this, \"" @@ -6527,13 +6546,14 @@ write_getset(ostream &out, Object *obj, Property *property) { // Extract only the setters that take two arguments. Function::Remaps::iterator it; - for (it = property->_setter->_remaps.begin(); - it != property->_setter->_remaps.end(); + 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) { + if (min_num_args <= 2 && max_num_args >= 2 && + TypeManager::is_integer(remap->_parameters[1]._remap->get_new_type())) { remaps.insert(remap); } } @@ -6551,8 +6571,192 @@ write_getset(ostream &out, Object *obj, Property *property) { out << " return -1;\n"; out << "}\n\n"; } + } - // Now write the getter, which returns a special wrapper object. + + // Write the getitem functions. + if (ielem.is_mapping()) { + out << + "/**\n" + " * mapping getitem for property " << ielem.get_scoped_name() << "\n" + " */\n" + "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Mapping_Getitem(PyObject *self, PyObject *arg) {\n"; + + // Before we do the has_function: if this is also a sequence, then we have + // to also handle the case here that we were passed an index. + if (ielem.is_sequence()) { + out << + "#if PY_MAJOR_VERSION >= 3\n" + " if (PyLong_CheckExact(arg)) {\n" + "#else\n" + " if (PyLong_CheckExact(arg) || PyInt_CheckExact(arg)) {\n" + "#endif\n" + " return Dtool_" << ClassName << "_" << ielem.get_name() << "_Sequence_Getitem(self, PyLongOrInt_AsSize_t(arg));\n" + " }\n\n"; + } + + if (property->_has_this) { + out << + " " << cClassName << " *local_this = NULL;\n" + " if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n" + " return NULL;\n" + " }\n"; + } + + if (property->_has_function != NULL) { + std::set remaps; + remaps.insert(property->_has_function->_remaps.begin(), + property->_has_function->_remaps.end()); + + out << " {\n"; + string expected_params; + write_function_forset(out, remaps, 1, 1, expected_params, 4, true, true, + AT_single_arg, RF_raise_keyerror | RF_err_null, false, true); + out << " }\n"; + } + + std::set remaps; + // Extract only the getters that take one argument. Fish out the ones + // already taken by the sequence getter. + 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 && + (!ielem.is_sequence() || !TypeManager::is_integer(remap->_parameters[(size_t)remap->_has_this]._remap->get_new_type()))) { + remaps.insert(remap); + } + } + + string expected_params; + write_function_forset(out, remaps, 1, 1, expected_params, 2, true, true, + AT_single_arg, RF_pyobject | RF_err_null, false, true); + + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " return Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n" + " }\n" + " return NULL;\n" + "}\n\n"; + + // Write out a setitem if this is not a read-only property. + if (!property->_setter_remaps.empty()) { + out << + "/**\n" + " * mapping setitem for property " << ielem.get_scoped_name() << "\n" + " */\n" + "static int Dtool_" + ClassName + "_" + ielem.get_name() + "_Mapping_Setitem(PyObject *self, PyObject *key, PyObject *value) {\n"; + + if (property->_has_this) { + out << + " " << cClassName << " *local_this = NULL;\n" + " if (!Dtool_Call_ExtractThisPointer_NonConst(self, Dtool_" << ClassName << ", (void **)&local_this, \"" + << classNameFromCppName(cClassName, false) << "." << ielem.get_name() << "\")) {\n" + " return -1;\n" + " }\n\n"; + } + + out << " if (value == (PyObject *)NULL) {\n"; + if (property->_deleter != NULL) { + out << " PyObject *arg = key;\n"; + std::set remaps; + remaps.insert(property->_deleter->_remaps.begin(), + property->_deleter->_remaps.end()); + + string expected_params; + write_function_forset(out, remaps, 1, 1, + expected_params, 4, true, true, AT_single_arg, + RF_int, false, false); + out << " return -1;\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 (value == Py_None) {\n" + << " local_this->" << property->_clear_function->_ifunc.get_name() << "(key);\n" + << " return 0;\n" + << " }\n"; + } + + std::set remaps; + remaps.insert(property->_setter_remaps.begin(), + property->_setter_remaps.end()); + + // We have to create an args tuple only to unpack it alter, ugh. + out << " PyObject *args = PyTuple_New(2);\n" + << " PyTuple_SET_ITEM(args, 0, key);\n" + << " PyTuple_SET_ITEM(args, 1, value);\n" + << " Py_INCREF(key);\n" + << " Py_INCREF(value);\n"; + + string expected_params; + write_function_forset(out, remaps, 2, 2, + expected_params, 2, true, true, AT_varargs, + RF_int | RF_decref_args, false, false); + + out << " if (!_PyErr_OCCURRED()) {\n"; + out << " Dtool_Raise_BadArgumentsError(\n"; + output_quoted(out, 6, expected_params); + out << ");\n"; + out << " }\n"; + out << " Py_DECREF(args);\n"; + out << " return -1;\n"; + out << "}\n\n"; + } + } + + // Now write the actual getter wrapper. It will be a different wrapper + // depending on whether it's a mapping, sequence, or both. + if (ielem.is_mapping() && ielem.is_sequence()) { + out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n"; + if (property->_has_this) { + out << " nassertr(self != NULL, NULL);\n" + " Py_INCREF(self);\n"; + } else { + out << " Py_XINCREF(self);\n"; + } + out << " Dtool_SeqMapWrapper *wrap = PyObject_New(Dtool_SeqMapWrapper, &Dtool_SeqMapWrapper_Type);\n" + " wrap->_seq._base._self = self;\n" + " wrap->_seq._len_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Len;\n" + " wrap->_seq._getitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Sequence_Getitem;\n" + " wrap->_map_getitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Mapping_Getitem;\n"; + if (!property->_setter_remaps.empty()) { + out << " wrap->_seq._setitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Sequence_Setitem;\n"; + out << " wrap->_map_setitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Mapping_Setitem;\n"; + } else { + out << " wrap->_seq._setitem_func = NULL;\n"; + out << " wrap->_map_setitem_func = NULL;\n"; + } + out << " return (PyObject *)wrap;\n" + "}\n\n"; + + } else if (ielem.is_mapping()) { + out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n"; + if (property->_has_this) { + out << " nassertr(self != NULL, NULL);\n" + " Py_INCREF(self);\n"; + } else { + out << " Py_XINCREF(self);\n"; + } + out << " Dtool_MappingWrapper *wrap = PyObject_New(Dtool_MappingWrapper, &Dtool_MappingWrapper_Type);\n" + " wrap->_base._self = self;\n" + " wrap->_getitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Mapping_Getitem;\n"; + if (!property->_setter_remaps.empty()) { + out << " wrap->_setitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Mapping_Setitem;\n"; + } else { + out << " wrap->_setitem_func = NULL;\n"; + } + out << " return (PyObject *)wrap;\n" + "}\n\n"; + + } else if (ielem.is_sequence()) { out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n"; if (property->_has_this) { out << " nassertr(self != NULL, NULL);\n" @@ -6561,21 +6765,21 @@ write_getset(ostream &out, Object *obj, Property *property) { out << " Py_XINCREF(self);\n"; } out << " Dtool_SequenceWrapper *wrap = PyObject_New(Dtool_SequenceWrapper, &Dtool_SequenceWrapper_Type);\n" - " wrap->_base = self;\n" + " wrap->_base._self = 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"; + " wrap->_getitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Sequence_Getitem;\n"; + if (!property->_setter_remaps.empty()) { + out << " wrap->_setitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Sequence_Setitem;\n"; } else { out << " wrap->_setitem_func = NULL;\n"; } out << " return (PyObject *)wrap;\n" - "}\n\n"; + "}\n\n"; - } else if (property->_getter != NULL) { + } else { // 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(); if (remap->_has_this) { if (remap->_const_method) { @@ -6611,7 +6815,7 @@ write_getset(ostream &out, Object *obj, Property *property) { out << "}\n\n"; // Write out a setter if this is not a read-only property. - if (property->_setter != NULL) { + if (!property->_setter_remaps.empty()) { out << "static int Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter(PyObject *self, PyObject *arg, void *) {\n"; if (remap->_has_this) { out << " " << cClassName << " *local_this = NULL;\n"; @@ -6630,7 +6834,7 @@ write_getset(ostream &out, Object *obj, Property *property) { << " return 0;\n"; } else { out << " Dtool_Raise_TypeError(\"can't delete " << ielem.get_name() << " attribute\");\n" - " return -1;\n"; + " return -1;\n"; } out << " }\n"; @@ -6649,9 +6853,9 @@ write_getset(ostream &out, Object *obj, Property *property) { // Extract only the setters that take one argument. Function::Remaps::iterator it; - for (it = property->_setter->_remaps.begin(); - it != property->_setter->_remaps.end(); - ++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(); @@ -6763,62 +6967,8 @@ record_object(TypeIndex type_index) { ElementIndex element_index = itype.get_element(ei); const InterrogateElement &ielement = idb->get_element(element_index); - Property *property = new Property(ielement); - - if (ielement.has_setter()) { - FunctionIndex func_index = ielement.get_setter(); - Function *setter = record_function(itype, func_index); - if (is_function_legal(setter)) { - property->_setter = setter; - property->_has_this |= setter->_has_this; - } - } - - if (ielement.has_getter()) { - FunctionIndex func_index = ielement.get_getter(); - Function *getter = record_function(itype, func_index); - if (is_function_legal(getter)) { - property->_getter = getter; - property->_has_this |= getter->_has_this; - } - } - - if (ielement.has_has_function()) { - FunctionIndex func_index = ielement.get_has_function(); - Function *has_function = record_function(itype, func_index); - if (is_function_legal(has_function)) { - property->_has_function = has_function; - property->_has_this |= has_function->_has_this; - } - } - - if (ielement.has_clear_function()) { - FunctionIndex func_index = ielement.get_clear_function(); - Function *clear_function = record_function(itype, func_index); - if (is_function_legal(clear_function)) { - property->_clear_function = clear_function; - property->_has_this |= clear_function->_has_this; - } - } - - 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; - property->_has_this |= del_function->_has_this; - } - } - - if (ielement.is_sequence()) { - FunctionIndex func_index = ielement.get_length_function(); - property->_length_function = record_function(itype, func_index); - if (property->_length_function != nullptr) { - property->_has_this |= property->_length_function->_has_this; - } - } - - if (property->_getter != NULL) { + Property *property = record_property(itype, itype.get_element(ei)); + if (property != nullptr) { object->_properties.push_back(property); } else { // No use exporting a property without a getter. @@ -6850,6 +7000,96 @@ record_object(TypeIndex type_index) { } return object; } + +/** + * + */ +InterfaceMaker::Property *InterfaceMakerPythonNative:: +record_property(const InterrogateType &itype, ElementIndex element_index) { + InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); + const InterrogateElement &ielement = idb->get_element(element_index); + if (!ielement.has_getter()) { + // A property needs at the very least a getter. + return nullptr; + } + + Property *property; + { + FunctionIndex func_index = ielement.get_getter(); + if (func_index != 0) { + const InterrogateFunction &ifunc = idb->get_function(func_index); + property = new Property(ielement); + + InterrogateFunction::Instances::const_iterator ii; + for (ii = ifunc._instances->begin(); ii != ifunc._instances->end(); ++ii) { + CPPInstance *cppfunc = (*ii).second; + FunctionRemap *remap = + make_function_remap(itype, ifunc, cppfunc, 0); + + if (remap != nullptr && is_remap_legal(remap)) { + property->_getter_remaps.push_back(remap); + property->_has_this |= remap->_has_this; + } + } + } else { + return nullptr; + } + } + + if (ielement.has_setter()) { + FunctionIndex func_index = ielement.get_setter(); + if (func_index != 0) { + const InterrogateFunction &ifunc = idb->get_function(func_index); + + InterrogateFunction::Instances::const_iterator ii; + for (ii = ifunc._instances->begin(); ii != ifunc._instances->end(); ++ii) { + CPPInstance *cppfunc = (*ii).second; + FunctionRemap *remap = + make_function_remap(itype, ifunc, cppfunc, 0); + + if (remap != nullptr && is_remap_legal(remap)) { + property->_setter_remaps.push_back(remap); + property->_has_this |= remap->_has_this; + } + } + } + } + + if (ielement.has_has_function()) { + FunctionIndex func_index = ielement.get_has_function(); + Function *has_function = record_function(itype, func_index); + if (is_function_legal(has_function)) { + property->_has_function = has_function; + property->_has_this |= has_function->_has_this; + } + } + + if (ielement.has_clear_function()) { + FunctionIndex func_index = ielement.get_clear_function(); + Function *clear_function = record_function(itype, func_index); + if (is_function_legal(clear_function)) { + property->_clear_function = clear_function; + property->_has_this |= clear_function->_has_this; + } + } + + 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; + property->_has_this |= del_function->_has_this; + } + } + + if (ielement.is_sequence()) { + FunctionIndex func_index = ielement.get_length_function(); + property->_length_function = record_function(itype, func_index); + } + + return property; +} + /** * Walks through the set of functions in the database and generates wrappers * for each function, storing these in the database. No actual code should be diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.h b/dtool/src/interrogate/interfaceMakerPythonNative.h index 8f66fcf3b0..2c0195fdbf 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.h +++ b/dtool/src/interrogate/interfaceMakerPythonNative.h @@ -47,6 +47,7 @@ public: virtual bool separate_overloading(); virtual Object *record_object(TypeIndex type_index); + Property *record_property(const InterrogateType &itype, ElementIndex element_index); protected: virtual string get_wrapper_prefix(); @@ -111,6 +112,9 @@ private: // Decref temporary args object before returning. RF_decref_args = 0x1000, + + // This raises a KeyError on falsey (or -1) return value. + RF_raise_keyerror = 0x4000, }; class SlottedFunctionDef { diff --git a/dtool/src/interrogate/interrogateBuilder.cxx b/dtool/src/interrogate/interrogateBuilder.cxx index 349e9c46ad..a8fd7e1e57 100644 --- a/dtool/src/interrogate/interrogateBuilder.cxx +++ b/dtool/src/interrogate/interrogateBuilder.cxx @@ -1798,34 +1798,46 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP } string property_name = make_property->get_local_name(&parser); + InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); // First, check to see if it's already there. + ElementIndex index = 0; PropertiesByName::const_iterator tni = _properties_by_name.find(property_name); if (tni != _properties_by_name.end()) { - ElementIndex index = (*tni).second; - return index; + index = (*tni).second; + const InterrogateElement &ielem = idb->get_element(index); + if (ielem._make_property == make_property) { + // This is the same property. + return index; + } + + // It is possible to have property definitions with the same name, but + // they cannot define conflicting interfaces. + if ((ielem.is_sequence() || ielem.is_mapping()) != + (make_property->_type != CPPMakeProperty::T_normal)) { + cerr << "Conflicting property definitions for " << property_name << "!\n"; + 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 (make_property->_type & CPPMakeProperty::T_sequence) { + CPPFunctionGroup::Instances::const_iterator fi; + CPPFunctionGroup *fgroup = make_property->_length_function; + if (fgroup != NULL) { + 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; + } } } } @@ -1840,7 +1852,10 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP CPPInstance *getter = NULL; CPPType *return_type = NULL; - fgroup = make_property->_get_function; + // How many arguments we expect the getter to have. + size_t num_args = (size_t)(make_property->_type != CPPMakeProperty::T_normal); + + CPPFunctionGroup *fgroup = make_property->_get_function; if (fgroup != NULL) { CPPFunctionGroup::Instances::const_iterator fi; for (fi = fgroup->_instances.begin(); fi != fgroup->_instances.end(); ++fi) { @@ -1852,9 +1867,13 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP const CPPParameterList::Parameters ¶ms = ftype->_parameters->_parameters; - size_t expected_num_args = (size_t)is_seq; + size_t expected_num_args = 0; size_t index_arg = 0; + if (make_property->_type != CPPMakeProperty::T_normal) { + ++expected_num_args; + } + if (!params.empty() && params[0]->get_simple_name() == "self" && TypeManager::is_pointer_to_PyObject(params[0]->_type)) { // Taking a PyObject *self argument. @@ -1867,7 +1886,8 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP (params.size() > expected_num_args && params[expected_num_args]->_initializer != NULL)) { // If this is a sequence getter, it must take an index argument. - if (is_seq && !TypeManager::is_integer(params[index_arg]->_type)) { + if (make_property->_type == CPPMakeProperty::T_sequence && + !TypeManager::is_integer(params[index_arg]->_type)) { continue; } @@ -1899,13 +1919,14 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP CPPInstance *function = (*fi); CPPFunctionType *ftype = function->_type->as_function_type(); - if (ftype != NULL && TypeManager::is_bool(ftype->_return_type)) { + if (ftype != nullptr && (TypeManager::is_integer(ftype->_return_type) || + TypeManager::is_pointer(ftype->_return_type))) { hasser = function; break; } } - if (hasser == NULL || return_type == NULL) { + if (hasser == nullptr) { cerr << "No instance of has-function '" << fgroup->_name << "' is suitable!\n"; return 0; @@ -1921,44 +1942,77 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP 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() == (size_t)is_seq) { + if (ftype != NULL && ftype->_parameters->_parameters.size() == num_args) { deleter = function; break; } } - if (deleter == NULL || return_type == NULL) { + if (deleter == nullptr) { cerr << "No instance of delete-function '" << fgroup->_name << "' is suitable!\n"; return 0; } } - InterrogateDatabase *idb = InterrogateDatabase::get_ptr(); - // It isn't here, so we'll have to define it. - ElementIndex index = idb->get_next_index(); - _properties_by_name[property_name] = index; + if (index == 0) { + // It isn't here, so we'll have to define it. + index = idb->get_next_index(); + _properties_by_name[property_name] = index; - InterrogateElement iproperty; - iproperty._name = make_property->get_simple_name(); - iproperty._scoped_name = descope(make_property->get_local_name(&parser)); + InterrogateElement iproperty; + iproperty._name = make_property->get_simple_name(); + iproperty._scoped_name = descope(make_property->get_local_name(&parser)); + idb->add_element(index, iproperty); + } + + InterrogateElement &iproperty = idb->update_element(index); if (return_type != NULL) { - iproperty._type = get_type(TypeManager::unwrap_reference(return_type), false); + TypeIndex return_index = get_type(TypeManager::unwrap_reference(return_type), false); + if (iproperty._type != 0 && iproperty._type != return_index) { + cerr << "Property " << property_name << " has inconsistent element type!\n"; + } } else { iproperty._type = 0; } - if (length_function != 0) { + if (make_property->_type & CPPMakeProperty::T_sequence) { iproperty._flags |= InterrogateElement::F_sequence; iproperty._length_function = length_function; } - if (getter != NULL) { - iproperty._flags |= InterrogateElement::F_has_getter; - iproperty._getter = get_function(getter, "", struct_type, - struct_type->get_scope(), 0); - nassertr(iproperty._getter, 0); + if (make_property->_type & CPPMakeProperty::T_mapping) { + iproperty._flags |= InterrogateElement::F_mapping; + } + + if (make_property->_type == CPPMakeProperty::T_normal) { + if (getter != NULL) { + iproperty._flags |= InterrogateElement::F_has_getter; + iproperty._getter = get_function(getter, "", struct_type, + struct_type->get_scope(), 0); + nassertr(iproperty._getter, 0); + } + } else { + // We could have a mixed sequence/mapping property, so synthesize a + // getitem function. We don't really care what's in here; we just use + // this to store the remaps. + if (!iproperty.has_getter()) { + iproperty._flags |= InterrogateElement::F_has_getter; + iproperty._getter = InterrogateDatabase::get_ptr()->get_next_index(); + InterrogateFunction *ifunction = new InterrogateFunction; + ifunction->_instances = new InterrogateFunction::Instances; + InterrogateDatabase::get_ptr()->add_function(iproperty._getter, ifunction); + } + + // Add our getter to the generated getitem function. + string signature = TypeManager::get_function_signature(getter); + InterrogateFunction &ifunction = + InterrogateDatabase::get_ptr()->update_function(iproperty._getter); + if (ifunction._instances == nullptr) { + ifunction._instances = new InterrogateFunction::Instances; + } + ifunction._instances->insert(InterrogateFunction::Instances::value_type(signature, getter)); } if (hasser != NULL) { @@ -2011,7 +2065,6 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP } } - idb->add_element(index, iproperty); return index; } @@ -2621,7 +2674,9 @@ define_struct_type(InterrogateType &itype, CPPStructType *cpptype, } else if ((*di)->get_subtype() == CPPDeclaration::ST_make_property) { ElementIndex element_index = get_make_property((*di)->as_make_property(), cpptype, scope); - itype._elements.push_back(element_index); + if (find(itype._elements.begin(), itype._elements.end(), element_index) == itype._elements.end()) { + itype._elements.push_back(element_index); + } } else if ((*di)->get_subtype() == CPPDeclaration::ST_make_seq) { MakeSeqIndex make_seq_index = get_make_seq((*di)->as_make_seq(), cpptype); diff --git a/dtool/src/interrogatedb/interrogateElement.I b/dtool/src/interrogatedb/interrogateElement.I index 7e3ba61f77..9dc587efab 100644 --- a/dtool/src/interrogatedb/interrogateElement.I +++ b/dtool/src/interrogatedb/interrogateElement.I @@ -26,6 +26,7 @@ InterrogateElement(InterrogateModuleDef *def) : _clear_function = 0; _del_function = 0; _length_function = 0; + _make_property = nullptr; } /** @@ -52,6 +53,7 @@ operator = (const InterrogateElement ©) { _clear_function = copy._clear_function; _del_function = copy._del_function; _length_function = copy._length_function; + _make_property = copy._make_property; } /** @@ -199,6 +201,14 @@ get_length_function() const { return _length_function; } +/** + * + */ +INLINE bool InterrogateElement:: +is_mapping() const { + return (_flags & F_mapping) != 0; +} + INLINE ostream & operator << (ostream &out, const InterrogateElement &element) { diff --git a/dtool/src/interrogatedb/interrogateElement.h b/dtool/src/interrogatedb/interrogateElement.h index 3506d7b9a8..5488cc4cfe 100644 --- a/dtool/src/interrogatedb/interrogateElement.h +++ b/dtool/src/interrogatedb/interrogateElement.h @@ -19,6 +19,7 @@ #include "interrogateComponent.h" class IndexRemapper; +class CPPMakeProperty; /** * An internal representation of a data element, like a data member or a @@ -51,6 +52,7 @@ public: INLINE FunctionIndex get_del_function() const; INLINE bool is_sequence() const; INLINE FunctionIndex get_length_function() const; + INLINE bool is_mapping() const; void output(ostream &out) const; void input(istream &in); @@ -80,6 +82,8 @@ private: FunctionIndex _clear_function; FunctionIndex _del_function; + CPPMakeProperty *_make_property; + friend class InterrogateBuilder; }; diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index 1156b6dfef..d629fd6d60 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -614,6 +614,14 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { return Dtool_Raise_TypeError("PyType_Ready(Dtool_SequenceWrapper)"); } + if (PyType_Ready(&Dtool_MappingWrapper_Type) < 0) { + return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper)"); + } + + if (PyType_Ready(&Dtool_SeqMapWrapper_Type) < 0) { + return Dtool_Raise_TypeError("PyType_Ready(Dtool_SeqMapWrapper)"); + } + if (PyType_Ready(&Dtool_StaticProperty_Type) < 0) { return Dtool_Raise_TypeError("PyType_Ready(Dtool_StaticProperty_Type)"); } @@ -1028,34 +1036,79 @@ bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, PyObject *kwds) } /** - * This class is returned from properties that require a settable interface, - * ie. something.children[i] = 3. + * These classes are returned from properties that require a subscript + * interface, ie. something.children[i] = 3. */ -static void Dtool_SequenceWrapper_dealloc(PyObject *self) { - Dtool_SequenceWrapper *wrap = (Dtool_SequenceWrapper *)self; +static void Dtool_WrapperBase_dealloc(PyObject *self) { + Dtool_WrapperBase *wrap = (Dtool_WrapperBase *)self; nassertv(wrap); - Py_XDECREF(wrap->_base); + Py_XDECREF(wrap->_self); } 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); + if (wrap->_len_func != nullptr) { + nassertr(wrap->_len_func, -1); + return wrap->_len_func(wrap->_base._self); + } else { + Dtool_Raise_TypeError("property does not support len()"); + return -1; + } } 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); + nassertr(wrap, nullptr); + nassertr(wrap->_getitem_func, nullptr); + return wrap->_getitem_func(wrap->_base._self, 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); + if (wrap->_setitem_func != nullptr) { + return wrap->_setitem_func(wrap->_base._self, index, value); + } else { + Dtool_Raise_TypeError("property does not support item assignment"); + return -1; + } +} + +static PyObject *Dtool_MappingWrapper_getitem(PyObject *self, PyObject *key) { + Dtool_MappingWrapper *wrap = (Dtool_MappingWrapper *)self; + nassertr(wrap, nullptr); + nassertr(wrap->_getitem_func, nullptr); + return wrap->_getitem_func(wrap->_base._self, key); +} + +static int Dtool_MappingWrapper_setitem(PyObject *self, PyObject *key, PyObject *value) { + Dtool_MappingWrapper *wrap = (Dtool_MappingWrapper *)self; + nassertr(wrap, -1); + if (wrap->_setitem_func != nullptr) { + return wrap->_setitem_func(wrap->_base._self, key, value); + } else { + Dtool_Raise_TypeError("property does not support item assignment"); + return -1; + } +} + +static PyObject *Dtool_SeqMapWrapper_getitem(PyObject *self, PyObject *key) { + Dtool_SeqMapWrapper *wrap = (Dtool_SeqMapWrapper *)self; + nassertr(wrap, nullptr); + nassertr(wrap->_map_getitem_func, nullptr); + return wrap->_map_getitem_func(wrap->_seq._base._self, key); +} + +static int Dtool_SeqMapWrapper_setitem(PyObject *self, PyObject *key, PyObject *value) { + Dtool_SeqMapWrapper *wrap = (Dtool_SeqMapWrapper *)self; + nassertr(wrap, -1); + if (wrap->_map_setitem_func != nullptr) { + return wrap->_map_setitem_func(wrap->_seq._base._self, key, value); + } else { + Dtool_Raise_TypeError("property does not support item assignment"); + return -1; + } } static PySequenceMethods Dtool_SequenceWrapper_SequenceMethods = { @@ -1071,12 +1124,27 @@ static PySequenceMethods Dtool_SequenceWrapper_SequenceMethods = { 0, // sq_inplace_repeat }; +static PyMappingMethods Dtool_MappingWrapper_MappingMethods = { + 0, // mp_length + Dtool_MappingWrapper_getitem, + Dtool_MappingWrapper_setitem, +}; + +static PyMappingMethods Dtool_SeqMapWrapper_MappingMethods = { + Dtool_SequenceWrapper_length, + Dtool_SeqMapWrapper_getitem, + Dtool_SeqMapWrapper_setitem, +}; + +/** + * This variant defines only a sequence interface. + */ PyTypeObject Dtool_SequenceWrapper_Type = { PyVarObject_HEAD_INIT(NULL, 0) "sequence wrapper", sizeof(Dtool_SequenceWrapper), 0, // tp_itemsize - Dtool_SequenceWrapper_dealloc, + Dtool_WrapperBase_dealloc, 0, // tp_print 0, // tp_getattr 0, // tp_setattr @@ -1262,4 +1330,128 @@ PyTypeObject Dtool_StaticProperty_Type = { #endif }; +/** + * This variant defines only a mapping interface. + */ +PyTypeObject Dtool_MappingWrapper_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "mapping wrapper", + sizeof(Dtool_MappingWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_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 + 0, // tp_as_sequence + &Dtool_MappingWrapper_MappingMethods, + 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 +#if PY_VERSION_HEX >= 0x03040000 + 0, // tp_finalize +#endif +}; + +/** + * This variant defines both a sequence and mapping interface. + */ +PyTypeObject Dtool_SeqMapWrapper_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "sequence/mapping wrapper", + sizeof(Dtool_SeqMapWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_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, + &Dtool_SeqMapWrapper_MappingMethods, + 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 +#if PY_VERSION_HEX >= 0x03040000 + 0, // tp_finalize +#endif +}; + #endif // HAVE_PYTHON diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index 9df9fad4af..21b4a8b53e 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -339,6 +339,9 @@ EXPCL_INTERROGATEDB PyObject *_Dtool_Raise_BadArgumentsError(); #define Dtool_Raise_BadArgumentsError(x) Dtool_Raise_TypeError("Arguments must match:\n" x) #endif +// These functions are similar to Dtool_WrapValue, except that they also +// contain code for checking assertions and exceptions when compiling with +// NDEBUG mode on. EXPCL_INTERROGATEDB PyObject *_Dtool_Return_None(); EXPCL_INTERROGATEDB PyObject *Dtool_Return_Bool(bool value); EXPCL_INTERROGATEDB PyObject *_Dtool_Return(PyObject *value); @@ -465,18 +468,36 @@ EXPCL_INTERROGATEDB PyObject * map_deepcopy_to_copy(PyObject *self, PyObject *args); /** - * This class is returned from properties that require a settable interface, - * ie. something.children[i] = 3. + * These classes are returned from properties that require a subscript + * interface, ie. something.children[i] = 3. */ +struct Dtool_WrapperBase { + PyObject_HEAD; + PyObject *_self; +}; + struct Dtool_SequenceWrapper { - PyObject_HEAD - PyObject *_base; + Dtool_WrapperBase _base; lenfunc _len_func; ssizeargfunc _getitem_func; ssizeobjargproc _setitem_func; }; +struct Dtool_MappingWrapper { + Dtool_WrapperBase _base; + binaryfunc _getitem_func; + objobjargproc _setitem_func; +}; + +struct Dtool_SeqMapWrapper { + Dtool_SequenceWrapper _seq; + binaryfunc _map_getitem_func; + objobjargproc _map_setitem_func; +}; + EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SequenceWrapper_Type; +EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Type; +EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SeqMapWrapper_Type; EXPCL_INTERROGATEDB extern PyTypeObject Dtool_StaticProperty_Type; EXPCL_INTERROGATEDB PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset); diff --git a/panda/src/chan/animGroup.h b/panda/src/chan/animGroup.h index af81aba3b1..22b1366c84 100644 --- a/panda/src/chan/animGroup.h +++ b/panda/src/chan/animGroup.h @@ -44,12 +44,13 @@ PUBLISHED: AnimGroup *get_child(int n) const; 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 *find_child(const string &name) const; void sort_descendants(); + MAKE_SEQ_PROPERTY(children, get_num_children, get_child); + MAKE_MAP_PROPERTY(children, get_child_named, get_child_named); + public: virtual TypeHandle get_value_type() const; diff --git a/panda/src/chan/partGroup.h b/panda/src/chan/partGroup.h index 0d5967a39a..5265846c19 100644 --- a/panda/src/chan/partGroup.h +++ b/panda/src/chan/partGroup.h @@ -70,12 +70,14 @@ PUBLISHED: int get_num_children() const; PartGroup *get_child(int n) const; 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 *find_child(const string &name) const; void sort_descendants(); + MAKE_SEQ_PROPERTY(children, get_num_children, get_child); + MAKE_MAP_PROPERTY(children, get_child_named, get_child_named); + bool apply_freeze(const TransformState *transform); virtual bool apply_freeze_matrix(const LVecBase3 &pos, const LVecBase3 &hpr, const LVecBase3 &scale); virtual bool apply_freeze_scalar(PN_stdfloat value); diff --git a/panda/src/gobj/geomVertexFormat.h b/panda/src/gobj/geomVertexFormat.h index c7451225e2..23d1ab5a7b 100644 --- a/panda/src/gobj/geomVertexFormat.h +++ b/panda/src/gobj/geomVertexFormat.h @@ -125,6 +125,9 @@ PUBLISHED: MAKE_SEQ_PROPERTY(points, get_num_points, get_point); MAKE_SEQ_PROPERTY(vectors, get_num_vectors, get_vector); + // We also define this as a mapping interface, for lookups by name. + MAKE_MAP_PROPERTY(columns, has_column, get_column); + void output(ostream &out) const; void write(ostream &out, int indent_level = 0) const; void write_with_data(ostream &out, int indent_level, diff --git a/panda/src/gobj/texture.h b/panda/src/gobj/texture.h index e40ca6f8e5..15dae5f02d 100644 --- a/panda/src/gobj/texture.h +++ b/panda/src/gobj/texture.h @@ -539,6 +539,8 @@ PUBLISHED: void set_aux_data(const string &key, TypedReferenceCount *aux_data); void clear_aux_data(const string &key); TypedReferenceCount *get_aux_data(const string &key) const; + MAKE_MAP_PROPERTY(aux_data, get_aux_data, get_aux_data, + set_aux_data, clear_aux_data); INLINE static void set_textures_power_2(AutoTextureScale scale); INLINE static AutoTextureScale get_textures_power_2(); diff --git a/panda/src/gobj/transformBlend.I b/panda/src/gobj/transformBlend.I index 2d1f3624c2..936ca57cc4 100644 --- a/panda/src/gobj/transformBlend.I +++ b/panda/src/gobj/transformBlend.I @@ -142,6 +142,17 @@ get_weight(size_t n) const { return _entries[n]._weight; } +/** + * Removes the nth transform stored in the blend object. + */ +INLINE void TransformBlend:: +remove_transform(size_t n) { + nassertv(n < _entries.size()); + _entries.erase(_entries.begin() + n); + Thread *current_thread = Thread::get_current_thread(); + clear_result(current_thread); +} + /** * Replaces the nth transform stored in the blend object. */ diff --git a/panda/src/gobj/transformBlend.h b/panda/src/gobj/transformBlend.h index 02f39f05d1..9ca49ab9c4 100644 --- a/panda/src/gobj/transformBlend.h +++ b/panda/src/gobj/transformBlend.h @@ -62,9 +62,15 @@ PUBLISHED: INLINE const VertexTransform *get_transform(size_t n) const; MAKE_SEQ(get_transforms, get_num_transforms, get_transform); INLINE PN_stdfloat get_weight(size_t n) const; + INLINE void remove_transform(size_t n); INLINE void set_transform(size_t n, const VertexTransform *transform); INLINE void set_weight(size_t n, PN_stdfloat weight); + MAKE_SEQ_PROPERTY(transforms, get_num_transforms, get_transform, + set_transform, remove_transform); + MAKE_SEQ_PROPERTY(weights, get_num_transforms, get_weight, set_weight); + MAKE_MAP_PROPERTY(weights, has_transform, get_weight); + INLINE void update_blend(Thread *current_thread) const; INLINE void get_blend(LMatrix4 &result, Thread *current_thread) const; diff --git a/panda/src/pgraph/camera.h b/panda/src/pgraph/camera.h index f983773846..84b33bf55b 100644 --- a/panda/src/pgraph/camera.h +++ b/panda/src/pgraph/camera.h @@ -91,12 +91,16 @@ PUBLISHED: void clear_tag_states(); bool has_tag_state(const string &tag_state) const; CPT(RenderState) get_tag_state(const string &tag_state) const; + MAKE_MAP_PROPERTY(tag_states, has_tag_state, get_tag_state, + set_tag_state, clear_tag_state); void set_aux_scene_data(const NodePath &node_path, AuxSceneData *data); bool clear_aux_scene_data(const NodePath &node_path); AuxSceneData *get_aux_scene_data(const NodePath &node_path) const; void list_aux_scene_data(ostream &out) const; int cleanup_aux_scene_data(Thread *current_thread = Thread::get_current_thread()); + MAKE_MAP_PROPERTY(aux_scene_data, get_aux_scene_data, get_aux_scene_data, + set_aux_scene_data, clear_aux_scene_data); private: void add_display_region(DisplayRegion *display_region); diff --git a/panda/src/pgraph/nodePath.h b/panda/src/pgraph/nodePath.h index 85eb068d55..2225ea745e 100644 --- a/panda/src/pgraph/nodePath.h +++ b/panda/src/pgraph/nodePath.h @@ -913,6 +913,9 @@ PUBLISHED: INLINE bool has_net_tag(const string &key) const; NodePath find_net_tag(const string &key) const; + MAKE_MAP_PROPERTY(tags, has_tag, get_tag, set_tag, clear_tag); + MAKE_MAP_PROPERTY(net_tags, has_net_tag, get_net_tag); + EXTENSION(INLINE PyObject *get_tag_keys() const); EXTENSION(PyObject *get_python_tags()); diff --git a/panda/src/pgraph/renderState.h b/panda/src/pgraph/renderState.h index 0cdcca07a1..aa337bbb04 100644 --- a/panda/src/pgraph/renderState.h +++ b/panda/src/pgraph/renderState.h @@ -109,6 +109,8 @@ PUBLISHED: INLINE int get_override(TypeHandle type) const; INLINE int get_override(int slot) const; + MAKE_MAP_PROPERTY(attribs, has_attrib, get_attrib); + INLINE CPT(RenderState) get_unique() const; virtual bool unref() const; diff --git a/panda/src/pgraph/shaderInput.I b/panda/src/pgraph/shaderInput.I index 30d1bab97a..8c37322082 100644 --- a/panda/src/pgraph/shaderInput.I +++ b/panda/src/pgraph/shaderInput.I @@ -417,6 +417,14 @@ ShaderInput(CPT_InternalName name, const LVecBase2i &vec, int priority) : { } +/** + * + */ +INLINE ShaderInput:: +operator bool () const { + return _type != M_invalid; +} + /** * */ diff --git a/panda/src/pgraph/shaderInput.h b/panda/src/pgraph/shaderInput.h index 1947dc0f86..d0ae3eae20 100644 --- a/panda/src/pgraph/shaderInput.h +++ b/panda/src/pgraph/shaderInput.h @@ -104,6 +104,7 @@ PUBLISHED: M_buffer, }; + INLINE operator bool() const; INLINE bool operator == (const ShaderInput &other) const; INLINE bool operator != (const ShaderInput &other) const; INLINE bool operator < (const ShaderInput &other) const; diff --git a/panda/src/pgraph/textureAttrib.h b/panda/src/pgraph/textureAttrib.h index aa9eea03c9..040cde7ef2 100644 --- a/panda/src/pgraph/textureAttrib.h +++ b/panda/src/pgraph/textureAttrib.h @@ -64,12 +64,18 @@ PUBLISHED: int find_on_stage(const TextureStage *stage) const; + MAKE_SEQ_PROPERTY(on_stages, get_num_on_stages, get_on_stage); + MAKE_MAP_PROPERTY(on_stages, find_on_stage, get_on_stage); + INLINE int get_num_off_stages() const; INLINE TextureStage *get_off_stage(int n) const; MAKE_SEQ(get_off_stages, get_num_off_stages, get_off_stage); INLINE bool has_off_stage(TextureStage *stage) const; INLINE bool has_all_off() const; + MAKE_SEQ_PROPERTY(off_stages, get_num_off_stages, get_off_stage); + MAKE_MAP_PROPERTY(off_stages, has_off_stage, get_off_stage); + INLINE bool is_identity() const; CPT(RenderAttrib) add_on_stage(TextureStage *stage, Texture *tex, int override = 0) const; From 464cd5fc8b4bc327503bd55ccbf0e25c749d2bad Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 9 Oct 2017 00:05:00 +0200 Subject: [PATCH 187/254] Replace __builtin_expect macros with LIKELY/UNLIKELY --- dtool/src/dtoolbase/dtoolbase.h | 8 ++++++++ dtool/src/interrogate/interfaceMakerPython.cxx | 2 +- dtool/src/interrogate/interfaceMakerPythonNative.cxx | 2 +- dtool/src/interrogatedb/py_panda.cxx | 12 ++++++------ dtool/src/interrogatedb/py_panda.h | 4 ++-- dtool/src/prc/notifyCategory.I | 12 ++---------- dtool/src/prc/notifyCategoryProxy.I | 12 ++---------- 7 files changed, 22 insertions(+), 30 deletions(-) diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index 5afa70df03..2029555e3b 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -94,6 +94,14 @@ #define RETURNS_ALIGNED(x) #endif +#ifdef __GNUC__ +#define LIKELY(x) __builtin_expect(!!(x), 1) +#define UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define LIKELY(x) (x) +#define UNLIKELY(x) (x) +#endif + /* include win32 defns for everything up to WinServer2003, and assume I'm smart enough to use GetProcAddress for backward compat on diff --git a/dtool/src/interrogate/interfaceMakerPython.cxx b/dtool/src/interrogate/interfaceMakerPython.cxx index f799335dfa..37125a7e64 100644 --- a/dtool/src/interrogate/interfaceMakerPython.cxx +++ b/dtool/src/interrogate/interfaceMakerPython.cxx @@ -51,7 +51,7 @@ test_assert(ostream &out, int indent_level) const { indent(out, indent_level) << "Notify *notify = Notify::ptr();\n"; indent(out, indent_level) - << "if (notify->has_assert_failed()) {\n"; + << "if (UNLIKELY(notify->has_assert_failed())) {\n"; indent(out, indent_level + 2) << "PyErr_SetString(PyExc_AssertionError, notify->get_assert_error_message().c_str());\n"; indent(out, indent_level + 2) diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index a5e5295e4e..1d2f2900d8 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -6000,7 +6000,7 @@ write_function_instance(ostream &out, FunctionRemap *remap, indent(out, indent_level) << "Notify *notify = Notify::ptr();\n"; indent(out, indent_level) - << "if (notify->has_assert_failed()) {\n"; + << "if (UNLIKELY(notify->has_assert_failed())) {\n"; if (manage_return) { // Output code to delete any temporary object we may have allocated. diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index d629fd6d60..76c4e7cf1b 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -322,11 +322,11 @@ PyObject *_Dtool_Raise_BadArgumentsError() { * NULL, otherwise Py_None. */ PyObject *_Dtool_Return_None() { - if (_PyErr_OCCURRED()) { + if (UNLIKELY(_PyErr_OCCURRED())) { return NULL; } #ifndef NDEBUG - if (Notify::ptr()->has_assert_failed()) { + if (UNLIKELY(Notify::ptr()->has_assert_failed())) { return Dtool_Raise_AssertionError(); } #endif @@ -339,11 +339,11 @@ PyObject *_Dtool_Return_None() { * NULL, otherwise the given boolean value as a PyObject *. */ PyObject *Dtool_Return_Bool(bool value) { - if (_PyErr_OCCURRED()) { + if (UNLIKELY(_PyErr_OCCURRED())) { return NULL; } #ifndef NDEBUG - if (Notify::ptr()->has_assert_failed()) { + if (UNLIKELY(Notify::ptr()->has_assert_failed())) { return Dtool_Raise_AssertionError(); } #endif @@ -358,11 +358,11 @@ PyObject *Dtool_Return_Bool(bool value) { * increased. */ PyObject *_Dtool_Return(PyObject *value) { - if (_PyErr_OCCURRED()) { + if (UNLIKELY(_PyErr_OCCURRED())) { return NULL; } #ifndef NDEBUG - if (Notify::ptr()->has_assert_failed()) { + if (UNLIKELY(Notify::ptr()->has_assert_failed())) { return Dtool_Raise_AssertionError(); } #endif diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index 21b4a8b53e..c341bb6b33 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -320,9 +320,9 @@ EXPCL_INTERROGATEDB bool _Dtool_CheckErrorOccurred(); #endif #ifdef NDEBUG -#define Dtool_CheckErrorOccurred() (_PyErr_OCCURRED() != NULL) +#define Dtool_CheckErrorOccurred() (UNLIKELY(_PyErr_OCCURRED() != NULL)) #else -#define Dtool_CheckErrorOccurred() _Dtool_CheckErrorOccurred() +#define Dtool_CheckErrorOccurred() (UNLIKELY(_Dtool_CheckErrorOccurred())) #endif EXPCL_INTERROGATEDB PyObject *Dtool_Raise_AssertionError(); diff --git a/dtool/src/prc/notifyCategory.I b/dtool/src/prc/notifyCategory.I index 07d3634d92..46aca56bb2 100644 --- a/dtool/src/prc/notifyCategory.I +++ b/dtool/src/prc/notifyCategory.I @@ -71,11 +71,7 @@ is_on(NotifySeverity severity) const { INLINE bool NotifyCategory:: is_spam() const { // Instruct the compiler to optimize for the usual case. -#ifdef __GNUC__ - return __builtin_expect(is_on(NS_spam), 0); -#else - return is_on(NS_spam); -#endif + return UNLIKELY(is_on(NS_spam)); } /** @@ -84,11 +80,7 @@ is_spam() const { INLINE bool NotifyCategory:: is_debug() const { // Instruct the compiler to optimize for the usual case. -#ifdef __GNUC__ - return __builtin_expect(is_on(NS_debug), 0); -#else - return is_on(NS_debug); -#endif + return UNLIKELY(is_on(NS_debug)); } #else /** diff --git a/dtool/src/prc/notifyCategoryProxy.I b/dtool/src/prc/notifyCategoryProxy.I index ae829eeedb..9a05f35625 100644 --- a/dtool/src/prc/notifyCategoryProxy.I +++ b/dtool/src/prc/notifyCategoryProxy.I @@ -70,11 +70,7 @@ template INLINE bool NotifyCategoryProxy:: is_spam() { // Instruct the compiler to optimize for the usual case. -#ifdef __GNUC__ - return __builtin_expect(get_unsafe_ptr()->is_spam(), 0); -#else - return get_unsafe_ptr()->is_spam(); -#endif + return UNLIKELY(get_unsafe_ptr()->is_spam()); } #else template @@ -92,11 +88,7 @@ template INLINE bool NotifyCategoryProxy:: is_debug() { // Instruct the compiler to optimize for the usual case. -#ifdef __GNUC__ - return __builtin_expect(get_unsafe_ptr()->is_debug(), 0); -#else - return get_unsafe_ptr()->is_debug(); -#endif + return UNLIKELY(get_unsafe_ptr()->is_debug()); } #else template From 5758fdf8f5a9390108322f390ca0534eae8badda Mon Sep 17 00:00:00 2001 From: Eric Klawitter Date: Mon, 9 Oct 2017 14:56:40 -0500 Subject: [PATCH 188/254] Fix 'of of' doc typos --- panda/src/collide/collisionBox.I | 2 +- panda/src/pgraph/clipPlaneAttrib.cxx | 2 +- panda/src/pgraph/lightAttrib.cxx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/panda/src/collide/collisionBox.I b/panda/src/collide/collisionBox.I index d35bfc906d..62c58cbceb 100644 --- a/panda/src/collide/collisionBox.I +++ b/panda/src/collide/collisionBox.I @@ -12,7 +12,7 @@ */ /** - * Create the Box by giving a Center and distances of of each of the sides of + * Create the Box by giving a Center and distances of each of the sides of * box from the Center. */ INLINE CollisionBox:: diff --git a/panda/src/pgraph/clipPlaneAttrib.cxx b/panda/src/pgraph/clipPlaneAttrib.cxx index 102ddf6ad3..2b45be735a 100644 --- a/panda/src/pgraph/clipPlaneAttrib.cxx +++ b/panda/src/pgraph/clipPlaneAttrib.cxx @@ -213,7 +213,7 @@ make_default() { /** * Returns the basic operation type of the ClipPlaneAttrib. If this is O_set, * the planes listed here completely replace any planes that were already on. - * If this is O_add, the planes here are added to the set of of planes that + * If this is O_add, the planes here are added to the set of planes that * were already on, and if O_remove, the planes here are removed from the set * of planes that were on. * diff --git a/panda/src/pgraph/lightAttrib.cxx b/panda/src/pgraph/lightAttrib.cxx index 21b5150dcc..86ec271e63 100644 --- a/panda/src/pgraph/lightAttrib.cxx +++ b/panda/src/pgraph/lightAttrib.cxx @@ -257,7 +257,7 @@ make_default() { /** * Returns the basic operation type of the LightAttrib. If this is O_set, the * lights listed here completely replace any lights that were already on. If - * this is O_add, the lights here are added to the set of of lights that were + * this is O_add, the lights here are added to the set of lights that were * already on, and if O_remove, the lights here are removed from the set of * lights that were on. * From 51d948a7faed06b9a9ffaa0811efb950a51e5586 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 13 Oct 2017 12:40:29 +0200 Subject: [PATCH 189/254] Support compilation for Python 3.7 --- direct/src/dcparser/dcPacker.cxx | 2 +- dtool/src/interrogate/interfaceMakerPythonNative.cxx | 6 +++--- makepanda/makepandacore.py | 2 ++ panda/src/gobj/internalName_ext.cxx | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/direct/src/dcparser/dcPacker.cxx b/direct/src/dcparser/dcPacker.cxx index fe3461a6c1..794d5e1690 100644 --- a/direct/src/dcparser/dcPacker.cxx +++ b/direct/src/dcparser/dcPacker.cxx @@ -708,7 +708,7 @@ pack_object(PyObject *object) { pack_int64(PyLong_AsLongLong(object)); #if PY_MAJOR_VERSION >= 3 } else if (PyUnicode_Check(object)) { - char *buffer; + const char *buffer; Py_ssize_t length; buffer = PyUnicode_AsUTF8AndSize(object, &length); if (buffer) { diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index 1d2f2900d8..e5a353eb51 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -4819,7 +4819,7 @@ write_function_instance(ostream &out, FunctionRemap *remap, << default_value->_str.size() << ";\n"; } } else { - indent(out, indent_level) << "char *" << param_name << "_str = NULL;\n"; + indent(out, indent_level) << "const char *" << param_name << "_str = NULL;\n"; indent(out, indent_level) << "Py_ssize_t " << param_name << "_len;\n"; } @@ -4828,7 +4828,7 @@ write_function_instance(ostream &out, FunctionRemap *remap, // As a special hack to fix pickling in Python 3, if the method name // starts with py_decode_, we take a bytes object instead of a str. if (remap->_cppfunc->get_local_name().substr(0, 10) == "py_decode_") { - indent(out, indent_level) << "if (PyBytes_AsStringAndSize(arg, &" + indent(out, indent_level) << "if (PyBytes_AsStringAndSize(arg, (char **)&" << param_name << "_str, &" << param_name << "_len) == -1) {\n"; indent(out, indent_level + 2) << param_name << "_str = NULL;\n"; indent(out, indent_level) << "}\n"; @@ -4838,7 +4838,7 @@ write_function_instance(ostream &out, FunctionRemap *remap, << param_name << "_len);\n"; } out << "#else\n"; // NB. PyString_AsStringAndSize also accepts a PyUnicode. - indent(out, indent_level) << "if (PyString_AsStringAndSize(arg, &" + indent(out, indent_level) << "if (PyString_AsStringAndSize(arg, (char **)&" << param_name << "_str, &" << param_name << "_len) == -1) {\n"; indent(out, indent_level + 2) << param_name << "_str = NULL;\n"; indent(out, indent_level) << "}\n"; diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 9425794121..6705c72a1f 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -2620,6 +2620,8 @@ def SetupBuildEnvironment(compiler): if os.path.isdir(pcbsd_inc): SYS_INC_DIRS.append(pcbsd_inc) + null.close() + # Print out the search paths if GetVerbose(): print("System library search path:") diff --git a/panda/src/gobj/internalName_ext.cxx b/panda/src/gobj/internalName_ext.cxx index 24c2852968..b98bcd9c12 100644 --- a/panda/src/gobj/internalName_ext.cxx +++ b/panda/src/gobj/internalName_ext.cxx @@ -26,7 +26,7 @@ make(PyUnicodeObject *str) { if (!PyUnicode_CHECK_INTERNED(str)) { // Not an interned string; don't bother. Py_ssize_t len = 0; - char *c_str = PyUnicode_AsUTF8AndSize((PyObject *)str, &len); + const char *c_str = PyUnicode_AsUTF8AndSize((PyObject *)str, &len); if (c_str == NULL) { return NULL; } @@ -43,7 +43,7 @@ make(PyUnicodeObject *str) { } else { Py_ssize_t len = 0; - char *c_str = PyUnicode_AsUTF8AndSize((PyObject *)str, &len); + const char *c_str = PyUnicode_AsUTF8AndSize((PyObject *)str, &len); string name(c_str, len); #else From 0db3d272479c50dde0496bc282907ec73b4a6e02 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 15 Oct 2017 17:06:59 +0200 Subject: [PATCH 190/254] ShaderGenerator: fix updating color of combine stages with CS_constant This also changes the function of TextureStage::uses_color(), which no longer incorporate TextureStage::involves_color_scale() Fixes: #177 --- panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx | 2 +- panda/src/gobj/textureStage.I | 3 +-- panda/src/pgraphnodes/shaderGenerator.cxx | 14 +++++++++----- panda/src/pgraphnodes/shaderGenerator.h | 1 + 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 4ad0250ee3..5b7ffce964 100644 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -4438,7 +4438,7 @@ set_texture_blend_mode(int i, const TextureStage *stage) { set_texture_stage_state(i, D3DTSS_RESULTARG, D3DTA_CURRENT); } - if (stage->uses_color()) { + if (stage->uses_color() || stage->involves_color_scale()) { // Set up the constant color for this stage. D3DCOLOR constant_color; diff --git a/panda/src/gobj/textureStage.I b/panda/src/gobj/textureStage.I index b00d47d699..c73c2d5338 100644 --- a/panda/src/gobj/textureStage.I +++ b/panda/src/gobj/textureStage.I @@ -658,8 +658,7 @@ update_color_flags() { _combine_alpha_source2 == CS_constant_color_scale))); _uses_color = - (_involves_color_scale || - _mode == M_blend || + (_mode == M_blend || (_mode == M_combine && (_combine_rgb_source0 == CS_constant || _combine_rgb_source1 == CS_constant || diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index b58ce1e777..0b4dc68a62 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -424,6 +424,11 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { info._stage = stage; } + // Does this stage need a texcolor_# input? + if (stage->uses_color()) { + info._flags |= ShaderKey::TF_uses_color; + } + key._textures.push_back(info); key._texture_flags |= info._flags; } @@ -827,7 +832,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { text << "\t uniform float4x4 texmat_" << i << ",\n"; } - if (tex._mode == TextureStage::M_blend) { + if (tex._flags & ShaderKey::TF_uses_color) { text << "\t uniform float4 texcolor_" << i << ",\n"; } } @@ -1562,10 +1567,9 @@ combine_source_as_string(CPT(TextureStage) stage, short num, bool alpha, bool si case TextureStage::CS_texture: csource << "tex" << texindex; break; - case TextureStage::CS_constant: { - LVecBase4 c = stage->get_color(); - csource << "float4(" << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << ")"; - break; } + case TextureStage::CS_constant: + csource << "texcolor_" << texindex; + break; case TextureStage::CS_primary_color: csource << "primary_color"; break; diff --git a/panda/src/pgraphnodes/shaderGenerator.h b/panda/src/pgraphnodes/shaderGenerator.h index ba2619bef7..dc68d90d66 100644 --- a/panda/src/pgraphnodes/shaderGenerator.h +++ b/panda/src/pgraphnodes/shaderGenerator.h @@ -110,6 +110,7 @@ protected: TF_map_height = 64, TF_map_glow = 128, TF_map_gloss = 256, + TF_uses_color = 512, }; ColorAttrib::Type _color_type; From bb60e8c373c4101f96f47568afbf609fe6782448 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 15 Oct 2017 18:48:53 +0200 Subject: [PATCH 191/254] display: fix segfault when output is removed during render Fixes: #176 --- panda/src/display/graphicsEngine.cxx | 4 ++-- panda/src/display/graphicsEngine.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index a9ce3abbcb..9c11fc9bdc 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -1271,7 +1271,7 @@ set_window_sort(GraphicsOutput *window, int sort) { * model begins with the "-" character. */ void GraphicsEngine:: -cull_and_draw_together(const GraphicsEngine::Windows &wlist, +cull_and_draw_together(GraphicsEngine::Windows wlist, Thread *current_thread) { PStatTimer timer(_cull_pcollector, current_thread); @@ -1380,7 +1380,7 @@ cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr, * drawing. */ void GraphicsEngine:: -cull_to_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) { +cull_to_bins(GraphicsEngine::Windows wlist, Thread *current_thread) { PStatTimer timer(_cull_pcollector, current_thread); _singular_warning_last_frame = _singular_warning_this_frame; diff --git a/panda/src/display/graphicsEngine.h b/panda/src/display/graphicsEngine.h index 04f0993dfa..1483fca068 100644 --- a/panda/src/display/graphicsEngine.h +++ b/panda/src/display/graphicsEngine.h @@ -142,11 +142,11 @@ private: void set_window_sort(GraphicsOutput *window, int sort); - void cull_and_draw_together(const Windows &wlist, Thread *current_thread); + void cull_and_draw_together(Windows wlist, Thread *current_thread); void cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread); - void cull_to_bins(const Windows &wlist, Thread *current_thread); + void cull_to_bins(Windows wlist, Thread *current_thread); void cull_to_bins(GraphicsOutput *win, GraphicsStateGuardian *gsg, DisplayRegion *dr, SceneSetup *scene_setup, CullResult *cull_result, Thread *current_thread); From dee8d83998b4cd863c9b1071b5f5cc8d4b9e8ad0 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 17 Oct 2017 21:18:51 +0200 Subject: [PATCH 192/254] interrogate: fix regression with setter of MAKE_PROPERTY2 See also tobspr/RenderPipeline#86 --- dtool/src/cppparser/cppBison.cxx.prebuilt | 4 ++-- dtool/src/cppparser/cppBison.yxx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dtool/src/cppparser/cppBison.cxx.prebuilt b/dtool/src/cppparser/cppBison.cxx.prebuilt index c8b8754035..f93ae67fdd 100644 --- a/dtool/src/cppparser/cppBison.cxx.prebuilt +++ b/dtool/src/cppparser/cppBison.cxx.prebuilt @@ -4420,9 +4420,9 @@ yyreduce: make_property->_has_function = hasser->as_function_group(); } - CPPDeclaration *setter = (yyvsp[-6].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = (yyvsp[-4].u.identifier)->find_symbol(current_scope, global_scope, current_lexer); if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("reference to non-existent or invalid setter: " + (yyvsp[-6].u.identifier)->get_fully_scoped_name(), (yylsp[-6])); + yyerror("reference to non-existent or invalid setter: " + (yyvsp[-4].u.identifier)->get_fully_scoped_name(), (yylsp[-4])); } else { make_property->_set_function = setter->as_function_group(); } diff --git a/dtool/src/cppparser/cppBison.yxx b/dtool/src/cppparser/cppBison.yxx index 00e5c87397..1bf3f3860a 100644 --- a/dtool/src/cppparser/cppBison.yxx +++ b/dtool/src/cppparser/cppBison.yxx @@ -793,9 +793,9 @@ declaration: make_property->_has_function = hasser->as_function_group(); } - CPPDeclaration *setter = $7->find_symbol(current_scope, global_scope, current_lexer); + CPPDeclaration *setter = $9->find_symbol(current_scope, global_scope, current_lexer); if (setter == nullptr || setter->get_subtype() != CPPDeclaration::ST_function_group) { - yyerror("reference to non-existent or invalid setter: " + $7->get_fully_scoped_name(), @7); + yyerror("reference to non-existent or invalid setter: " + $9->get_fully_scoped_name(), @9); } else { make_property->_set_function = setter->as_function_group(); } From 8078fa2b38d0b214c0eab98e8bbf7cfd400cc083 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 17 Oct 2017 21:29:03 +0200 Subject: [PATCH 193/254] More efficiently store SimpleHashMap with empty values --- panda/src/pgraph/renderAttrib.cxx | 2 +- panda/src/pgraph/renderAttrib.h | 4 +- panda/src/pgraph/renderAttribRegistry.cxx | 2 +- panda/src/pgraph/renderState.cxx | 4 +- panda/src/pgraph/renderState.h | 4 +- panda/src/pgraph/transformState.cxx | 2 +- panda/src/pgraph/transformState.h | 4 +- panda/src/putil/simpleHashMap.I | 29 +++++++--- panda/src/putil/simpleHashMap.h | 70 +++++++++++++++++------ 9 files changed, 79 insertions(+), 42 deletions(-) diff --git a/panda/src/pgraph/renderAttrib.cxx b/panda/src/pgraph/renderAttrib.cxx index 37b65f3b2a..385d7ee740 100644 --- a/panda/src/pgraph/renderAttrib.cxx +++ b/panda/src/pgraph/renderAttrib.cxx @@ -389,7 +389,7 @@ return_unique(RenderAttrib *attrib) { // deleted while it's in it. attrib->ref(); } - si = _attribs->store(attrib, Empty()); + si = _attribs->store(attrib, nullptr); // Save the index and return the input attrib. attrib->_saved_entry = si; diff --git a/panda/src/pgraph/renderAttrib.h b/panda/src/pgraph/renderAttrib.h index aaa537ee5f..5bf54cf32f 100644 --- a/panda/src/pgraph/renderAttrib.h +++ b/panda/src/pgraph/renderAttrib.h @@ -185,9 +185,7 @@ public: private: // This mutex protects _attribs. static LightReMutex *_attribs_lock; - class Empty { - }; - typedef SimpleHashMap > Attribs; + typedef SimpleHashMap > Attribs; static Attribs *_attribs; int _saved_entry; diff --git a/panda/src/pgraph/renderAttribRegistry.cxx b/panda/src/pgraph/renderAttribRegistry.cxx index cd011e838d..4c27e4c0a7 100644 --- a/panda/src/pgraph/renderAttribRegistry.cxx +++ b/panda/src/pgraph/renderAttribRegistry.cxx @@ -93,7 +93,7 @@ register_slot(TypeHandle type_handle, int sort, RenderAttrib *default_attrib) { // If this attribute was already registered, something odd is going on. nassertr(RenderAttrib::_attribs->find(default_attrib) == -1, 0); default_attrib->_saved_entry = - RenderAttrib::_attribs->store(default_attrib, RenderAttrib::Empty()); + RenderAttrib::_attribs->store(default_attrib, nullptr); } // It effectively lives forever. Might as well make it official. diff --git a/panda/src/pgraph/renderState.cxx b/panda/src/pgraph/renderState.cxx index ee53a7d4a4..1aad1ed25c 100644 --- a/panda/src/pgraph/renderState.cxx +++ b/panda/src/pgraph/renderState.cxx @@ -1338,7 +1338,7 @@ return_unique(RenderState *state) { // deleted while it's in it. state->cache_ref(); } - si = _states->store(state, Empty()); + si = _states->store(state, nullptr); // Save the index and return the input state. state->_saved_entry = si; @@ -1865,7 +1865,7 @@ init_states() { // is declared globally, and lives forever. RenderState *state = new RenderState; state->local_object(); - state->_saved_entry = _states->store(state, Empty()); + state->_saved_entry = _states->store(state, nullptr); _empty_state = state; } diff --git a/panda/src/pgraph/renderState.h b/panda/src/pgraph/renderState.h index aa337bbb04..a7dc550625 100644 --- a/panda/src/pgraph/renderState.h +++ b/panda/src/pgraph/renderState.h @@ -227,9 +227,7 @@ private: // cache, which is encoded in _composition_cache and // _invert_composition_cache. static LightReMutex *_states_lock; - class Empty { - }; - typedef SimpleHashMap > States; + typedef SimpleHashMap > States; static States *_states; static const RenderState *_empty_state; diff --git a/panda/src/pgraph/transformState.cxx b/panda/src/pgraph/transformState.cxx index 3c28e358bf..bff497298e 100644 --- a/panda/src/pgraph/transformState.cxx +++ b/panda/src/pgraph/transformState.cxx @@ -1512,7 +1512,7 @@ return_unique(TransformState *state) { // deleted while it's in it. state->cache_ref(); } - si = _states->store(state, Empty()); + si = _states->store(state, nullptr); // Save the index and return the input state. state->_saved_entry = si; diff --git a/panda/src/pgraph/transformState.h b/panda/src/pgraph/transformState.h index b4efd5abf3..b770e7bf52 100644 --- a/panda/src/pgraph/transformState.h +++ b/panda/src/pgraph/transformState.h @@ -253,9 +253,7 @@ private: // cache, which is encoded in _composition_cache and // _invert_composition_cache. static LightReMutex *_states_lock; - class Empty { - }; - typedef SimpleHashMap > States; + typedef SimpleHashMap > States; static States *_states; static CPT(TransformState) _identity_state; static CPT(TransformState) _invalid_state; diff --git a/panda/src/putil/simpleHashMap.I b/panda/src/putil/simpleHashMap.I index 5f797dfde1..dc954bac97 100644 --- a/panda/src/putil/simpleHashMap.I +++ b/panda/src/putil/simpleHashMap.I @@ -128,7 +128,7 @@ store(const Key &key, const Value &data) { } if (is_element(index, key)) { // This element is already in the map; replace the data at that key. - _table[index]._data = data; + set_data(index, data); #ifdef _DEBUG nassertr(validate(), index); #endif @@ -151,7 +151,7 @@ store(const Key &key, const Value &data) { return index; } if (is_element(index, key)) { - _table[index]._data = data; + set_data(index, data); #ifdef _DEBUG nassertr(validate(), index); #endif @@ -200,8 +200,7 @@ remove(const Key &key) { // Swap it with the last one, so that we don't get any gaps in the table // of entries. - _table[index]._key = move(_table[last]._key); - _table[index]._data = move(_table[last]._data); + _table[index] = move(_table[last]); index_array[(size_t)other_slot] = index; } @@ -311,8 +310,8 @@ get_key(size_t n) const { template INLINE const Value &SimpleHashMap:: get_data(size_t n) const { - nassertr(n < _num_entries, _table[n]._data); - return _table[n]._data; + nassertr(n < _num_entries, _table[n].get_data()); + return _table[n].get_data(); } /** @@ -323,8 +322,8 @@ get_data(size_t n) const { template INLINE Value &SimpleHashMap:: modify_data(size_t n) { - nassertr(n < _num_entries, _table[n]._data); - return _table[n]._data; + nassertr(n < _num_entries, _table[n].modify_data()); + return _table[n].modify_data(); } /** @@ -336,7 +335,19 @@ template INLINE void SimpleHashMap:: set_data(size_t n, const Value &data) { nassertv(n < _num_entries); - _table[n]._data = data; + _table[n].set_data(data); +} + +/** + * Changes the data for the nth entry of the table. + * + * @param n should be in the range 0 <= n < size(). + */ +template +INLINE void SimpleHashMap:: +set_data(size_t n, Value &&data) { + nassertv(n < _num_entries); + _table[n].set_data(move(data)); } /** diff --git a/panda/src/putil/simpleHashMap.h b/panda/src/putil/simpleHashMap.h index d7d6aaa7fc..c7914e4206 100644 --- a/panda/src/putil/simpleHashMap.h +++ b/panda/src/putil/simpleHashMap.h @@ -18,6 +18,52 @@ #include "pvector.h" #include "config_util.h" +/** + * Entry in the SimpleHashMap. + */ +template +class SimpleKeyValuePair { +public: + INLINE SimpleKeyValuePair(const Key &key, const Value &data) : + _key(key), + _data(data) {} + + Key _key; + + ALWAYS_INLINE const Value &get_data() const { + return _data; + } + ALWAYS_INLINE Value &modify_data() { + return _data; + } + ALWAYS_INLINE void set_data(const Value &data) { + _data = data; + } + ALWAYS_INLINE void set_data(Value &&data) { + _data = move(data); + } + +private: + Value _data; +}; + +/** + * Specialisation of SimpleKeyValuePair to not waste memory for nullptr_t + * values. This allows effectively using SimpleHashMap as a set. + */ +template +class SimpleKeyValuePair { +public: + INLINE SimpleKeyValuePair(const Key &key, nullptr_t data) : + _key(key) {} + + Key _key; + + ALWAYS_INLINE_CONSTEXPR static nullptr_t get_data() { return nullptr; } + ALWAYS_INLINE_CONSTEXPR static nullptr_t modify_data() { return nullptr; } + ALWAYS_INLINE static void set_data(nullptr_t) {} +}; + /** * This template class implements an unordered map of keys to data, * implemented as a hashtable. It is similar to STL's hash_map, but @@ -28,6 +74,8 @@ * (d) it allows for efficient iteration over the entries, * (e) permits removal and resizing during forward iteration, and * (f) it has a constexpr constructor. + * + * It can also be used as a set, by using nullptr_t as Value typename. */ template > > class SimpleHashMap { @@ -55,6 +103,7 @@ public: INLINE const Value &get_data(size_t n) const; INLINE Value &modify_data(size_t n); INLINE void set_data(size_t n, const Value &data); + INLINE void set_data(size_t n, Value &&data); void remove_element(size_t n); INLINE size_t get_num_entries() const; @@ -67,8 +116,6 @@ public: INLINE bool consider_shrink_table(); private: - class TableEntry; - INLINE size_t get_hash(const Key &key) const; INLINE size_t next_hash(size_t hash) const; @@ -82,23 +129,8 @@ private: INLINE bool consider_expand_table(); void resize_table(size_t new_size); - class TableEntry { - public: - INLINE TableEntry(const Key &key, const Value &data) : - _key(key), - _data(data) {} - INLINE TableEntry(const TableEntry ©) : - _key(copy._key), - _data(copy._data) {} -#ifdef USE_MOVE_SEMANTICS - INLINE TableEntry(TableEntry &&from) NOEXCEPT : - _key(move(from._key)), - _data(move(from._data)) {} -#endif - Key _key; - Value _data; - }; - +public: + typedef SimpleKeyValuePair TableEntry; TableEntry *_table; DeletedBufferChain *_deleted_chain; size_t _table_size; From 6ecfcb1fd355707c0031cff5a13e0493346e02e2 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 17 Oct 2017 23:21:38 +0200 Subject: [PATCH 194/254] Store munged states more efficiently, without weak key maps --- panda/src/display/graphicsStateGuardian.cxx | 24 ++++++++++++++++--- panda/src/gsgbase/graphicsStateGuardianBase.h | 2 ++ panda/src/pgraph/renderState.cxx | 1 + panda/src/pgraph/renderState.h | 10 +++++--- panda/src/pgraph/stateMunger.cxx | 13 ++++++---- panda/src/pgraph/stateMunger.h | 2 -- 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index f0d807ffce..9d368467f8 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -281,6 +281,11 @@ GraphicsStateGuardian(CoordinateSystem internal_coordinate_system, _gamma = 1.0f; _texture_quality_override = Texture::QL_default; + + // Give it a unique identifier. Unlike a pointer, we can guarantee that + // this value will never be reused. + static size_t next_index = 0; + _id = next_index++; } /** @@ -290,6 +295,19 @@ GraphicsStateGuardian:: ~GraphicsStateGuardian() { remove_gsg(this); GeomMunger::unregister_mungers_for_gsg(this); + + // Remove the munged states for this GSG. This requires going through all + // states, although destructing a GSG should be rare enough for this not to + // matter too much. + // Note that if uniquify-states is false, we can't iterate over all the + // states, and some GSGs will linger. Let's hope this isn't a problem. + LightReMutexHolder holder(*RenderState::_states_lock); + size_t size = RenderState::_states->get_num_entries(); + for (size_t si = 0; si < size; ++si) { + const RenderState *state = RenderState::_states->get_key(si); + state->_mungers.remove(_id); + state->_munged_states.remove(_id); + } } /** @@ -743,7 +761,7 @@ get_geom_munger(const RenderState *state, Thread *current_thread) { // multiple times during a frame. Also, this might well be the only GSG // in the world anyway. int mi = state->_last_mi; - if (mi >= 0 && mungers.has_element(mi) && mungers.get_key(mi) == this) { + if (mi >= 0 && mi < mungers.get_num_entries() && mungers.get_key(mi) == _id) { PT(GeomMunger) munger = mungers.get_data(mi); if (munger->is_registered()) { return munger; @@ -751,7 +769,7 @@ get_geom_munger(const RenderState *state, Thread *current_thread) { } // Nope, we have to look it up in the map. - mi = mungers.find(this); + mi = mungers.find(_id); if (mi >= 0) { PT(GeomMunger) munger = mungers.get_data(mi); if (munger->is_registered()) { @@ -769,7 +787,7 @@ get_geom_munger(const RenderState *state, Thread *current_thread) { nassertr(munger != (GeomMunger *)NULL && munger->is_registered(), munger); nassertr(munger->is_of_type(StateMunger::get_class_type()), munger); - state->_last_mi = mungers.store(this, munger); + state->_last_mi = mungers.store(_id, munger); return munger; } diff --git a/panda/src/gsgbase/graphicsStateGuardianBase.h b/panda/src/gsgbase/graphicsStateGuardianBase.h index 361407ec6c..f86d39a8a3 100644 --- a/panda/src/gsgbase/graphicsStateGuardianBase.h +++ b/panda/src/gsgbase/graphicsStateGuardianBase.h @@ -235,6 +235,8 @@ public: static void add_gsg(GraphicsStateGuardianBase *gsg); static void remove_gsg(GraphicsStateGuardianBase *gsg); + size_t _id; + private: struct GSGList { LightMutex _lock; diff --git a/panda/src/pgraph/renderState.cxx b/panda/src/pgraph/renderState.cxx index 1aad1ed25c..6f035a6557 100644 --- a/panda/src/pgraph/renderState.cxx +++ b/panda/src/pgraph/renderState.cxx @@ -987,6 +987,7 @@ clear_munger_cache() { for (size_t si = 0; si < size; ++si) { RenderState *state = (RenderState *)(_states->get_key(si)); state->_mungers.clear(); + state->_munged_states.clear(); state->_last_mi = -1; } } diff --git a/panda/src/pgraph/renderState.h b/panda/src/pgraph/renderState.h index a7dc550625..4e2b2e3384 100644 --- a/panda/src/pgraph/renderState.h +++ b/panda/src/pgraph/renderState.h @@ -30,10 +30,8 @@ #include "lightMutex.h" #include "deletedChain.h" #include "simpleHashMap.h" -#include "weakKeyHashMap.h" #include "cacheStats.h" #include "renderAttribRegistry.h" -#include "graphicsStateGuardianBase.h" class FactoryParams; class ShaderAttrib; @@ -264,10 +262,15 @@ private: // in the RenderState pointer than vice-versa, since there are likely to be // far fewer GSG's than RenderStates. The code to manage this map lives in // GraphicsStateGuardian::get_geom_munger(). - typedef WeakKeyHashMap Mungers; + typedef SimpleHashMap Mungers; mutable Mungers _mungers; mutable int _last_mi; + // Similarly, this is a cache of munged states. This map is managed by + // StateMunger::munge_state(). + typedef SimpleHashMap MungedStates; + mutable MungedStates _munged_states; + // This is used to mark nodes as we visit them to detect cycles. UpdateSeq _cycle_detect; static UpdateSeq _last_cycle_detect; @@ -360,6 +363,7 @@ private: friend class GraphicsStateGuardian; friend class RenderAttribRegistry; friend class Extension; + friend class StateMunger; }; // We can safely redefine this as a no-op. diff --git a/panda/src/pgraph/stateMunger.cxx b/panda/src/pgraph/stateMunger.cxx index c57366133d..db94c81ba8 100644 --- a/panda/src/pgraph/stateMunger.cxx +++ b/panda/src/pgraph/stateMunger.cxx @@ -27,15 +27,20 @@ StateMunger:: */ CPT(RenderState) StateMunger:: munge_state(const RenderState *state) { - int mi = _state_map.find(state); + RenderState::MungedStates &munged_states = state->_munged_states; + + int id = get_gsg()->_id; + int mi = munged_states.find(id); if (mi != -1) { - if (!_state_map.get_data(mi).was_deleted()) { - return _state_map.get_data(mi).p(); + if (!munged_states.get_data(mi).was_deleted()) { + return munged_states.get_data(mi).p(); + } else { + munged_states.remove_element(mi); } } CPT(RenderState) result = munge_state_impl(state); - _state_map.store(state, result.p()); + munged_states.store(id, result.p()); return result; } diff --git a/panda/src/pgraph/stateMunger.h b/panda/src/pgraph/stateMunger.h index b246d67413..467eaaf604 100644 --- a/panda/src/pgraph/stateMunger.h +++ b/panda/src/pgraph/stateMunger.h @@ -33,8 +33,6 @@ public: protected: virtual CPT(RenderState) munge_state_impl(const RenderState *state); - typedef WeakKeyHashMap StateMap; - StateMap _state_map; public: static TypeHandle get_class_type() { From 410049fd4baeb5aa665548cc0e60f7770618d5dc Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 18 Oct 2017 11:10:11 +0200 Subject: [PATCH 195/254] Improvements for ShaderGenerator-based programs: * Disable state munger, which isn't needed * Reflect updates to TextureStage properties (Fixes #178) * Also respect combine mode and rgb scale changes * Allow rehashing and clearing generated shader cache State munger is now disabled whenever any shader is applied. Panda assumes that any custom shader will apply color scale by itself. --- panda/src/display/graphicsStateGuardian.cxx | 50 +++ panda/src/display/graphicsStateGuardian.h | 3 + panda/src/display/standardMunger.cxx | 51 +-- panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx | 2 +- .../glstuff/glGraphicsStateGuardian_src.cxx | 9 +- panda/src/gobj/textureStage.I | 73 +++- panda/src/gobj/textureStage.cxx | 4 +- panda/src/gobj/textureStage.h | 7 +- .../src/gsgbase/graphicsStateGuardianBase.cxx | 1 + panda/src/gsgbase/graphicsStateGuardianBase.h | 11 + panda/src/pgraph/config_pgraph.cxx | 2 +- panda/src/pgraph/cullableObject.cxx | 11 +- panda/src/pgraph/renderState.h | 2 + panda/src/pgraph/stateMunger.I | 11 +- panda/src/pgraph/stateMunger.h | 3 + panda/src/pgraphnodes/shaderGenerator.cxx | 327 +++++++++++------- panda/src/pgraphnodes/shaderGenerator.h | 54 +-- 17 files changed, 421 insertions(+), 200 deletions(-) diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 9d368467f8..f4672a0198 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -3039,6 +3039,19 @@ determine_target_texture() { nassertv(_target_texture->get_num_on_stages() <= max_texture_stages); } +/** + * Assigns _target_shader based on the _target_rs. + */ +void GraphicsStateGuardian:: +determine_target_shader() { + if (_target_rs->_generated_shader != nullptr) { + _target_shader = (const ShaderAttrib *)_target_rs->_generated_shader.p(); + } else { + _target_shader = (const ShaderAttrib *) + _target_rs->get_attrib_def(ShaderAttrib::get_class_slot()); + } +} + /** * Frees some memory that was explicitly allocated within the glgsg. */ @@ -3382,6 +3395,43 @@ make_shadow_buffer(const NodePath &light_np, GraphicsOutputBase *host) { return tex; } +/** + * Ensures that an appropriate shader has been generated for the given state. + * This is stored in the _generated_shader field on the RenderState. + */ +void GraphicsStateGuardian:: +ensure_generated_shader(const RenderState *state) { +#ifdef HAVE_CG + const ShaderAttrib *shader_attrib; + state->get_attrib_def(shader_attrib); + + if (shader_attrib->auto_shader()) { + if (_shader_generator == nullptr) { + if (!_supports_basic_shaders) { + return; + } + _shader_generator = new ShaderGenerator(this); + } + if (state->_generated_shader == nullptr || + state->_generated_shader_seq != _generated_shader_seq) { + GeomVertexAnimationSpec spec; + + // Currently we overload this flag to request vertex animation for the + // shader generator. + const ShaderAttrib *sattr; + state->get_attrib_def(sattr); + if (sattr->get_flag(ShaderAttrib::F_hardware_skinning)) { + spec.set_hardware(4, true); + } + + // Cache the generated ShaderAttrib on the shader state. + state->_generated_shader = _shader_generator->synthesize_shader(state, spec); + state->_generated_shader_seq = _generated_shader_seq; + } + } +#endif +} + /** * Returns true if the GSG implements the extension identified by the given * string. This currently is only implemented by the OpenGL back-end. diff --git a/panda/src/display/graphicsStateGuardian.h b/panda/src/display/graphicsStateGuardian.h index 305a8d62e0..52cae8ff28 100644 --- a/panda/src/display/graphicsStateGuardian.h +++ b/panda/src/display/graphicsStateGuardian.h @@ -426,6 +426,8 @@ public: PT(Texture) get_dummy_shadow_map(Texture::TextureType texture_type) const; PT(Texture) make_shadow_buffer(const NodePath &light_np, GraphicsOutputBase *host); + virtual void ensure_generated_shader(const RenderState *state); + #ifdef DO_PSTATS static void init_frame_pstats(); #endif @@ -446,6 +448,7 @@ protected: virtual void end_bind_clip_planes(); void determine_target_texture(); + void determine_target_shader(); virtual void free_pointers(); virtual void close_gsg(); diff --git a/panda/src/display/standardMunger.cxx b/panda/src/display/standardMunger.cxx index 1cb64189da..cdc2f0bda3 100644 --- a/panda/src/display/standardMunger.cxx +++ b/panda/src/display/standardMunger.cxx @@ -38,7 +38,17 @@ StandardMunger(GraphicsStateGuardianBase *gsg, const RenderState *state, _auto_shader(false), _shader_skinning(false) { - if (!get_gsg()->get_runtime_color_scale()) { + const ShaderAttrib *shader_attrib; + state->get_attrib_def(shader_attrib); +#ifdef HAVE_CG + _auto_shader = shader_attrib->auto_shader(); +#endif + if (shader_attrib->get_flag(ShaderAttrib::F_hardware_skinning)) { + _shader_skinning = true; + } + + if (!get_gsg()->get_runtime_color_scale() && !_auto_shader && + shader_attrib->get_shader() == nullptr) { // We might need to munge the colors. const ColorAttrib *color_attrib; const ColorScaleAttrib *color_scale_attrib; @@ -60,6 +70,7 @@ StandardMunger(GraphicsStateGuardianBase *gsg, const RenderState *state, _color[3] * cs[3]); } _munge_color = true; + _should_munge_state = true; } } else if (state->get_attrib(color_scale_attrib) && @@ -74,6 +85,7 @@ StandardMunger(GraphicsStateGuardianBase *gsg, const RenderState *state, if ((color_scale_attrib->has_rgb_scale() && !get_gsg()->get_color_scale_via_lighting()) || (color_scale_attrib->has_alpha_scale() && !get_gsg()->get_alpha_scale_via_texture(tex_attrib))) { _munge_color_scale = true; + _should_munge_state = true; } // Known bug: if there is a material on an object that would obscure the @@ -82,15 +94,6 @@ StandardMunger(GraphicsStateGuardianBase *gsg, const RenderState *state, // effort to detect this contrived situation and handle it correctly. } } - - const ShaderAttrib *shader_attrib = (const ShaderAttrib *) - state->get_attrib_def(ShaderAttrib::get_class_slot()); - if (shader_attrib->auto_shader()) { - _auto_shader = true; - } - if (shader_attrib->get_flag(ShaderAttrib::F_hardware_skinning)) { - _shader_skinning = true; - } } /** @@ -341,33 +344,5 @@ munge_state_impl(const RenderState *state) { munged_state = munged_state->remove_attrib(ColorScaleAttrib::get_class_slot()); } -#ifdef HAVE_CG - if (_auto_shader) { - GraphicsStateGuardian *gsg = get_gsg(); - ShaderGenerator *shader_generator = gsg->get_shader_generator(); - if (shader_generator == nullptr) { - shader_generator = new ShaderGenerator(gsg); - gsg->set_shader_generator(shader_generator); - } - if (munged_state->_generated_shader == nullptr) { - // Cache the generated ShaderAttrib on the shader state. - GeomVertexAnimationSpec spec; - - // Currently we overload this flag to request vertex animation for the - // shader generator. - const ShaderAttrib *sattr; - munged_state->get_attrib_def(sattr); - if (sattr->get_flag(ShaderAttrib::F_hardware_skinning)) { - spec.set_hardware(4, true); - } - - munged_state->_generated_shader = shader_generator->synthesize_shader(munged_state, spec); - } - if (munged_state->_generated_shader != nullptr) { - munged_state = munged_state->set_attrib(munged_state->_generated_shader); - } - } -#endif - return munged_state; } diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index 5b7ffce964..b51d67c564 100644 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -3074,7 +3074,7 @@ set_state_and_transform(const RenderState *target, } _target_rs = target; - _target_shader = DCAST(ShaderAttrib, _target_rs->get_attrib_def(ShaderAttrib::get_class_slot())); + determine_target_shader(); int alpha_test_slot = AlphaTestAttrib::get_class_slot(); if (_target_rs->get_attrib(alpha_test_slot) != _state_rs->get_attrib(alpha_test_slot) || diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 305f7e3aab..45450ae98d 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -174,7 +174,7 @@ static const string default_vshader = "void main(void) {\n" " gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex;\n" " texcoord = p3d_MultiTexCoord0;\n" - " color = p3d_Color;\n" + " color = p3d_Color * p3d_ColorScale;\n" "}\n"; static const string default_fshader = @@ -3127,6 +3127,10 @@ reset() { } #endif + // Do we guarantee that we can apply the color scale via a shader? We set + // this false if there is a chance that the fixed-function pipeline is used. + _runtime_color_scale = !has_fixed_function_pipeline(); + #ifndef OPENGLES if (_gl_shadlang_ver_major >= 4 || has_extension("GL_NV_gpu_program5")) { // gp5fp - OpenGL fragment profile for GeForce 400 Series and up @@ -10341,8 +10345,7 @@ set_state_and_transform(const RenderState *target, _target_rs = target; #ifndef OPENGLES_1 - _target_shader = (const ShaderAttrib *) - _target_rs->get_attrib_def(ShaderAttrib::get_class_slot()); + determine_target_shader(); _instance_count = _target_shader->get_instance_count(); if (_target_shader != _state_shader) { diff --git a/panda/src/gobj/textureStage.I b/panda/src/gobj/textureStage.I index c73c2d5338..cc977c99c1 100644 --- a/panda/src/gobj/textureStage.I +++ b/panda/src/gobj/textureStage.I @@ -15,7 +15,7 @@ * Initialize the texture stage from other */ INLINE TextureStage:: -TextureStage(TextureStage ©) { +TextureStage(const TextureStage ©) { (*this) = copy; } @@ -52,6 +52,10 @@ set_sort(int sort) { // Update the global flag to indicate that all TextureAttribs in the world // must now re-sort their lists. _sort_seq++; + + if (_used_by_auto_shader) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } } /** @@ -80,6 +84,10 @@ set_priority(int priority) { // Update the global flag to indicate that all TextureAttribs in the world // must now re-sort their lists. _sort_seq++; + + if (_used_by_auto_shader) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } } /** @@ -99,7 +107,13 @@ get_priority() const { */ INLINE void TextureStage:: set_texcoord_name(InternalName *name) { - _texcoord_name = name; + if (name != _texcoord_name) { + _texcoord_name = name; + + if (_used_by_auto_shader) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } + } } /** @@ -108,7 +122,7 @@ set_texcoord_name(InternalName *name) { */ INLINE void TextureStage:: set_texcoord_name(const string &name) { - _texcoord_name = InternalName::get_texcoord_name(name); + set_texcoord_name(InternalName::get_texcoord_name(name)); } /** @@ -150,13 +164,16 @@ get_binormal_name() const { */ INLINE void TextureStage:: set_mode(TextureStage::Mode mode) { - _mode = mode; + if (mode != _mode) { + _mode = mode; - if (_mode != M_combine) { - _num_combine_rgb_operands = 0; - _num_combine_alpha_operands = 0; + if (_mode != M_combine) { + _num_combine_rgb_operands = 0; + _num_combine_alpha_operands = 0; + } + + update_color_flags(); } - update_color_flags(); } /** @@ -202,8 +219,14 @@ get_color() const { */ INLINE void TextureStage:: set_rgb_scale(int rgb_scale) { - nassertv(rgb_scale == 1 || rgb_scale == 2 || rgb_scale == 4); - _rgb_scale = rgb_scale; + if (rgb_scale != _rgb_scale) { + nassertv(rgb_scale == 1 || rgb_scale == 2 || rgb_scale == 4); + _rgb_scale = rgb_scale; + + if (_used_by_auto_shader) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } + } } /** @@ -222,8 +245,14 @@ get_rgb_scale() const { */ INLINE void TextureStage:: set_alpha_scale(int alpha_scale) { - nassertv(alpha_scale == 1 || alpha_scale == 2 || alpha_scale == 4); - _alpha_scale = alpha_scale; + if (alpha_scale != _alpha_scale) { + nassertv(alpha_scale == 1 || alpha_scale == 2 || alpha_scale == 4); + _alpha_scale = alpha_scale; + + if (_used_by_auto_shader) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } + } } /** @@ -247,7 +276,13 @@ get_alpha_scale() const { */ INLINE void TextureStage:: set_saved_result(bool saved_result) { - _saved_result = saved_result; + if (saved_result != _saved_result) { + _saved_result = saved_result; + + if (_used_by_auto_shader) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } + } } /** @@ -641,6 +676,14 @@ get_sort_seq() { return _sort_seq; } +/** + * Marks this TextureStage as having been used by the auto shader. + */ +INLINE void TextureStage:: +mark_used_by_auto_shader() const { + _used_by_auto_shader = true; +} + /** * Updates _uses_color, _involves_color_scale, _uses_primary_color and * _uses_last_saved_result appropriately. @@ -684,6 +727,10 @@ update_color_flags() { _combine_alpha_source0 == CS_last_saved_result || _combine_alpha_source1 == CS_last_saved_result || _combine_alpha_source2 == CS_last_saved_result)); + + if (_used_by_auto_shader) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } } INLINE ostream & diff --git a/panda/src/gobj/textureStage.cxx b/panda/src/gobj/textureStage.cxx index 708b6d140d..120bb4feb3 100644 --- a/panda/src/gobj/textureStage.cxx +++ b/panda/src/gobj/textureStage.cxx @@ -25,7 +25,7 @@ TypeHandle TextureStage::_type_handle; * Initialize the texture stage at construction */ TextureStage:: -TextureStage(const string &name) { +TextureStage(const string &name) : _used_by_auto_shader(false) { _name = name; _sort = 0; _priority = 0; @@ -90,6 +90,8 @@ operator = (const TextureStage &other) { _uses_color = other._uses_color; _involves_color_scale = other._involves_color_scale; + + _used_by_auto_shader = false; } /** diff --git a/panda/src/gobj/textureStage.h b/panda/src/gobj/textureStage.h index ccaa32e5d0..2414e72991 100644 --- a/panda/src/gobj/textureStage.h +++ b/panda/src/gobj/textureStage.h @@ -21,6 +21,7 @@ #include "typedWritableReferenceCount.h" #include "updateSeq.h" #include "luse.h" +#include "graphicsStateGuardianBase.h" class FactoryParams; @@ -34,7 +35,7 @@ class FactoryParams; class EXPCL_PANDA_GOBJ TextureStage : public TypedWritableReferenceCount { PUBLISHED: explicit TextureStage(const string &name); - INLINE TextureStage(TextureStage ©); + INLINE TextureStage(const TextureStage ©); void operator = (const TextureStage ©); virtual ~TextureStage(); @@ -206,6 +207,8 @@ PUBLISHED: public: INLINE static UpdateSeq get_sort_seq(); + INLINE void mark_used_by_auto_shader() const; + private: INLINE void update_color_flags(); @@ -249,6 +252,8 @@ private: static PT(TextureStage) _default_stage; static UpdateSeq _sort_seq; + mutable bool _used_by_auto_shader; + public: // Datagram stuff static void register_with_read_factory(); diff --git a/panda/src/gsgbase/graphicsStateGuardianBase.cxx b/panda/src/gsgbase/graphicsStateGuardianBase.cxx index aa23375418..fefd8037f2 100644 --- a/panda/src/gsgbase/graphicsStateGuardianBase.cxx +++ b/panda/src/gsgbase/graphicsStateGuardianBase.cxx @@ -16,6 +16,7 @@ #include AtomicAdjust::Pointer GraphicsStateGuardianBase::_gsg_list; +UpdateSeq GraphicsStateGuardianBase::_generated_shader_seq; TypeHandle GraphicsStateGuardianBase::_type_handle; /** diff --git a/panda/src/gsgbase/graphicsStateGuardianBase.h b/panda/src/gsgbase/graphicsStateGuardianBase.h index f86d39a8a3..45bf35b958 100644 --- a/panda/src/gsgbase/graphicsStateGuardianBase.h +++ b/panda/src/gsgbase/graphicsStateGuardianBase.h @@ -223,6 +223,14 @@ public: virtual void bind_light(Spotlight *light_obj, const NodePath &light, int light_id) { } + virtual void ensure_generated_shader(const RenderState *state)=0; + + static void mark_rehash_generated_shaders() { +#ifdef HAVE_CG + ++_generated_shader_seq; +#endif + } + PUBLISHED: static GraphicsStateGuardianBase *get_default_gsg(); static void set_default_gsg(GraphicsStateGuardianBase *default_gsg); @@ -247,6 +255,9 @@ private: }; static AtomicAdjust::Pointer _gsg_list; +protected: + static UpdateSeq _generated_shader_seq; + public: static TypeHandle get_class_type() { return _type_handle; diff --git a/panda/src/pgraph/config_pgraph.cxx b/panda/src/pgraph/config_pgraph.cxx index f481a2aeb1..237c1d0011 100644 --- a/panda/src/pgraph/config_pgraph.cxx +++ b/panda/src/pgraph/config_pgraph.cxx @@ -227,7 +227,7 @@ ConfigVariableBool uniquify_states "are pointerwise equal. This may improve caching performance, " "but also adds additional overhead to maintain the cache, " "including the need to check for a composition cycle in " - "the cache.")); + "the cache. It is highly recommended to keep this on.")); ConfigVariableBool uniquify_attribs ("uniquify-attribs", true, diff --git a/panda/src/pgraph/cullableObject.cxx b/panda/src/pgraph/cullableObject.cxx index 0630513696..d38fc4f5a4 100644 --- a/panda/src/pgraph/cullableObject.cxx +++ b/panda/src/pgraph/cullableObject.cxx @@ -142,10 +142,15 @@ munge_geom(GraphicsStateGuardianBase *gsg, GeomMunger *munger, DCAST(ShaderAttrib, ShaderAttrib::make())->set_flag(ShaderAttrib::F_hardware_skinning, true)); _state = _state->compose(state); } - } - StateMunger *state_munger = (StateMunger *)munger; - _state = state_munger->munge_state(_state); + gsg->ensure_generated_shader(_state); + } else { + // We may need to munge the state for the fixed-function pipeline. + StateMunger *state_munger = (StateMunger *)munger; + if (state_munger->should_munge_state()) { + _state = state_munger->munge_state(_state); + } + } // If there is any animation left in the vertex data after it has been // munged--that is, we couldn't arrange to handle the animation in diff --git a/panda/src/pgraph/renderState.h b/panda/src/pgraph/renderState.h index 4e2b2e3384..1052687314 100644 --- a/panda/src/pgraph/renderState.h +++ b/panda/src/pgraph/renderState.h @@ -219,6 +219,7 @@ public: // declare this as a ShaderAttrib because that would create a circular // include-file dependency problem. Aaargh. mutable CPT(RenderAttrib) _generated_shader; + mutable UpdateSeq _generated_shader_seq; private: // This mutex protects _states. It also protects any modification to the @@ -363,6 +364,7 @@ private: friend class GraphicsStateGuardian; friend class RenderAttribRegistry; friend class Extension; + friend class ShaderGenerator; friend class StateMunger; }; diff --git a/panda/src/pgraph/stateMunger.I b/panda/src/pgraph/stateMunger.I index edd3f6669b..7e35a2450c 100644 --- a/panda/src/pgraph/stateMunger.I +++ b/panda/src/pgraph/stateMunger.I @@ -16,6 +16,15 @@ */ INLINE StateMunger:: StateMunger(GraphicsStateGuardianBase *gsg) : - GeomMunger(gsg) + GeomMunger(gsg), + _should_munge_state(false) { } + +/** + * Returns true if this munger has something interesting to do to the state. + */ +INLINE bool StateMunger:: +should_munge_state() const { + return _should_munge_state; +} diff --git a/panda/src/pgraph/stateMunger.h b/panda/src/pgraph/stateMunger.h index 467eaaf604..c7fa6ef862 100644 --- a/panda/src/pgraph/stateMunger.h +++ b/panda/src/pgraph/stateMunger.h @@ -30,9 +30,12 @@ public: virtual ~StateMunger(); CPT(RenderState) munge_state(const RenderState *state); + INLINE bool should_munge_state() const; + protected: virtual CPT(RenderState) munge_state_impl(const RenderState *state); + bool _should_munge_state; public: static TypeHandle get_class_type() { diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index 0b4dc68a62..b25eb338fb 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -51,6 +51,14 @@ TypeHandle ShaderGenerator::_type_handle; #ifdef HAVE_CG +#define PACK_COMBINE(src0, op0, src1, op1, src2, op2) ( \ + ((uint16_t)src0) | ((((uint16_t)op0 - 1u) & 3u) << 3u) | \ + ((uint16_t)src1 << 5u) | ((((uint16_t)op1 - 1u) & 3u) << 8u) | \ + ((uint16_t)src2 << 10u) | ((((uint16_t)op2 - 1u) & 3u) << 13u)) + +#define UNPACK_COMBINE_SRC(from, n) (TextureStage::CombineSource)((from >> ((uint16_t)n * 5u)) & 7u) +#define UNPACK_COMBINE_OP(from, n) (TextureStage::CombineOperand)(((from >> (((uint16_t)n * 5u) + 3u)) & 3u) + 1u) + static PStatCollector lookup_collector("*:Munge:ShaderGen:Lookup"); static PStatCollector synthesize_collector("*:Munge:ShaderGen:Synthesize"); @@ -60,7 +68,7 @@ static PStatCollector synthesize_collector("*:Munge:ShaderGen:Synthesize"); * shader generator belongs. */ ShaderGenerator:: -ShaderGenerator(GraphicsStateGuardianBase *gsg) { +ShaderGenerator(const GraphicsStateGuardianBase *gsg) { // The ATTR# input semantics seem to map to generic vertex attributes in // both arbvp1 and glslv, which behave more consistently. However, they // don't exist in Direct3D 9. Use this silly little check for now. @@ -298,10 +306,17 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { Texture *tex = texture->get_on_texture(stage); nassertd(tex != nullptr) continue; + // Mark this TextureStage as having been used by the shader generator, so + // that the next time its properties change, it will cause the state to be + // rehashed to ensure that the shader is regenerated if needed. + stage->mark_used_by_auto_shader(); + ShaderKey::TextureInfo info; info._type = tex->get_texture_type(); info._mode = stage->get_mode(); info._flags = 0; + info._combine_rgb = 0u; + info._combine_alpha = 0u; // While we look at the mode, determine whether we need to change the mode // in order to reflect disabled features. @@ -357,6 +372,40 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { info._flags = ShaderKey::TF_map_normal | ShaderKey::TF_map_gloss; } break; + + case TextureStage::M_combine: + // If we have this rare, special mode, we encode all these extra + // parameters as flags to prevent bloating the shader key. + info._flags |= (uint32_t)stage->get_combine_rgb_mode() << ShaderKey::TF_COMBINE_RGB_MODE_SHIFT; + info._flags |= (uint32_t)stage->get_combine_alpha_mode() << ShaderKey::TF_COMBINE_ALPHA_MODE_SHIFT; + if (stage->get_rgb_scale() == 2) { + info._flags |= ShaderKey::TF_rgb_scale_2; + } + if (stage->get_rgb_scale() == 4) { + info._flags |= ShaderKey::TF_rgb_scale_4; + } + if (stage->get_alpha_scale() == 2) { + info._flags |= ShaderKey::TF_alpha_scale_2; + } + if (stage->get_alpha_scale() == 4) { + info._flags |= ShaderKey::TF_alpha_scale_4; + } + info._combine_rgb = PACK_COMBINE( + stage->get_combine_rgb_source0(), stage->get_combine_rgb_operand0(), + stage->get_combine_rgb_source1(), stage->get_combine_rgb_operand1(), + stage->get_combine_rgb_source2(), stage->get_combine_rgb_operand2()); + info._combine_alpha = PACK_COMBINE( + stage->get_combine_alpha_source0(), stage->get_combine_alpha_operand0(), + stage->get_combine_alpha_source1(), stage->get_combine_alpha_operand1(), + stage->get_combine_alpha_source2(), stage->get_combine_alpha_operand2()); + + if (stage->uses_primary_color()) { + info._flags |= ShaderKey::TF_uses_primary_color; + } + if (stage->uses_last_saved_result()) { + info._flags |= ShaderKey::TF_uses_last_saved_result; + } + break; } // In fact, perhaps this stage should be disabled altogether? @@ -417,11 +466,9 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { info._gen_mode = TexGenAttrib::M_off; } - // If we have this rare, special mode, just include a pointer to the - // TextureStage object, because I can't be bothered to bloat the shader - // key with all these extra relevant properties. - if (stage->get_mode() == TextureStage::M_combine) { - info._stage = stage; + // Does this stage require saving its result? + if (stage->get_saved_result()) { + info._flags |= ShaderKey::TF_saved_result; } // Does this stage need a texcolor_# input? @@ -433,6 +480,17 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { key._texture_flags |= info._flags; } + // Does nothing use the saved result? If so, don't bother saving it. + if ((key._texture_flags & ShaderKey::TF_uses_last_saved_result) == 0 && + (key._texture_flags & ShaderKey::TF_saved_result) != 0) { + + pvector::iterator it; + for (it = key._textures.begin(); it != key._textures.end(); ++it) { + (*it)._flags &= ~ShaderKey::TF_saved_result; + } + key._texture_flags &= ~ShaderKey::TF_saved_result; + } + // Decide whether to separate ambient and diffuse calculations. if (have_ambient) { if (key._material_flags & Material::F_ambient) { @@ -468,6 +526,74 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { } } +/** + * Rehashes all the states with generated shaders, removing the ones that are + * no longer fresh. + * + * Call this if certain state has changed in such a way as to require a rerun + * of the shader generator. This should be rare because in most cases, the + * shader generator will automatically regenerate shaders as necessary. + */ +INLINE void ShaderGenerator:: +rehash_generated_shaders() { + LightReMutexHolder holder(*RenderState::_states_lock); + + // With uniquify-states turned on, we can actually go through all the states + // and check whether their generated shader is still OK. + size_t size = RenderState::_states->get_num_entries(); + for (size_t si = 0; si < size; ++si) { + const RenderState *state = RenderState::_states->get_key(si); + + if (state->_generated_shader != nullptr) { + ShaderKey key; + analyze_renderstate(key, state); + + GeneratedShaders::const_iterator si; + si = _generated_shaders.find(key); + if (si != _generated_shaders.end()) { + if (si->second != state->_generated_shader) { + state->_generated_shader = si->second; + state->_munged_states.clear(); + } + } else { + // We have not yet generated a shader for this modified state. + state->_generated_shader.clear(); + state->_munged_states.clear(); + } + } + } + + // If we don't have uniquify-states, however, the above list won't contain + // all the state. We can change a global seq value to require Panda to + // rehash the states the next time it tries to render an object with it. + if (!uniquify_states) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } +} + +/** + * Removes all previously generated shaders, requiring all shaders to be + * regenerated. Does not clear cache of compiled shaders. + */ +INLINE void ShaderGenerator:: +clear_generated_shaders() { + LightReMutexHolder holder(*RenderState::_states_lock); + + size_t size = RenderState::_states->get_num_entries(); + for (size_t si = 0; si < size; ++si) { + const RenderState *state = RenderState::_states->get_key(si); + state->_generated_shader.clear(); + } + + _generated_shaders.clear(); + + // If we don't have uniquify-states, we can't clear all the ShaderAttribs + // that are cached on the states, but we can simulate the effect of that. + if (!uniquify_states) { + GraphicsStateGuardianBase::mark_rehash_generated_shaders(); + } +} + /** * This is the routine that implements the next-gen fixed function pipeline by * synthesizing a shader. It also takes care of setting up any buffers needed @@ -1256,24 +1382,12 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } } - // Loop first to see if something is using primary_color or - // last_saved_result. - bool have_saved_result = false; - bool have_primary_color = false; - for (size_t i = 0; i < key._textures.size(); ++i) { - const ShaderKey::TextureInfo &tex = key._textures[i]; - if (tex._stage == nullptr) { - continue; - } - - if (tex._stage->uses_primary_color() && !have_primary_color) { - text << "\t float4 primary_color = result;\n"; - have_primary_color = true; - } - if (tex._stage->uses_last_saved_result() && !have_saved_result) { - text << "\t float4 last_saved_result = result;\n"; - have_saved_result = true; - } + // Store these if any stages will use it. + if (key._texture_flags & ShaderKey::TF_uses_primary_color) { + text << "\t float4 primary_color = result;\n"; + } + if (key._texture_flags & ShaderKey::TF_uses_last_saved_result) { + text << "\t float4 last_saved_result = result;\n"; } // Now loop through the textures to compose our magic blending formulas. @@ -1315,24 +1429,21 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { } break; case TextureStage::M_combine: - // Only in the case of M_combine have we filled in the _stage pointer. text << "\t result.rgb = "; - if (tex._stage->get_combine_rgb_mode() != TextureStage::CM_undefined) { - text << combine_mode_as_string(tex._stage, tex._stage->get_combine_rgb_mode(), false, i); - } else { - text << "tex" << i << ".rgb"; + text << combine_mode_as_string(tex, (TextureStage::CombineMode)((tex._flags & ShaderKey::TF_COMBINE_RGB_MODE_MASK) >> ShaderKey::TF_COMBINE_RGB_MODE_SHIFT), false, i); + if (tex._flags & ShaderKey::TF_rgb_scale_2) { + text << " * 2"; } - if (tex._stage->get_rgb_scale() != 1) { - text << " * " << tex._stage->get_rgb_scale(); + if (tex._flags & ShaderKey::TF_rgb_scale_4) { + text << " * 4"; } text << ";\n\t result.a = "; - if (tex._stage->get_combine_alpha_mode() != TextureStage::CM_undefined) { - text << combine_mode_as_string(tex._stage, tex._stage->get_combine_alpha_mode(), true, i); - } else { - text << "tex" << i << ".a"; + text << combine_mode_as_string(tex, (TextureStage::CombineMode)((tex._flags & ShaderKey::TF_COMBINE_ALPHA_MODE_MASK) >> ShaderKey::TF_COMBINE_ALPHA_MODE_SHIFT), false, i); + if (tex._flags & ShaderKey::TF_alpha_scale_2) { + text << " * 2"; } - if (tex._stage->get_alpha_scale() != 1) { - text << " * " << tex._stage->get_alpha_scale(); + if (tex._flags & ShaderKey::TF_alpha_scale_4) { + text << " * 4"; } text << ";\n"; break; @@ -1342,7 +1453,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { default: break; } - if ((tex._flags & ShaderKey::TF_saved_result) != 0 && have_saved_result) { + if (tex._flags & ShaderKey::TF_saved_result) { text << "\t last_saved_result = result;\n"; } } @@ -1469,53 +1580,53 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) { * This 'synthesizes' a combine mode into a string. */ const string ShaderGenerator:: -combine_mode_as_string(CPT(TextureStage) stage, TextureStage::CombineMode c_mode, bool alpha, short texindex) { +combine_mode_as_string(const ShaderKey::TextureInfo &info, TextureStage::CombineMode c_mode, bool alpha, short texindex) { ostringstream text; switch (c_mode) { - case TextureStage::CM_modulate: - text << combine_source_as_string(stage, 0, alpha, alpha, texindex); - text << " * "; - text << combine_source_as_string(stage, 1, alpha, alpha, texindex); - break; - case TextureStage::CM_add: - text << combine_source_as_string(stage, 0, alpha, alpha, texindex); - text << " + "; - text << combine_source_as_string(stage, 1, alpha, alpha, texindex); - break; - case TextureStage::CM_add_signed: - text << combine_source_as_string(stage, 0, alpha, alpha, texindex); - text << " + "; - text << combine_source_as_string(stage, 1, alpha, alpha, texindex); - if (alpha) { - text << " - 0.5"; - } else { - text << " - float3(0.5, 0.5, 0.5)"; - } - break; - case TextureStage::CM_interpolate: - text << "lerp("; - text << combine_source_as_string(stage, 1, alpha, alpha, texindex); - text << ", "; - text << combine_source_as_string(stage, 0, alpha, alpha, texindex); - text << ", "; - text << combine_source_as_string(stage, 2, alpha, true, texindex); - text << ")"; - break; - case TextureStage::CM_subtract: - text << combine_source_as_string(stage, 0, alpha, alpha, texindex); - text << " + "; - text << combine_source_as_string(stage, 1, alpha, alpha, texindex); - break; - case TextureStage::CM_dot3_rgb: - pgraphnodes_cat.error() << "TextureStage::CombineMode DOT3_RGB not yet supported in per-pixel mode.\n"; - break; - case TextureStage::CM_dot3_rgba: - pgraphnodes_cat.error() << "TextureStage::CombineMode DOT3_RGBA not yet supported in per-pixel mode.\n"; - break; - case TextureStage::CM_replace: - default: // Not sure if this is correct as default value. - text << combine_source_as_string(stage, 0, alpha, alpha, texindex); - break; + case TextureStage::CM_modulate: + text << combine_source_as_string(info, 0, alpha, alpha, texindex); + text << " * "; + text << combine_source_as_string(info, 1, alpha, alpha, texindex); + break; + case TextureStage::CM_add: + text << combine_source_as_string(info, 0, alpha, alpha, texindex); + text << " + "; + text << combine_source_as_string(info, 1, alpha, alpha, texindex); + break; + case TextureStage::CM_add_signed: + text << combine_source_as_string(info, 0, alpha, alpha, texindex); + text << " + "; + text << combine_source_as_string(info, 1, alpha, alpha, texindex); + if (alpha) { + text << " - 0.5"; + } else { + text << " - float3(0.5, 0.5, 0.5)"; + } + break; + case TextureStage::CM_interpolate: + text << "lerp("; + text << combine_source_as_string(info, 1, alpha, alpha, texindex); + text << ", "; + text << combine_source_as_string(info, 0, alpha, alpha, texindex); + text << ", "; + text << combine_source_as_string(info, 2, alpha, true, texindex); + text << ")"; + break; + case TextureStage::CM_subtract: + text << combine_source_as_string(info, 0, alpha, alpha, texindex); + text << " + "; + text << combine_source_as_string(info, 1, alpha, alpha, texindex); + break; + case TextureStage::CM_dot3_rgb: + pgraphnodes_cat.error() << "TextureStage::CombineMode DOT3_RGB not yet supported in per-pixel mode.\n"; + break; + case TextureStage::CM_dot3_rgba: + pgraphnodes_cat.error() << "TextureStage::CombineMode DOT3_RGBA not yet supported in per-pixel mode.\n"; + break; + case TextureStage::CM_replace: + default: // Not sure if this is correct as default value. + text << combine_source_as_string(info, 0, alpha, alpha, texindex); + break; } return text.str(); } @@ -1524,39 +1635,15 @@ combine_mode_as_string(CPT(TextureStage) stage, TextureStage::CombineMode c_mode * This 'synthesizes' a combine source into a string. */ const string ShaderGenerator:: -combine_source_as_string(CPT(TextureStage) stage, short num, bool alpha, bool single_value, short texindex) { - TextureStage::CombineSource c_src = TextureStage::CS_undefined; - TextureStage::CombineOperand c_op = TextureStage::CO_undefined; - if (alpha) { - switch (num) { - case 0: - c_src = stage->get_combine_alpha_source0(); - c_op = stage->get_combine_alpha_operand0(); - break; - case 1: - c_src = stage->get_combine_alpha_source1(); - c_op = stage->get_combine_alpha_operand1(); - break; - case 2: - c_src = stage->get_combine_alpha_source2(); - c_op = stage->get_combine_alpha_operand2(); - break; - } +combine_source_as_string(const ShaderKey::TextureInfo &info, short num, bool alpha, bool single_value, short texindex) { + TextureStage::CombineSource c_src; + TextureStage::CombineOperand c_op; + if (!alpha) { + c_src = UNPACK_COMBINE_SRC(info._combine_rgb, num); + c_op = UNPACK_COMBINE_OP(info._combine_rgb, num); } else { - switch (num) { - case 0: - c_src = stage->get_combine_rgb_source0(); - c_op = stage->get_combine_rgb_operand0(); - break; - case 1: - c_src = stage->get_combine_rgb_source1(); - c_op = stage->get_combine_rgb_operand1(); - break; - case 2: - c_src = stage->get_combine_rgb_source2(); - c_op = stage->get_combine_rgb_operand2(); - break; - } + c_src = UNPACK_COMBINE_SRC(info._combine_alpha, num); + c_op = UNPACK_COMBINE_OP(info._combine_alpha, num); } ostringstream csource; if (c_op == TextureStage::CO_one_minus_src_color || @@ -1688,8 +1775,11 @@ operator < (const ShaderKey &other) const { if (tex._flags != other_tex._flags) { return tex._flags < other_tex._flags; } - if (tex._stage != other_tex._stage) { - return tex._stage < other_tex._stage; + if (tex._combine_rgb != other_tex._combine_rgb) { + return tex._combine_rgb < other_tex._combine_rgb; + } + if (tex._combine_alpha != other_tex._combine_alpha) { + return tex._combine_alpha < other_tex._combine_alpha; } } if (_lights.size() != other._lights.size()) { @@ -1763,7 +1853,8 @@ operator == (const ShaderKey &other) const { tex._mode != other_tex._mode || tex._gen_mode != other_tex._gen_mode || tex._flags != other_tex._flags || - tex._stage != other_tex._stage) { + tex._combine_rgb != other_tex._combine_rgb || + tex._combine_alpha != other_tex._combine_alpha) { return false; } } diff --git a/panda/src/pgraphnodes/shaderGenerator.h b/panda/src/pgraphnodes/shaderGenerator.h index dc68d90d66..28a563cc25 100644 --- a/panda/src/pgraphnodes/shaderGenerator.h +++ b/panda/src/pgraphnodes/shaderGenerator.h @@ -65,18 +65,15 @@ class GeomVertexAnimationSpec; */ class EXPCL_PANDA_PGRAPHNODES ShaderGenerator : public TypedReferenceCount { PUBLISHED: - ShaderGenerator(GraphicsStateGuardianBase *gsg); + ShaderGenerator(const GraphicsStateGuardianBase *gsg); virtual ~ShaderGenerator(); virtual CPT(ShaderAttrib) synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim); -protected: - static const string combine_mode_as_string(CPT(TextureStage) stage, - TextureStage::CombineMode c_mode, bool alpha, short texindex); - static const string combine_source_as_string(CPT(TextureStage) stage, - short num, bool alpha, bool single_value, short texindex); - static const string texture_type_as_string(Texture::TextureType ttype); + INLINE void rehash_generated_shaders(); + INLINE void clear_generated_shaders(); +protected: // Shader register allocation: bool _use_generic_attr; @@ -101,16 +98,28 @@ protected: GeomVertexAnimationSpec _anim_spec; enum TextureFlags { - TF_has_rgb = 1, - TF_has_alpha = 2, - TF_has_texscale = 4, - TF_has_texmat = 8, - TF_saved_result = 16, - TF_map_normal = 32, - TF_map_height = 64, - TF_map_glow = 128, - TF_map_gloss = 256, - TF_uses_color = 512, + TF_has_rgb = 0x001, + TF_has_alpha = 0x002, + TF_has_texscale = 0x004, + TF_has_texmat = 0x008, + TF_saved_result = 0x010, + TF_map_normal = 0x020, + TF_map_height = 0x040, + TF_map_glow = 0x080, + TF_map_gloss = 0x100, + TF_uses_color = 0x200, + TF_uses_primary_color = 0x400, + TF_uses_last_saved_result = 0x800, + + TF_rgb_scale_2 = 0x1000, + TF_rgb_scale_4 = 0x2000, + TF_alpha_scale_2 = 0x4000, + TF_alpha_scale_4 = 0x8000, + + TF_COMBINE_RGB_MODE_SHIFT = 16, + TF_COMBINE_RGB_MODE_MASK = 0x0000f0000, + TF_COMBINE_ALPHA_MODE_SHIFT = 20, + TF_COMBINE_ALPHA_MODE_MASK = 0x000f00000, }; ColorAttrib::Type _color_type; @@ -123,9 +132,8 @@ protected: TextureStage::Mode _mode; TexGenAttrib::Mode _gen_mode; int _flags; - - // Stored only if combine modes / blend color is used - CPT(TextureStage) _stage; + uint16_t _combine_rgb; + uint16_t _combine_alpha; }; pvector _textures; @@ -160,6 +168,12 @@ protected: void analyze_renderstate(ShaderKey &key, const RenderState *rs); + static const string combine_mode_as_string(const ShaderKey::TextureInfo &info, + TextureStage::CombineMode c_mode, bool alpha, short texindex); + static const string combine_source_as_string(const ShaderKey::TextureInfo &info, + short num, bool alpha, bool single_value, short texindex); + static const string texture_type_as_string(Texture::TextureType ttype); + public: static TypeHandle get_class_type() { return _type_handle; From 7d721a33a6598295c55cdb785eef6e1897e3eba6 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 18 Oct 2017 11:26:20 +0200 Subject: [PATCH 196/254] Restore setShaderInput overload taking 4 numbers, but deprecate it --- panda/src/pgraph/nodePath.h | 6 +++--- samples/fireflies/main.py | 2 +- samples/shadows/advanced.py | 10 +++++----- samples/shadows/basic.py | 1 - 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/panda/src/pgraph/nodePath.h b/panda/src/pgraph/nodePath.h index 2225ea745e..d4785b7fb9 100644 --- a/panda/src/pgraph/nodePath.h +++ b/panda/src/pgraph/nodePath.h @@ -657,12 +657,12 @@ public: INLINE void set_shader_input(CPT_InternalName id, const LVecBase4i &v, int priority=0); INLINE void set_shader_input(CPT_InternalName id, const LVecBase3i &v, int priority=0); INLINE void set_shader_input(CPT_InternalName id, const LVecBase2i &v, int priority=0); - INLINE void set_shader_input(CPT_InternalName id, int n1, int n2=0, int n3=0, +PUBLISHED: + INLINE void set_shader_input(CPT_InternalName id, int n1, int n2, int n3=0, int n4=0, int priority=0); - INLINE void set_shader_input(CPT_InternalName id, PN_stdfloat n1, PN_stdfloat n2=0, + INLINE void set_shader_input(CPT_InternalName id, PN_stdfloat n1, PN_stdfloat n2, PN_stdfloat n3=0, PN_stdfloat n4=0, int priority=0); -PUBLISHED: EXTENSION(void set_shader_input(CPT_InternalName, PyObject *, int priority=0)); EXTENSION(void set_shader_inputs(PyObject *args, PyObject *kwargs)); diff --git a/samples/fireflies/main.py b/samples/fireflies/main.py index 994a7d09ec..41527beb88 100755 --- a/samples/fireflies/main.py +++ b/samples/fireflies/main.py @@ -338,7 +338,7 @@ class FireflyDemo(ShowBase): color_g = random.uniform(0.8, 1.0) color_b = min(color_g, random.uniform(0.5, 1.0)) fly.setColor(color_r, color_g, color_b, 1.0) - fly.setShaderInput("lightcolor", color_r, color_g, color_b, 1.0) + fly.setShaderInput("lightcolor", (color_r, color_g, color_b, 1.0)) int1 = fly.posInterval(random.uniform(7, 12), pos1, pos2) int2 = fly.posInterval(random.uniform(7, 12), pos2, pos1) si1 = fly.scaleInterval(random.uniform(0.8, 1.5), diff --git a/samples/shadows/advanced.py b/samples/shadows/advanced.py index 988e78df32..e11ed2645a 100755 --- a/samples/shadows/advanced.py +++ b/samples/shadows/advanced.py @@ -103,7 +103,7 @@ class World(DirectObject): self.pandaModel = Actor.Actor('panda-model', {'walk': 'panda-walk4'}) self.pandaModel.reparentTo(self.pandaAxis) self.pandaModel.setPos(9, 0, 0) - self.pandaModel.setShaderInput("scale", 0.01, 0.01, 0.01, 1.0) + self.pandaModel.setShaderInput("scale", (0.01, 0.01, 0.01, 1.0)) self.pandaWalk = self.pandaModel.actorInterval('walk', playRate=1.8) self.pandaWalk.loop() self.pandaMovement = self.pandaAxis.hprInterval( @@ -113,7 +113,7 @@ class World(DirectObject): self.teapot = loader.loadModel('teapot') self.teapot.reparentTo(render) self.teapot.setPos(0, -20, 10) - self.teapot.setShaderInput("texDisable", 1, 1, 1, 1) + self.teapot.setShaderInput("texDisable", (1, 1, 1, 1)) self.teapotMovement = self.teapot.hprInterval(50, LPoint3(0, 360, 360)) self.teapotMovement.loop() @@ -145,9 +145,9 @@ class World(DirectObject): # setting up shader render.setShaderInput('light', self.LCam) render.setShaderInput('Ldepthmap', Ldepthmap) - render.setShaderInput('ambient', self.ambient, 0, 0, 1.0) - render.setShaderInput('texDisable', 0, 0, 0, 0) - render.setShaderInput('scale', 1, 1, 1, 1) + render.setShaderInput('ambient', (self.ambient, 0, 0, 1.0)) + render.setShaderInput('texDisable', (0, 0, 0, 0)) + render.setShaderInput('scale', (1, 1, 1, 1)) # Put a shader on the Light camera. lci = NodePath(PandaNode("Light Camera Initializer")) diff --git a/samples/shadows/basic.py b/samples/shadows/basic.py index 843b9b9b27..722aeb0643 100755 --- a/samples/shadows/basic.py +++ b/samples/shadows/basic.py @@ -80,7 +80,6 @@ class World(DirectObject): self.teapot = loader.loadModel('teapot') self.teapot.reparentTo(render) self.teapot.setPos(0, -20, 10) - self.teapot.setShaderInput("texDisable", 1, 1, 1, 1) self.teapotMovement = self.teapot.hprInterval(50, LPoint3(0, 360, 360)) self.teapotMovement.loop() From 8a35f360bd64806cdba8c9c34c9a36017a1fb2c6 Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 18 Oct 2017 12:29:44 +0200 Subject: [PATCH 197/254] Fix build error --- panda/src/pgraphnodes/shaderGenerator.cxx | 4 ++-- panda/src/pgraphnodes/shaderGenerator.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index b25eb338fb..0251f7f445 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/panda/src/pgraphnodes/shaderGenerator.cxx @@ -534,7 +534,7 @@ analyze_renderstate(ShaderKey &key, const RenderState *rs) { * of the shader generator. This should be rare because in most cases, the * shader generator will automatically regenerate shaders as necessary. */ -INLINE void ShaderGenerator:: +void ShaderGenerator:: rehash_generated_shaders() { LightReMutexHolder holder(*RenderState::_states_lock); @@ -575,7 +575,7 @@ rehash_generated_shaders() { * Removes all previously generated shaders, requiring all shaders to be * regenerated. Does not clear cache of compiled shaders. */ -INLINE void ShaderGenerator:: +void ShaderGenerator:: clear_generated_shaders() { LightReMutexHolder holder(*RenderState::_states_lock); diff --git a/panda/src/pgraphnodes/shaderGenerator.h b/panda/src/pgraphnodes/shaderGenerator.h index 28a563cc25..953ac51431 100644 --- a/panda/src/pgraphnodes/shaderGenerator.h +++ b/panda/src/pgraphnodes/shaderGenerator.h @@ -70,8 +70,8 @@ PUBLISHED: virtual CPT(ShaderAttrib) synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim); - INLINE void rehash_generated_shaders(); - INLINE void clear_generated_shaders(); + void rehash_generated_shaders(); + void clear_generated_shaders(); protected: // Shader register allocation: From 407c8e8712fc2c2ccc2d36a910c75416e4c3120d Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 20 Oct 2017 19:53:02 +0200 Subject: [PATCH 198/254] bullet: add interface to access BulletTriangleMesh vertices/triangles --- panda/src/bullet/bulletTriangleMesh.I | 28 +++++++++++++++++++++++++ panda/src/bullet/bulletTriangleMesh.cxx | 2 +- panda/src/bullet/bulletTriangleMesh.h | 13 ++++++++++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/panda/src/bullet/bulletTriangleMesh.I b/panda/src/bullet/bulletTriangleMesh.I index 33b9b9bf47..b6965303aa 100644 --- a/panda/src/bullet/bulletTriangleMesh.I +++ b/panda/src/bullet/bulletTriangleMesh.I @@ -19,6 +19,34 @@ ptr() const { return (btStridingMeshInterface *)&_mesh; } +/** + * Returns the number of vertices in this triangle mesh. + */ +INLINE size_t BulletTriangleMesh:: +get_num_vertices() const { + return _vertices.size(); +} + +/** + * Returns the vertex at the given vertex index. + */ +INLINE LPoint3 BulletTriangleMesh:: +get_vertex(size_t index) const { + nassertr(index < _vertices.size(), LPoint3::zero()); + const btVector3 &vertex = _vertices[index]; + return LPoint3(vertex[0], vertex[1], vertex[2]); +} + +/** + * Returns the vertex indices making up the given triangle index. + */ +INLINE LVecBase3i BulletTriangleMesh:: +get_triangle(size_t index) const { + index *= 3; + nassertr(index + 2 < _indices.size(), LVecBase3i::zero()); + return LVecBase3i(_indices[index], _indices[index + 1], _indices[index + 2]); +} + /** * */ diff --git a/panda/src/bullet/bulletTriangleMesh.cxx b/panda/src/bullet/bulletTriangleMesh.cxx index 8a74e61ff5..3138e28efd 100644 --- a/panda/src/bullet/bulletTriangleMesh.cxx +++ b/panda/src/bullet/bulletTriangleMesh.cxx @@ -39,7 +39,7 @@ BulletTriangleMesh() /** * Returns the number of triangles in this triangle mesh. */ -int BulletTriangleMesh:: +size_t BulletTriangleMesh:: get_num_triangles() const { return _indices.size() / 3; } diff --git a/panda/src/bullet/bulletTriangleMesh.h b/panda/src/bullet/bulletTriangleMesh.h index 2c3b5c0626..64973d83e8 100644 --- a/panda/src/bullet/bulletTriangleMesh.h +++ b/panda/src/bullet/bulletTriangleMesh.h @@ -48,15 +48,24 @@ PUBLISHED: void set_welding_distance(PN_stdfloat distance); void preallocate(int num_verts, int num_indices); - int get_num_triangles() const; + size_t get_num_triangles() const; PN_stdfloat get_welding_distance() const; virtual void output(ostream &out) const; virtual void write(ostream &out, int indent_level) const; - MAKE_PROPERTY(num_triangles, get_num_triangles); +public: + INLINE size_t get_num_vertices() const; + INLINE LPoint3 get_vertex(size_t index) const; + + INLINE LVecBase3i get_triangle(size_t index) const; + +PUBLISHED: MAKE_PROPERTY(welding_distance, get_welding_distance, set_welding_distance); + MAKE_SEQ_PROPERTY(vertices, get_num_vertices, get_vertex); + MAKE_SEQ_PROPERTY(triangles, get_num_triangles, get_triangle); + public: INLINE btStridingMeshInterface *ptr() const; From 51090ccf122a8363bc268993dcc2ba6430422d18 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 20 Oct 2017 20:12:25 +0200 Subject: [PATCH 199/254] pgraph: fix LightLensNode assert due to bad refcount in LightAttrib::compose --- panda/src/pgraph/lightAttrib.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/panda/src/pgraph/lightAttrib.cxx b/panda/src/pgraph/lightAttrib.cxx index 86ec271e63..15b010336e 100644 --- a/panda/src/pgraph/lightAttrib.cxx +++ b/panda/src/pgraph/lightAttrib.cxx @@ -833,6 +833,14 @@ compose_impl(const RenderAttrib *other) const { ++result; } + // Increase the attrib_ref of all the lights in this new attribute. + Lights::const_iterator it; + for (it = new_attrib->_on_lights.begin(); it != new_attrib->_on_lights.end(); ++it) { + Light *lobj = (*it).node()->as_light(); + nassertd(lobj != nullptr) continue; + lobj->attrib_ref(); + } + return return_new(new_attrib); } From a7d68a8412da2c8d4b3fc6f3398a3c697037c4a5 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 26 Oct 2017 17:36:43 +0200 Subject: [PATCH 200/254] egg2bam: fix external refs not being resolved relative to egg file --- pandatool/src/eggbase/eggReader.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandatool/src/eggbase/eggReader.cxx b/pandatool/src/eggbase/eggReader.cxx index 72d0007fb3..dce7b64c51 100644 --- a/pandatool/src/eggbase/eggReader.cxx +++ b/pandatool/src/eggbase/eggReader.cxx @@ -193,7 +193,7 @@ handle_args(ProgramBase::Args &args) { file_path.append_directory(filename.get_dirname()); if (_force_complete) { - if (!file_data.load_externals()) { + if (!file_data.load_externals(file_path)) { exit(1); } } From 0c0f9adab97afdc09728f8e79646c8c3943b36a8 Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 31 Oct 2017 15:45:55 +0100 Subject: [PATCH 201/254] Support coroutines and async/await in the task manager and loader --- direct/src/showbase/Loader.py | 153 +++++--- direct/src/task/Task.py | 10 + dtool/src/interrogate/functionRemap.cxx | 2 +- .../interfaceMakerPythonNative.cxx | 40 +- dtool/src/interrogatedb/py_panda.cxx | 73 ++++ dtool/src/interrogatedb/py_panda.h | 6 + dtool/src/pystub/pystub.cxx | 2 + makepanda/makepanda.py | 2 + panda/src/audio/audioLoadRequest.I | 17 +- panda/src/audio/audioLoadRequest.h | 2 + panda/src/event/asyncTask.I | 1 + panda/src/event/asyncTask.h | 10 + panda/src/event/asyncTaskChain.cxx | 24 +- panda/src/event/asyncTaskChain.h | 1 + panda/src/event/asyncTaskManager.h | 1 + panda/src/event/asyncTask_ext.cxx | 75 ++++ panda/src/event/asyncTask_ext.h | 35 ++ panda/src/event/pythonTask.I | 49 +++ panda/src/event/pythonTask.cxx | 350 +++++++++++++++--- panda/src/event/pythonTask.h | 30 +- panda/src/pgraph/modelFlattenRequest.I | 18 +- panda/src/pgraph/modelFlattenRequest.h | 4 +- panda/src/pgraph/modelLoadRequest.I | 10 + panda/src/pgraph/modelLoadRequest.h | 8 +- panda/src/pgraph/modelSaveRequest.I | 10 + panda/src/pgraph/modelSaveRequest.h | 7 +- 26 files changed, 821 insertions(+), 119 deletions(-) create mode 100755 panda/src/event/asyncTask_ext.cxx create mode 100755 panda/src/event/asyncTask_ext.h diff --git a/direct/src/showbase/Loader.py b/direct/src/showbase/Loader.py index 9edde2a9b7..64fa593940 100644 --- a/direct/src/showbase/Loader.py +++ b/direct/src/showbase/Loader.py @@ -21,31 +21,103 @@ class Loader(DirectObject): loaderIndex = 0 class Callback: - def __init__(self, numObjects, gotList, callback, extraArgs): + """Returned by loadModel when used asynchronously. This class is + modelled after Future, and can be awaited.""" + + # This indicates that this class behaves like a Future. + _asyncio_future_blocking = False + + def __init__(self, loader, numObjects, gotList, callback, extraArgs): + self._loader = loader self.objects = [None] * numObjects self.gotList = gotList self.callback = callback self.extraArgs = extraArgs - self.numRemaining = numObjects - self.cancelled = False self.requests = set() + self.requestList = [] def gotObject(self, index, object): self.objects[index] = object - self.numRemaining -= 1 - if self.numRemaining == 0: - if self.gotList: - self.callback(self.objects, *self.extraArgs) - else: - self.callback(*(self.objects + self.extraArgs)) + if not self.requests: + self._loader = None + if self.callback: + if self.gotList: + self.callback(self.objects, *self.extraArgs) + else: + self.callback(*(self.objects + self.extraArgs)) + + def cancel(self): + "Cancels the request. Callback won't be called." + if self._loader: + self._loader = None + for request in self.requests: + self._loader.loader.remove(request) + del self._loader._requests[request] + self.requests = None + self.requestList = None + + def cancelled(self): + "Returns true if the request was cancelled." + return self.requestList is None + + def done(self): + "Returns true if all the requests were finished or cancelled." + return not self.requests + + def result(self): + assert not self.requests, "Result is not ready." + if self.gotList: + return self.objects + else: + return self.objects[0] + + def exception(self): + assert self.done() and not self.cancelled() + return None + + def __await__(self): + """ Returns a generator that raises StopIteration when the loading + is complete. This allows this class to be used with 'await'.""" + if self.requests: + self._asyncio_future_blocking = True + yield self + + # This should be a simple return, but older versions of Python + # don't allow return statements with arguments. + result = self.result() + exc = StopIteration(result) + exc.value = result + raise exc + + def __aiter__(self): + """ This allows using `async for` to iterate asynchronously over + the results of this class. It does guarantee to return the + results in order, though, even though they may not be loaded in + that order. """ + requestList = self.requestList + assert requestList is not None, "Request was cancelled." + + class AsyncIter: + index = 0 + def __anext__(self): + if self.index < len(requestList): + i = self.index + self.index = i + 1 + return requestList[i] + else: + raise StopAsyncIteration + + iter = AsyncIter() + iter.objects = self.objects + return iter # special methods def __init__(self, base): self.base = base self.loader = PandaLoader.getGlobalPtr() - self.__requests = {} + self._requests = {} self.hook = "async_loader_%s" % (Loader.loaderIndex) Loader.loaderIndex += 1 @@ -180,7 +252,7 @@ class Loader(DirectObject): # requested models have been loaded, we'll invoke the # callback (passing it the models on the parameter list). - cb = Loader.Callback(len(modelList), gotList, callback, extraArgs) + cb = Loader.Callback(self, len(modelList), gotList, callback, extraArgs) i = 0 for modelPath in modelList: request = self.loader.makeAsyncRequest(Filename(modelPath), loaderOptions) @@ -189,26 +261,26 @@ class Loader(DirectObject): request.setDoneEvent(self.hook) self.loader.loadAsync(request) cb.requests.add(request) - self.__requests[request] = (cb, i) + cb.requestList.append(request) + self._requests[request] = (cb, i) i += 1 return cb def cancelRequest(self, cb): """Cancels an aysynchronous loading or flatten request issued earlier. The callback associated with the request will not be - called after cancelRequest() has been performed. """ + called after cancelRequest() has been performed. - if not cb.cancelled: - cb.cancelled = True - for request in cb.requests: - self.loader.remove(request) - del self.__requests[request] - cb.requests = None + This is now deprecated: call cb.cancel() instead. """ + + cb.cancel() def isRequestPending(self, cb): """ Returns true if an asynchronous loading or flatten request issued earlier is still pending, or false if it has completed or - been cancelled. """ + been cancelled. + + This is now deprecated: call cb.done() instead. """ return bool(cb.requests) @@ -344,7 +416,7 @@ class Loader(DirectObject): # requested models have been saved, we'll invoke the # callback (passing it the models on the parameter list). - cb = Loader.Callback(len(modelList), gotList, callback, extraArgs) + cb = Loader.Callback(self, len(modelList), gotList, callback, extraArgs) i = 0 for modelPath, node in modelList: request = self.loader.makeAsyncSaveRequest(Filename(modelPath), loaderOptions, node) @@ -353,7 +425,8 @@ class Loader(DirectObject): request.setDoneEvent(self.hook) self.loader.saveAsync(request) cb.requests.add(request) - self.__requests[request] = (cb, i) + cb.requestList.append(request) + self._requests[request] = (cb, i) i += 1 return cb @@ -880,13 +953,14 @@ class Loader(DirectObject): # requested sounds have been loaded, we'll invoke the # callback (passing it the sounds on the parameter list). - cb = Loader.Callback(len(soundList), gotList, callback, extraArgs) + cb = Loader.Callback(self, len(soundList), gotList, callback, extraArgs) for i, soundPath in enumerate(soundList): request = AudioLoadRequest(manager, soundPath, positional) request.setDoneEvent(self.hook) self.loader.loadAsync(request) cb.requests.add(request) - self.__requests[request] = (cb, i) + cb.requestList.append(request) + self._requests[request] = (cb, i) return cb def unloadSfx(self, sfx): @@ -944,14 +1018,15 @@ class Loader(DirectObject): callback = self.__asyncFlattenDone gotList = True - cb = Loader.Callback(len(modelList), gotList, callback, extraArgs) + cb = Loader.Callback(self, len(modelList), gotList, callback, extraArgs) i = 0 for model in modelList: request = ModelFlattenRequest(model.node()) request.setDoneEvent(self.hook) self.loader.loadAsync(request) cb.requests.add(request) - self.__requests[request] = (cb, i) + cb.requestList.append(request) + self._requests[request] = (cb, i) i += 1 return cb @@ -980,36 +1055,22 @@ class Loader(DirectObject): of loaded objects, and call the appropriate callback when it's time.""" - if request not in self.__requests: + if request not in self._requests: return - cb, i = self.__requests[request] - if cb.cancelled: + cb, i = self._requests[request] + if cb.cancelled(): # Shouldn't be here. - del self.__requests[request] + del self._requests[request] return cb.requests.discard(request) if not cb.requests: - del self.__requests[request] + del self._requests[request] - object = None - if hasattr(request, "getModel"): - node = request.getModel() - if node is not None: - object = NodePath(node) - - elif hasattr(request, "getSound"): - object = request.getSound() - - elif hasattr(request, "getSuccess"): - object = request.getSuccess() - - cb.gotObject(i, object) + cb.gotObject(i, request.result() or None) load_model = loadModel - cancel_request = cancelRequest - is_request_pending = isRequestPending unload_model = unloadModel save_model = saveModel load_font = loadFont diff --git a/direct/src/task/Task.py b/direct/src/task/Task.py index 215b240d16..08baa924a5 100644 --- a/direct/src/task/Task.py +++ b/direct/src/task/Task.py @@ -333,6 +333,7 @@ class TaskManager: funcOrTask - either an existing Task object (not already added to the task manager), or a callable function object. If this is a function, a new Task object will be created and returned. + You may also pass in a coroutine object. name - the name to assign to the Task. Required, unless you are passing in a Task object that already has a name. @@ -385,6 +386,15 @@ class TaskManager: task = funcOrTask elif hasattr(funcOrTask, '__call__'): task = PythonTask(funcOrTask) + if name is None: + name = getattr(funcOrTask, '__qualname__', None) or \ + getattr(funcOrTask, '__name__', None) + elif hasattr(funcOrTask, 'cr_await') or type(funcOrTask) == types.GeneratorType: + # It's a coroutine, or something emulating one. + task = PythonTask(funcOrTask) + if name is None: + name = getattr(funcOrTask, '__qualname__', None) or \ + getattr(funcOrTask, '__name__', None) else: self.notify.error( 'add: Tried to add a task that was not a Task or a func') diff --git a/dtool/src/interrogate/functionRemap.cxx b/dtool/src/interrogate/functionRemap.cxx index 5b04209c48..27ec829479 100644 --- a/dtool/src/interrogate/functionRemap.cxx +++ b/dtool/src/interrogate/functionRemap.cxx @@ -846,7 +846,7 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak } } else if (fname == "__iter__") { - if (_has_this && _parameters.size() == 1 && + if ((int)_parameters.size() == first_param && TypeManager::is_pointer(_return_type->get_new_type())) { // It receives no parameters, and returns a pointer. _flags |= F_iter; diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index e5a353eb51..4384a66253 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -499,6 +499,24 @@ get_slotted_function_def(Object *obj, Function *func, FunctionRemap *remap, } } + if (method_name == "__await__") { + def._answer_location = "am_await"; + def._wrapper_type = WT_no_params; + return true; + } + + if (method_name == "__aiter__") { + def._answer_location = "am_aiter"; + def._wrapper_type = WT_no_params; + return true; + } + + if (method_name == "__anext__") { + def._answer_location = "am_anext"; + def._wrapper_type = WT_no_params; + return true; + } + if (method_name == "operator ()") { def._answer_location = "tp_call"; def._wrapper_type = WT_none; @@ -2798,6 +2816,20 @@ write_module_class(ostream &out, Object *obj) { out << "};\n\n"; } + bool have_async = false; + if (has_parent_class || slots.count("am_await") != 0 || + slots.count("am_aiter") != 0 || + slots.count("am_anext") != 0) { + out << "#if PY_VERSION_HEX >= 0x03050000\n"; + out << "static PyAsyncMethods Dtool_AsyncMethods_" << ClassName << " = {\n"; + write_function_slot(out, 2, slots, "am_await"); + write_function_slot(out, 2, slots, "am_aiter"); + write_function_slot(out, 2, slots, "am_anext"); + out << "};\n"; + out << "#endif\n\n"; + have_async = true; + } + // Output the actual PyTypeObject definition. out << "struct Dtool_PyTypedObject Dtool_" << ClassName << " = {\n"; out << " {\n"; @@ -2819,7 +2851,13 @@ write_module_class(ostream &out, Object *obj) { write_function_slot(out, 4, slots, "tp_setattr"); // cmpfunc tp_compare; (reserved in Python 3) - out << "#if PY_MAJOR_VERSION >= 3\n"; + out << "#if PY_VERSION_HEX >= 0x03050000\n"; + if (have_async) { + out << " &Dtool_AsyncMethods_" << ClassName << ",\n"; + } else { + out << " 0, // tp_as_async\n"; + } + out << "#elif PY_MAJOR_VERSION >= 3\n"; out << " 0, // tp_reserved\n"; out << "#else\n"; if (has_hash_compare) { diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index 76c4e7cf1b..6b0c9f93a5 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -622,6 +622,10 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { return Dtool_Raise_TypeError("PyType_Ready(Dtool_SeqMapWrapper)"); } + if (PyType_Ready(&Dtool_GeneratorWrapper_Type) < 0) { + return Dtool_Raise_TypeError("PyType_Ready(Dtool_GeneratorWrapper)"); + } + if (PyType_Ready(&Dtool_StaticProperty_Type) < 0) { return Dtool_Raise_TypeError("PyType_Ready(Dtool_StaticProperty_Type)"); } @@ -1111,6 +1115,13 @@ static int Dtool_SeqMapWrapper_setitem(PyObject *self, PyObject *key, PyObject * } } +static PyObject *Dtool_GeneratorWrapper_iternext(PyObject *self) { + Dtool_GeneratorWrapper *wrap = (Dtool_GeneratorWrapper *)self; + nassertr(wrap, nullptr); + nassertr(wrap->_iternext_func, nullptr); + return wrap->_iternext_func(wrap->_base._self); +} + static PySequenceMethods Dtool_SequenceWrapper_SequenceMethods = { Dtool_SequenceWrapper_length, 0, // sq_concat @@ -1454,4 +1465,66 @@ PyTypeObject Dtool_SeqMapWrapper_Type = { #endif }; +/** + * This variant defines only a generator interface. + */ +PyTypeObject Dtool_GeneratorWrapper_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "generator wrapper", + sizeof(Dtool_GeneratorWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_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 + 0, // tp_as_sequence + 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 + PyObject_SelfIter, + Dtool_GeneratorWrapper_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 +#if PY_VERSION_HEX >= 0x03040000 + 0, // tp_finalize +#endif +}; + #endif // HAVE_PYTHON diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index c341bb6b33..bf6d038382 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -495,9 +495,15 @@ struct Dtool_SeqMapWrapper { objobjargproc _map_setitem_func; }; +struct Dtool_GeneratorWrapper { + Dtool_WrapperBase _base; + iternextfunc _iternext_func; +}; + EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SequenceWrapper_Type; EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Type; EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SeqMapWrapper_Type; +EXPCL_INTERROGATEDB extern PyTypeObject Dtool_GeneratorWrapper_Type; EXPCL_INTERROGATEDB extern PyTypeObject Dtool_StaticProperty_Type; EXPCL_INTERROGATEDB PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset); diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index 935b3a47b6..90cdf17715 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -115,6 +115,7 @@ extern "C" { EXPCL_PYSTUB int PyObject_IsTrue(...); EXPCL_PYSTUB int PyObject_Repr(...); EXPCL_PYSTUB int PyObject_RichCompareBool(...); + EXPCL_PYSTUB int PyObject_SelfIter(...); EXPCL_PYSTUB int PyObject_SetAttrString(...); EXPCL_PYSTUB int PyObject_Str(...); EXPCL_PYSTUB int PyObject_Type(...); @@ -336,6 +337,7 @@ int PyObject_IsInstance(...) { return 0; } int PyObject_IsTrue(...) { return 0; } int PyObject_Repr(...) { return 0; } int PyObject_RichCompareBool(...) { return 0; } +int PyObject_SelfIter(...) { return 0; } int PyObject_SetAttrString(...) { return 0; } int PyObject_Str(...) { return 0; } int PyObject_Type(...) { return 0; } diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 696cc33857..ccd3d30bd0 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -3616,6 +3616,7 @@ if (not RUNTIME): TargetAdd('p3event_composite2.obj', opts=OPTS, input='p3event_composite2.cxx') OPTS=['DIR:panda/src/event', 'PYTHON'] + TargetAdd('p3event_asyncTask_ext.obj', opts=OPTS, input='asyncTask_ext.cxx') TargetAdd('p3event_pythonTask.obj', opts=OPTS, input='pythonTask.cxx') IGATEFILES=GetDirectoryContents('panda/src/event', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3event.in', opts=OPTS, input=IGATEFILES) @@ -4209,6 +4210,7 @@ if (not RUNTIME): TargetAdd('core.pyd', input='p3pipeline_pythonThread.obj') TargetAdd('core.pyd', input='p3putil_ext_composite.obj') TargetAdd('core.pyd', input='p3pnmimage_pfmFile_ext.obj') + TargetAdd('core.pyd', input='p3event_asyncTask_ext.obj') TargetAdd('core.pyd', input='p3event_pythonTask.obj') TargetAdd('core.pyd', input='p3gobj_ext_composite.obj') TargetAdd('core.pyd', input='p3pgraph_ext_composite.obj') diff --git a/panda/src/audio/audioLoadRequest.I b/panda/src/audio/audioLoadRequest.I index 21eea901c5..0daf2df619 100644 --- a/panda/src/audio/audioLoadRequest.I +++ b/panda/src/audio/audioLoadRequest.I @@ -62,11 +62,24 @@ is_ready() const { } /** - * Returns the sound that was loaded asynchronously, if any, or NULL if there - * was an error. It is an error to call this unless is_ready() returns true. + * Returns the sound that was loaded asynchronously, if any, or nullptr if + * there was an error. It is an error to call this unless is_ready() returns + * true. + * @deprecated Use result() instead. */ INLINE AudioSound *AudioLoadRequest:: get_sound() const { nassertr(_is_ready, NULL); return _sound; } + +/** + * Returns the sound that was loaded asynchronously, if any, or nullptr if + * there was an error. It is an error to call this unless is_ready() returns + * true. + */ +INLINE AudioSound *AudioLoadRequest:: +result() const { + nassertr(_is_ready, nullptr); + return _sound; +} diff --git a/panda/src/audio/audioLoadRequest.h b/panda/src/audio/audioLoadRequest.h index 7e5fb3d23b..04b63fcb31 100644 --- a/panda/src/audio/audioLoadRequest.h +++ b/panda/src/audio/audioLoadRequest.h @@ -42,6 +42,8 @@ PUBLISHED: INLINE bool is_ready() const; INLINE AudioSound *get_sound() const; + INLINE AudioSound *result() const; + protected: virtual DoneStatus do_task(); diff --git a/panda/src/event/asyncTask.I b/panda/src/event/asyncTask.I index ae411d3d7c..3b4476afb7 100644 --- a/panda/src/event/asyncTask.I +++ b/panda/src/event/asyncTask.I @@ -33,6 +33,7 @@ is_alive() const { case S_servicing: case S_sleeping: case S_active_nested: + case S_awaiting: return true; case S_inactive: diff --git a/panda/src/event/asyncTask.h b/panda/src/event/asyncTask.h index 97176df0a3..b50a4a6e54 100644 --- a/panda/src/event/asyncTask.h +++ b/panda/src/event/asyncTask.h @@ -45,6 +45,7 @@ PUBLISHED: DS_exit, // stop the enclosing sequence DS_pause, // pause, then exit (useful within a sequence) DS_interrupt, // interrupt the task manager, but run task again + DS_await, // await a different task's completion }; enum State { @@ -54,6 +55,7 @@ PUBLISHED: S_servicing_removed, // Still servicing, but wants removal from manager. S_sleeping, S_active_nested, // active within a sequence. + S_awaiting, // Waiting for a dependent task to complete }; INLINE State get_state() const; @@ -98,6 +100,9 @@ PUBLISHED: virtual void output(ostream &out) const; + EXTENSION(static PyObject *__await__(PyObject *self)); + EXTENSION(static PyObject *__iter__(PyObject *self)); + protected: void jump_to_task_chain(AsyncTaskManager *manager); DoneStatus unlock_and_do_task(); @@ -130,11 +135,16 @@ protected: double _total_dt; int _num_frames; + // Tasks waiting for this one to complete. + pvector _waiting_tasks; + static AtomicAdjust::Integer _next_task_id; static PStatCollector _show_code_pcollector; PStatCollector _task_pcollector; + friend class PythonTask; + public: static TypeHandle get_class_type() { return _type_handle; diff --git a/panda/src/event/asyncTaskChain.cxx b/panda/src/event/asyncTaskChain.cxx index bd5c391857..46975efb7c 100644 --- a/panda/src/event/asyncTaskChain.cxx +++ b/panda/src/event/asyncTaskChain.cxx @@ -44,6 +44,7 @@ AsyncTaskChain(AsyncTaskManager *manager, const string &name) : _frame_sync(false), _num_busy_threads(0), _num_tasks(0), + _num_awaiting_tasks(0), _state(S_initial), _current_sort(-INT_MAX), _pickup_mode(false), @@ -726,6 +727,13 @@ service_one_task(AsyncTaskChain::AsyncTaskChainThread *thread) { } break; + case AsyncTask::DS_await: + // The task wants to wait for another one to finish. + task->_state = AsyncTask::S_awaiting; + _cvar.notify_all(); + ++_num_awaiting_tasks; + break; + default: // The task has finished. cleanup_task(task, true, true); @@ -775,6 +783,20 @@ cleanup_task(AsyncTask *task, bool upon_death, bool clean_exit) { _manager->remove_task_by_name(task); + // Activate the tasks that were waiting for this one to finish. + if (upon_death) { + pvector::iterator it; + for (it = task->_waiting_tasks.begin(); it != task->_waiting_tasks.end(); ++it) { + AsyncTask *task = *it; + // Note that this task may not be on the same task chain. + nassertd(task->_manager == _manager) continue; + task->_state = AsyncTask::S_active; + task->_chain->_active.push_back(task); + --task->_chain->_num_awaiting_tasks; + } + task->_waiting_tasks.clear(); + } + if (upon_death) { _manager->_lock.release(); task->upon_death(_manager, clean_exit); @@ -899,7 +921,7 @@ finish_sort_group() { filter_timeslice_priority(); } - nassertr((size_t)_num_tasks == _active.size() + _this_active.size() + _next_active.size() + _sleeping.size(), true); + nassertr((size_t)_num_tasks == _active.size() + _this_active.size() + _next_active.size() + _sleeping.size() + (size_t)_num_awaiting_tasks, true); make_heap(_active.begin(), _active.end(), AsyncTaskSortPriority()); _current_sort = -INT_MAX; diff --git a/panda/src/event/asyncTaskChain.h b/panda/src/event/asyncTaskChain.h index 4f98ef284a..3dded59317 100644 --- a/panda/src/event/asyncTaskChain.h +++ b/panda/src/event/asyncTaskChain.h @@ -172,6 +172,7 @@ protected: bool _frame_sync; int _num_busy_threads; int _num_tasks; + int _num_awaiting_tasks; TaskHeap _active; TaskHeap _this_active; TaskHeap _next_active; diff --git a/panda/src/event/asyncTaskManager.h b/panda/src/event/asyncTaskManager.h index 967476c4af..a92a46b141 100644 --- a/panda/src/event/asyncTaskManager.h +++ b/panda/src/event/asyncTaskManager.h @@ -155,6 +155,7 @@ private: friend class AsyncTaskChain::AsyncTaskChainThread; friend class AsyncTask; friend class AsyncTaskSequence; + friend class PythonTask; }; INLINE ostream &operator << (ostream &out, const AsyncTaskManager &manager) { diff --git a/panda/src/event/asyncTask_ext.cxx b/panda/src/event/asyncTask_ext.cxx new file mode 100755 index 0000000000..bbfb46d2c1 --- /dev/null +++ b/panda/src/event/asyncTask_ext.cxx @@ -0,0 +1,75 @@ +/** + * 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 asyncTask_ext.h + * @author rdb + * @date 2017-10-29 + */ + +#include "asyncTask_ext.h" +#include "nodePath.h" + +#ifdef HAVE_PYTHON + +#ifndef CPPPARSER +extern struct Dtool_PyTypedObject Dtool_AsyncTask; +#endif + +/** + * Yields continuously until the task has finished. + */ +static PyObject *gen_next(PyObject *self) { + const AsyncTask *request = nullptr; + if (!Dtool_Call_ExtractThisPointer(self, Dtool_AsyncTask, (void **)&request)) { + return nullptr; + } + + if (request->is_alive()) { + // Continue awaiting the result. + Py_INCREF(self); + return self; + } else { + // It's done. Do we have a method like result(), eg. in the case of a + // ModelLoadRequest? In that case we pass that value into the exception. + PyObject *method = PyObject_GetAttrString(self, "result"); + PyObject *result = nullptr; + if (method != nullptr) { + if (PyCallable_Check(method)) { + result = _PyObject_CallNoArg(method); + Py_DECREF(method); + if (result == nullptr) { + // An exception happened. Pass it on. + return nullptr; + } + } + Py_DECREF(method); + } + Py_INCREF(PyExc_StopIteration); + PyErr_Restore(PyExc_StopIteration, result, nullptr); + return nullptr; + } +} + +/** + * Returns a generator that continuously yields an awaitable until the task + * has finished. This allows syntax like `model = await loader.load...` to be + * used in a Python coroutine. + */ +PyObject *Extension:: +__await__(PyObject *self) { + Dtool_GeneratorWrapper *gen; + gen = (Dtool_GeneratorWrapper *)PyType_GenericAlloc(&Dtool_GeneratorWrapper_Type, 0); + if (gen != nullptr) { + Py_INCREF(self); + gen->_base._self = self; + gen->_iternext_func = &gen_next; + } + return (PyObject *)gen; +} + +#endif diff --git a/panda/src/event/asyncTask_ext.h b/panda/src/event/asyncTask_ext.h new file mode 100755 index 0000000000..89fd4cb8f4 --- /dev/null +++ b/panda/src/event/asyncTask_ext.h @@ -0,0 +1,35 @@ +/** + * 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 asyncTask_ext.h + * @author rdb + * @date 2017-10-29 + */ + +#ifndef ASYNCTASK_EXT_H +#define ASYNCTASK_EXT_H + +#include "extension.h" +#include "py_panda.h" +#include "modelLoadRequest.h" + +#ifdef HAVE_PYTHON + +/** + * Extension class for AsyncTask + */ +template<> +class Extension : public ExtensionBase { +public: + static PyObject *__await__(PyObject *self); + static PyObject *__iter__(PyObject *self) { return __await__(self); } +}; + +#endif // HAVE_PYTHON + +#endif // ASYNCTASK_EXT_H diff --git a/panda/src/event/pythonTask.I b/panda/src/event/pythonTask.I index b2f9a0ef07..7280b4e7d6 100644 --- a/panda/src/event/pythonTask.I +++ b/panda/src/event/pythonTask.I @@ -10,3 +10,52 @@ * @author drose * @date 2008-09-16 */ + +/** + * Returns the function that is called when the task runs. + */ +INLINE PyObject *PythonTask:: +get_function() { + Py_INCREF(_function); + return _function; +} + +/** + * Returns the function that is called when the task finishes. + */ +INLINE PyObject *PythonTask:: +get_upon_death() { + Py_INCREF(_upon_death); + return _upon_death; +} + +/** + * Returns the "owner" object. See set_owner(). + */ +INLINE PyObject *PythonTask:: +get_owner() const { + Py_INCREF(_owner); + return _owner; +} + +/** + * Sets the "result" of this task. This is the value returned from an "await" + * expression on this task. + * This can only be called while the task is still alive. + */ +INLINE void PythonTask:: +set_result(PyObject *result) { + nassertv(is_alive()); + nassertv(_exception == nullptr); + Py_INCREF(result); + Py_XDECREF(_exc_value); + _exc_value = result; +} + +/** + * Same as __await__, for backward compatibility with the old coroutine way. + */ +INLINE PyObject *PythonTask:: +__iter__(PyObject *self) { + return __await__(self); +} diff --git a/panda/src/event/pythonTask.cxx b/panda/src/event/pythonTask.cxx index 3ca6178803..1b4adc0921 100644 --- a/panda/src/event/pythonTask.cxx +++ b/panda/src/event/pythonTask.cxx @@ -19,28 +19,52 @@ #include "py_panda.h" #include "pythonThread.h" +#include "asyncTaskManager.h" TypeHandle PythonTask::_type_handle; #ifndef CPPPARSER extern struct Dtool_PyTypedObject Dtool_TypedReferenceCount; +extern struct Dtool_PyTypedObject Dtool_AsyncTask; +extern struct Dtool_PyTypedObject Dtool_PythonTask; #endif /** * */ PythonTask:: -PythonTask(PyObject *function, const string &name) : - AsyncTask(name) -{ - _function = NULL; - _args = NULL; - _upon_death = NULL; - _owner = NULL; - _registered_to_owner = false; - _generator = NULL; +PythonTask(PyObject *func_or_coro, const string &name) : + AsyncTask(name), + _function(nullptr), + _args(nullptr), + _upon_death(nullptr), + _owner(nullptr), + _registered_to_owner(false), + _exception(nullptr), + _exc_value(nullptr), + _exc_traceback(nullptr), + _generator(nullptr), + _future_done(nullptr), + _retrieved_exception(false) { + + nassertv(func_or_coro != nullptr); + if (func_or_coro == Py_None || PyCallable_Check(func_or_coro)) { + _function = func_or_coro; + Py_INCREF(_function); +#if PY_VERSION_HEX >= 0x03050000 + } else if (PyCoro_CheckExact(func_or_coro)) { + // We also allow passing in a coroutine, because why not. + _generator = func_or_coro; + Py_INCREF(_generator); +#endif + } else if (PyGen_CheckExact(func_or_coro)) { + // Something emulating a coroutine. + _generator = func_or_coro; + Py_INCREF(_generator); + } else { + nassert_raise("Invalid function passed to PythonTask"); + } - set_function(function); set_args(Py_None, true); set_upon_death(Py_None); set_owner(Py_None); @@ -60,9 +84,24 @@ PythonTask(PyObject *function, const string &name) : */ PythonTask:: ~PythonTask() { - Py_DECREF(_function); +#ifndef NDEBUG + // If the coroutine threw an exception, and there was no opportunity to + // handle it, let the user know. + if (_exception != nullptr && !_retrieved_exception) { + task_cat.error() + << *this << " exception was never retrieved:\n"; + PyErr_Restore(_exception, _exc_value, _exc_traceback); + PyErr_Print(); + PyErr_Restore(nullptr, nullptr, nullptr); + } +#endif + + Py_XDECREF(_function); Py_DECREF(_args); Py_DECREF(__dict__); + Py_XDECREF(_exception); + Py_XDECREF(_exc_value); + Py_XDECREF(_exc_traceback); Py_XDECREF(_generator); Py_XDECREF(_owner); Py_XDECREF(_upon_death); @@ -83,15 +122,6 @@ set_function(PyObject *function) { } } -/** - * Returns the function that is called when the task runs. - */ -PyObject *PythonTask:: -get_function() { - Py_INCREF(_function); - return _function; -} - /** * Replaces the argument list that is passed to the task function. The * parameter should be a tuple or list of arguments, or None to indicate the @@ -166,15 +196,6 @@ set_upon_death(PyObject *upon_death) { } } -/** - * Returns the function that is called when the task finishes. - */ -PyObject *PythonTask:: -get_upon_death() { - Py_INCREF(_upon_death); - return _upon_death; -} - /** * Specifies a Python object that serves as the "owner" for the task. This * owner object must have two methods: _addTask() and _clearTask(), which will @@ -212,12 +233,87 @@ set_owner(PyObject *owner) { } /** - * Returns the "owner" object. See set_owner(). + * Returns the result of this task's execution, as set by set_result() within + * the task or returned from a coroutine added to the task manager. If an + * exception occurred within this task, it is raised instead. */ PyObject *PythonTask:: -get_owner() { - Py_INCREF(_owner); - return _owner; +result() const { + nassertr(!is_alive(), nullptr); + + if (_exception == nullptr) { + // The result of the call is stored in _exc_value. + Py_XINCREF(_exc_value); + return _exc_value; + } else { + _retrieved_exception = true; + Py_INCREF(_exception); + Py_XINCREF(_exc_value); + Py_XINCREF(_exc_traceback); + PyErr_Restore(_exception, _exc_value, _exc_traceback); + return nullptr; + } +} + +/** + * If an exception occurred during execution of this task, returns it. This + * is only set if this task returned a coroutine or generator. + */ +/*PyObject *PythonTask:: +exception() const { + if (_exception == nullptr) { + Py_INCREF(Py_None); + return Py_None; + } else if (_exc_value == nullptr || _exc_value == Py_None) { + return _PyObject_CallNoArg(_exception); + } else if (PyTuple_Check(_exc_value)) { + return PyObject_Call(_exception, _exc_value, nullptr); + } else { + return PyObject_CallFunctionObjArgs(_exception, _exc_value, nullptr); + } +}*/ + +/** + * Returns an iterator that continuously yields an awaitable until the task + * has finished. + */ +PyObject *PythonTask:: +__await__(PyObject *self) { + Dtool_GeneratorWrapper *gen; + gen = (Dtool_GeneratorWrapper *)PyType_GenericAlloc(&Dtool_GeneratorWrapper_Type, 0); + if (gen != nullptr) { + Py_INCREF(self); + gen->_base._self = self; + gen->_iternext_func = &gen_next; + } + return (PyObject *)gen; +} + +/** + * Yields continuously until a task has finished. + */ +PyObject *PythonTask:: +gen_next(PyObject *self) { + const PythonTask *task = nullptr; + if (!Dtool_Call_ExtractThisPointer(self, Dtool_PythonTask, (void **)&task)) { + return nullptr; + } + + if (task->is_alive()) { + Py_INCREF(self); + return self; + } else if (task->_exception != nullptr) { + task->_retrieved_exception = true; + Py_INCREF(task->_exception); + Py_INCREF(task->_exc_value); + Py_INCREF(task->_exc_traceback); + PyErr_Restore(task->_exception, task->_exc_value, task->_exc_traceback); + return nullptr; + } else { + // The result of the call is stored in _exc_value. + PyErr_SetObject(PyExc_StopIteration, task->_exc_value); + return nullptr; + } } /** @@ -396,16 +492,30 @@ do_task() { */ AsyncTask::DoneStatus PythonTask:: do_python_task() { - PyObject *result = NULL; + PyObject *result = nullptr; - if (_generator == (PyObject *)NULL) { + // Are we waiting for a future to finish? + if (_future_done != nullptr) { + PyObject *is_done = PyObject_CallObject(_future_done, nullptr); + if (!PyObject_IsTrue(is_done)) { + // Nope, ask again next frame. + Py_DECREF(is_done); + return DS_cont; + } + Py_DECREF(is_done); + Py_DECREF(_future_done); + _future_done = nullptr; + } + + if (_generator == nullptr) { // We are calling the function directly. + nassertr(_function != nullptr, DS_interrupt); + PyObject *args = get_args(); result = PythonThread::call_python_func(_function, args); Py_DECREF(args); -#ifdef PyGen_Check - if (result != (PyObject *)NULL && PyGen_Check(result)) { + if (result != nullptr && PyGen_Check(result)) { // The function has yielded a generator. We will call into that // henceforth, instead of calling the function from the top again. if (task_cat.is_debug()) { @@ -423,30 +533,166 @@ do_python_task() { Py_DECREF(str); } _generator = result; - result = NULL; - } + result = nullptr; + +#if PY_VERSION_HEX >= 0x03050000 + } else if (result != nullptr && Py_TYPE(result)->tp_as_async != nullptr) { + // The function yielded a coroutine, or something of the sort. + if (task_cat.is_debug()) { + PyObject *str = PyObject_ASCII(_function); + PyObject *str2 = PyObject_ASCII(result); + task_cat.debug() + << PyUnicode_AsUTF8(str) << " in " << *this + << " yielded an awaitable: " << PyUnicode_AsUTF8(str2) << "\n"; + Py_DECREF(str); + Py_DECREF(str2); + } + if (PyCoro_CheckExact(result)) { + // If a coroutine, am_await is possible but senseless, since we can + // just call send(None) on the coroutine itself. + _generator = result; + } else { + unaryfunc await = Py_TYPE(result)->tp_as_async->am_await; + _generator = await(result); + Py_DECREF(result); + } + result = nullptr; #endif + } } - if (_generator != (PyObject *)NULL) { - // We are calling a generator. - PyObject *func = PyObject_GetAttrString(_generator, "next"); - nassertr(func != (PyObject *)NULL, DS_interrupt); - - result = PyObject_CallObject(func, NULL); + if (_generator != nullptr) { + // We are calling a generator. Use "send" rather than PyIter_Next since + // we need to be able to read the value from a StopIteration exception. + PyObject *func = PyObject_GetAttrString(_generator, "send"); + nassertr(func != nullptr, DS_interrupt); + result = PyObject_CallFunctionObjArgs(func, Py_None, nullptr); Py_DECREF(func); - if (result == (PyObject *)NULL && PyErr_Occurred() && - PyErr_ExceptionMatches(PyExc_StopIteration)) { - // "Catch" StopIteration and treat it like DS_done. - PyErr_Clear(); + if (result == nullptr) { + // An error happened. If StopIteration, that indicates the task has + // returned. Otherwise, we need to save it so that it can be re-raised + // in the function that awaited this task. Py_DECREF(_generator); - _generator = NULL; - return DS_done; + _generator = nullptr; + +#if PY_VERSION_HEX >= 0x03030000 + if (_PyGen_FetchStopIterationValue(&result) == 0) { +#else + if (PyErr_ExceptionMatches(PyExc_StopIteration)) { + result = Py_None; + Py_INCREF(result); +#endif + PyErr_Restore(nullptr, nullptr, nullptr); + + // If we passed a coroutine into the task, eg. something like: + // taskMgr.add(my_async_function()) + // then we cannot rerun the task, so the return value is always + // assumed to be DS_done. Instead, we pass the return value to the + // result of the `await` expression. + if (_function == nullptr) { + if (task_cat.is_debug()) { + task_cat.debug() + << *this << " received StopIteration from coroutine.\n"; + } + // Store the result in _exc_value because that's not used anyway. + Py_XDECREF(_exc_value); + _exc_value = result; + return DS_done; + } + } else if (_function == nullptr) { + // We got an exception. If this is a scheduled coroutine, we will + // keep it and instead throw it into whatever 'awaits' this task. + // Otherwise, fall through and handle it the regular way. + Py_XDECREF(_exception); + Py_XDECREF(_exc_value); + Py_XDECREF(_exc_traceback); + PyErr_Fetch(&_exception, &_exc_value, &_exc_traceback); + _retrieved_exception = false; + + if (task_cat.is_debug()) { + if (_exception != nullptr && Py_TYPE(_exception) == &PyType_Type) { + task_cat.debug() + << *this << " received " << ((PyTypeObject *)_exception)->tp_name << " from coroutine.\n"; + } else { + task_cat.debug() + << *this << " received exception from coroutine.\n"; + } + } + + // Tell the task chain we want to kill ourselves. It doesn't really + // matter what we return if we set S_servicing_removed. If we don't + // set it, however, it will think this was a clean exit. + _manager->_lock.acquire(); + _state = S_servicing_removed; + _manager->_lock.release(); + return DS_interrupt; + } + + } else if (DtoolCanThisBeAPandaInstance(result)) { + // We are waiting for a task to finish. + void *ptr = ((Dtool_PyInstDef *)result)->_My_Type->_Dtool_UpcastInterface(result, &Dtool_AsyncTask); + if (ptr != nullptr) { + // Suspend execution of this task until this other task has completed. + AsyncTask *task = (AsyncTask *)ptr; + AsyncTaskManager *manager = task->_manager; + nassertr(manager != nullptr, DS_interrupt); + nassertr(manager == _manager, DS_interrupt); + manager->_lock.acquire(); + if (task != (AsyncTask *)this) { + if (task->is_alive()) { + if (task_cat.is_debug()) { + task_cat.debug() + << *this << " is now awaiting <" << *task << ">.\n"; + } + task->_waiting_tasks.push_back(this); + } else { + // The task is already done. Continue at next opportunity. + Py_DECREF(result); + manager->_lock.release(); + return DS_cont; + } + } else { + // This is an error. If we wanted to be fancier we could also + // detect deeper circular dependencies. + task_cat.error() + << *this << " cannot await itself\n"; + } + task->_manager->_lock.release(); + Py_DECREF(result); + return DS_await; + } + + } else { + // We are waiting for a future to finish. We currently implement this + // by simply checking every frame whether the future is done. + PyObject *check = PyObject_GetAttrString(result, "_asyncio_future_blocking"); + if (check != nullptr && check != Py_None) { + Py_DECREF(check); + // Next frame, check whether this future is done. + _future_done = PyObject_GetAttrString(result, "done"); + if (_future_done == nullptr || !PyCallable_Check(_future_done)) { + task_cat.error() + << "future.done is not callable\n"; + return DS_interrupt; + } +#if PY_MAJOR_VERSION >= 3 + if (task_cat.is_debug()) { + PyObject *str = PyObject_ASCII(result); + task_cat.debug() + << *this << " is now awaiting " << PyUnicode_AsUTF8(str) << ".\n"; + Py_DECREF(str); + } +#endif + Py_DECREF(result); + return DS_cont; + } + PyErr_Clear(); + Py_XDECREF(check); } } - if (result == (PyObject *)NULL) { + if (result == nullptr) { if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { // Don't print an error message for SystemExit. Or rather, make it a // debug message. diff --git a/panda/src/event/pythonTask.h b/panda/src/event/pythonTask.h index d97be5795e..59c3c65c5f 100644 --- a/panda/src/event/pythonTask.h +++ b/panda/src/event/pythonTask.h @@ -22,8 +22,8 @@ #include "py_panda.h" /** - * This class exists to allow association of a Python function with the - * AsyncTaskManager. + * This class exists to allow association of a Python function or coroutine + * with the AsyncTaskManager. */ class PythonTask : public AsyncTask { PUBLISHED: @@ -32,16 +32,23 @@ PUBLISHED: ALLOC_DELETED_CHAIN(PythonTask); void set_function(PyObject *function); - PyObject *get_function(); + INLINE PyObject *get_function(); void set_args(PyObject *args, bool append_task); PyObject *get_args(); void set_upon_death(PyObject *upon_death); - PyObject *get_upon_death(); + INLINE PyObject *get_upon_death(); void set_owner(PyObject *owner); - PyObject *get_owner(); + INLINE PyObject *get_owner() const; + + INLINE void set_result(PyObject *result); + PyObject *result() const; + //PyObject *exception() const; + + static PyObject *__await__(PyObject *self); + INLINE static PyObject *__iter__(PyObject *self); int __setattr__(PyObject *self, PyObject *attr, PyObject *v); int __delattr__(PyObject *self, PyObject *attr); @@ -94,6 +101,8 @@ protected: virtual void upon_death(AsyncTaskManager *manager, bool clean_exit); private: + static PyObject *gen_next(PyObject *self); + void register_to_owner(); void unregister_from_owner(); void call_owner_method(const char *method_name); @@ -102,12 +111,19 @@ private: private: PyObject *_function; PyObject *_args; - bool _append_task; PyObject *_upon_death; PyObject *_owner; - bool _registered_to_owner; + + PyObject *_exception; + PyObject *_exc_value; + PyObject *_exc_traceback; PyObject *_generator; + PyObject *_future_done; + + bool _append_task; + bool _registered_to_owner; + mutable bool _retrieved_exception; public: static TypeHandle get_class_type() { diff --git a/panda/src/pgraph/modelFlattenRequest.I b/panda/src/pgraph/modelFlattenRequest.I index 248d122c40..84e58744da 100644 --- a/panda/src/pgraph/modelFlattenRequest.I +++ b/panda/src/pgraph/modelFlattenRequest.I @@ -34,7 +34,7 @@ get_orig() const { /** * Returns true if this request has completed, false if it is still pending. * When this returns true, you may retrieve the model loaded by calling - * get_result(). + * result(). */ INLINE bool ModelFlattenRequest:: is_ready() const { @@ -47,6 +47,20 @@ is_ready() const { */ INLINE PandaNode *ModelFlattenRequest:: get_model() const { - nassertr(_is_ready, NULL); + nassertr(_is_ready, nullptr); return _model; } + +/** + * Returns the flattened copy of the model wrapped in a NodePath. It is an + * error to call this unless is_ready() returns true. + */ +INLINE NodePath ModelFlattenRequest:: +result() const { + nassertr(_is_ready, NodePath::fail()); + if (_model != nullptr) { + return NodePath(_model); + } else { + return NodePath::fail(); + } +} diff --git a/panda/src/pgraph/modelFlattenRequest.h b/panda/src/pgraph/modelFlattenRequest.h index 5716635f82..08a6e72901 100644 --- a/panda/src/pgraph/modelFlattenRequest.h +++ b/panda/src/pgraph/modelFlattenRequest.h @@ -19,6 +19,7 @@ #include "asyncTask.h" #include "pandaNode.h" #include "pointerTo.h" +#include "nodePath.h" /** * This class object manages a single asynchronous request to flatten a model. @@ -38,9 +39,10 @@ PUBLISHED: INLINE bool is_ready() const; INLINE PandaNode *get_model() const; + INLINE NodePath result() const; + MAKE_PROPERTY(orig, get_orig); MAKE_PROPERTY(ready, is_ready); - MAKE_PROPERTY(model, get_model); protected: virtual DoneStatus do_task(); diff --git a/panda/src/pgraph/modelLoadRequest.I b/panda/src/pgraph/modelLoadRequest.I index 7392194510..2b8ef41544 100644 --- a/panda/src/pgraph/modelLoadRequest.I +++ b/panda/src/pgraph/modelLoadRequest.I @@ -37,6 +37,16 @@ get_loader() const { return _loader; } +/** + * Returns the model that was loaded asynchronously as a NodePath, if any, or + * the empty NodePath if there was an error. + */ +INLINE NodePath ModelLoadRequest:: +result() const { + nassertr_always(_is_ready, NodePath::fail()); + return NodePath(_model); +} + /** * Returns true if this request has completed, false if it is still pending. * When this returns true, you may retrieve the model loaded by calling diff --git a/panda/src/pgraph/modelLoadRequest.h b/panda/src/pgraph/modelLoadRequest.h index 00f55e8052..423a807c38 100644 --- a/panda/src/pgraph/modelLoadRequest.h +++ b/panda/src/pgraph/modelLoadRequest.h @@ -11,8 +11,8 @@ * @date 2006-08-29 */ -#ifndef MODELLOADREQUEST -#define MODELLOADREQUEST +#ifndef MODELLOADREQUEST_H +#define MODELLOADREQUEST_H #include "pandabase.h" @@ -22,6 +22,7 @@ #include "pandaNode.h" #include "pointerTo.h" #include "loader.h" +#include "nodePath.h" /** * A class object that manages a single asynchronous model load request. @@ -42,6 +43,8 @@ PUBLISHED: INLINE const LoaderOptions &get_options() const; INLINE Loader *get_loader() const; + INLINE NodePath result() const; + INLINE bool is_ready() const; INLINE PandaNode *get_model() const; @@ -49,7 +52,6 @@ PUBLISHED: MAKE_PROPERTY(options, get_options); MAKE_PROPERTY(loader, get_loader); MAKE_PROPERTY(ready, is_ready); - MAKE_PROPERTY(model, get_model); protected: virtual DoneStatus do_task(); diff --git a/panda/src/pgraph/modelSaveRequest.I b/panda/src/pgraph/modelSaveRequest.I index d7ccd1dd09..14940aaf0f 100644 --- a/panda/src/pgraph/modelSaveRequest.I +++ b/panda/src/pgraph/modelSaveRequest.I @@ -64,3 +64,13 @@ get_success() const { nassertr(_is_ready, false); return _success; } + +/** + * Returns a boolean indicating whether the model saved correctly. It is an + * error to call this unless is_ready() returns true. + */ +INLINE bool ModelSaveRequest:: +result() const { + nassertr(_is_ready, false); + return _success; +} diff --git a/panda/src/pgraph/modelSaveRequest.h b/panda/src/pgraph/modelSaveRequest.h index 878e28edee..fb0ca6551b 100644 --- a/panda/src/pgraph/modelSaveRequest.h +++ b/panda/src/pgraph/modelSaveRequest.h @@ -11,8 +11,8 @@ * @date 2012-12-19 */ -#ifndef MODELSAVEREQUEST -#define MODELSAVEREQUEST +#ifndef MODELSAVEREQUEST_H +#define MODELSAVEREQUEST_H #include "pandabase.h" @@ -46,12 +46,13 @@ PUBLISHED: INLINE bool is_ready() const; INLINE bool get_success() const; + INLINE bool result() const; + MAKE_PROPERTY(filename, get_filename); MAKE_PROPERTY(options, get_options); MAKE_PROPERTY(node, get_node); MAKE_PROPERTY(loader, get_loader); MAKE_PROPERTY(ready, is_ready); - MAKE_PROPERTY(success, get_success); protected: virtual DoneStatus do_task(); From f22c0cdd83ad8f22db0e0736df00e42b1158dfb4 Mon Sep 17 00:00:00 2001 From: frainfreeze Date: Tue, 31 Oct 2017 19:20:24 +0100 Subject: [PATCH 202/254] Add README.md files for various directories Closes: #10 --- dtool/src/interrogate/README.md | 28 ++++++++++++++++++++++++++++ panda/src/chan/README.md | 5 +++++ panda/src/cull/README.md | 3 +++ panda/src/dgraph/README.md | 3 +++ panda/src/display/README.md | 2 ++ panda/src/dxgsg9/README.md | 2 ++ 6 files changed, 43 insertions(+) create mode 100644 dtool/src/interrogate/README.md create mode 100644 panda/src/chan/README.md create mode 100644 panda/src/cull/README.md create mode 100644 panda/src/dgraph/README.md create mode 100644 panda/src/display/README.md create mode 100644 panda/src/dxgsg9/README.md diff --git a/dtool/src/interrogate/README.md b/dtool/src/interrogate/README.md new file mode 100644 index 0000000000..4da044c8b5 --- /dev/null +++ b/dtool/src/interrogate/README.md @@ -0,0 +1,28 @@ +A key advantage of Panda3D is that it provides developers with the +ability to use both C++ and Python simultaneously. Essentially, Panda3D +gives programmers the best of both worlds, as they are able to take +advantage of the high performance and low-level programming found in +C++ in addition to the flexibility, interactive scripting, and +rapid-prototyping capabilities of Python. This feature is made possible +due to Python’s ability to call C libraries, and ultimately make use of +Panda3D’s Interrogate System: an automated C++ Extension Module +generation utility similar to SWIG. Although Python is the favored +scripting language of Panda3D, the engine is highly extensible in this +aspect, as any language that has a foreign function interface can make +use of the Interrogate System. + +The Interrogate System works like a compiler by scanning and parsing +C++ code for the Panda3D-specific, “PUBLISHED” keyword. This keyword +marks the particular methods of a class that are to be exposed within a +C++ Extension Module for that class which is eventually generated. One +benefit of using the “PUBLISHED” keyword is that it alleviates the need +for an interface file that provides function prototypes for the class +methods that will be exposed within the extension module, as is the +case with SWIG. Interrogate turns a class into a loose collection of +Python interface wrapper functions that make up the C++ Extension +Module. + +This package depends on the 'cppparser' package, which contains the +code that parses the C++ headers, and the 'interrogatedb' package, +which contains the intermediate representation of the interfaces that +can be saved to a database file for FFI generation tools to consume. diff --git a/panda/src/chan/README.md b/panda/src/chan/README.md new file mode 100644 index 0000000000..298bdf4345 --- /dev/null +++ b/panda/src/chan/README.md @@ -0,0 +1,5 @@ +This package contains the animation channels. This defines the various +kinds of AnimChannels that may be defined, as well as the MovingPart +class which binds to the channels and plays the animation. This is a +support library for char, as well as any other libraries that want to +define objects whose values change over time. diff --git a/panda/src/cull/README.md b/panda/src/cull/README.md new file mode 100644 index 0000000000..f5ae26c40d --- /dev/null +++ b/panda/src/cull/README.md @@ -0,0 +1,3 @@ +This package contains the Cull Traverser. The cull traversal collects +all state changes specified, and removes unnecessary state change +requests. Also does all the depth sorting for proper alphaing. diff --git a/panda/src/dgraph/README.md b/panda/src/dgraph/README.md new file mode 100644 index 0000000000..330c952a60 --- /dev/null +++ b/panda/src/dgraph/README.md @@ -0,0 +1,3 @@ +This package defines and manages the data graph, which is the hierarchy +of devices, tforms, and any other things which might have an input or +an output and need to execute every frame. diff --git a/panda/src/display/README.md b/panda/src/display/README.md new file mode 100644 index 0000000000..f9029b8a2b --- /dev/null +++ b/panda/src/display/README.md @@ -0,0 +1,2 @@ +This package contains the abstract display classes, including pipes, +windows, channels, and display regions. diff --git a/panda/src/dxgsg9/README.md b/panda/src/dxgsg9/README.md new file mode 100644 index 0000000000..72da6ba2f5 --- /dev/null +++ b/panda/src/dxgsg9/README.md @@ -0,0 +1,2 @@ +This package handles all communication with the DirectX backend, and +manages state to minimize redundant state changes. From 34731cd2f42d8b573c3ca6f64be47c3de52f2e21 Mon Sep 17 00:00:00 2001 From: Ed Swartz Date: Tue, 31 Oct 2017 13:43:28 -0500 Subject: [PATCH 203/254] rocket: Add sample showing some Panda3D uses of libRocket. (#24) --- .../assets/Perfect DOS VGA 437.ttf | Bin 0 -> 81192 bytes samples/rocket-console/assets/console.rcss | 38 ++ samples/rocket-console/assets/console.rml | 11 + samples/rocket-console/assets/dos437.txt | 1 + samples/rocket-console/assets/loading.rml | 54 +++ samples/rocket-console/assets/modenine.nfo | 18 + samples/rocket-console/assets/modenine.ttf | Bin 0 -> 22256 bytes samples/rocket-console/assets/monitor.egg.pz | Bin 0 -> 184112 bytes samples/rocket-console/assets/monitor.txt | 12 + samples/rocket-console/assets/rkt.rcss | 44 ++ samples/rocket-console/assets/takeyga_kb.egg | 316 ++++++++++++++ .../assets/tex/takeyga_kb_diffuse.dds | Bin 0 -> 174904 bytes .../assets/tex/takeyga_kb_normal.dds | Bin 0 -> 174904 bytes .../assets/tex/takeyga_kb_specular.dds | Bin 0 -> 174904 bytes samples/rocket-console/assets/window.rcss | 56 +++ samples/rocket-console/assets/window.rml | 42 ++ samples/rocket-console/console.py | 153 +++++++ samples/rocket-console/main.py | 410 ++++++++++++++++++ 18 files changed, 1155 insertions(+) create mode 100644 samples/rocket-console/assets/Perfect DOS VGA 437.ttf create mode 100755 samples/rocket-console/assets/console.rcss create mode 100755 samples/rocket-console/assets/console.rml create mode 100644 samples/rocket-console/assets/dos437.txt create mode 100755 samples/rocket-console/assets/loading.rml create mode 100644 samples/rocket-console/assets/modenine.nfo create mode 100644 samples/rocket-console/assets/modenine.ttf create mode 100644 samples/rocket-console/assets/monitor.egg.pz create mode 100644 samples/rocket-console/assets/monitor.txt create mode 100755 samples/rocket-console/assets/rkt.rcss create mode 100644 samples/rocket-console/assets/takeyga_kb.egg create mode 100644 samples/rocket-console/assets/tex/takeyga_kb_diffuse.dds create mode 100644 samples/rocket-console/assets/tex/takeyga_kb_normal.dds create mode 100644 samples/rocket-console/assets/tex/takeyga_kb_specular.dds create mode 100755 samples/rocket-console/assets/window.rcss create mode 100755 samples/rocket-console/assets/window.rml create mode 100644 samples/rocket-console/console.py create mode 100644 samples/rocket-console/main.py diff --git a/samples/rocket-console/assets/Perfect DOS VGA 437.ttf b/samples/rocket-console/assets/Perfect DOS VGA 437.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f5cbfc06fd489f01566cfaa1a41f5c260368d7b9 GIT binary patch literal 81192 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 literal 0 HcmV?d00001 diff --git a/samples/rocket-console/assets/console.rcss b/samples/rocket-console/assets/console.rcss new file mode 100755 index 0000000000..b1df4879f5 --- /dev/null +++ b/samples/rocket-console/assets/console.rcss @@ -0,0 +1,38 @@ +body +{ + font-family: "Perfect DOS VGA 437"; + font-weight: normal; + font-style: normal; + + // use all the allocated texture space + min-width: 100%; + min-height: 100%; + + background-color: #000; +} + + +text#content +{ + z-index: 2; + font-size: 30px; + + white-space: pre-wrap; + + margin: auto; + + text-align: left; + position: absolute; + + // account for non-proportionality of our 1024x512 + // buffer compared with VGA font proportions and + // wanting to center the screen with 40 columns + top: 16px; + left: 32px; + + width: 100%; + height: 100%; + + color: #888; + +} diff --git a/samples/rocket-console/assets/console.rml b/samples/rocket-console/assets/console.rml new file mode 100755 index 0000000000..7887f4ef7c --- /dev/null +++ b/samples/rocket-console/assets/console.rml @@ -0,0 +1,11 @@ + + + + Administrative Console + + + + + + + diff --git a/samples/rocket-console/assets/dos437.txt b/samples/rocket-console/assets/dos437.txt new file mode 100644 index 0000000000..614d29885e --- /dev/null +++ b/samples/rocket-console/assets/dos437.txt @@ -0,0 +1 @@ +from www.dafont.com/perfect-dos-vga-437.font (info at http://zehfernando.com/2015/revisiting-vga-fonts/) \ No newline at end of file diff --git a/samples/rocket-console/assets/loading.rml b/samples/rocket-console/assets/loading.rml new file mode 100755 index 0000000000..c85a5d3bed --- /dev/null +++ b/samples/rocket-console/assets/loading.rml @@ -0,0 +1,54 @@ + + + Main Menu + + + + + + + +
+ +
+ +
diff --git a/samples/rocket-console/assets/modenine.nfo b/samples/rocket-console/assets/modenine.nfo new file mode 100644 index 0000000000..c6af4f1f8b --- /dev/null +++ b/samples/rocket-console/assets/modenine.nfo @@ -0,0 +1,18 @@ +ModeNine + +Based on Andrew Bulhak's ModeSeven, in turn inspired by the screen +output of the BBC Micro. + +copyright: +(C) 1998 Andrew C. Bulhak +(C) 2001 Graham H Freeman + +Freely Distributable. + +All we ask is that this readme file must be included with the font package. +Impresarios of free font sites and shovelware cd-roms, this means you! + +If you think this font is doovy, let us know at fonts@grudnuk.com, and we +might actually make more fonts. + +Another fine Grudnuk Creations produkt | http://grudnuk.com/ \ No newline at end of file diff --git a/samples/rocket-console/assets/modenine.ttf b/samples/rocket-console/assets/modenine.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c0b00462d766d67eb4e11d05ac3147968a19cf92 GIT binary patch literal 22256 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 literal 0 HcmV?d00001 diff --git a/samples/rocket-console/assets/monitor.egg.pz b/samples/rocket-console/assets/monitor.egg.pz new file mode 100644 index 0000000000000000000000000000000000000000..9c9f3675fda70fde8811c418905e66fc82cb63cc GIT binary patch literal 184112 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 z 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 *RS+*8=I`$Ty=0z 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 z�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
  • J-|iVMc|s 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
      vH52n4g?KSXo3DLxg)hymw_#_H3c9HO+KuNPpg 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

      7M83js6h-qZpUp%N07l> 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 literal 0 HcmV?d00001 diff --git a/samples/rocket-console/assets/monitor.txt b/samples/rocket-console/assets/monitor.txt new file mode 100644 index 0000000000..f2e1f7265e --- /dev/null +++ b/samples/rocket-console/assets/monitor.txt @@ -0,0 +1,12 @@ + +This is an edited version of this file from blendswap.com (http://www.blendswap.com/blends/view/74468). + +VERY IMPORTANT LICENSE INFORMATION: + +This file has been released by buzo under the following license: + + Creative Commons Zero (Public Domain) + +You can use this model for any purposes according to the following conditions: + + There are no requirements for CC-Zero licensed blends. \ No newline at end of file diff --git a/samples/rocket-console/assets/rkt.rcss b/samples/rocket-console/assets/rkt.rcss new file mode 100755 index 0000000000..ebc49f50fb --- /dev/null +++ b/samples/rocket-console/assets/rkt.rcss @@ -0,0 +1,44 @@ +/* +* Default styles for all the basic elements. +*/ + +div +{ + display: block; +} + +p +{ + display: block; +} + +h1 +{ + display: block; +} + +em +{ + font-style: italic; +} + +strong +{ + font-weight: bold; +} + +datagrid +{ + display: block; +} + +select, dataselect, datacombo +{ + text-align: left; +} + +tabset tabs +{ + display: block; +} + diff --git a/samples/rocket-console/assets/takeyga_kb.egg b/samples/rocket-console/assets/takeyga_kb.egg new file mode 100644 index 0000000000..3085947839 --- /dev/null +++ b/samples/rocket-console/assets/takeyga_kb.egg @@ -0,0 +1,316 @@ + { Z-up } + takeyga_kb { + diffr { 0.800000 } + diffg { 0.800000 } + diffb { 0.800000 } + specr { 0.500000 } + specg { 0.500000 } + specb { 0.500000 } + shininess { 12.5 } + ambr { 1.000000 } + ambg { 1.000000 } + ambb { 1.000000 } + emitr { 0.000000 } + emitg { 0.000000 } + emitb { 0.000000 } +} + + Texture.001 { + "./tex/takeyga_kb_specular.dds" + envtype { MODULATE } + minfilter { LINEAR_MIPMAP_LINEAR } + magfilter { LINEAR_MIPMAP_LINEAR } + wrap { REPEAT } +} + + Tex { + "./tex/takeyga_kb_diffuse.dds" + envtype { MODULATE } + minfilter { LINEAR_MIPMAP_LINEAR } + magfilter { LINEAR_MIPMAP_LINEAR } + wrap { REPEAT } +} + + Texture { + "./tex/takeyga_kb_normal.dds" + envtype { NORMAL } + minfilter { LINEAR_MIPMAP_LINEAR } + magfilter { LINEAR_MIPMAP_LINEAR } + wrap { REPEAT } +} + + Cube.001 { + { + { + 0.08499996364116669 0.0 0.0 0.0 + 0.0 0.23999987542629242 0.0 0.0 + 0.0 0.0 0.02500000037252903 0.0 + 0.0 0.0 0.0 1.0 + } + } + + Cube.001 { + + 0 {0.082953 0.240000 -0.025000 + { + 0.158203125 0.595703125 + } + } + 1 {0.082953 -0.240000 -0.025000 + { + 0.98828125 0.6015625 + } + } + 2 {-0.085000 -0.240000 -0.025000 + { + 0.98828125 0.986328125 + } + } + 3 {-0.085000 0.240000 -0.025000 + { + 0.162109375 0.98828125 + } + } + 4 {0.073544 0.227744 -0.005546 + { + 0.990234375 0.017578125 + } + } + 5 {-0.067932 0.223167 0.018996 + { + 0.98046875 0.46875 + } + } + 6 {-0.067932 -0.223167 0.018996 + { + 0.017578125 0.470703125 + } + } + 7 {0.073544 -0.227744 -0.005546 + { + 0.01953125 0.013671875 + } + } + 8 {0.082372 0.237328 -0.015273 + { + 0.9794921875 0.552734375 + } + } + 9 {0.073544 0.227744 -0.005546 + { + 0.9765625 0.57421875 + } + } + 10 {0.073544 -0.227744 -0.005546 + { + 0.025390625 0.57421875 + } + } + 11 {0.082372 -0.237328 -0.015273 + { + 0.0234375 0.5537109375 + } + } + 12 {0.082372 -0.237328 -0.015273 + { + 0.0703125 0.6123046875 + } + } + 13 {0.073544 -0.227744 -0.005546 + { + 0.095703125 0.615234375 + } + } + 14 {-0.067932 -0.223167 0.018996 + { + 0.13671875 0.97265625 + } + } + 15 {-0.080884 -0.235006 0.001122 + { + 0.07421875 0.982421875 + } + } + 16 {-0.080884 -0.235006 0.001122 + { + 0.0166015625 0.5361328125 + } + } + 17 {-0.067932 -0.223167 0.018996 + { + 0.017578125 0.58203125 + } + } + 18 {-0.067932 0.223167 0.018996 + { + 0.978515625 0.580078125 + } + } + 19 {-0.080884 0.235006 0.001122 + { + 0.984375 0.5341796875 + } + } + 20 {0.082372 0.237328 -0.015273 + { + 0.0703125 0.6123046875 + } + } + 21 {0.082953 0.240000 -0.025000 + { + 0.044921875 0.609375 + } + } + 22 {-0.085000 0.240000 -0.025000 + { + 0.01171875 0.9921875 + } + } + 23 {-0.080884 0.235006 0.001122 + { + 0.07421875 0.982421875 + } + } + 24 {0.082953 0.240000 -0.025000 + { + 0.982421875 0.53125 + } + } + 25 {0.082372 0.237328 -0.015273 + { + 0.9794921875 0.552734375 + } + } + 26 {0.082372 -0.237328 -0.015273 + { + 0.0234375 0.5537109375 + } + } + 27 {0.082953 -0.240000 -0.025000 + { + 0.021484375 0.533203125 + } + } + 28 {0.082953 -0.240000 -0.025000 + { + 0.044921875 0.609375 + } + } + 29 {0.082372 -0.237328 -0.015273 + { + 0.0703125 0.6123046875 + } + } + 30 {-0.080884 -0.235006 0.001122 + { + 0.07421875 0.982421875 + } + } + 31 {-0.085000 -0.240000 -0.025000 + { + 0.01171875 0.9921875 + } + } + 32 {-0.085000 -0.240000 -0.025000 + { + 0.015625 0.490234375 + } + } + 33 {-0.080884 -0.235006 0.001122 + { + 0.0166015625 0.5361328125 + } + } + 34 {-0.080884 0.235006 0.001122 + { + 0.984375 0.5341796875 + } + } + 35 {-0.085000 0.240000 -0.025000 + { + 0.990234375 0.48828125 + } + } + 36 {0.073544 0.227744 -0.005546 + { + 0.095703125 0.615234375 + } + } + 37 {0.082372 0.237328 -0.015273 + { + 0.0703125 0.6123046875 + } + } + 38 {-0.080884 0.235006 0.001122 + { + 0.07421875 0.982421875 + } + } + 39 {-0.067932 0.223167 0.018996 + { + 0.13671875 0.97265625 + } + }} + + + { + { Tex } + { takeyga_kb } + {0.000000 0.000000 -1.000000} + { 0 1 2 3 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {0.508027 -0.000000 0.861341} + { 4 5 6 7 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {0.966167 -0.000000 0.257917} + { 8 9 10 11 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {0.028240 -0.996449 0.079322} + { 12 13 14 15 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {-0.978036 0.000000 0.208436} + { 16 17 18 19 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {0.001260 0.999752 0.022233} + { 20 21 22 23 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {0.999846 -0.000000 0.017550} + { 24 25 26 27 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {0.001259 -0.999752 0.022233} + { 28 29 30 31 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {-0.998928 0.000000 0.046291} + { 32 33 34 35 { Cube.001 }} + } + { + { Tex } + { takeyga_kb } + {0.028241 0.996449 0.079322} + { 36 37 38 39 { Cube.001 }} + } + } diff --git a/samples/rocket-console/assets/tex/takeyga_kb_diffuse.dds b/samples/rocket-console/assets/tex/takeyga_kb_diffuse.dds new file mode 100644 index 0000000000000000000000000000000000000000..406e6895452935953892fa098cf8886781c5bf56 GIT binary patch literal 174904 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