Example: "flags & 0xFF != 0" is equivalent to "flags & 1",
most likely it's unexpected.
Example: "a << 2 + 1" (equal to "a << 3", probably unexpected).
The only way to suppress this error for the programmer
is to use parenthesis.
`get` keyword behaves exactly like `method_id` (auto-calc hash),
but it's placed on the left, similar to Tact: `get T name()`.
`method_id(n)` is still valid, considering it can't be invoked by name,
since a client will compute another hash.
It's supposed it will be still used in tests and in low-level code
(not to be called externally, but to be called after replacing c3).
`get(hash)` is invalid, this keyword does not accept anything.
Before, such code `if (slices_equal() & status == 1)` was parsed
as `if( (slices_equal()&status) == 1 )`.
Note, that this change leads to hash changes of some verified contracts,
but a new priority is more expected from the user experience.
Before, #pragma allow-post-modification produced Op::_Let for every
tensor entity (which became non-disabled if modification really happened).
Although they are stripped off by the compiler and don't affect fif output,
they pollute intermediate "AST" representation (ops).
Now, Op::_Let is added only if var modification actually happens
(which is very uncommon for real-wise code)
Note, that I have not added all builtin functions.
I filtered out strange and actually unused in practice,
like "int_at()" and similar, or "run_method0()" and similar.
(Probably, they should be dropped off even from builtins)
Also, I've modified some stdlib.fc legacy tests just to ensure
that a resulting hash doesn't change.
In stdlib, all existing pure functions are asm-implemented.
But since we introduced a `pure` keyword applicable to user-defined functions,
we need to check that they won't have any side effects
(exceptions, globals modification, etc.)
They work alongside Lisp-style ;; and {--}, without any #pragma.
Conceptually, a new syntax should be disabled by default
and activated using a special compiler option.
But now, we don't have an easy way to provide compiler options
in func-js, blueprint, etc.
Note, that introducing per-file #pragma is a wrong approach here,
since if we want to fire human-readable error on using '//' without pragma,
lexer should nevertheless work differently.
(this could be controlled by a launch option, but see above)
@code_hash to match (boc) hash of compiled.fif against expected.
While being much less flexible than @fif_codegen, it nevertheless
gives a guarantee of bytecode stability on compiler modifications.
This will allow to easily implement camelCase wrappers aside stdlib,
even without changing hashes of existing contracts.
Also, stdlib renamings could be easily performed in the same manner,
even with arguments reordered.
* @fif_codegen to match compiled.fif against an expected pattern
* @fif_codegen_avoid to ensure compiled.fif doesn't contain a substring
* both in Python and JS run_tests
* consider tests/codegen_check_demo.fc for examples
* fully refactor run_tests.py, make it extensible for the future
* an ability to write @compilation_should_fail tests
* an ability to launch run_tests.py for a single .fc file
* keep run_tests.js in sync with run_tests.py
* extract legacy_tests names/hashes to a separate file
shared between legacy_tester.py and legacy_tester.js
* Fix "sgn" in fift; fix marking infinite loops as noterurn in func
* TON-P1-1: Remove unused catchain queries
* TON-P1-15: Avoid synchronization with self
* TON-P1-3, TON-P1-17: Disallow more than one candidate per src per round (to prevent flood), add checks to process_broadcast
* TON-P1-10: Fix fast/slow attempts
* TON-P1-14: Add named constants
* TON-P1-18, TON-P1-19: Alloc temporary memory in the same way as persistent memory
* TON-P1-20: Add comment to choose_blocks_to_approve
* TON-P1-16: Avoid creating two catchain blocks on need_new_block
* TON-P1-8: Add some validation to validator-engine parameters
* TON-P1-6: Don't allow sending the same block many times
Many requests for the same block are not unusual (however, there's no need to answer them all)
* TON-P1-2: Enable prohibiting dependencies from blamed nodes (2.7.5 in CatChain doc), fix processing blame proofs
* Best practices
bp-6: Fix incorrect warning
bp-7: Remove unused code
bp-8: Bring back PerfWarningTimer logging (only when no callback)
bp-9: Remove unnecessary condition
bp-11: Remove commented-out code
bp-13: Divide code in validator-session-state
Adherence to Specification: Fix typo
* Fix UB in func
* Improve optimizing int consts and unused variables in FunC
* Bump funC version to 0.4.3
* Fix analyzing repeat loop
---------
Co-authored-by: SpyCheese <mikle98@yandex.ru>
* FunC pragmas: allow-post-modification and compute-asm-ltr
* Warn if #pragma is enabled only in included files
* Add tests for new pragmas
* Add special ops for "allow-post-modification" only when needed
* Update FunC version to 0.4.1
* Allow empty inlines (#10)
Co-authored-by: SpyCheese <mikle98@yandex.ru>
* Fixed complex funC setglob cases
* Forbid modifying local variables after using them in the same tensor
* Fix analyzing "while" in func
* Update funC version (#9)
* Update stress tester
* Fix using variable after move
Co-authored-by: krigga <krigga7@gmail.com>
Co-authored-by: SpyCheese <mikle98@yandex.ru>