Runtime: add method dispatch for array/string/dict/number (.len, .push, .pop, .keys, .values, .has, .toInt) Stdlib: delete global len/push/pop/keys/values/has Tests/docs/examples: migrate to method style; add tests/test_builtin_methods_style.bob All tests pass Breaking: global len/push/pop/keys/values/has removed; use methods instead Parser/AST: add class/extends/extension/super, field initializers Runtime: shared methods with this injection; classParents/classTemplates; super resolution; ownerClass/currentClass; extension lookup order Builtins: method dispatch for array/string/dict/number (.len/.push/.pop/.keys/.values/.has/.toInt); remove global forms Tests/docs/examples: add/refresh for classes, inheritance, super, polymorphism; migrate to method style; all tests pass VS Code extension: update grammar/readme/snippets for new features
89 lines
2.8 KiB
Plaintext
89 lines
2.8 KiB
Plaintext
// Memory leak test: Function-related scenarios
|
|
// Test various function patterns that could cause memory leaks
|
|
|
|
print("=== Function Memory Leak Tests ===");
|
|
print("Initial memory: " + memoryUsage() + " MB");
|
|
|
|
// Test 1: Recursive function closures
|
|
print("Test 1: Recursive function closures");
|
|
var recursiveFuncs = [];
|
|
for (var i = 0; i < 100000; i++) {
|
|
recursiveFuncs.push(func() {
|
|
var capturedI = i;
|
|
return func() {
|
|
if (capturedI > 0) {
|
|
return capturedI * capturedI;
|
|
}
|
|
return 0;
|
|
};
|
|
});
|
|
}
|
|
print("Created " + recursiveFuncs.len() + " recursive closure functions");
|
|
print("Memory after creation: " + memoryUsage() + " MB");
|
|
input("Press Enter to clear recursive functions...");
|
|
recursiveFuncs = none;
|
|
print("Memory after cleanup: " + memoryUsage() + " MB");
|
|
input("Cleared. Check memory usage...");
|
|
|
|
// Test 2: Functions returning functions (factory pattern)
|
|
print("Test 2: Function factories");
|
|
var factories = [];
|
|
for (var i = 0; i < 100000; i++) {
|
|
factories.push(func() {
|
|
var multiplier = i;
|
|
return func(x) {
|
|
return x * multiplier;
|
|
};
|
|
});
|
|
}
|
|
print("Created " + factories.len() + " function factories");
|
|
print("Memory: " + memoryUsage() + " MB");
|
|
input("Press Enter to clear factories...");
|
|
factories = [];
|
|
print("Memory after clear: " + memoryUsage() + " MB");
|
|
input("Cleared. Check memory usage...");
|
|
|
|
// Test 3: Deep function nesting
|
|
print("Test 3: Deep function nesting");
|
|
var deepNested = [];
|
|
for (var i = 0; i < 50000; i++) {
|
|
deepNested.push(func() {
|
|
return func() {
|
|
return func() {
|
|
return func() {
|
|
return func() {
|
|
return i * 42;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
});
|
|
}
|
|
print("Created " + deepNested.len() + " deeply nested functions");
|
|
print("Memory: " + memoryUsage() + " MB");
|
|
input("Press Enter to clear deep nested...");
|
|
deepNested = "test";
|
|
print("Memory after clear: " + memoryUsage() + " MB");
|
|
input("Cleared. Check memory usage...");
|
|
|
|
// Test 4: Circular function references
|
|
print("Test 4: Circular function references");
|
|
var circularFuncs = [];
|
|
for (var i = 0; i < 1000000; i++) {
|
|
var funcA = func() {
|
|
return "A" + i;
|
|
};
|
|
var funcB = func() {
|
|
return "B" + i;
|
|
};
|
|
// Store both in same array element to create potential circular refs
|
|
circularFuncs.push([funcA, funcB, func() { return funcA; }]);
|
|
}
|
|
print("Created " + circularFuncs.len() + " circular function structures");
|
|
print("Memory: " + memoryUsage() + " MB");
|
|
input("Press Enter to clear circular functions...");
|
|
circularFuncs = 42;
|
|
print("Memory after clear: " + memoryUsage() + " MB");
|
|
input("Cleared. Check memory usage...");
|
|
|
|
print("=== Function Tests Complete ==="); |