MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

compact more, add add delete operator tests

+83 -6
+57
examples/spec/delete.js
··· 1 + import { test, summary } from './helpers.js'; 2 + 3 + console.log('Delete Operator Tests\n'); 4 + 5 + const obj = { a: 1, b: 2, c: 3 }; 6 + 7 + let result = delete obj.a; 8 + test('delete existing property returns true', result, true); 9 + test('property removed after delete', obj.a, undefined); 10 + test('has property after delete', 'a' in obj, false); 11 + test('other properties remain', obj.b, 2); 12 + 13 + result = delete obj.nonexistent; 14 + test('delete non-existent property returns true', result, true); 15 + 16 + const nested = { outer: { inner: 42 } }; 17 + result = delete nested.outer.inner; 18 + test('delete nested property', result, true); 19 + test('nested property removed', nested.outer.inner, undefined); 20 + test('parent still exists', typeof nested.outer, 'object'); 21 + 22 + const arr = [1, 2, 3, 4, 5]; 23 + result = delete arr[2]; 24 + test('delete array element returns true', result, true); 25 + test('array element becomes undefined', arr[2], undefined); 26 + test('array length unchanged', arr.length, 5); 27 + test('array has hole', 2 in arr, false); 28 + 29 + const withUndefined = { x: undefined }; 30 + result = delete withUndefined.x; 31 + test('delete property set to undefined', result, true); 32 + test('property gone after delete', 'x' in withUndefined, false); 33 + 34 + const computed = { foo: 'bar', baz: 'qux' }; 35 + const key = 'foo'; 36 + result = delete computed[key]; 37 + test('delete with computed key', result, true); 38 + test('computed key property removed', computed.foo, undefined); 39 + 40 + const proto = { inherited: true }; 41 + const child = Object.create(proto); 42 + child.own = 'value'; 43 + result = delete child.own; 44 + test('delete own property', result, true); 45 + test('own property removed', child.own, undefined); 46 + test('inherited property still accessible', child.inherited, true); 47 + result = delete child.inherited; 48 + test('delete inherited returns true but keeps it', result, true); 49 + test('inherited still accessible after delete', child.inherited, true); 50 + 51 + const symbolKey = Symbol('test'); 52 + const withSymbol = { [symbolKey]: 'symbol value' }; 53 + result = delete withSymbol[symbolKey]; 54 + test('delete symbol property returns true', result, true); 55 + test('symbol property removed', withSymbol[symbolKey], undefined); 56 + 57 + summary();
+1 -1
meson.build
··· 86 86 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 87 87 88 88 version_conf = configuration_data() 89 - version_conf.set('ANT_VERSION', '0.3.1.15') 89 + version_conf.set('ANT_VERSION', '0.3.1.16') 90 90 version_conf.set('ANT_GIT_HASH', git_hash) 91 91 version_conf.set('ANT_BUILD_DATE', build_date) 92 92
+10 -5
src/ant.c
··· 2321 2321 ofs = js->brk; 2322 2322 if (js->brk + size > js->size) return ~(jsoff_t) 0; 2323 2323 } else { 2324 - ANT_GC_COLLECT(); 2324 + js_gc_compact(js); 2325 2325 ofs = js->brk; 2326 2326 if (js->brk + size > js->size) { 2327 2327 if (js_try_grow_memory(js, size)) { ··· 4616 4616 jsoff_t off = lkp_proto(js, obj, keystr, keylen); 4617 4617 if (off == 0) { 4618 4618 jsval_t key = js_mkstr(js, keystr, keylen); 4619 - jsval_t prop = setprop(js, obj, key, js_mkundef()); 4620 - return prop; 4619 + return mkpropref((jsoff_t)vdata(obj), (jsoff_t)vdata(key)); 4621 4620 } 4622 4621 return mkval(T_PROP, off); 4623 4622 } ··· 7670 7669 jsoff_t deleted_next = loadoff(js, prop_off) & ~FLAGMASK; 7671 7670 jsoff_t target = prev_off ? prev_off : obj_off; 7672 7671 jsoff_t current = loadoff(js, target); 7672 + 7673 7673 saveoff(js, target, (deleted_next & ~3U) | (current & (FLAGMASK | 3U))); 7674 7674 increment_version(js, obj_off); 7675 7675 } ··· 7862 7862 jsoff_t first_prop = loadoff(js, obj_off) & ~(3U | FLAGMASK); 7863 7863 if (first_prop == prop_off) { 7864 7864 unlink_prop(js, obj_off, prop_off, 0); 7865 - return js_mktrue(); 7865 + js_gc_compact(js); return js_mktrue(); 7866 7866 } 7867 7867 for (jsoff_t prev = first_prop; prev != 0; ) { 7868 7868 jsoff_t next_prop = loadoff(js, prev) & ~(3U | FLAGMASK); 7869 - if (next_prop == prop_off) { unlink_prop(js, obj_off, prop_off, prev); return js_mktrue(); } 7869 + if (next_prop == prop_off) { 7870 + unlink_prop(js, obj_off, prop_off, prev); 7871 + js_gc_compact(js); return js_mktrue(); 7872 + } 7870 7873 prev = next_prop; 7871 7874 } 7872 7875 return js_mktrue(); ··· 20620 20623 jsoff_t current = loadoff(js, obj_off); 20621 20624 saveoff(js, obj_off, (deleted_next & ~3U) | (current & (FLAGMASK | 3U))); 20622 20625 increment_version(js, obj_off); 20626 + js_gc_compact(js); 20623 20627 return true; 20624 20628 } 20625 20629 ··· 20631 20635 jsoff_t prev_flags = loadoff(js, prev) & FLAGMASK; 20632 20636 saveoff(js, prev, deleted_next | prev_flags); 20633 20637 increment_version(js, obj_off); 20638 + js_gc_compact(js); 20634 20639 return true; 20635 20640 } 20636 20641 prev = next_prop;
+15
tests/delete.js
··· 1 + const user = { 2 + name: 'Alice', 3 + age: 30, 4 + active: true 5 + }; 6 + 7 + console.log(Ant.gc()); 8 + 9 + console.log(user.age); // Output: 30 10 + 11 + delete user.age; // The 'delete' operator returns true on success 12 + 13 + console.log(user.age); // Output: undefined 14 + console.log(user); // Output: { name: 'Alice', active: true } 15 + console.log(Ant.gc());