Commit 54b0bf52 authored by Stefan Behnel's avatar Stefan Behnel

Avoid copying unaligned 16-bit values since some platforms require them to be...

Avoid copying unaligned 16-bit values since some platforms require them to be aligned. Use memcpy() instead to let the C compiler decide how to do it.

Closes https://github.com/cython/cython/issues/4343
parent bf4979e2
...@@ -702,22 +702,11 @@ static const char DIGITS_HEX[2*16+1] = { ...@@ -702,22 +702,11 @@ static const char DIGITS_HEX[2*16+1] = {
static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t width, char padding_char, char format_char); static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t width, char padding_char, char format_char);
/////////////// CIntToPyUnicode /////////////// /////////////// CIntToPyUnicode ///////////////
//@requires: StringTools.c::IncludeStringH
//@requires: StringTools.c::BuildPyUnicode //@requires: StringTools.c::BuildPyUnicode
//@requires: CIntToDigits //@requires: CIntToDigits
//@requires: GCCDiagnostics //@requires: GCCDiagnostics
#ifdef _MSC_VER
#ifndef _MSC_STDINT_H_
#if _MSC_VER < 1300
typedef unsigned short uint16_t;
#else
typedef unsigned __int16 uint16_t;
#endif
#endif
#else
#include <stdint.h>
#endif
// NOTE: inlining because most arguments are constant, which collapses lots of code below // NOTE: inlining because most arguments are constant, which collapses lots of code below
static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t width, char padding_char, char format_char) { static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t width, char padding_char, char format_char) {
...@@ -755,14 +744,14 @@ static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t wid ...@@ -755,14 +744,14 @@ static CYTHON_INLINE PyObject* {{TO_PY_FUNCTION}}({{TYPE}} value, Py_ssize_t wid
digit_pos = abs((int)(remaining % (8*8))); digit_pos = abs((int)(remaining % (8*8)));
remaining = ({{TYPE}}) (remaining / (8*8)); remaining = ({{TYPE}}) (remaining / (8*8));
dpos -= 2; dpos -= 2;
*(uint16_t*)dpos = ((const uint16_t*)DIGIT_PAIRS_8)[digit_pos]; /* copy 2 digits at a time */ memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); /* copy 2 digits at a time, unaligned */
last_one_off = (digit_pos < 8); last_one_off = (digit_pos < 8);
break; break;
case 'd': case 'd':
digit_pos = abs((int)(remaining % (10*10))); digit_pos = abs((int)(remaining % (10*10)));
remaining = ({{TYPE}}) (remaining / (10*10)); remaining = ({{TYPE}}) (remaining / (10*10));
dpos -= 2; dpos -= 2;
*(uint16_t*)dpos = ((const uint16_t*)DIGIT_PAIRS_10)[digit_pos]; /* copy 2 digits at a time */ memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); /* copy 2 digits at a time, unaligned */
last_one_off = (digit_pos < 10); last_one_off = (digit_pos < 10);
break; break;
case 'x': case 'x':
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment