]> www.ginac.de Git - cln.git/commitdiff
Fix crashes in find_univpoly_ring and related functions
authorRichard Kreckel <kreckel@ginac.de>
Sun, 1 May 2005 11:59:55 +0000 (11:59 +0000)
committerRichard Kreckel <kreckel@ginac.de>
Sun, 1 May 2005 11:59:55 +0000 (11:59 +0000)
* include/cln/modinteger.h: Remove vptr from cl_heap_modint_ring;
remove declaration of cl_class cl_class_modint_ring.
* include/cln/univpoly.h: Remove vptr from cl_heap_univpoly_ring;
remove declaration of cl_class_univpoly_ring.
* include/cln/object.h: cl_class_flags_modint_ring: New #define...
* src/modinteger/cl_MI.cc: ...used in cl_class_modint_ring.
* src/modinteger/cl_MI_fix16.h: No vptr, but static dtor and type flag.
* src/modinteger/cl_MI_fix29.h: Likewise.
* src/modinteger/cl_MI_fix32.h: Likewise.
* src/modinteger/cl_MI_int32.h: Likewise.
* src/modinteger/cl_MI_montgom.h: Likewise.
* src/modinteger/cl_MI_pow2: Likewise.
* src/modinteger/cl_MI_pow2m1.h: Likewise.
* src/modinteger/cl_MI_pow2p1.h: Likewise.
* src/modinteger/cl_MI_std.h: Likewise.
* src/polynomial/elem/cl_UP.cc (cl_make_univpoly_ring): Compare with
cl_class_flags_modint_ring, not with cl_class_modint_ring.
* src/polynomial/elem/cl_UP_GF2.h (cl_class_num_univpoly_ring): New.
* src/polynomial/elem/cl_UP_MI.h (cl_class_modint_univpoly_ring): New.
* src/polynomial/elem/cl_UP_gen.h (cl_class_gen_univpoly_ring): New.
* src/polynomial/elem/cl_UP_number.h (cl_class_num_univpoly_ring): New.
Reported by Ralf Goertz <R_Goertz@web.de>.

19 files changed:
ChangeLog
include/cln/modinteger.h
include/cln/object.h
include/cln/univpoly.h
src/modinteger/cl_MI.cc
src/modinteger/cl_MI_fix16.h
src/modinteger/cl_MI_fix29.h
src/modinteger/cl_MI_fix32.h
src/modinteger/cl_MI_int32.h
src/modinteger/cl_MI_montgom.h
src/modinteger/cl_MI_pow2.h
src/modinteger/cl_MI_pow2m1.h
src/modinteger/cl_MI_pow2p1.h
src/modinteger/cl_MI_std.h
src/polynomial/elem/cl_UP.cc
src/polynomial/elem/cl_UP_GF2.h
src/polynomial/elem/cl_UP_MI.h
src/polynomial/elem/cl_UP_gen.h
src/polynomial/elem/cl_UP_number.h

index 857fbee9e2957b10db2fdd926949f43b2149eaf5..80da006230eb8f1876b9fd7de9d9298dd30fc2b7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2005-05-01  Richard B. Kreckel  <kreckel@ginac.de>
+
+       Fix crashes in find_univpoly_ring and related functions
+       * include/cln/modinteger.h: Remove vptr from cl_heap_modint_ring;
+       remove declaration of cl_class cl_class_modint_ring.
+       * include/cln/univpoly.h: Remove vptr from cl_heap_univpoly_ring;
+       remove declaration of cl_class_univpoly_ring.
+       * include/cln/object.h: cl_class_flags_modint_ring: New #define...
+       * src/modinteger/cl_MI.cc: ...used in cl_class_modint_ring.
+       * src/modinteger/cl_MI_fix16.h: No vptr, but static dtor and type flag.
+       * src/modinteger/cl_MI_fix29.h: Likewise.
+       * src/modinteger/cl_MI_fix32.h: Likewise.
+       * src/modinteger/cl_MI_int32.h: Likewise.
+       * src/modinteger/cl_MI_montgom.h: Likewise.
+       * src/modinteger/cl_MI_pow2: Likewise.
+       * src/modinteger/cl_MI_pow2m1.h: Likewise.
+       * src/modinteger/cl_MI_pow2p1.h: Likewise.
+       * src/modinteger/cl_MI_std.h: Likewise.
+       * src/polynomial/elem/cl_UP.cc (cl_make_univpoly_ring): Compare with
+       cl_class_flags_modint_ring, not with cl_class_modint_ring.
+       * src/polynomial/elem/cl_UP_GF2.h (cl_class_num_univpoly_ring): New.
+       * src/polynomial/elem/cl_UP_MI.h (cl_class_modint_univpoly_ring): New.
+       * src/polynomial/elem/cl_UP_gen.h (cl_class_gen_univpoly_ring): New.
+       * src/polynomial/elem/cl_UP_number.h (cl_class_num_univpoly_ring): New.
+       Reported by Ralf Goertz <R_Goertz@web.de>.
+
 2005-04-29  Richard B. Kreckel  <kreckel@ginac.de>
            Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
index d339cba88505d492eb2e8f9f8a293b1e13461e3f..59ae42fba22adefbea46dd18bc8b570b5967e143 100644 (file)
@@ -349,12 +349,9 @@ public:
                { return properties.get_property(key); }
        void add_property (cl_property* new_property)
                { properties.add_property(new_property); }
-// Constructor.
+// Constructor / destructor.
        cl_heap_modint_ring (cl_I m, cl_modint_setops*, cl_modint_addops*, cl_modint_mulops*);
-// This class is intented to be subclassable, hence needs a virtual destructor.
-       virtual ~cl_heap_modint_ring () {}
-private:
-       virtual void dummy ();
+       ~cl_heap_modint_ring () {}
 };
 #define SUBCLASS_cl_heap_modint_ring() \
   SUBCLASS_cl_heap_ring()
@@ -363,9 +360,6 @@ private:
 extern const cl_modint_ring find_modint_ring (const cl_I& m);
 CL_REQUIRE(cl_MI)
 
-// Runtime typing support.
-extern cl_class cl_class_modint_ring;
-
 
 // Operations on modular integers.
 
index 70faa35fd8b5b872f579e0161e52b5b3c00fed25..b7353dcbc00fcf0e55bc8bc860736c28a96219f2 100644 (file)
@@ -168,13 +168,15 @@ struct cl_heap {
 
 // Function to destroy the contents of a heap object.
 typedef void (*cl_heap_destructor_function) (cl_heap* pointer);
-// Flags, to be ORed together.
+// Flags, may be ORed together.
 #define cl_class_flags_subclass_complex   1  // all instances belong to cl_N
 #define cl_class_flags_subclass_real      2  // all instances belong to cl_R
 #define cl_class_flags_subclass_float     4  // all instances belong to cl_F
 #define cl_class_flags_subclass_rational  8  // all instances belong to cl_RA
 #define cl_class_flags_number_ring       16  // all instances are rings whose
                                              // elements belong to cl_number
+#define cl_class_flags_modint_ring       32  // all instances are rings whose
+                                             // elements belong to cl_MI
 // Function to print an object for debugging, to cerr.
 typedef void (*cl_heap_dprint_function) (cl_heap* pointer);
 
index 7547c06e8b1b38e16bd094d884bdbfb8fa97c139..39e1f1e5260aa25bb0392d48c2d4aafad4b5e56d 100644 (file)
@@ -340,10 +340,7 @@ public:
                { properties.add_property(new_property); }
 // Constructor.
        cl_heap_univpoly_ring (const cl_ring& r, cl_univpoly_setops*, cl_univpoly_addops*, cl_univpoly_mulops*, cl_univpoly_modulops*, cl_univpoly_polyops*);
-// This class is intented to be subclassable, hence needs a virtual destructor.
-       virtual ~cl_heap_univpoly_ring () {}
-private:
-       virtual void dummy ();
+       ~cl_heap_univpoly_ring () {}
 };
 #define SUBCLASS_cl_heap_univpoly_ring() \
   SUBCLASS_cl_heap_ring()
@@ -359,9 +356,6 @@ extern const cl_univpoly_ring find_univpoly_ring (const cl_ring& r, const cl_sym
 
 CL_REQUIRE(cl_UP)
 
-// Runtime typing support.
-extern cl_class cl_class_univpoly_ring;
-
 
 // Operations on polynomials.
 
index d1cc62344dc5929337c293e50bc60b51854caa07..a15b2c35c2f2d20623c7f8d99652450bb84860db 100644 (file)
@@ -27,6 +27,16 @@ CL_PROVIDE(cl_MI)
 
 namespace cln {
 
+static void cl_modint_ring_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring*)pointer).~cl_heap_modint_ring();
+}
+
+cl_class cl_class_modint_ring = {
+       cl_modint_ring_destructor,
+       cl_class_flags_modint_ring
+};
+
 cl_heap_modint_ring::cl_heap_modint_ring (cl_I m, cl_modint_setops* setopv, cl_modint_addops* addopv, cl_modint_mulops* mulopv)
        : setops (setopv), addops (addopv), mulops (mulopv), modulus (m)
 {
@@ -50,20 +60,6 @@ cl_heap_modint_ring::cl_heap_modint_ring (cl_I m, cl_modint_setops* setopv, cl_m
        }
 }
 
-static void cl_modint_ring_destructor (cl_heap* pointer)
-{
-       (*(cl_heap_modint_ring*)pointer).~cl_heap_modint_ring();
-}
-
-cl_class cl_class_modint_ring = {
-       cl_modint_ring_destructor,
-       0
-};
-
-// This tells the compiler to put the `cl_heap_modint_ring' vtable
-// into this file.
-void cl_heap_modint_ring::dummy () {}
-
 
 static cl_boolean modint_equal (cl_heap_modint_ring* R, const _cl_MI& x, const _cl_MI& y)
 {
index 6bd20699f7fce2b668a1c98ba312fcca389e1620..64fe7a94f99d81821404756d10630eccfcadc470 100644 (file)
@@ -66,10 +66,26 @@ class cl_heap_modint_ring_fix16 : public cl_heap_modint_ring {
        SUBCLASS_cl_heap_modint_ring()
 public:
        // Constructor.
-       cl_heap_modint_ring_fix16 (const cl_I& m)
-               : cl_heap_modint_ring (m, &std_setops, &fix16_addops, &fix16_mulops) {}
-       // Virtual destructor.
+       cl_heap_modint_ring_fix16 (const cl_I& m);
+       // Destructor.
        ~cl_heap_modint_ring_fix16 () {}
 };
 
+static void cl_modint_ring_fix16_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_fix16*)pointer).~cl_heap_modint_ring_fix16();
+}
+
+cl_class cl_class_modint_ring_fix16 = {
+       cl_modint_ring_fix16_destructor,
+       cl_class_flags_modint_ring
+};
+
+// Constructor.
+inline cl_heap_modint_ring_fix16::cl_heap_modint_ring_fix16(const cl_I& m)
+       : cl_heap_modint_ring (m, &std_setops, &fix16_addops, &fix16_mulops)
+{
+       type = &cl_class_modint_ring_fix16;
+}
+
 }  // namespace cln
index c72745a6ea20f9e458a2ff9cda63059c913db168..3d7ef4f60ea4dfdfcd7c3f9d03cdd01037db7b1c 100644 (file)
@@ -73,10 +73,26 @@ class cl_heap_modint_ring_fix29 : public cl_heap_modint_ring {
        SUBCLASS_cl_heap_modint_ring()
 public:
        // Constructor.
-       cl_heap_modint_ring_fix29 (const cl_I& m)
-               : cl_heap_modint_ring (m, &std_setops, &fix29_addops, &fix29_mulops) {}
-       // Virtual destructor.
+       cl_heap_modint_ring_fix29 (const cl_I& m);
+       // Destructor.
        ~cl_heap_modint_ring_fix29 () {}
 };
 
+static void cl_modint_ring_fix29_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_fix29*)pointer).~cl_heap_modint_ring_fix29();
+}
+
+cl_class cl_class_modint_ring_fix29 = {
+       cl_modint_ring_fix29_destructor,
+       cl_class_flags_modint_ring
+};
+
+// Constructor.
+inline cl_heap_modint_ring_fix29::cl_heap_modint_ring_fix29(const cl_I& m)
+       : cl_heap_modint_ring (m, &std_setops, &fix29_addops, &fix29_mulops)
+{
+       type = &cl_class_modint_ring_fix29;
+}
+
 }  // namespace cln
index f3b49d41087ed36d2e3b5ead0dc26e80e9b93b93..8c1833f2f00e83cefb2a670a6765ee811de365c8 100644 (file)
@@ -75,10 +75,26 @@ class cl_heap_modint_ring_fix32 : public cl_heap_modint_ring {
        SUBCLASS_cl_heap_modint_ring()
 public:
        // Constructor.
-       cl_heap_modint_ring_fix32 (const cl_I& m)
-               : cl_heap_modint_ring (m, &std_setops, &fix32_addops, &fix32_mulops) {}
-       // Virtual destructor.
+       cl_heap_modint_ring_fix32 (const cl_I& m);
+       // Destructor.
        ~cl_heap_modint_ring_fix32 () {}
 };
 
+static void cl_modint_ring_fix32_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_fix32*)pointer).~cl_heap_modint_ring_fix32();
+}
+
+cl_class cl_class_modint_ring_fix32 = {
+       cl_modint_ring_fix32_destructor,
+       cl_class_flags_modint_ring
+};
+
+// Constructor.
+inline cl_heap_modint_ring_fix32::cl_heap_modint_ring_fix32(const cl_I& m)
+       : cl_heap_modint_ring (m, &std_setops, &fix32_addops, &fix32_mulops)
+{
+       type = &cl_class_modint_ring_fix32;
+}
+
 }  // namespace cln
index 6d542ca0abaa71510aa7ea358bc944d6120c0d0d..8f073d611ce760c189eab33029e520bb95b73f9d 100644 (file)
@@ -74,10 +74,26 @@ class cl_heap_modint_ring_int32 : public cl_heap_modint_ring {
        SUBCLASS_cl_heap_modint_ring()
 public:
        // Constructor.
-       cl_heap_modint_ring_int32 (const cl_I& m)
-               : cl_heap_modint_ring (m, &std_setops, &int32_addops, &int32_mulops) {}
-       // Virtual destructor.
+       cl_heap_modint_ring_int32 (const cl_I& m);
+       // Destructor.
        ~cl_heap_modint_ring_int32 () {}
 };
 
+static void cl_modint_ring_int32_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_int32*)pointer).~cl_heap_modint_ring_int32();
+}
+
+cl_class cl_class_modint_ring_int32 = {
+       cl_modint_ring_int32_destructor,
+       cl_class_flags_modint_ring
+};
+
+// Constructor.
+inline cl_heap_modint_ring_int32::cl_heap_modint_ring_int32(const cl_I& m)
+       : cl_heap_modint_ring (m, &std_setops, &int32_addops, &int32_mulops)
+{
+       type = &cl_class_modint_ring_int32;
+}
+
 }  // namespace cln
index 1061a81051fd643fe32e96c828bd2416b388491d..06222ee24da135e65670b051abdb173e9e0dc20b 100644 (file)
@@ -70,7 +70,7 @@ class cl_heap_modint_ring_montgom : public cl_heap_modint_ring {
 public:
        // Constructor.
        cl_heap_modint_ring_montgom (const cl_I& M, uintL m, uintL n, const cl_I& V);
-       // Virtual destructor.
+       // Destructor.
        ~cl_heap_modint_ring_montgom () {}
        // Additional information.
        uintL m; // M = 2^m
@@ -78,6 +78,16 @@ public:
        cl_I V;
 };
 
+static void cl_modint_ring_montgom_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_montgom*)pointer).~cl_heap_modint_ring_montgom();
+}
+
+cl_class cl_class_modint_ring_montgom = {
+       cl_modint_ring_montgom_destructor,
+       cl_class_flags_modint_ring
+};
+
 // Assuming 0 <= x < 2^(2m), return  V*x mod M.
 static inline const cl_I montgom_redc (cl_heap_modint_ring_montgom* R, const cl_I& x)
 {
@@ -161,7 +171,9 @@ static cl_modint_mulops montgom_mulops = {
 inline cl_heap_modint_ring_montgom::cl_heap_modint_ring_montgom (const cl_I& M, uintL _m, uintL _n, const cl_I& _V)
        : cl_heap_modint_ring (M, &std_setops, &montgom_addops, &montgom_mulops),
          m (_m), n (_n), V (_V)
-{}
+{
+       type = &cl_class_modint_ring_montgom;
+}
 
 static cl_heap_modint_ring* try_make_modint_ring_montgom (const cl_I& M)
 {
index 248968f1a2a281fd8bab605868eab144794784a9..6746899cbf557d63d9bde52ea4e81d616011c39c 100644 (file)
@@ -7,7 +7,7 @@ class cl_heap_modint_ring_pow2 : public cl_heap_modint_ring {
 public:
        // Constructor.
        cl_heap_modint_ring_pow2 (const cl_I& m, uintL m1); // m = 2^m1
-       // Virtual destructor.
+       // Destructor.
        ~cl_heap_modint_ring_pow2 () {}
        // Additional information.
        uintL m1;
@@ -137,8 +137,21 @@ static cl_modint_mulops pow2_mulops = {
        std_retract
 };
 
+static void cl_modint_ring_pow2_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_pow2*)pointer).~cl_heap_modint_ring_pow2();
+}
+
+cl_class cl_class_modint_ring_pow2 = {
+       cl_modint_ring_pow2_destructor,
+       cl_class_flags_modint_ring
+};
+
 // Constructor.
 inline cl_heap_modint_ring_pow2::cl_heap_modint_ring_pow2 (const cl_I& m, uintL _m1)
-       : cl_heap_modint_ring (m, &std_setops, &pow2_addops, &pow2_mulops), m1 (_m1) {}
+       : cl_heap_modint_ring (m, &std_setops, &pow2_addops, &pow2_mulops), m1 (_m1)
+{
+       type = &cl_class_modint_ring_pow2;
+}
 
 }  // namespace cln
index 4c073a24f7ee096f0891c6ed498b642f299c938d..2a36cfe0f4d137ea67824902df8f87d391d8588f 100644 (file)
@@ -7,7 +7,7 @@ class cl_heap_modint_ring_pow2m1 : public cl_heap_modint_ring {
 public:
        // Constructor.
        cl_heap_modint_ring_pow2m1 (const cl_I& m, uintL m1); // m = 2^m1 - 1
-       // Virtual destructor.
+       // Destructor.
        ~cl_heap_modint_ring_pow2m1 () {}
        // Additional information.
        uintL m1;
@@ -78,8 +78,21 @@ static cl_modint_mulops pow2m1_mulops = {
        std_retract
 };
 
+static void cl_modint_ring_pow2m1_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_pow2m1*)pointer).~cl_heap_modint_ring_pow2m1();
+}
+
+cl_class cl_class_modint_ring_pow2m1 = {
+       cl_modint_ring_pow2m1_destructor,
+       cl_class_flags_modint_ring
+};
+
 // Constructor.
 inline cl_heap_modint_ring_pow2m1::cl_heap_modint_ring_pow2m1 (const cl_I& m, uintL _m1)
-       : cl_heap_modint_ring (m, &std_setops, &pow2m1_addops, &pow2m1_mulops), m1 (_m1) {}
+       : cl_heap_modint_ring (m, &std_setops, &pow2m1_addops, &pow2m1_mulops), m1 (_m1)
+{
+       type = &cl_class_modint_ring_pow2m1;
+}
 
 }  // namespace cln
index 0ee98a7bd3f71353a5b0568648b5de09758fadc1..06477c815201df4d0a2ee9bdf97b284206d297fb 100644 (file)
@@ -7,7 +7,7 @@ class cl_heap_modint_ring_pow2p1 : public cl_heap_modint_ring {
 public:
        // Constructor.
        cl_heap_modint_ring_pow2p1 (const cl_I& m, uintL m1); // m = 2^m1 + 1
-       // Virtual destructor.
+       // Destructor.
        ~cl_heap_modint_ring_pow2p1 () {}
        // Additional information.
        uintL m1;
@@ -89,8 +89,21 @@ static cl_modint_mulops pow2p1_mulops = {
        std_retract
 };
 
+static void cl_modint_ring_pow2p1_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_pow2p1*)pointer).~cl_heap_modint_ring_pow2p1();
+}
+
+cl_class cl_class_modint_ring_pow2p1 = {
+       cl_modint_ring_pow2p1_destructor,
+       cl_class_flags_modint_ring
+};
+
 // Constructor.
 inline cl_heap_modint_ring_pow2p1::cl_heap_modint_ring_pow2p1 (const cl_I& m, uintL _m1)
-       : cl_heap_modint_ring (m, &std_setops, &pow2p1_addops, &pow2p1_mulops), m1 (_m1) {}
+       : cl_heap_modint_ring (m, &std_setops, &pow2p1_addops, &pow2p1_mulops), m1 (_m1)
+{
+       type = &cl_class_modint_ring_pow2p1;
+}
 
 }  // namespace cln
index e52494bb9b8204facb4bc4b9b3ec1035b26fc719..7507cc035949c58d7baebb46bce2ad8dd5344467 100644 (file)
@@ -345,10 +345,26 @@ class cl_heap_modint_ring_std : public cl_heap_modint_ring {
        SUBCLASS_cl_heap_modint_ring()
 public:
        // Constructor.
-       cl_heap_modint_ring_std (const cl_I& m)
-               : cl_heap_modint_ring (m, &std_setops, &std_addops, &std_mulops) {}
+       cl_heap_modint_ring_std (const cl_I& m);
        // Virtual destructor.
        ~cl_heap_modint_ring_std () {}
 };
 
+static void cl_heap_modint_ring_std_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_ring_std*)pointer).~cl_heap_modint_ring_std();
+}
+
+cl_class cl_class_modint_ring_std = {
+       cl_heap_modint_ring_std_destructor,
+       cl_class_flags_modint_ring
+};
+
+// Constructor.
+inline cl_heap_modint_ring_std::cl_heap_modint_ring_std (const cl_I& m)
+       : cl_heap_modint_ring (m, &std_setops, &std_addops, &std_mulops)
+{
+       type = &cl_class_modint_ring_std;
+}
+
 }  // namespace cln
index a52fe8d040e726313c7a1eaf851a2b576fa29520..8da020077cc38e77e9025ab8070bdf632a3d090f 100644 (file)
@@ -38,14 +38,6 @@ cl_symbol cl_univpoly_varname_key = (cl_symbol)(cl_string)"variable name";
 
 namespace cln {
 
-cl_heap_univpoly_ring::cl_heap_univpoly_ring (const cl_ring& r, cl_univpoly_setops* setopv, cl_univpoly_addops* addopv, cl_univpoly_mulops* mulopv, cl_univpoly_modulops* modulopv, cl_univpoly_polyops* polyopv)
-       : setops (setopv), addops (addopv), mulops (mulopv), modulops (modulopv), polyops (polyopv),
-         _basering (r)
-{
-       refcount = 0; // will be incremented by the `cl_univpoly_ring' constructor
-       type = &cl_class_univpoly_ring;
-}
-
 static void cl_univpoly_ring_destructor (cl_heap* pointer)
 {
        (*(cl_heap_univpoly_ring*)pointer).~cl_heap_univpoly_ring();
@@ -56,9 +48,13 @@ cl_class cl_class_univpoly_ring = {
        0
 };
 
-// This tells the compiler to put the `cl_heap_univpoly_ring' vtable
-// into this file.
-void cl_heap_univpoly_ring::dummy () {}
+cl_heap_univpoly_ring::cl_heap_univpoly_ring (const cl_ring& r, cl_univpoly_setops* setopv, cl_univpoly_addops* addopv, cl_univpoly_mulops* mulopv, cl_univpoly_modulops* modulopv, cl_univpoly_polyops* polyopv)
+       : setops (setopv), addops (addopv), mulops (mulopv), modulops (modulopv), polyops (polyopv),
+         _basering (r)
+{
+       refcount = 0; // will be incremented by the `cl_univpoly_ring' constructor
+       type = &cl_class_univpoly_ring;
+}
 
 
 // Create a new univariate polynomial ring.
@@ -67,7 +63,7 @@ cl_heap_univpoly_ring* cl_make_univpoly_ring (const cl_ring& r)
 {
        if (r.pointer_type()->flags & cl_class_flags_number_ring)
                return new cl_heap_num_univpoly_ring(r);
-       else if (r.pointer_type() == &cl_class_modint_ring) {
+       else if (r.pointer_type()->flags & cl_class_flags_modint_ring) {
                if (((cl_heap_modint_ring*)r.heappointer)->modulus == 2)
                        return new cl_heap_gf2_univpoly_ring(r);
                else
index 8ca6f215bcb7b008417c51911dbae0080c911bd8..a7d1551305cf67fa95dee2164068ee8ee500b081 100644 (file)
@@ -1041,8 +1041,26 @@ class cl_heap_gf2_univpoly_ring : public cl_heap_univpoly_ring {
        SUBCLASS_cl_heap_univpoly_ring()
 public:
        // Constructor.
-       cl_heap_gf2_univpoly_ring (const cl_ring& r)
-               : cl_heap_univpoly_ring (r, &gf2_setops, &gf2_addops, &gf2_mulops, &gf2_modulops, &gf2_polyops) {}
+       cl_heap_gf2_univpoly_ring (const cl_ring& r);
+       // Destructor.
+       ~cl_heap_gf2_univpoly_ring () {}
 };
 
+static void cl_heap_gf2_univpoly_ring_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_gf2_univpoly_ring*)pointer).~cl_heap_gf2_univpoly_ring();
+}
+
+cl_class cl_class_gf2_univpoly_ring = {
+       cl_heap_gf2_univpoly_ring_destructor,
+       0
+};
+
+// Constructor.
+inline cl_heap_gf2_univpoly_ring::cl_heap_gf2_univpoly_ring (const cl_ring& r)
+       : cl_heap_univpoly_ring (r, &gf2_setops, &gf2_addops, &gf2_mulops, &gf2_modulops, &gf2_polyops)
+{
+       type = &cl_class_gf2_univpoly_ring;
+}
+
 }  // namespace cln
index 0b4d62fca26e5c5b676cf01568e28d02bb32856c..664dc43927fe1bb59b369bbb15f4bc8d1363e782 100644 (file)
@@ -481,8 +481,26 @@ class cl_heap_modint_univpoly_ring : public cl_heap_univpoly_ring {
        SUBCLASS_cl_heap_univpoly_ring()
 public:
        // Constructor.
-       cl_heap_modint_univpoly_ring (const cl_ring& r)
-               : cl_heap_univpoly_ring (r, &modint_setops, &modint_addops, &modint_mulops, &modint_modulops, &modint_polyops) {}
+       cl_heap_modint_univpoly_ring (const cl_ring& r);
+       // Destructor.
+       ~cl_heap_modint_univpoly_ring () {}
 };
 
+static void cl_heap_modint_univpoly_ring_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_modint_univpoly_ring*)pointer).~cl_heap_modint_univpoly_ring();
+}
+
+cl_class cl_class_modint_univpoly_ring = {
+       cl_heap_modint_univpoly_ring_destructor,
+       0
+};
+
+// Constructor.
+inline cl_heap_modint_univpoly_ring::cl_heap_modint_univpoly_ring (const cl_ring& r)
+       : cl_heap_univpoly_ring (r, &modint_setops, &modint_addops, &modint_mulops, &modint_modulops, &modint_polyops)
+{
+       type = &cl_class_modint_univpoly_ring;
+}
+
 }  // namespace cln
index 1917f5bbb863a3592ed42ae65798976db2842b7f..ad9093b2144c0fe568974875e0c7bcff149a458f 100644 (file)
@@ -460,8 +460,26 @@ class cl_heap_gen_univpoly_ring : public cl_heap_univpoly_ring {
        SUBCLASS_cl_heap_univpoly_ring()
 public:
        // Constructor.
-       cl_heap_gen_univpoly_ring (const cl_ring& r)
-               : cl_heap_univpoly_ring (r, &gen_setops, &gen_addops, &gen_mulops, &gen_modulops, &gen_polyops) {}
+       cl_heap_gen_univpoly_ring (const cl_ring& r);
+       // Destructor
+       ~cl_heap_gen_univpoly_ring () {}
 };
 
+static void cl_heap_gen_univpoly_ring_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_gen_univpoly_ring*)pointer).~cl_heap_gen_univpoly_ring();
+}
+
+cl_class cl_class_gen_univpoly_ring = {
+       cl_heap_gen_univpoly_ring_destructor,
+       0
+};
+
+// Constructor.
+inline cl_heap_gen_univpoly_ring::cl_heap_gen_univpoly_ring (const cl_ring& r)
+       : cl_heap_univpoly_ring (r, &gen_setops, &gen_addops, &gen_mulops, &gen_modulops, &gen_polyops)
+{
+       type = &cl_class_gen_univpoly_ring;
+}
+
 }  // namespace cln
index c5b5183a753d793aa000f1a8b52fea8b2f5b5f64..ea879b8ac358dd4d46fe73b965985aa42a1be672 100644 (file)
@@ -463,8 +463,26 @@ class cl_heap_num_univpoly_ring : public cl_heap_univpoly_ring {
        SUBCLASS_cl_heap_univpoly_ring()
 public:
        // Constructor.
-       cl_heap_num_univpoly_ring (const cl_ring& r)
-               : cl_heap_univpoly_ring (r, &num_setops, &num_addops, &num_mulops, &num_modulops, &num_polyops) {}
+       cl_heap_num_univpoly_ring (const cl_ring& r);
+       // Destructor.
+       ~cl_heap_num_univpoly_ring () {}
 };
 
+static void cl_heap_num_univpoly_ring_destructor (cl_heap* pointer)
+{
+       (*(cl_heap_num_univpoly_ring*)pointer).~cl_heap_num_univpoly_ring();
+}
+
+cl_class cl_class_num_univpoly_ring = {
+       cl_heap_num_univpoly_ring_destructor,
+       0
+};
+
+// Constructor.
+inline cl_heap_num_univpoly_ring::cl_heap_num_univpoly_ring (const cl_ring& r)
+       : cl_heap_univpoly_ring (r, &num_setops, &num_addops, &num_mulops, &num_modulops, &num_polyops)
+{
+       type = &cl_class_num_univpoly_ring;
+}
+
 }  // namespace cln