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 diff --git a/src/eval/evaluator_inc.cpp b/src/eval/evaluator_inc.cpp index c035227a..4a98175f 100644 --- a/src/eval/evaluator_inc.cpp +++ b/src/eval/evaluator_inc.cpp @@ -151,6 +151,45 @@ 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; + } + // 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) { + input_dependent_cells.insert(i); + } else { + 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..024a5923 --- /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