Author: Armin Rigo <ar...@tunes.org> Branch: reverse-debugger Changeset: r86170:44f0653642eb Date: 2016-08-12 15:00 +0200 http://bitbucket.org/pypy/pypy/changeset/44f0653642eb/
Log: Emulate modf. Fix emulation of dtoa(2.0) to output the ".0" too. diff --git a/rpython/rlib/revdb.py b/rpython/rlib/revdb.py --- a/rpython/rlib/revdb.py +++ b/rpython/rlib/revdb.py @@ -232,3 +232,7 @@ s = hlstr(s) assert s is not None return s + +def emulate_modf(x): + return (llop.revdb_modf(lltype.Float, x, 0), + llop.revdb_modf(lltype.Float, x, 1)) diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py --- a/rpython/rtyper/lltypesystem/lloperation.py +++ b/rpython/rtyper/lltypesystem/lloperation.py @@ -586,6 +586,7 @@ 'revdb_set_thread_breakpoint': LLOp(), 'revdb_strtod': LLOp(sideeffects=False), 'revdb_dtoa': LLOp(sideeffects=False), + 'revdb_modf': LLOp(sideeffects=False), } # ***** Run test_lloperation after changes. ***** diff --git a/rpython/rtyper/lltypesystem/module/ll_math.py b/rpython/rtyper/lltypesystem/module/ll_math.py --- a/rpython/rtyper/lltypesystem/module/ll_math.py +++ b/rpython/rtyper/lltypesystem/module/ll_math.py @@ -4,7 +4,7 @@ import sys from rpython.translator import cdir -from rpython.rlib import jit, rposix +from rpython.rlib import jit, rposix, revdb from rpython.rlib.rfloat import INFINITY, NAN, isfinite, isinf, isnan from rpython.rlib.rposix import UNDERSCORE_ON_WIN32 from rpython.rtyper.lltypesystem import lltype, rffi @@ -221,6 +221,8 @@ def ll_math_modf(x): # some platforms don't do the right thing for NaNs and # infinities, so we take care of special cases directly. + if revdb.flag_io_disabled(): + return revdb.emulate_modf(x) if not isfinite(x): if isnan(x): return (x, x) diff --git a/rpython/translator/revdb/src-revdb/revdb.c b/rpython/translator/revdb/src-revdb/revdb.c --- a/rpython/translator/revdb/src-revdb/revdb.c +++ b/rpython/translator/revdb/src-revdb/revdb.c @@ -1759,11 +1759,18 @@ RPY_EXTERN RPyString *rpy_reverse_db_dtoa(double d) { - char buffer[128]; + char buffer[128], *p; RPyString *result; int size; - size = snprintf(buffer, sizeof(buffer), "%g", d); - if (size < 0) size = 0; /* XXX? */ + size = snprintf(buffer, sizeof(buffer) - 3, "%g", d); + if (size < 0) + size = 0; + for (p = buffer; '0' <= *p && *p <= '9'; p++) { + } + if (*p == 0) { /* a pure integer */ + buffer[size++] = '.'; + buffer[size++] = '0'; + } result = make_rpy_string(size); memcpy(_RPyString_AsString(result), buffer, size); return result; diff --git a/rpython/translator/revdb/src-revdb/revdb_include.h b/rpython/translator/revdb/src-revdb/revdb_include.h --- a/rpython/translator/revdb/src-revdb/revdb_include.h +++ b/rpython/translator/revdb/src-revdb/revdb_include.h @@ -236,6 +236,13 @@ #define OP_REVDB_DTOA(d, r) \ r = rpy_reverse_db_dtoa(d) +#define OP_REVDB_MODF(x, index, r) \ + do { \ + double _r0, _r1; \ + _r0 = modf(x, &_r1); \ + r = (index == 0) ? _r0 : _r1; \ + } while (0) + RPY_EXTERN void rpy_reverse_db_flush(void); /* must be called with the lock */ RPY_EXTERN void rpy_reverse_db_fetch(const char *file, int line); diff --git a/rpython/translator/revdb/test/test_process.py b/rpython/translator/revdb/test/test_process.py --- a/rpython/translator/revdb/test/test_process.py +++ b/rpython/translator/revdb/test/test_process.py @@ -1,4 +1,4 @@ -import py, sys +import py, sys, math from cStringIO import StringIO from rpython.rlib import revdb, rdtoa from rpython.rlib.debug import debug_print, ll_assert @@ -49,7 +49,9 @@ stuff = dbstate.metavar elif extra == '2.35': val = rdtoa.strtod('2.35') - revdb.send_output(rdtoa.dtoa(val)) + valx, valy = math.modf(val) + revdb.send_output(rdtoa.dtoa(valx) + '\n') + revdb.send_output(rdtoa.dtoa(valy) + '\n') return else: assert False @@ -208,4 +210,4 @@ group = ReplayProcessGroup(str(self.exename), self.rdbname) with stdout_capture() as buf: group.print_cmd('2.35') - assert buf.getvalue() == "2.35" + assert buf.getvalue() == "0.35\n2.0\n" _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit