HaxeFoundation / HaxeFoundation/haxe

abstract over Map keys prevents iterator inlining

Open
#10,210 4 comments 0 reactions 1 assignee Claimed by @Simn View on GitHub
feature-abstracts feature-inline haxe-foundation-partner
Dominant language
Haxe
Stars
6.9k
Forks
715
Avg merge
2d 2h
Merged PRs (30d)
11

Description

```haxe
abstract A(String) {}

var m1 = new Map();
var m2 = new Map();

function main() {
// inlined
for (k in m1.keys()) {
}

// inlined
for (k => v in m1) {
}

// inlined
for (v in m1) {
}

// ---

// not inlined
for (k in m2.keys()) {
}

// not inlined
for (k => v in m2) {
}

// inlined
for (v in m2) {
}
}
```

Generated JS:

```js
function Main_main() {
var h = Main_m1.h;
var k_h = h;
var k_keys = Object.keys(h);
var k_length = k_keys.length;
var k_current = 0;
while(k_current < k_length) {
var k = k_keys[k_current++];
}
var h = Main_m1.h;
var _g_h = h;
var _g_keys = Object.keys(h);
var _g_length = _g_keys.length;
var _g_current = 0;
while(_g_current < _g_length) {
var key = _g_keys[_g_current++];
var _g1_key = key;
var _g1_value = _g_h[key];
var k = _g1_key;
var v = _g1_value;
}
var h = Main_m1.h;
var v_h = h;
var v_keys = Object.keys(h);
var v_length = v_keys.length;
var v_current = 0;
while(v_current < v_length) {
var v = v_h[v_keys[v_current++]];
}
var k = new haxe_ds__$StringMap_StringMapKeyIterator(Main_m2.h);
while(k.hasNext()) {
var k1 = k.next();
}
var _g = new haxe_ds__$StringMap_StringMapKeyValueIterator(Main_m2.h);
while(_g.hasNext()) {
var _g1 = _g.next();
var k = _g1.key;
var v = _g1.value;
}
var h = Main_m2.h;
var v_h = h;
var v_keys = Object.keys(h);
var v_length = v_keys.length;
var v_current = 0;
while(v_current < v_length) {
var v = v_h[v_keys[v_current++]];
}
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.