HaxeFoundation / haxe

Haxe - The Cross-Platform Toolkit
https://haxe.org
6.14k stars 656 forks source link

Iterable arg is not inlineable #11602

Open RblSb opened 7 months ago

RblSb commented 7 months ago

Maybe it can be optimized to work like Array<T> without allocating iterator objects here? Blocks optimization point of https://github.com/HaxeFoundation/haxe/pull/11148

using Main;

class Main {
    static function main() new Main();

    final nums = [1, 2, 3];
    public function new() {
        final foo = nums.inlineExists(item -> item == 1);
        trace(foo);
        final foo2 = nums.inlineArrExists(item -> item == 1);
        trace(foo2);
    }

    public static inline function inlineExists<T>(it:Iterable<T>, f:(item:T) -> Bool):Bool {
        var result = false;
        for (v in it) {
            if (f(v)) {
                result = true;
                break;
            }
        }
        return result;
    }

    public static inline function inlineArrExists<T>(it:Array<T>, f:(item:T) -> Bool):Bool {
        var result = false;
        for (v in it) {
            if (f(v)) {
                result = true;
                break;
            }
        }
        return result;
    }
}

Js output:

    this.nums = [1,2,3];
    var result = false;
    var v = $getIterator(this.nums);
    while(v.hasNext()) if(v.next() == 1) {
        result = true;
        break;
    }
    console.log("src/Main.hx:9:",result);
    var it = this.nums;
    var result = false;
    var _g = 0;
    while(_g < it.length) if(it[_g++] == 1) {
        result = true;
        break;
    }
    console.log("src/Main.hx:11:",result);