PageRenderTime 44ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/module/cpyext/floatobject.py

https://bitbucket.org/pypy/pypy/
Python | 86 lines | 61 code | 13 blank | 12 comment | 4 complexity | dc60d080dddac1a52fa53bd3cdafd1bc MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from rpython.rtyper.lltypesystem import rffi, lltype
  2. from pypy.module.cpyext.api import (PyObjectFields, bootstrap_function,
  3. cpython_struct,
  4. CANNOT_FAIL, cpython_api, PyObject, build_type_checkers, CONST_STRING)
  5. from pypy.module.cpyext.pyobject import (
  6. make_typedescr, track_reference, from_ref)
  7. from pypy.interpreter.error import OperationError
  8. from rpython.rlib.rstruct import runpack
  9. from pypy.objspace.std.floatobject import W_FloatObject
  10. PyFloatObjectStruct = lltype.ForwardReference()
  11. PyFloatObject = lltype.Ptr(PyFloatObjectStruct)
  12. PyFloatObjectFields = PyObjectFields + \
  13. (("ob_fval", rffi.DOUBLE),)
  14. cpython_struct("PyFloatObject", PyFloatObjectFields, PyFloatObjectStruct)
  15. @bootstrap_function
  16. def init_floatobject(space):
  17. "Type description of PyFloatObject"
  18. make_typedescr(space.w_float.layout.typedef,
  19. basestruct=PyFloatObject.TO,
  20. attach=float_attach,
  21. realize=float_realize)
  22. def float_attach(space, py_obj, w_obj):
  23. """
  24. Fills a newly allocated PyFloatObject with the given float object. The
  25. value must not be modified.
  26. """
  27. py_float = rffi.cast(PyFloatObject, py_obj)
  28. py_float.c_ob_fval = space.float_w(w_obj)
  29. def float_realize(space, obj):
  30. floatval = rffi.cast(lltype.Float, rffi.cast(PyFloatObject, obj).c_ob_fval)
  31. w_type = from_ref(space, rffi.cast(PyObject, obj.c_ob_type))
  32. w_obj = space.allocate_instance(W_FloatObject, w_type)
  33. w_obj.__init__(floatval)
  34. track_reference(space, obj, w_obj)
  35. return w_obj
  36. PyFloat_Check, PyFloat_CheckExact = build_type_checkers("Float")
  37. @cpython_api([lltype.Float], PyObject)
  38. def PyFloat_FromDouble(space, value):
  39. return space.wrap(value)
  40. @cpython_api([PyObject], lltype.Float, error=-1)
  41. def PyFloat_AsDouble(space, w_obj):
  42. return space.float_w(space.float(w_obj))
  43. @cpython_api([rffi.VOIDP], lltype.Float, error=CANNOT_FAIL)
  44. def PyFloat_AS_DOUBLE(space, w_float):
  45. """Return a C double representation of the contents of w_float, but
  46. without error checking."""
  47. return space.float_w(w_float)
  48. @cpython_api([PyObject], PyObject)
  49. def PyNumber_Float(space, w_obj):
  50. """
  51. Returns the o converted to a float object on success, or NULL on failure.
  52. This is the equivalent of the Python expression float(o)."""
  53. return space.call_function(space.w_float, w_obj)
  54. @cpython_api([PyObject, rffi.CCHARPP], PyObject)
  55. def PyFloat_FromString(space, w_obj, _):
  56. """Create a PyFloatObject object based on the string value in str, or
  57. NULL on failure. The pend argument is ignored. It remains only for
  58. backward compatibility."""
  59. return space.call_function(space.w_float, w_obj)
  60. @cpython_api([CONST_STRING, rffi.INT_real], rffi.DOUBLE, error=-1.0)
  61. def _PyFloat_Unpack4(space, ptr, le):
  62. input = rffi.charpsize2str(ptr, 4)
  63. if rffi.cast(lltype.Signed, le):
  64. return runpack.runpack("<f", input)
  65. else:
  66. return runpack.runpack(">f", input)
  67. @cpython_api([CONST_STRING, rffi.INT_real], rffi.DOUBLE, error=-1.0)
  68. def _PyFloat_Unpack8(space, ptr, le):
  69. input = rffi.charpsize2str(ptr, 8)
  70. if rffi.cast(lltype.Signed, le):
  71. return runpack.runpack("<d", input)
  72. else:
  73. return runpack.runpack(">d", input)