- 08 Oct, 2015 2 commits
-
-
Damien George authored
This patch eliminates the need for a nested parse node for assignments and keyword arguments. It saves a little bit of RAM when parsing.
-
Damien George authored
Also adds tests specifically for testing constant folding.
-
- 03 Oct, 2015 1 commit
-
-
Damien George authored
-
- 01 Oct, 2015 2 commits
-
-
Damien George authored
With this patch parse nodes are allocated sequentially in chunks. This reduces fragmentation of the heap and prevents waste at the end of individually allocated parse nodes. Saves roughly 20% of RAM during parse stage.
-
Damien George authored
-
- 24 Sep, 2015 1 commit
-
-
Damien George authored
It's relatively small (between 44 and 56 bytes) and helps to reduce heap pressure and fragmentation during compilation.
-
- 23 Sep, 2015 2 commits
-
-
Damien George authored
Saves a few bytes of code space and eliminates need for rot_two bytecode (hence saving RAM and execution time, by a tiny bit).
-
Delio Brignoli authored
-
- 07 Sep, 2015 1 commit
-
-
Damien George authored
-
- 04 Sep, 2015 1 commit
-
-
Damien George authored
Function annotations are only needed when the native emitter is enabled and when the current scope is emitted in viper mode. All other times the annotations can be skipped completely.
-
- 17 Aug, 2015 2 commits
-
-
Damien George authored
-
Damien George authored
unix-cpy was originally written to get semantic equivalent with CPython without writing functional tests. When writing the initial implementation of uPy it was a long way between lexer and functional tests, so the half-way test was to make sure that the bytecode was correct. The idea was that if the uPy bytecode matched CPython 1-1 then uPy would be proper Python if the bytecodes acted correctly. And having matching bytecode meant that it was less likely to miss some deep subtlety in the Python semantics that would require an architectural change later on. But that is all history and it no longer makes sense to retain the ability to output CPython bytecode, because: 1. It outputs CPython 3.3 compatible bytecode. CPython's bytecode changes from version to version, and seems to have changed quite a bit in 3.5. There's no point in changing the bytecode output to match CPython anymore. 2. uPy and CPy do different optimisations to the bytecode which makes it harder to match. 3. The bytecode tests are not run. They were never part of Travis and are not run locally anymore. 4. The EMIT_CPYTHON option needs a lot of extra source code which adds heaps of noise, especially in compile.c. 5. Now that there is an extensive test suite (which tests functionality) there is no need to match the bytecode. Some very subtle behaviour is tested with the test suite and passing these tests is a much better way to stay Python-language compliant, rather than trying to match CPy bytecode.
-
- 29 Jul, 2015 1 commit
-
-
Damien George authored
Previous to this patch there were some cases where line numbers for errors were 0 (unknown). Now the compiler attempts to give a better line number where possible, in some cases giving the line number of the closest statement, and other cases the line number of the inner-most scope of the error (eg the line number of the start of the function). This helps to give good (and sometimes exact) line numbers for ViperTypeError exceptions. This patch also makes sure that the first compile error (eg SyntaxError) that is encountered is reported (previously it was the last one that was reported).
-
- 27 Jul, 2015 1 commit
-
-
Damien George authored
ViperTypeError now includes filename and function name where the error occurred. The line number is the line number of the start of the function definition, which is the best that can be done without a lot more work. Partially addresses issue #1381.
-
- 25 Jun, 2015 1 commit
-
-
Damien George authored
Previous to this patch each time a bytes object was referenced a new instance (with the same data) was created. With this patch a single bytes object is created in the compiler and is loaded directly at execute time as a true constant (similar to loading bignum and float objects). This saves on allocating RAM and means that bytes objects can now be used when the memory manager is locked (eg in interrupts). The MP_BC_LOAD_CONST_BYTES bytecode was removed as part of this. Generated bytecode is slightly larger due to storing a pointer to the bytes object instead of the qstr identifier. Code size is reduced by about 60 bytes on Thumb2 architectures.
-
- 20 Apr, 2015 1 commit
-
-
Damien George authored
This fixes a long standing problem that viper code generation gave terrible error messages, and actually no errors on pyboard where assertions are disabled. Now all compile-time errors are raised as proper Python exceptions, and are of type ViperTypeError. Addresses issue #940.
-
- 11 Apr, 2015 1 commit
-
-
Damien George authored
-
- 09 Apr, 2015 2 commits
-
-
Damien George authored
-
Damien George authored
-
- 26 Mar, 2015 3 commits
-
-
Damien George authored
When just the bytecode emitter is needed there is no need to have a dynamic method table for the emitter back-end, and we can instead directly call the mp_emit_bc_XXX functions. This gives a significant reduction in code size and a very slight performance boost for the compiler. This patch saves 1160 bytes code on Thumb2 and 972 bytes on x86, when native emitters are disabled. Overall savings in code over the last 3 commits are: bare-arm: 1664 bytes. minimal: 2136 bytes. stmhal: 584 bytes (it has native emitter enabled). cc3200: 1736 bytes.
-
Damien George authored
First pass for the compiler is computing the scope (eg if an identifier is local or not) and originally had an entire table of methods dedicated to this, most of which did nothing. With changes from previous commit, this set of methods can be removed and the methods from the bytecode emitter used instead, with very little modification -- this is what is done in this commit. This factoring has little to no impact on the speed of the compiler (tested by compiling 3763 Python scripts and timing it). This factoring reduces code size by about 270-300 bytes on Thumb2 archs, and 400 bytes on x86.
-
Damien George authored
Saves around 230 bytes on Thumb2 and 750 bytes on x86.
-
- 25 Mar, 2015 2 commits
-
-
Damien George authored
It allowed such things as (a, b) += c.
-
Damien George authored
-
- 14 Mar, 2015 3 commits
-
-
Damien George authored
-
Damien George authored
These allow to fine-tune the compiler to select whether it optimises tuple assignments of the form a, b = c, d and a, b, c = d, e, f. Sensible defaults are provided.
-
Damien George authored
-
- 03 Mar, 2015 2 commits
-
-
Damien George authored
Just to reduce code size. Messages are still to the point and unambiguous.
-
Damien George authored
-
- 01 Mar, 2015 1 commit
-
-
Damien George authored
Addresses issue #1140.
-
- 28 Feb, 2015 3 commits
-
-
Damien George authored
Saves around 60 bytes code on Thumb2 archs.
-
Damien George authored
Saves 116 bytes for stmhal and 56 bytes for cc3200 port.
-
Damien George authored
Reduces code size by 72 bytes on Thumb2 archs.
-
- 27 Feb, 2015 1 commit
-
-
Damien George authored
Saves about 250 code bytes for Thumb2 archs.
-
- 16 Feb, 2015 1 commit
-
-
Damien George authored
-
- 13 Feb, 2015 2 commits
-
-
Damien George authored
-
Damien George authored
Also gives line number of location of error. Very useful!
-
- 08 Feb, 2015 1 commit
-
-
Damien George authored
Previous to this patch, a big-int, float or imag constant was interned (made into a qstr) and then parsed at runtime to create an object each time it was needed. This is wasteful in RAM and not efficient. Now, these constants are parsed straight away in the parser and turned into objects. This allows constants with large numbers of digits (so addresses issue #1103) and takes us a step closer to #722.
-
- 07 Feb, 2015 1 commit
-
-
Damien George authored
To enable parsing constants more efficiently, mp_parse should be allowed to raise an exception, and mp_compile can already raise a MemoryError. So these functions need to be protected by an nlr push/pop block. This patch adds that feature in all places. This allows to simplify how mp_parse and mp_compile are called: they now raise an exception if they have an error and so explicit checking is not needed anymore.
-
- 28 Jan, 2015 1 commit
-
-
Damien George authored
This cleans up vstr so that it's a pure "variable buffer", and the user can decide whether they need to add a terminating null byte. In most places where vstr is used, the vstr did not need to be null terminated and so this patch saves code size, a tiny bit of RAM, and makes vstr usage more efficient. When null termination is needed it must be done explicitly using vstr_null_terminate.
-