From e5dcd5f110bfc4ec28d278adf9bbb5f83dcc6c0d Mon Sep 17 00:00:00 2001 From: loader3229 <1010903229@qq.com> Date: Wed, 17 Jun 2026 00:55:36 +0806 Subject: [PATCH 1/4] commit --- src/eval/evaluator_inc.cpp | 41 ++++++++++++++++++++++++++++++++++++++ tests/inceval/I032.asm | 17 ++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 tests/inceval/I032.asm diff --git a/src/eval/evaluator_inc.cpp b/src/eval/evaluator_inc.cpp index c035227a..957f6cb9 100644 --- a/src/eval/evaluator_inc.cpp +++ b/src/eval/evaluator_inc.cpp @@ -151,6 +151,47 @@ bool IncrementalEvaluator::checkPreLoop(bool skip_input_transform, is_transform = true; break; + // clearing or filling memory cells + case Operation::Type::CLR: + case Operation::Type::FIL: { + if (op.source.type != Operand::Type::CONSTANT) { + if (error_code) { + *error_code = ErrorCode::MEMORY_OP_SOURCE_INVALID; + } + return false; + } + auto bounds = ProgramUtil::getTargetMemoryRange(op); + if (bounds.first == Number::INF || bounds.second == Number::INF) { + if (error_code) { + *error_code = ErrorCode::MEMORY_OP_SOURCE_INVALID; + } + return false; + } + int64_t left = bounds.first.asInt(); + int64_t right = bounds.second.asInt(); + if (right - left >= interpreter.settings.max_memory) { + if (error_code) { + *error_code = ErrorCode::MEMORY_OP_SOURCE_INVALID; + } + return false; + } + bool target_input_dependent = false; + if (op.type == Operation::Type::FIL) { + target_input_dependent = isInputDependent(op.target); + } + for (int64_t i = left; i < right; i++) { + if (target_input_dependent) { + if (input_dependent_cells.find(i) == input_dependent_cells.end()) { + input_dependent_cells.insert(i); + } + } else { + if (input_dependent_cells.find(i) != input_dependent_cells.end()) { + input_dependent_cells.erase(i); + } + } + } + } break; + default: // everything else is currently not allowed if (error_code) { diff --git a/tests/inceval/I032.asm b/tests/inceval/I032.asm new file mode 100644 index 00000000..a3303590 --- /dev/null +++ b/tests/inceval/I032.asm @@ -0,0 +1,17 @@ +mov $1,2 +fil $1,4 +add $4,1 +fil $4,3 +clr $2,3 +lpb $0 + sub $0,1 + add $1,$3 + add $3,$5 + add $4,$6 + add $1,$4 + add $1,$5 + add $5,$4 + add $4,$3 + add $3,$6 +lpe +mov $0,$1 \ No newline at end of file From 2bdc534f14c3a692d482c9715832a96877e34341 Mon Sep 17 00:00:00 2001 From: loader3229 <1010903229@qq.com> Date: Thu, 18 Jun 2026 08:48:22 +0806 Subject: [PATCH 2/4] commit --- src/eval/evaluator_inc.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/eval/evaluator_inc.cpp b/src/eval/evaluator_inc.cpp index 957f6cb9..92d2a791 100644 --- a/src/eval/evaluator_inc.cpp +++ b/src/eval/evaluator_inc.cpp @@ -175,12 +175,15 @@ bool IncrementalEvaluator::checkPreLoop(bool skip_input_transform, } return false; } - bool target_input_dependent = false; + // Clearing memory cells will make these cells are not input dependent + // now. Filling memory cells will make input dependent state of these + // cells to input dependent state of target cell. + bool input_dependent = false; if (op.type == Operation::Type::FIL) { - target_input_dependent = isInputDependent(op.target); + input_dependent = isInputDependent(op.target); } for (int64_t i = left; i < right; i++) { - if (target_input_dependent) { + if (input_dependent) { if (input_dependent_cells.find(i) == input_dependent_cells.end()) { input_dependent_cells.insert(i); } From 2b5de7a8063ba3bf2a56bbb7d5b66a9ab0d93270 Mon Sep 17 00:00:00 2001 From: loader3229 <1010903229@qq.com> Date: Sat, 20 Jun 2026 21:48:32 +0806 Subject: [PATCH 3/4] commit --- src/eval/evaluator_inc.cpp | 13 ++++--------- tests/inceval/I032.asm | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/eval/evaluator_inc.cpp b/src/eval/evaluator_inc.cpp index 92d2a791..4a98175f 100644 --- a/src/eval/evaluator_inc.cpp +++ b/src/eval/evaluator_inc.cpp @@ -175,22 +175,17 @@ bool IncrementalEvaluator::checkPreLoop(bool skip_input_transform, } return false; } - // Clearing memory cells will make these cells are not input dependent - // now. Filling memory cells will make input dependent state of these - // cells to input dependent state of target cell. + // CLR: cells become constant zero → not input-dependent. + // FIL: cells take the value of op.target → inherit its input-dependency. bool input_dependent = false; if (op.type == Operation::Type::FIL) { input_dependent = isInputDependent(op.target); } for (int64_t i = left; i < right; i++) { if (input_dependent) { - if (input_dependent_cells.find(i) == input_dependent_cells.end()) { - input_dependent_cells.insert(i); - } + input_dependent_cells.insert(i); } else { - if (input_dependent_cells.find(i) != input_dependent_cells.end()) { - input_dependent_cells.erase(i); - } + input_dependent_cells.erase(i); } } } break; diff --git a/tests/inceval/I032.asm b/tests/inceval/I032.asm index a3303590..024a5923 100644 --- a/tests/inceval/I032.asm +++ b/tests/inceval/I032.asm @@ -14,4 +14,4 @@ lpb $0 add $4,$3 add $3,$6 lpe -mov $0,$1 \ No newline at end of file +mov $0,$1 From 68a0037055d4b3dd01a6823b88bc279a9f809611 Mon Sep 17 00:00:00 2001 From: loader3229 <1010903229@qq.com> Date: Sat, 20 Jun 2026 21:51:06 +0806 Subject: [PATCH 4/4] commit --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cd5af43..9719a61a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## [Unreleased] +### Enhancements +* Add `clr` and `fil` support in incremental evaluator before main loop + ## v26.6.7 ### Bugfixes