Skip to content
Snippets Groups Projects
  1. Feb 05, 2019
  2. Aug 14, 2018
    • Damien George's avatar
      py/stream: Adjust mp_stream_posix_XXX to take void*, not mp_obj_t. · 9ab816d6
      Damien George authored
      These POSIX wrappers are assumed to be passed a concrete stream object so
      it is more efficient (eg on nan-boxing builds) to pass in the pointer
      rather than mp_obj_t, because then the users of these functions only need
      to store a void* (and mp_obj_t may be wider than a pointer).  And things
      would be further improved if the stream protocol functions eventually took
      a pointer as their first argument (instead of an mp_obj_t).
      
      This patch is a step to getting ussl/axtls compiling on nan-boxing builds.
      
      See issue #3085.
      9ab816d6
  3. Jun 20, 2018
  4. Jun 18, 2018
    • Damien George's avatar
      py/stream: Introduce and use efficient mp_get_stream to access stream_p. · 6abede2c
      Damien George authored
      The existing mp_get_stream_raise() helper does explicit checks that the
      input object is a real pointer object, has a non-NULL stream protocol, and
      has the desired stream C method (read/write/ioctl).  In most cases it is
      not necessary to do these checks because it is guaranteed that the input
      object has the stream protocol and desired C methods.  For example, native
      objects that use the stream wrappers (eg mp_stream_readinto_obj) in their
      locals dict always have the stream protocol (or else they shouldn't have
      these wrappers in their locals dict).
      
      This patch introduces an efficient mp_get_stream() which doesn't do any
      checks and just extracts the stream protocol struct.  This should be used
      in all cases where the argument object is known to be a stream.  The
      existing mp_get_stream_raise() should be used primarily to verify that an
      object does have the correct stream protocol methods.
      
      All uses of mp_get_stream_raise() in py/stream.c have been converted to use
      mp_get_stream() because the argument is guaranteed to be a proper stream
      object.
      
      This patch improves efficiency of stream operations and reduces code size.
      6abede2c
  5. May 01, 2018
    • Ayke van Laethem's avatar
      py/stream: Use uPy errno instead of system's for non-blocking check. · d43c7377
      Ayke van Laethem authored
      This is a more consistent use of errno codes.  For example, it may be that
      a stream returns MP_EAGAIN but the mp_is_nonblocking_error() macro doesn't
      catch this value because it checks for EAGAIN instead (which may have a
      different value than MP_EAGAIN when MICROPY_USE_INTERNAL_ERRNO is enabled).
      d43c7377
  6. Apr 10, 2018
    • Damien George's avatar
      py/stream: Switch stream close operation from method to ioctl. · cf31d384
      Damien George authored
      This patch moves the implementation of stream closure from a dedicated
      method to the ioctl of the stream protocol, for each type that implements
      closing.  The benefits of this are:
      
      1. Rounds out the stream ioctl function, which already includes flush,
         seek and poll (among other things).
      
      2. Makes calling mp_stream_close() on an object slightly more efficient
         because it now no longer needs to lookup the close method and call it,
         rather it just delegates straight to the ioctl function (if it exists).
      
      3. Reduces code size and allows future types that implement the stream
         protocol to be smaller because they don't need a dedicated close method.
      
      Code size reduction is around 200 bytes smaller for x86 archs and around
      30 bytes smaller for the bare-metal archs.
      cf31d384
  7. Oct 04, 2017
    • Damien George's avatar
      all: Remove inclusion of internal py header files. · a3dc1b19
      Damien George authored
      Header files that are considered internal to the py core and should not
      normally be included directly are:
          py/nlr.h - internal nlr configuration and declarations
          py/bc0.h - contains bytecode macro definitions
          py/runtime0.h - contains basic runtime enums
      
      Instead, the top-level header files to include are one of:
          py/obj.h - includes runtime0.h and defines everything to use the
              mp_obj_t type
          py/runtime.h - includes mpstate.h and hence nlr.h, obj.h, runtime0.h,
              and defines everything to use the general runtime support functions
      
      Additional, specific headers (eg py/objlist.h) can be included if needed.
      a3dc1b19
  8. Sep 21, 2017
  9. Aug 20, 2017
  10. Jul 31, 2017
  11. Jun 15, 2017
  12. May 29, 2017
  13. Nov 13, 2016
  14. Oct 27, 2016
  15. Oct 17, 2016
  16. Oct 07, 2016
  17. Sep 22, 2016
  18. Aug 23, 2016
    • Krzysztof Blazewicz's avatar
      py/stream.c: use mp_obj_get_type in mp_get_stream_raise · 65620764
      Krzysztof Blazewicz authored
      In current state `mp_get_stream_raise` assumes that `self_in` is an object
      and always performs a pointer derefence which may cause a segfault.
      
      This function shall throw an exception whenever `self_in` does not implement
      a stream protocol, that includes qstr's and numbers.
      
      fixes #2331
      65620764
  19. Jul 30, 2016
  20. Jul 29, 2016
  21. Jul 26, 2016
  22. Jul 13, 2016
    • Paul Sokolovsky's avatar
      py/stream: Implement 2- and 3-arg write() method as an extension to CPython. · ad9b9c76
      Paul Sokolovsky authored
      3-arg form:
      
      stream.write(data, offset, length)
      
      2-arg form:
      
      stream.write(data, length)
      
      These allow efficient buffer writing without incurring extra memory
      allocation for slicing or creating memoryview() object, what is
      important for low-memory ports.
      
      All arguments must be positional. It might be not so bad idea to standardize
      on 3-arg form, but 2-arg case would need check and raising an exception
      anyway then, so instead it was just made to work.
      ad9b9c76
  23. Jun 18, 2016
  24. May 20, 2016
  25. May 17, 2016
    • Paul Sokolovsky's avatar
      py/stream: Support both "exact size" and "one underlying call" operations. · 7f7c84b1
      Paul Sokolovsky authored
      Both read and write operations support variants where either a) a single
      call is made to the undelying stream implementation and returned buffer
      length may be less than requested, or b) calls are repeated until requested
      amount of data is collected, shorter amount is returned only in case of
      EOF or error.
      
      These operations are available from the level of C support functions to be
      used by other C modules to implementations of Python methods to be used in
      user-facing objects.
      
      The rationale of these changes is to allow to write concise and robust
      code to work with *blocking* streams of types prone to short reads, like
      serial interfaces and sockets. Particular object types may select "exact"
      vs "once" types of methods depending on their needs. E.g., for sockets,
      revc() and send() methods continue to be "once", while read() and write()
      thus converted to "exactly" versions.
      
      These changes don't affect non-blocking handling, e.g. trying "exact"
      method on the non-blocking socket will return as much data as available
      without blocking. No data available is continued to be signaled as None
      return value to read() and write().
      
      From the point of view of CPython compatibility, this model is a cross
      between its io.RawIOBase and io.BufferedIOBase abstract classes. For
      blocking streams, it works as io.BufferedIOBase model (guaranteeing
      lack of short reads/writes), while for non-blocking - as io.RawIOBase,
      returning None in case of lack of data (instead of raising expensive
      exception, as required by io.BufferedIOBase). Such a cross-behavior
      should be optimal for MicroPython needs.
      7f7c84b1
  26. Apr 10, 2016
  27. Mar 27, 2016
  28. Mar 24, 2016
  29. Jan 11, 2016
  30. Dec 09, 2015
  31. Nov 29, 2015
  32. Oct 18, 2015
  33. Aug 13, 2015
Loading