Skip to content

Fix leak in closures with circular references#695

Draft
SuperFola wants to merge 2 commits into
devfrom
fix/leak
Draft

Fix leak in closures with circular references#695
SuperFola wants to merge 2 commits into
devfrom
fix/leak

Conversation

@SuperFola

@SuperFola SuperFola commented Jun 25, 2026

Copy link
Copy Markdown
Member

Description

Closes # (issue)

Checklist

  • I have read the Contributor guide
  • My code follows the style guidelines of this project
  • I have commented my code, particularly in hard-to-understand areas
  • I have updated the documentation if needed (on https://github.com/ArkScript-lang/website, content/docs/)
  • I have added tests that prove my fix/feature is working
  • New and existing tests pass locally with my changes
  • I confirm that I am the author of this code and release it to the ArkScript project under the MPL-2.0 license. This contribution does not contain code from other sources, including code generated by a Large Language Model ("AI").

@github-actions

github-actions Bot commented Jun 25, 2026

Copy link
Copy Markdown

Static analysis report

Lizard report

Listing only functions with cyclomatic complexity >= 15 or NLOC >= 100 or parameters >= 6.

Filename Start line:end line Function name Parameters NLOC CCN
src/arkreactor/VM/VM.cpp 448:2152 Ark::VM::unsafeRun 2 1433 281
src/arkreactor/VM/VM.cpp 2306:2400 Ark::VM::backtrace 3 81 20
src/arkreactor/VM/VM.cpp 2164:2221 Ark::VM::throwArityError 4 47 15
Report about files you didn't modify in this PR
Filename Start line:end line Function name Parameters NLOC CCN
src/arkreactor/Compiler/Macros/Processor.cpp 259:643 Ark::internal::MacroProcessor::evaluate 3 353 119
src/arkreactor/Compiler/BytecodeReader.cpp 385:596 Ark::BytecodeReader::display 4 171 92
src/arkreactor/Error/Diagnostics.cpp 45:192 Ark::Diagnostics::makeContext 4 109 44
src/arkscript/main.cpp 24:383 main 2 310 43
src/arkreactor/Compiler/AST/Parser.cpp 841:975 Ark::internal::Parser::string 1 131 42
src/arkscript/JsonCompiler.cpp 27:276 JsonCompiler::_compile 1 214 38
src/arkreactor/Compiler/NameResolution/NameResolutionPass.cpp 163:268 Ark::internal::NameResolutionPass::visitKeyword 3 85 35
src/arkreactor/Builtins/Slice.cpp 21:93 Ark::internal::Builtins::slice 1 63 34
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 355:434 Ark::internal::ASTLowerer::compileListInstruction 3 64 32
src/arkreactor/Compiler/AST/Node.cpp 179:285 Ark::internal::Node::repr 0 90 30
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 853:999 Ark::internal::ASTLowerer::handleFunctionCall 3 114 30
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 212:317 Ark::internal::ASTLowerer::compileExpression 5 88 29
src/arkreactor/Compiler/Macros/Processor.cpp 107:191 Ark::internal::MacroProcessor::processNode 3 63 28
src/arkreactor/Compiler/AST/Node.cpp 287:368 Ark::internal::Node::debugPrint 1 70 26
src/arkreactor/Compiler/BytecodeReader.cpp 612:713 Ark::BytecodeReader::printInstruction 7 98 25
src/arkreactor/TypeChecker.cpp 149:236 Ark::types::generateError 6 75 25
src/arkreactor/TypeChecker.cpp 32:147 Ark::types::displayContract 6 102 24
src/arkreactor/Compiler/NameResolution/NameResolutionPass.cpp 57:161 Ark::internal::NameResolutionPass::visit 2 83 23
src/arkreactor/Compiler/AST/Parser.cpp 289:417 Ark::internal::Parser::import_ 1 98 23
include/utf8.hpp 138:184 utf8::isValid 1 44 21
src/arkreactor/VM/Value/Value.cpp 81:149 Ark::Value::toString 2 54 21
src/arkreactor/Compiler/AST/Optimizer.cpp 35:85 Ark::internal::Optimizer::countAndPruneDeadCode 1 42 20
src/arkreactor/Compiler/NameResolution/StaticScope.cpp 70:111 Ark::internal::NamespaceScope::get 3 32 19
src/arkreactor/Compiler/AST/Optimizer.cpp 87:144 Ark::internal::Optimizer::pruneUnusedGlobalVariables 1 50 18
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 799:851 Ark::internal::ASTLowerer::handleOperator 3 42 18
src/arkreactor/Builtins/String.cpp 47:113 fmt::formatter::parse 1 59 18
src/arkscript/Formatter.cpp 212:274 Formatter::format 3 59 18
src/arkscript/Formatter.cpp 527:585 Formatter::formatCall 2 50 18
src/arkreactor/Compiler/Macros/Executors/Function.cpp 16:89 Ark::internal::FunctionExecutor::applyMacro 2 56 17
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 107:129 Ark::internal::ASTLowerer::nodeProducesOutput 1 18 17
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 597:645 Ark::internal::ASTLowerer::compileLetMutSet 4 40 17
include/Ark/Compiler/AST/Predicates.hpp 142:166 Ark::internal::IsSymbol::operator ( ) 1 24 16
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 514:595 Ark::internal::ASTLowerer::compileFunction 3 59 16
src/arkscript/Formatter.cpp 324:366 Formatter::formatFunction 2 36 16
src/arkreactor/Compiler/Macros/Executors/Function.cpp 99:156 Ark::internal::FunctionExecutor::unify 5 50 15
src/arkreactor/Compiler/IntermediateRepresentation/IROptimizer.cpp 22:260 Ark::internal::IROptimizer::IROptimizer 1 219 14
src/arkreactor/Builtins/Time.cpp 71:91 Ark::internal::Builtins::Time::makeTimestamp 6 20 5
src/arkreactor/Error/Diagnostics.cpp 194:211 Ark::Diagnostics::helper 7 17 2

CppCheck report

Filename Line Type Description
include/Ark/VM/VM.inl 257 style Variable 'maybe_value_ptr' can be declared as pointer to const
src/arkreactor/VM/VM.cpp 0 information Too many #ifdef configurations - cppcheck only checks 12 of 13 configurations. Use --force to check all configurations.
src/arkreactor/VM/VM.cpp 280 error Iterators of different containers 'm_execution_contexts.emplace_back(std::make_unique())' and 'm_execution_contexts.front()' are used together.
Report files about files you didn't modify in this PR
Filename Line Type Description
src/arkreactor/Builtins/Bytecode.cpp 23 style Parameter 'vm' can be declared as pointer to const
src/arkreactor/Builtins/Time.cpp 31 style Parameter 'n' can be declared as reference to const
src/arkreactor/Compiler/BytecodeReader.cpp 20 performance Variable 'm_arg_kinds' is assigned in constructor body. Consider performing initialization in initialization list.
src/arkreactor/Compiler/IntermediateRepresentation/IROptimizer.cpp 249 style Consider using std::transform algorithm instead of a raw loop.
src/arkreactor/Compiler/IntermediateRepresentation/IROptimizer.cpp 256 style Consider using std::transform algorithm instead of a raw loop.
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 620 style Consider using std::count_if algorithm instead of a raw loop.
src/arkreactor/Compiler/Lowerer/LocalsLocator.cpp 26 style The scope of the variable 'data' can be reduced.
src/arkreactor/Compiler/NameResolution/ScopeResolver.cpp 136 style Consider using std::find_if algorithm instead of a raw loop.
src/arkreactor/State.cpp 183 style Variable 'bytecode_hash' is assigned a value that is never used.
src/arkreactor/VM/SharedLibrary.cpp 0 information Too many #ifdef configurations - cppcheck only checks 12 of 13 configurations. Use --force to check all configurations.
include/Ark/VM/Value/Future.hpp 50 style Unused private function: 'Future::deleteSelfViaVM'
src/arkreactor/VM/Value/Future.cpp 23 performance Variable 'm_value' is assigned in constructor body. Consider performing initialization in initialization list.

@codspeed-hq

codspeed-hq Bot commented Jun 25, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 2.22%

⚡ 2 improved benchmarks
❌ 2 regressed benchmarks
✅ 14 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Benchmark BASE HEAD Efficiency
binary_trees 4.8 s 5.2 s -8.37%
create_closure 4.8 ms 5.1 ms -6.37%
fibonacci 31 ms 29.7 ms +4.16%
ackermann 344.1 ms 336.4 ms +2.31%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing fix/leak (34254f9) with dev (a68b045)

Open in CodSpeed

@github-actions

Copy link
Copy Markdown

Super Instructions report

Some Super Instructions are under the usage threshold (24).

Super Instruction Uses in compiled code
APPEND_IN_PLACE_SYM_INDEX 23
INCREMENT 19
DECREMENT 18
STORE_FROM 15
INCREMENT_BY_INDEX 14
LT_CONST_JUMP_IF_FALSE 9
NEQ_SYM_JUMP_IF_FALSE 4
SET_VAL_TAIL 4
STORE_HEAD 2
MUL_BY 2
CHECK_TYPE_OF 2
NEQ_CONST_JUMP_IF_TRUE 2
SET_VAL_TAIL_BY_INDEX 1
SET_VAL_HEAD_BY_INDEX 1
MUL_SET_VAL 1
SET_VAL_HEAD 1
STORE_TAIL 1
Super Instructions over the threshold
Super Instruction Uses in compiled code
CALL_SYMBOL 6413
LOAD_CONST_LOAD_CONST 5912
LOAD_CONST_STORE 3165
LOAD_CONST_SET_VAL 921
CALL_BUILTIN 912
CALL_BUILTIN_WITHOUT_RETURN_ADDRESS 655
INCREMENT_STORE 619
AT_SYM_SYM 571
GET_FIELD_FROM_SYMBOL_INDEX 505
STORE_LIST 385
GET_FIELD_FROM_SYMBOL 342
APPEND_IN_PLACE_SYM 341
LT_LEN_SYM_JUMP_IF_FALSE 331
CALL_SYMBOL_BY_INDEX 322
EQ_SYM_INDEX_JUMP_IF_TRUE 219
SET_VAL_FROM_INDEX 160
SET_VAL_FROM 141
LT_SYM_JUMP_IF_FALSE 130
STORE_FROM_INDEX 127
DECREMENT_STORE 120
STORE_LEN 116
FUSED_MATH 114
GT_CONST_JUMP_IF_FALSE 112
DECREMENT_BY_INDEX 97
GT_CONST_JUMP_IF_TRUE 84
LT_CONST_JUMP_IF_TRUE 83
AT_SYM_INDEX_SYM_INDEX 83
MUL_BY_INDEX 80
CALL_CURRENT_PAGE 75
EQ_CONST_JUMP_IF_TRUE 53
AT_SYM_INDEX_CONST 51
GT_SYM_JUMP_IF_FALSE 39
STORE_HEAD_BY_INDEX 36
STORE_TAIL_BY_INDEX 35
CHECK_TYPE_OF_BY_INDEX 30

@github-actions

github-actions Bot commented Jun 25, 2026

Copy link
Copy Markdown

Fuzzing report

/usr/local/bin/afl-whatsup status check tool for afl-fuzz by Michal Zalewski

Summary stats

    Fuzzers alive : 0
   Dead or remote : 1 (included in stats)
   Total run time : 5 minutes, 0 seconds
      Total execs : 37 thousands
 Cumulative speed : 124 execs/sec
    Pending items : 137 faves, 1216 total
 Coverage reached : 10.37%
    Crashes saved : 0
      Hangs saved : 0

Cycles without finds : 0
Time without finds : 0

[+] Captured 44334 tuples (map size 270400, highest value 255, total values 455336761) in '/dev/null'.
[+] A coverage of 44334 edges were achieved out of 270400 existing (16.40%) with 1225 input files.

@coveralls

Copy link
Copy Markdown

Coverage Report for CI Build 28232378609

Warning

No base build found for commit a68b045 on dev.
Coverage changes can't be calculated without a base build.
If a base build is processing, this comment will update automatically when it completes.

Coverage: 94.382%

Details

  • Patch coverage: 23 of 23 lines across 5 files are fully covered (100%).

Uncovered Changes

No uncovered changes found.

Coverage Regressions

Requires a base build to compare against. How to fix this →


Coverage Stats

Coverage Status
Relevant Lines: 10930
Covered Lines: 10316
Line Coverage: 94.38%
Coverage Strength: 991262.26 hits per line

💛 - Coveralls

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants