Author: Manuel Jacob <[email protected]>
Branch: py3.3
Changeset: r78193:3c835daef6cc
Date: 2015-06-18 23:05 +0200
http://bitbucket.org/pypy/pypy/changeset/3c835daef6cc/

Log:    Port _decimal to CFFI 1.0.

diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -75,6 +75,7 @@
 ^lib_pypy/__pycache__$
 ^lib_pypy/ctypes_config_cache/_.+_cache\.py$
 ^lib_pypy/ctypes_config_cache/_.+_.+_\.py$
+^lib_pypy/_libmpdec/.+.o$
 ^rpython/translator/cli/query-descriptions$
 ^pypy/doc/discussion/.+\.html$
 ^include/.+\.h$
diff --git a/lib_pypy/_decimal.py b/lib_pypy/_decimal.py
--- a/lib_pypy/_decimal.py
+++ b/lib_pypy/_decimal.py
@@ -1,11 +1,12 @@
 # Implementation of the "decimal" module, based on libmpdec library.
 
-from cffi import FFI as _FFI
 import collections as _collections
 import math as _math
 import numbers as _numbers
 import sys as _sys
 
+from _decimal_cffi import ffi as _ffi, lib as _mpdec
+
 # Compatibility with the C version
 HAVE_THREADS = True
 if _sys.maxsize == 2**63-1:
@@ -94,278 +95,6 @@
 class FloatOperation(DecimalException, TypeError):
     __module__ = 'decimal'
 
-# Bindings to the libmpdec library
-
-_ffi = _FFI()
-_ffi.cdef("""
-typedef size_t mpd_size_t; /* unsigned size type */
-typedef ssize_t mpd_ssize_t; /* signed size type */
-typedef size_t mpd_uint_t;
-#define MPD_SIZE_MAX ...
-#define MPD_SSIZE_MIN ...
-#define MPD_SSIZE_MAX ...
-
-const char *mpd_version(void);
-void mpd_free(void *ptr);
-
-typedef struct mpd_context_t {
-    mpd_ssize_t prec;   /* precision */
-    mpd_ssize_t emax;   /* max positive exp */
-    mpd_ssize_t emin;   /* min negative exp */
-    uint32_t traps;     /* status events that should be trapped */
-    uint32_t status;    /* status flags */
-    uint32_t newtrap;   /* set by mpd_addstatus_raise() */
-    int      round;     /* rounding mode */
-    int      clamp;     /* clamp mode */
-    int      allcr;     /* all functions correctly rounded */
-} mpd_context_t;
-
-enum {
-    MPD_ROUND_UP,          /* round away from 0               */
-    MPD_ROUND_DOWN,        /* round toward 0 (truncate)       */
-    MPD_ROUND_CEILING,     /* round toward +infinity          */
-    MPD_ROUND_FLOOR,       /* round toward -infinity          */
-    MPD_ROUND_HALF_UP,     /* 0.5 is rounded up               */
-    MPD_ROUND_HALF_DOWN,   /* 0.5 is rounded down             */
-    MPD_ROUND_HALF_EVEN,   /* 0.5 is rounded to even          */
-    MPD_ROUND_05UP,        /* round zero or five away from 0  */
-    MPD_ROUND_TRUNC,       /* truncate, but set infinity      */
-    MPD_ROUND_GUARD
-};
-
-#define MPD_Clamped             ...
-#define MPD_Conversion_syntax   ...
-#define MPD_Division_by_zero    ...
-#define MPD_Division_impossible ...
-#define MPD_Division_undefined  ...
-#define MPD_Fpu_error           ...
-#define MPD_Inexact             ...
-#define MPD_Invalid_context     ...
-#define MPD_Invalid_operation   ...
-#define MPD_Malloc_error        ...
-#define MPD_Not_implemented     ...
-#define MPD_Overflow            ...
-#define MPD_Rounded             ...
-#define MPD_Subnormal           ...
-#define MPD_Underflow           ...
-#define MPD_Max_status          ...
-/* Conditions that result in an IEEE 754 exception */
-#define MPD_IEEE_Invalid_operation ...
-/* Errors that require the result of an operation to be set to NaN */
-#define MPD_Errors              ...
-
-
-
-void mpd_maxcontext(mpd_context_t *ctx);
-int mpd_qsetprec(mpd_context_t *ctx, mpd_ssize_t prec);
-int mpd_qsetemax(mpd_context_t *ctx, mpd_ssize_t emax);
-int mpd_qsetemin(mpd_context_t *ctx, mpd_ssize_t emin);
-int mpd_qsetround(mpd_context_t *ctx, int newround);
-int mpd_qsettraps(mpd_context_t *ctx, uint32_t flags);
-int mpd_qsetstatus(mpd_context_t *ctx, uint32_t flags);
-int mpd_qsetclamp(mpd_context_t *ctx, int c);
-
-
-
-
-typedef struct mpd_t {
-    uint8_t flags;
-    mpd_ssize_t exp;
-    mpd_ssize_t digits;
-    mpd_ssize_t len;
-    mpd_ssize_t alloc;
-    mpd_uint_t *data;
-} mpd_t;
-
-#define MPD_POS                 ...
-#define MPD_NEG                 ...
-#define MPD_INF                 ...
-#define MPD_NAN                 ...
-#define MPD_SNAN                ...
-#define MPD_SPECIAL             ...
-#define MPD_STATIC              ...
-#define MPD_STATIC_DATA         ...
-#define MPD_SHARED_DATA         ...
-#define MPD_CONST_DATA          ...
-#define MPD_DATAFLAGS           ...
-
-
-mpd_t *mpd_qnew(void);
-void mpd_del(mpd_t *dec);
-
-
-/* Operations */
-void mpd_qabs(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qplus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qminus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qexp(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qln(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t 
*status);
-void mpd_qlog10(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qlogb(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qinvert(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-
-void mpd_qmax(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qmax_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qmin(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qmin_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-
-void mpd_qadd(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qsub(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qmul(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qdiv(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t 
*ctx, uint32_t *status);
-void mpd_qdivint(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t 
*ctx, uint32_t *status);
-void mpd_qfma(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_t *c, 
const mpd_context_t *ctx, uint32_t *status);
-void mpd_qrem(mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t 
*ctx, uint32_t *status);
-void mpd_qrem_near(mpd_t *r, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qpow(mpd_t *result, const mpd_t *base, const mpd_t *exp, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qpowmod(mpd_t *result, const mpd_t *base, const mpd_t *exp, const 
mpd_t *mod, const mpd_context_t *ctx, uint32_t *status);
-int mpd_qcopy_sign(mpd_t *result, const mpd_t *a, const mpd_t *b, uint32_t 
*status);
-int mpd_qcopy_abs(mpd_t *result, const mpd_t *a, uint32_t *status);
-int mpd_qcopy_negate(mpd_t *result, const mpd_t *a, uint32_t *status);
-void mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qand(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qor(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qxor(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-int mpd_same_quantum(const mpd_t *a, const mpd_t *b);
-
-void mpd_qround_to_intx(mpd_t *result, const mpd_t *a, const mpd_context_t 
*ctx, uint32_t *status);
-void mpd_qround_to_int(mpd_t *result, const mpd_t *a, const mpd_context_t 
*ctx, uint32_t *status);
-int mpd_qcopy(mpd_t *result, const mpd_t *a,  uint32_t *status);
-
-int mpd_qcmp(const mpd_t *a, const mpd_t *b, uint32_t *status);
-int mpd_qcompare(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-int mpd_qcompare_signal(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-int mpd_compare_total(mpd_t *result, const mpd_t *a, const mpd_t *b);
-int mpd_compare_total_mag(mpd_t *result, const mpd_t *a, const mpd_t *b);
-void mpd_qnext_toward(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qnext_minus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qnext_plus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qquantize(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-
-void mpd_qrotate(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qscaleb(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qshift(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
-void mpd_qreduce(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
-
-/* Get attributes */
-uint8_t mpd_sign(const mpd_t *dec);
-int mpd_isnegative(const mpd_t *dec);
-int mpd_ispositive(const mpd_t *dec);
-int mpd_iszero(const mpd_t *dec);
-int mpd_isfinite(const mpd_t *dec);
-int mpd_isinfinite(const mpd_t *dec);
-int mpd_issigned(const mpd_t *dec);
-int mpd_isnan(const mpd_t *dec);
-int mpd_issnan(const mpd_t *dec);
-int mpd_isspecial(const mpd_t *dec);
-int mpd_isqnan(const mpd_t *dec);
-int mpd_isnormal(const mpd_t *dec, const mpd_context_t *ctx);
-int mpd_issubnormal(const mpd_t *dec, const mpd_context_t *ctx);
-mpd_ssize_t mpd_adjexp(const mpd_t *dec);
-mpd_ssize_t mpd_etiny(const mpd_context_t *ctx);
-mpd_ssize_t mpd_etop(const mpd_context_t *ctx);
-
-mpd_t *mpd_qncopy(const mpd_t *a);
-
-/* Set attributes */
-void mpd_set_sign(mpd_t *result, uint8_t sign);
-void mpd_set_positive(mpd_t *result);
-void mpd_clear_flags(mpd_t *result);
-void mpd_seterror(mpd_t *result, uint32_t flags, uint32_t *status);
-void mpd_setspecial(mpd_t *dec, uint8_t sign, uint8_t type);
-
-/* I/O */
-void mpd_qimport_u16(mpd_t *result, const uint16_t *srcdata, size_t srclen,
-                     uint8_t srcsign, uint32_t srcbase,
-                     const mpd_context_t *ctx, uint32_t *status);
-size_t mpd_qexport_u16(uint16_t **rdata, size_t rlen, uint32_t base,
-                       const mpd_t *src, uint32_t *status);
-void mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qset_uint(mpd_t *result, mpd_uint_t a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx, 
uint32_t *status);
-void mpd_qsset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx, 
uint32_t *status);
-mpd_ssize_t mpd_qget_ssize(const mpd_t *dec, uint32_t *status);
-int mpd_lsnprint_signals(char *dest, int nmemb, uint32_t flags, const char 
*signal_string[]);
-#define MPD_MAX_SIGNAL_LIST ...
-const char *dec_signal_string[];
-
-void mpd_qfinalize(mpd_t *result, const mpd_context_t *ctx, uint32_t *status);
-const char *mpd_class(const mpd_t *a, const mpd_context_t *ctx);
-
-/* format specification */
-typedef struct mpd_spec_t {
-    mpd_ssize_t min_width; /* minimum field width */
-    mpd_ssize_t prec;      /* fraction digits or significant digits */
-    char type;             /* conversion specifier */
-    char align;            /* alignment */
-    char sign;             /* sign printing/alignment */
-    char fill[5];          /* fill character */
-    const char *dot;       /* decimal point */
-    const char *sep;       /* thousands separator */
-    const char *grouping;  /* grouping of digits */
-} mpd_spec_t;
-
-char *mpd_to_sci(const mpd_t *dec, int fmt);
-char *mpd_to_eng(const mpd_t *dec, int fmt);
-int mpd_parse_fmt_str(mpd_spec_t *spec, const char *fmt, int caps);
-int mpd_validate_lconv(mpd_spec_t *spec);
-char *mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec, const 
mpd_context_t *ctx, uint32_t *status);
-
-""")
-
-import os
-
-_libdir = os.path.join(os.path.dirname(__file__), '_libmpdec')
-_mpdec = _ffi.verify(
-    """
-#include "mpdecimal.h"
-
-const char *dec_signal_string[MPD_NUM_FLAGS] = {
-    "Clamped",
-    "InvalidOperation",
-    "DivisionByZero",
-    "InvalidOperation",
-    "InvalidOperation",
-    "InvalidOperation",
-    "Inexact",
-    "InvalidOperation",
-    "InvalidOperation",
-    "InvalidOperation",
-    "FloatOperation",
-    "Overflow",
-    "Rounded",
-    "Subnormal",
-    "Underflow",
-};
-""",
-    sources=[os.path.join(_libdir, 'mpdecimal.c'),
-             os.path.join(_libdir, 'basearith.c'),
-             os.path.join(_libdir, 'convolute.c'),
-             os.path.join(_libdir, 'constants.c'),
-             os.path.join(_libdir, 'context.c'),
-             os.path.join(_libdir, 'io.c'),
-             os.path.join(_libdir, 'fourstep.c'),
-             os.path.join(_libdir, 'sixstep.c'),
-             os.path.join(_libdir, 'transpose.c'),
-             os.path.join(_libdir, 'difradix2.c'),
-             os.path.join(_libdir, 'numbertheory.c'),
-             os.path.join(_libdir, 'fnt.c'),
-             os.path.join(_libdir, 'crt.c'),
-             os.path.join(_libdir, 'memory.c'),
-         ],
-    include_dirs=[_libdir],
-    extra_compile_args=[
-        "-DANSI",
-        "-DHAVE_STDINT_H",
-        "-DHAVE_INTTYPES_H",
-        "-DCONFIG_64" if _sys.maxsize > 1 << 32 else "-DCONFIG_32",
-    ],
-)
-
-del os
-
-_mpdec.MPD_Float_operation = _mpdec.MPD_Not_implemented
 
 __version__ = "1.70"
 __libmpdec_version__ = _ffi.string(_mpdec.mpd_version())
diff --git a/lib_pypy/_decimal_build.py b/lib_pypy/_decimal_build.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_decimal_build.py
@@ -0,0 +1,277 @@
+import os
+import sys
+
+from cffi import FFI
+
+
+ffi = FFI()
+ffi.cdef("""
+typedef size_t mpd_size_t; /* unsigned size type */
+typedef ssize_t mpd_ssize_t; /* signed size type */
+typedef size_t mpd_uint_t;
+#define MPD_SIZE_MAX ...
+#define MPD_SSIZE_MIN ...
+#define MPD_SSIZE_MAX ...
+
+const char *mpd_version(void);
+void mpd_free(void *ptr);
+
+typedef struct mpd_context_t {
+    mpd_ssize_t prec;   /* precision */
+    mpd_ssize_t emax;   /* max positive exp */
+    mpd_ssize_t emin;   /* min negative exp */
+    uint32_t traps;     /* status events that should be trapped */
+    uint32_t status;    /* status flags */
+    uint32_t newtrap;   /* set by mpd_addstatus_raise() */
+    int      round;     /* rounding mode */
+    int      clamp;     /* clamp mode */
+    int      allcr;     /* all functions correctly rounded */
+} mpd_context_t;
+
+enum {
+    MPD_ROUND_UP,          /* round away from 0               */
+    MPD_ROUND_DOWN,        /* round toward 0 (truncate)       */
+    MPD_ROUND_CEILING,     /* round toward +infinity          */
+    MPD_ROUND_FLOOR,       /* round toward -infinity          */
+    MPD_ROUND_HALF_UP,     /* 0.5 is rounded up               */
+    MPD_ROUND_HALF_DOWN,   /* 0.5 is rounded down             */
+    MPD_ROUND_HALF_EVEN,   /* 0.5 is rounded to even          */
+    MPD_ROUND_05UP,        /* round zero or five away from 0  */
+    MPD_ROUND_TRUNC,       /* truncate, but set infinity      */
+    MPD_ROUND_GUARD
+};
+
+#define MPD_Clamped             ...
+#define MPD_Conversion_syntax   ...
+#define MPD_Division_by_zero    ...
+#define MPD_Division_impossible ...
+#define MPD_Division_undefined  ...
+#define MPD_Float_operation     ...
+#define MPD_Fpu_error           ...
+#define MPD_Inexact             ...
+#define MPD_Invalid_context     ...
+#define MPD_Invalid_operation   ...
+#define MPD_Malloc_error        ...
+#define MPD_Not_implemented     ...
+#define MPD_Overflow            ...
+#define MPD_Rounded             ...
+#define MPD_Subnormal           ...
+#define MPD_Underflow           ...
+#define MPD_Max_status          ...
+/* Conditions that result in an IEEE 754 exception */
+#define MPD_IEEE_Invalid_operation ...
+/* Errors that require the result of an operation to be set to NaN */
+#define MPD_Errors              ...
+
+
+
+void mpd_maxcontext(mpd_context_t *ctx);
+int mpd_qsetprec(mpd_context_t *ctx, mpd_ssize_t prec);
+int mpd_qsetemax(mpd_context_t *ctx, mpd_ssize_t emax);
+int mpd_qsetemin(mpd_context_t *ctx, mpd_ssize_t emin);
+int mpd_qsetround(mpd_context_t *ctx, int newround);
+int mpd_qsettraps(mpd_context_t *ctx, uint32_t flags);
+int mpd_qsetstatus(mpd_context_t *ctx, uint32_t flags);
+int mpd_qsetclamp(mpd_context_t *ctx, int c);
+
+
+
+
+typedef struct mpd_t {
+    uint8_t flags;
+    mpd_ssize_t exp;
+    mpd_ssize_t digits;
+    mpd_ssize_t len;
+    mpd_ssize_t alloc;
+    mpd_uint_t *data;
+} mpd_t;
+
+#define MPD_POS                 ...
+#define MPD_NEG                 ...
+#define MPD_INF                 ...
+#define MPD_NAN                 ...
+#define MPD_SNAN                ...
+#define MPD_SPECIAL             ...
+#define MPD_STATIC              ...
+#define MPD_STATIC_DATA         ...
+#define MPD_SHARED_DATA         ...
+#define MPD_CONST_DATA          ...
+#define MPD_DATAFLAGS           ...
+
+
+mpd_t *mpd_qnew(void);
+void mpd_del(mpd_t *dec);
+
+
+/* Operations */
+void mpd_qabs(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qplus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qminus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qexp(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qln(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t 
*status);
+void mpd_qlog10(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qlogb(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qinvert(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+
+void mpd_qmax(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qmax_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qmin(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qmin_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+
+void mpd_qadd(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qsub(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qmul(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qdiv(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t 
*ctx, uint32_t *status);
+void mpd_qdivint(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t 
*ctx, uint32_t *status);
+void mpd_qfma(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_t *c, 
const mpd_context_t *ctx, uint32_t *status);
+void mpd_qrem(mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t 
*ctx, uint32_t *status);
+void mpd_qrem_near(mpd_t *r, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qpow(mpd_t *result, const mpd_t *base, const mpd_t *exp, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qpowmod(mpd_t *result, const mpd_t *base, const mpd_t *exp, const 
mpd_t *mod, const mpd_context_t *ctx, uint32_t *status);
+int mpd_qcopy_sign(mpd_t *result, const mpd_t *a, const mpd_t *b, uint32_t 
*status);
+int mpd_qcopy_abs(mpd_t *result, const mpd_t *a, uint32_t *status);
+int mpd_qcopy_negate(mpd_t *result, const mpd_t *a, uint32_t *status);
+void mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qand(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qor(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qxor(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+int mpd_same_quantum(const mpd_t *a, const mpd_t *b);
+
+void mpd_qround_to_intx(mpd_t *result, const mpd_t *a, const mpd_context_t 
*ctx, uint32_t *status);
+void mpd_qround_to_int(mpd_t *result, const mpd_t *a, const mpd_context_t 
*ctx, uint32_t *status);
+int mpd_qcopy(mpd_t *result, const mpd_t *a,  uint32_t *status);
+
+int mpd_qcmp(const mpd_t *a, const mpd_t *b, uint32_t *status);
+int mpd_qcompare(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+int mpd_qcompare_signal(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+int mpd_compare_total(mpd_t *result, const mpd_t *a, const mpd_t *b);
+int mpd_compare_total_mag(mpd_t *result, const mpd_t *a, const mpd_t *b);
+void mpd_qnext_toward(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qnext_minus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qnext_plus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qquantize(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+
+void mpd_qrotate(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qscaleb(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qshift(mpd_t *result, const mpd_t *a, const mpd_t *b, const 
mpd_context_t *ctx, uint32_t *status);
+void mpd_qreduce(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, 
uint32_t *status);
+
+/* Get attributes */
+uint8_t mpd_sign(const mpd_t *dec);
+int mpd_isnegative(const mpd_t *dec);
+int mpd_ispositive(const mpd_t *dec);
+int mpd_iszero(const mpd_t *dec);
+int mpd_isfinite(const mpd_t *dec);
+int mpd_isinfinite(const mpd_t *dec);
+int mpd_issigned(const mpd_t *dec);
+int mpd_isnan(const mpd_t *dec);
+int mpd_issnan(const mpd_t *dec);
+int mpd_isspecial(const mpd_t *dec);
+int mpd_isqnan(const mpd_t *dec);
+int mpd_isnormal(const mpd_t *dec, const mpd_context_t *ctx);
+int mpd_issubnormal(const mpd_t *dec, const mpd_context_t *ctx);
+mpd_ssize_t mpd_adjexp(const mpd_t *dec);
+mpd_ssize_t mpd_etiny(const mpd_context_t *ctx);
+mpd_ssize_t mpd_etop(const mpd_context_t *ctx);
+
+mpd_t *mpd_qncopy(const mpd_t *a);
+
+/* Set attributes */
+void mpd_set_sign(mpd_t *result, uint8_t sign);
+void mpd_set_positive(mpd_t *result);
+void mpd_clear_flags(mpd_t *result);
+void mpd_seterror(mpd_t *result, uint32_t flags, uint32_t *status);
+void mpd_setspecial(mpd_t *dec, uint8_t sign, uint8_t type);
+
+/* I/O */
+void mpd_qimport_u16(mpd_t *result, const uint16_t *srcdata, size_t srclen,
+                     uint8_t srcsign, uint32_t srcbase,
+                     const mpd_context_t *ctx, uint32_t *status);
+size_t mpd_qexport_u16(uint16_t **rdata, size_t rlen, uint32_t base,
+                       const mpd_t *src, uint32_t *status);
+void mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qset_uint(mpd_t *result, mpd_uint_t a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx, 
uint32_t *status);
+void mpd_qsset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx, 
uint32_t *status);
+mpd_ssize_t mpd_qget_ssize(const mpd_t *dec, uint32_t *status);
+int mpd_lsnprint_signals(char *dest, int nmemb, uint32_t flags, const char 
*signal_string[]);
+#define MPD_MAX_SIGNAL_LIST ...
+const char *dec_signal_string[];
+
+void mpd_qfinalize(mpd_t *result, const mpd_context_t *ctx, uint32_t *status);
+const char *mpd_class(const mpd_t *a, const mpd_context_t *ctx);
+
+/* format specification */
+typedef struct mpd_spec_t {
+    mpd_ssize_t min_width; /* minimum field width */
+    mpd_ssize_t prec;      /* fraction digits or significant digits */
+    char type;             /* conversion specifier */
+    char align;            /* alignment */
+    char sign;             /* sign printing/alignment */
+    char fill[5];          /* fill character */
+    const char *dot;       /* decimal point */
+    const char *sep;       /* thousands separator */
+    const char *grouping;  /* grouping of digits */
+} mpd_spec_t;
+
+char *mpd_to_sci(const mpd_t *dec, int fmt);
+char *mpd_to_eng(const mpd_t *dec, int fmt);
+int mpd_parse_fmt_str(mpd_spec_t *spec, const char *fmt, int caps);
+int mpd_validate_lconv(mpd_spec_t *spec);
+char *mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec, const 
mpd_context_t *ctx, uint32_t *status);
+
+""")
+
+_libdir = os.path.join(os.path.dirname(__file__), '_libmpdec')
+ffi.set_source('_decimal_cffi',
+    """
+#include "mpdecimal.h"
+
+#define MPD_Float_operation MPD_Not_implemented
+
+const char *dec_signal_string[MPD_NUM_FLAGS] = {
+    "Clamped",
+    "InvalidOperation",
+    "DivisionByZero",
+    "InvalidOperation",
+    "InvalidOperation",
+    "InvalidOperation",
+    "Inexact",
+    "InvalidOperation",
+    "InvalidOperation",
+    "InvalidOperation",
+    "FloatOperation",
+    "Overflow",
+    "Rounded",
+    "Subnormal",
+    "Underflow",
+};
+""",
+    sources=[os.path.join(_libdir, 'mpdecimal.c'),
+             os.path.join(_libdir, 'basearith.c'),
+             os.path.join(_libdir, 'convolute.c'),
+             os.path.join(_libdir, 'constants.c'),
+             os.path.join(_libdir, 'context.c'),
+             os.path.join(_libdir, 'io.c'),
+             os.path.join(_libdir, 'fourstep.c'),
+             os.path.join(_libdir, 'sixstep.c'),
+             os.path.join(_libdir, 'transpose.c'),
+             os.path.join(_libdir, 'difradix2.c'),
+             os.path.join(_libdir, 'numbertheory.c'),
+             os.path.join(_libdir, 'fnt.c'),
+             os.path.join(_libdir, 'crt.c'),
+             os.path.join(_libdir, 'memory.c'),
+         ],
+    include_dirs=[_libdir],
+    extra_compile_args=[
+        "-DANSI",
+        "-DHAVE_STDINT_H",
+        "-DHAVE_INTTYPES_H",
+        "-DCONFIG_64" if sys.maxsize > 1 << 32 else "-DCONFIG_32",
+    ],
+)
+
+
+if __name__ == '__main__':
+    ffi.compile()
diff --git a/pypy/tool/release/package.py b/pypy/tool/release/package.py
--- a/pypy/tool/release/package.py
+++ b/pypy/tool/release/package.py
@@ -62,7 +62,7 @@
     "_gdbm": "_gdbm_build.py"  if sys.platform != "win32" else None,
     "pwdgrp": "_pwdgrp_build.py" if sys.platform != "win32" else None,
     "lzma": "_lzma_build.py",
-    "_decimal": None, # XXX change _decimal to use CFFI 1.0
+    "_decimal": "_decimal_build.py",
     "xx": None,    # for testing: 'None' should be completely ignored
     }
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to