summaryrefslogtreecommitdiffstatshomepage
path: root/py/repl.c
Commit message (Collapse)AuthorAge
* py/makemoduledefs.py: Add a way to register extensible built-in modules.Jim Mussared2023-06-08
| | | | Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
* shared/readline: Make tab insert an indent when it follows whitespace.Damien George2022-04-22
| | | | | | | | | | | | | | | | | | Entering tab at the REPL will now make it insert an indent (4 spaces) in the following cases: - after any whitespace on a line - at the start of a line that is not the first line This changes the existing behaviour where a tab would insert an indent only if there were no matches in the auto-complete search, and it was the start of the line. This means, if there were any symbols in the global namespace, tab could never be used to indent. Note that entering tab at the start of the first line will still do auto-completion, but will now do nothing if there are no symbols in the global namespace, which is more consistent than before. Signed-off-by: Damien George <damien@micropython.org>
* py/modsys: Add optional mutable attributes sys.ps1/ps2 and use them.Damien George2022-03-10
| | | | | | This allows customising the REPL prompt strings. Signed-off-by: Damien George <damien@micropython.org>
* py/repl: Don't read past the end of import_str.Jeff Epler2021-05-30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | asan considers that memcmp(p, q, N) is permitted to access N bytes at each of p and q, even for values of p and q that have a difference earlier. Accessing additional values is frequently done in practice, reading 4 or more bytes from each input at a time for efficiency, so when completing "non_exist<TAB>" in the repl, this causes a diagnostic: ==16938==ERROR: AddressSanitizer: global-buffer-overflow on address 0x555555cd8dc8 at pc 0x7ffff726457b bp 0x7fffffffda20 sp 0x7fff READ of size 9 at 0x555555cd8dc8 thread T0 #0 0x7ffff726457a (/usr/lib/x86_64-linux-gnu/libasan.so.5+0xb857a) #1 0x555555b0e82a in mp_repl_autocomplete ../../py/repl.c:301 #2 0x555555c89585 in readline_process_char ../../lib/mp-readline/re #3 0x555555c8ac6e in readline ../../lib/mp-readline/readline.c:513 #4 0x555555b8dcbd in do_repl /home/jepler/src/micropython/ports/uni #5 0x555555b90859 in main_ /home/jepler/src/micropython/ports/unix/ #6 0x555555b90a3a in main /home/jepler/src/micropython/ports/unix/m #7 0x7ffff619a09a in __libc_start_main ../csu/libc-start.c:308 #8 0x55555595fd69 in _start (/home/jepler/src/micropython/ports/uni 0x555555cd8dc8 is located 0 bytes to the right of global variable 'import_str' defined in '../../py/repl.c:285:23' (0x555555cd8dc0) of size 8 'import_str' is ascii string 'import ' Signed-off-by: Jeff Epler <jepler@gmail.com>
* py/repl: Autocomplete builtin modules.Artyom Skrobov2021-05-02
| | | | | | | | Doing "import <tab>" will now complete/list built-in modules. Originally at adafruit#4548 and adafruit#4608 Signed-off-by: Artyom Skrobov <tyomitch@gmail.com>
* py/repl: Refactor autocomplete, extracting reusable parts.Artyom Skrobov2021-05-02
| | | | | | Originally at adafruit#4548 Signed-off-by: Artyom Skrobov <tyomitch@gmail.com>
* py/repl: Refactor autocomplete to reduce nesting.Artyom Skrobov2021-05-02
| | | | | | Originally at adafruit#4548 Signed-off-by: Artyom Skrobov <tyomitch@gmail.com>
* py/repl: Enter four spaces when there are no matches.scottbelden2021-05-02
| | | | | | Originally at adafruit#1859 Signed-off-by: scottbelden <scottabelden@gmail.com>
* py/repl: Filter private methods from tab completion.Kathryn Lingel2021-05-02
| | | | | | | | | | Anything beginning with "_" will now only be tab-completed if there is already a partial match for such an entry. In other words, entering foo.<tab> will no longer complete/list anything beginning with "_". Originally at adafruit#1850 Signed-off-by: Kathryn Lingel <kathryn@lingel.net>
* all: Reformat C and Python source code with tools/codeformat.py.Damien George2020-02-28
| | | | This is run with uncrustify 0.70.1, and black 19.10b0.
* py: Rename MP_QSTR_NULL to MP_QSTRnull to avoid intern collisions.Josh Lloyd2019-09-26
| | | | Fixes #5140.
* py/repl: Fix handling of unmatched brackets and unfinished quotes.Li Weiwei2018-05-18
| | | | | | | | | | | | | | | | | | | | Before this patch: >>> print(') ... ') Traceback (most recent call last): File "<stdin>", line 1 SyntaxError: invalid syntax After this patch: >>> print(') Traceback (most recent call last): File "<stdin>", line 1 SyntaxError: invalid syntax This matches CPython and prevents getting stuck in REPL continuation when a 1-quote is unmatched.
* py/repl: Initialise q_last variable to prevent compiler warnings.Damien George2018-05-11
| | | | | Some older compilers cannot deduce that q_last is always written to before being read.
* py/repl: Use mp_load_method_protected to prevent leaking of exceptions.Damien George2018-05-10
| | | | | | | This patch fixes the possibility of a crash of the REPL when tab-completing an object which raises an exception when its attributes are accessed. See issue #3729.
* py/{modbuiltins,repl}: Start qstr probing from after empty qstr.Damien George2018-05-09
| | | | | The list of qstrs starts with MP_QSTR_NULL followed by MP_QSTR_, and these should never appear in dir() or REPL tab completion, so skip them.
* py/repl: Generalise REPL autocomplete to use qstr probing.Damien George2018-02-19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch changes the way REPL autocomplete finds matches. It now probes the target object for all qstrs via mp_load_method_maybe to look for a match with the given input string. Similar to how the builtin dir() function works, this new algorithm now find all methods and instances of user-defined classes including attributes of their parent classes. This helps a lot at the REPL prompt for user-discovery and to autocomplete names even for classes that are derived. The downside is that this new algorithm is slower than the previous one, and in particular will be slower the more qstrs there are in the system. But because REPL autocomplete is primarily used in an interactive way it is not that important to make it fast, as long as it is "fast enough" compared to human reaction. On a slow microcontroller (CPU running at 16MHz) the autocomplete time for a list of 35 names in the outer namespace (pressing tab at a bare prompt) takes about 160ms with this algorithm, compared to about 40ms for the previous implementation (this time includes the actual printing of the names as well). This time of 160ms is very reasonable especially given the new functionality of listing all the names. This patch also decreases code size by: bare-arm: +0 minimal x86: -128 unix x64: -128 unix nanbox: -224 stm32: -88 cc3200: -80 esp8266: -92 esp32: -84
* all: Use the name MicroPython consistently in commentsAlexander Steffen2017-07-31
| | | | | There were several different spellings of MicroPython present in comments, when there should be only one.
* py/repl: Change mp_uint_t to size_t in repl helpers.Damien George2017-07-04
|
* py: Change mp_uint_t to size_t for mp_obj_str_get_data len arg.Damien George2017-03-29
|
* py: Declare constant data as properly constant.Damien George2016-05-20
| | | | | Otherwise some compilers (eg without optimisation) will put this read-only data in RAM instead of ROM.
* py/repl: Fix handling of backslash in quotes when checking continuation.Damien George2016-05-11
|
* py/repl: If there're no better alternatives, try to complete "import".Paul Sokolovsky2016-05-08
| | | | | | Also do that only for the first word in a line. The idea is that when you start up interpreter, high chance that you want to do an import. With this patch, this can be achieved with "i<tab>".
* py: add async/await/async for/async with syntaxpohmelie2016-04-13
| | | | | | | | They are sugar for marking function as generator, "yield from" and pep492 python "semantically equivalents" respectively. @dpgeorge was the original author of this patch, but @pohmelie made changes to implement `async for` and `async with`.
* py/repl: Check for an identifier char after the keyword.Alex March2016-02-17
| | | | | - As described in the #1850. - Add cmdline tests.
* py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR.Damien George2015-11-29
| | | | | | | | | This allows the mp_obj_t type to be configured to something other than a pointer-sized primitive type. This patch also includes additional changes to allow the code to compile when sizeof(mp_uint_t) != sizeof(void*), such as using size_t instead of mp_uint_t, and various casts.
* py/repl: Treat escaped quotes correctly in REPL continuation.Alex March2015-09-19
| | | | | | | Escaped quotes are now recognised correctly in REPL when used inside normal quotes. Fixes: #1419
* py/repl: Don't look inside strings for unmatched brackets/quotes.Damien George2015-07-29
| | | | | | | When looking to see if the REPL input needs to be continued on the next line, don't look inside strings for unmatched ()[]{} ''' or """. Addresses issue #1387.
* py/repl: Fix case where shorter names are shadowed by longer names.Damien George2015-07-06
| | | | | | Previous to this patch, if "abcd" and "ab" were possible completions to tab-completing "a", then tab would expand to "abcd" straight away if this identifier appeared first in the dict.
* py/repl.c: Fix shadowing of local variable "i".Damien George2015-04-29
|
* py, readline: Add tab autocompletion for REPL.Damien George2015-04-29
| | | | | | | | Can complete names in the global namespace, as well as a chain of attributes, eg pyb.Pin.board.<tab> will give a list of all board pins. Costs 700 bytes ROM on Thumb2 arch, but greatly increases usability of REPL prompt.
* py: Move to guarded includes, everywhere in py/ core.Damien George2015-01-01
| | | | Addresses issue #1022.
* py: Make functions static where appropriate.Damien George2014-12-10
|
* py: Convert [u]int to mp_[u]int_t where appropriate.Damien George2014-10-03
| | | | Addressing issue #50.
* py: Include mpconfig.h before all other includes.Paul Sokolovsky2014-06-21
| | | | | | It defines types used by all other headers. Fixes #691.
* Tidy up some configuration options.Damien George2014-05-21
| | | | | | | | | | MP_ALLOC_* -> MICROPY_ALLOC_* MICROPY_PATH_MAX -> MICROPY_ALLOC_PATH_MAX MICROPY_ENABLE_REPL_HELPERS -> MICROPY_HELPER_REPL MICROPY_ENABLE_LEXER_UNIX -> MICROPY_HELPER_LEXER_UNIX MICROPY_EXTRA_* -> MICROPY_PORT_* See issue #35.
* Add license header to (almost) all files.Damien George2014-05-03
| | | | | | | Blanket wide to all .c and .h files. Some files originating from ST are difficult to deal with (license wise) so it was left out of those. Also merged modpyb.h, modos.h, modstm.h and modtime.h in stmhal/.
* py: Continue line if last character is backslash.Damien George2014-04-08
|
* Improve REPL detecting when input needs to continue.Damien George2014-04-08
| | | | | | | | Full CPython compatibility with this requires actually parsing the input so far collected, and if it fails parsing due to lack of tokens, then continue collecting input. It's not worth doing it this way. Not having compatibility at this level does not hurt the goals of Micro Python.
* py: Detect unmatched tripple quote in repl helper.Damien George2014-04-07
|
* mp_repl_is_compound_stmt(): Thinko fix s/true/try/.Paul Sokolovsky2014-01-11
|
* Factor and simplify Makefile's and mpconfig.Damien George2014-01-07
|
* Put unicode functions in unicode.c, and tidy their names.Damien George2013-12-30
|
* Change object representation from 1 big union to individual structs.Damien2013-12-21
| | | | | | | | | | A big change. Micro Python objects are allocated as individual structs with the first element being a pointer to the type information (which is itself an object). This scheme follows CPython. Much more flexible, not necessarily slower, uses same heap memory, and can allocate objects statically. Also change name prefix, from py_ to mp_ (mp for Micro Python).
* Improve REPL compount statement detection.Damien2013-10-22