micropython/py
Paul Sokolovsky 7f7c84b10a py/stream: Support both "exact size" and "one underlying call" operations.
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.
2016-05-18 02:41:45 +03:00
..
argcheck.c py/argcheck: Use size_t instead of mp_uint_t to count number of args. 2016-03-14 22:35:48 +00:00
asmarm.c py: Implement native multiply operation in viper emitter. 2015-06-04 14:00:29 +00:00
asmarm.h py: Implement native multiply operation in viper emitter. 2015-06-04 14:00:29 +00:00
asmthumb.c py/asmthumb: Allow to compile with -Wsign-compare and -Wunused-parameter. 2015-11-09 14:11:21 +00:00
asmthumb.h py: Add lsl/lsr/asr opcode support to inline Thumb2 assembler. 2015-10-19 14:26:19 +01:00
asmx64.c py/asmx64: Support all 16 regs in reg to memory move instructions. 2016-02-15 09:05:50 +00:00
asmx64.h py: Implement ptr32 load and store in viper emitter. 2015-10-13 00:50:17 +01:00
asmx86.c py/asmx86: Fix function definition to use int32_t instead of int. 2015-11-27 14:06:53 +00:00
asmx86.h py: Implement native multiply operation in viper emitter. 2015-06-04 14:00:29 +00:00
bc0.h py: Make UNARY_OP_NOT a first-class op, to agree with Py not semantics. 2015-12-10 22:19:48 +00:00
bc.c py: Fix bug passing a string as a keyword arg in a dict. 2016-04-21 16:51:36 +01:00
bc.h py/bc: Use size_t instead of mp_uint_t to count size of state and args. 2015-12-17 12:33:42 +00:00
binary.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
binary.h py/binary: Make return type of mp_binary_get_size size_t instead of int. 2015-05-17 18:12:19 +01:00
builtin.h py: Add uerrno module, with errno constants and dict. 2016-05-10 23:30:39 +01:00
builtinevex.c py: Change type signature of builtin funs that take variable or kw args. 2016-01-11 00:49:27 +00:00
builtinimport.c py: Add ability to have frozen persistent bytecode from .mpy files. 2016-04-13 16:07:47 +01:00
compile.c py: Fix constant folding and inline-asm to work with new async grammar. 2016-04-13 15:26:39 +01:00
compile.h py/compile: Add mp_compile_to_raw_code() to return raw code object. 2015-11-20 12:30:37 +00:00
emit.h py: Combine continuous block of emit steps into with_cleanup emit call. 2016-04-07 08:50:38 +01:00
emitbc.c py: Combine continuous block of emit steps into with_cleanup emit call. 2016-04-07 08:50:38 +01:00
emitcommon.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
emitglue.c py/emitglue: Fix build on AArch64 (ARMv8, etc.) related to loading .mpy files. 2016-05-12 16:00:57 +03:00
emitglue.h py/emitglue: Make mp_raw_code_t* arguments constant pointers. 2016-04-13 16:05:43 +01:00
emitinlinethumb.c py/emitinlinethumb: Use qstrs instead of char* for names of asm ops. 2016-02-23 15:20:39 +00:00
emitnative.c py/emitnative: Use MP_OBJ_NEW_SMALL_INT instead of manual bit shifting. 2016-04-26 10:02:32 +01:00
formatfloat.c py/formatfloat: Fix further cases of buffer overflow in formatting. 2016-03-29 22:07:15 +01:00
formatfloat.h py: Implement mp_format_float for doubles and use where appropriate 2015-05-17 21:47:11 +01:00
frozenmod.c py/frozenmod: Pass the source name of the frozen module to the lexer. 2016-04-17 12:37:00 +01:00
frozenmod.h py: Add ability to have frozen persistent bytecode from .mpy files. 2016-04-13 16:07:47 +01:00
gc.c py/gc: gc_dump_alloc_table(): Dump heap offset instead of actual address. 2016-05-13 00:16:38 +03:00
gc.h py/gc: Move away from using mp_uint_t, instead use uintptr_t and size_t. 2015-11-29 14:25:04 +00:00
grammar.h py: Simplify "and" action within parser by making ident-rules explicit. 2016-04-14 13:49:23 +01:00
lexer.c py: add async/await/async for/async with syntax 2016-04-13 15:26:38 +01:00
lexer.h py: add async/await/async for/async with syntax 2016-04-13 15:26:38 +01:00
lexerstr.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
lexerunix.c unix: Allow to cat a script into stdin from the command line. 2015-06-04 23:42:45 +01:00
makeqstrdata.py py/makeqstrdata: Add special case to handle \n qstr. 2016-04-14 15:22:36 +01:00
makeqstrdefs.py py/makeqstrdefs.py: Windows compatibility. 2016-04-25 22:34:22 +01:00
makeversionhdr.py py/makeversionhdr.py: Work with backslashes in paths. 2015-10-30 11:34:53 +03:00
malloc.c py/malloc: Provide a proper malloc-based implementation of realloc_ext. 2016-02-23 13:53:38 +00:00
map.c py/map: Change hash-table allocation policy to be less aggressive. 2016-04-15 16:24:46 +01:00
misc.h py/repl: Check for an identifier char after the keyword. 2016-02-17 08:56:15 +00:00
mkenv.mk py/mkenv.mk: Remove -s and -S args from PYTHON variable. 2016-04-21 22:25:35 +01:00
mkrules.mk py/mkrules.mk: Typo fixes in comments. 2016-04-26 12:39:28 +03:00
modarray.c py: Add MP_ROM_* macros and mp_rom_* types and use them. 2015-11-29 14:25:04 +00:00
modbuiltins.c py: add async/await/async for/async with syntax 2016-04-13 15:26:38 +01:00
modcmath.c py: Make it easy to build without MICROPY_PY_BUILTINS_COMPLEX. 2015-12-07 00:19:24 +02:00
modcollections.c py/modcollections: Rename module name have "u" prefix for consistency. 2016-05-02 13:57:46 +03:00
modgc.c py/modgc: Remove obsolete extern declaration. 2015-12-17 13:20:40 +00:00
modio.c py/stream: Support both "exact size" and "one underlying call" operations. 2016-05-18 02:41:45 +03:00
modmath.c py/objfloat, py/modmath: Ensure M_PI and M_E defined. 2016-05-12 13:28:45 +01:00
modmicropython.c py/modmicropython: Add stack_use, heap_lock and heap_unlock functions. 2016-01-24 09:12:06 +00:00
modstruct.c py/modstruct: Raise ValueError on unsupported format char. 2016-05-14 15:47:08 +03:00
modsys.c py: Change type signature of builtin funs that take variable or kw args. 2016-01-11 00:49:27 +00:00
moduerrno.c py/moduerrno: Add EACCES, pretty common error on Unix. 2016-05-13 00:15:38 +03:00
mpconfig.h py: Add uerrno module, with errno constants and dict. 2016-05-10 23:30:39 +01:00
mperrno.h py/objexcept: Don't convert errno to str in constructor, do it in print. 2016-05-12 14:27:52 +01:00
mphal.h all: Add py/mphal.h and use it in all ports. 2015-10-31 19:14:30 +03:00
mpprint.c py/mpprint: Fix sign extension when printf'ing %u, %x and %X. 2016-02-01 15:08:42 +00:00
mpprint.h py: Change mp_print_strn_t func type to use size_t for the str length. 2015-11-29 14:25:04 +00:00
mpstate.c py: Add MICROPY_DYNAMIC_COMPILER option to config compiler at runtime. 2016-02-25 10:05:46 +00:00
mpstate.h py: Add MICROPY_DYNAMIC_COMPILER option to config compiler at runtime. 2016-02-25 10:05:46 +00:00
mpz.c py/mpz: Fix mpn_div so that it doesn't modify memory of denominator. 2016-05-09 17:21:42 +01:00
mpz.h windows/py: Support 64bit mingw-w64 builds 2015-11-24 17:34:14 +02:00
nativeglue.c py/viper: Allow casting of Python integers to viper pointers. 2016-02-09 13:29:20 +00:00
nlr.h py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
nlrsetjmp.c py: Put all global state together in state structures. 2015-01-07 20:33:00 +00:00
nlrthumb.S py/nlrthumb: Make compatible with Cortex-M0 (ARMv6M instr set). 2015-10-20 13:26:34 +01:00
nlrx64.S nlr: Use single preprocessor symbol to check if building on Windows 2015-11-24 17:34:14 +02:00
nlrx86.S nlr: Use single preprocessor symbol to check if building on Windows 2015-11-24 17:34:14 +02:00
nlrxtensa.S py: Put all global state together in state structures. 2015-01-07 20:33:00 +00:00
obj.c py/obj: Add warning note about get_array return value and GC blocks. 2016-05-04 10:19:08 +01:00
obj.h py/obj: Add warning note about get_array return value and GC blocks. 2016-05-04 10:19:08 +01:00
objarray.c py/objarray: Fix array.append so it doesn't extend if append fails. 2016-04-07 09:03:33 +01:00
objattrtuple.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objbool.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objboundmeth.c py/objboundmeth: Allocate arg state on stack if heap alloc fails. 2016-03-08 15:36:53 +00:00
objcell.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objclosure.c py: Fix passing of some wide int types to printf varg format list. 2016-03-14 22:40:39 +00:00
objcomplex.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objdict.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objenumerate.c py: Use new code pattern for parsing kw args with mp_arg_parse_all. 2016-01-13 15:47:56 +00:00
objexcept.c py/objexcept: Don't convert errno to str in constructor, do it in print. 2016-05-12 14:27:52 +01:00
objexcept.h py: Change exception traceback data to use size_t instead of mp_uint_t. 2016-01-02 22:04:12 +00:00
objfilter.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objfloat.c py/objfloat, py/modmath: Ensure M_PI and M_E defined. 2016-05-12 13:28:45 +01:00
objfun.c py/objfun: Allow inline-asm functions to be called with 4 arguments. 2016-03-16 08:22:26 +00:00
objfun.h py: Add constant table to bytecode. 2015-11-13 12:49:18 +00:00
objgenerator.c py/vm: "yield from" didn't handle MP_OBJ_STOP_ITERATION optimization. 2016-04-28 02:08:43 +03:00
objgenerator.h py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
objgetitemiter.c py/objgetitemiter: Typo fix in comment. 2016-01-23 23:30:06 +02:00
objint_longlong.c py: Use MP_SMALL_INT_POSITIVE_MASK to check if uint fits in a small int. 2016-03-10 21:52:56 +00:00
objint_mpz.c py/mpz: Do Python style division/modulo within bignum divmod routine. 2016-05-08 22:21:21 +01:00
objint.c py: Use MP_SMALL_INT_POSITIVE_MASK to check if uint fits in a small int. 2016-03-10 21:52:56 +00:00
objint.h py: Change mp_obj_int_is_positive to more general mp_obj_int_sign. 2016-01-07 14:29:12 +00:00
objlist.c py: Use new code pattern for parsing kw args with mp_arg_parse_all. 2016-01-13 15:47:56 +00:00
objlist.h py: Fix adding of traceback so that it appends to existing info. 2015-02-27 00:36:39 +00:00
objmap.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objmodule.c py: Add uerrno module, with errno constants and dict. 2016-05-10 23:30:39 +01:00
objmodule.h py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
objnamedtuple.c py: Fix passing of some wide int types to printf varg format list. 2016-03-14 22:40:39 +00:00
objnone.c py: Convert hash API to use MP_UNARY_OP_HASH instead of ad-hoc function. 2015-05-12 22:46:02 +01:00
objobject.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objpolyiter.c py/objpolyiter: Implement instance-polymorphic iterator type. 2015-12-14 23:48:12 +02:00
objproperty.c py/objproperty: Fix static struct to build with OBJ_REPR_D. 2016-01-15 11:09:20 +00:00
objrange.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objreversed.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objset.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objsingleton.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objslice.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objstr.c py/objstr: Make dedicated splitlines function, supporting diff newlines. 2016-05-13 12:21:32 +01:00
objstr.h py/objarray: Implement "in" operator for bytearray. 2016-02-14 18:57:11 +02:00
objstringio.c py/objstringio: Add TODO comment about avoiding copying on .getvalue(). 2016-05-14 14:46:13 +03:00
objstrunicode.c py: Use polymorphic iterator type where possible to reduce code size. 2016-01-03 16:27:55 +00:00
objtuple.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objtuple.h py: Add MP_ROM_* macros and mp_rom_* types and use them. 2015-11-29 14:25:04 +00:00
objtype.c py: When printf'ing an object as a pointer, pass the concrete pointer. 2016-03-14 22:41:14 +00:00
objtype.h py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objzip.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
opmethods.c py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
parse.c py/parse: Add uerrno to list of modules to look for constants in. 2016-05-10 23:30:39 +01:00
parse.h py/parse: Improve constant folding to operate on small and big ints. 2016-01-07 14:40:35 +00:00
parsenum.c py/parsenum: Use pow function to apply exponent to decimal number. 2016-03-29 22:12:07 +01:00
parsenum.h py/parsenum: Use size_t to count bytes, and int for type of base arg. 2016-03-14 22:34:03 +00:00
parsenumbase.c py/parsenum: Fix compiler warnings for no decl and signed comparison. 2016-03-14 22:52:52 +00:00
parsenumbase.h py/parsenum: Use size_t to count bytes, and int for type of base arg. 2016-03-14 22:34:03 +00:00
py.mk py: Add uerrno module, with errno constants and dict. 2016-05-10 23:30:39 +01:00
qstr.c py: Rework QSTR extraction to work in simple and obvious way. 2016-04-19 11:37:56 +03:00
qstr.h py: Rework QSTR extraction to work in simple and obvious way. 2016-04-19 11:37:56 +03:00
qstrdefs.h py: Add rules for automated extraction of qstrs from sources. 2016-04-16 13:18:09 +01:00
repl.c py/repl: Fix handling of backslash in quotes when checking continuation. 2016-05-11 16:05:22 +01:00
repl.h py, readline: Add tab autocompletion for REPL. 2015-04-29 00:46:26 +01:00
ringbuf.h py/ringbuf.h: Add reusable ring buffer class. 2016-03-30 14:48:31 +03:00
runtime0.h py: Extend native type-sig to use 4 bits, so uint is separate to ptr. 2016-02-02 23:16:05 +00:00
runtime_utils.c py/runtime_utils: Fix nanbox build. 2016-04-25 20:03:14 +03:00
runtime.c py/runtime: Properly handle passing user mappings to ** keyword args. 2016-05-07 22:02:46 +01:00
runtime.h py: Move call_function_*_protected() functions to py/ for reuse. 2016-04-25 19:31:17 +03:00
scope.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
scope.h py: Put all bytecode state (arg count, etc) in bytecode. 2015-11-13 12:49:18 +00:00
sequence.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
showbc.c py: Make UNARY_OP_NOT a first-class op, to agree with Py not semantics. 2015-12-10 22:19:48 +00:00
smallint.c py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
smallint.h py/smallint: Allow to override MP_SMALL_INT_MIN et al. 2016-01-08 13:43:56 +00:00
stackctrl.c py/stackctrl: Add mp_stack_set_top() to explicitly set stack top value. 2016-03-07 14:12:24 +07:00
stackctrl.h py/stackctrl: Add mp_stack_set_top() to explicitly set stack top value. 2016-03-07 14:12:24 +07:00
stream.c py/stream: Support both "exact size" and "one underlying call" operations. 2016-05-18 02:41:45 +03:00
stream.h py/stream: Support both "exact size" and "one underlying call" operations. 2016-05-18 02:41:45 +03:00
unicode.c py/repl: Check for an identifier char after the keyword. 2016-02-17 08:56:15 +00:00
unicode.h py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
vm.c py/vm: "yield from" didn't handle MP_OBJ_STOP_ITERATION optimization. 2016-04-28 02:08:43 +03:00
vmentrytable.h py: Make UNARY_OP_NOT a first-class op, to agree with Py not semantics. 2015-12-10 22:19:48 +00:00
vstr.c py/vstr: Change allocation policy, +16 to requested size, instead of *2. 2016-05-10 00:56:51 +03:00
warning.c py: Convert occurrences of non-debug printf to mp_printf. 2015-04-16 14:30:16 +00:00