+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>
{ 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()
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.
// 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);
{ 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()
CL_REQUIRE(cl_UP)
-// Runtime typing support.
-extern cl_class cl_class_univpoly_ring;
-
// Operations on polynomials.
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)
{
}
}
-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)
{
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
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
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
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
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
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)
{
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)
{
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;
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
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;
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
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;
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
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
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();
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.
{
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
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
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
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
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