Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Array doesn't change when method inlined

This is part of my stack class. It works fine in flash, but in cpp/windows, the push method doesn't always work. I don't understand C++ well enough to understand why it could be inconsistent.

var arr:Array<T>;
public var length(default, null):Int;

public function new() {
    clear();
}

public inline function clear():Void {
    arr = [];
    length = 0;
}

public inline function push(t:T):Void {
    // Log.trace(arr) -> []
    arr[length++] = t;
    // Log.trace(arr) -> []
}

When push is inlined, something like stack.push(0) does not always change the array, like its true length is fixed at 0 (the length variable does increase, however). Other times, it works fine. If I remove the inline keyword, it works fine all the time.

The generated cpp when inlined (replacing stack.push(0)):

::msg::utils::Stack tmp = this->stack;
::msg::utils::Stack _this = tmp;
Array< int > tmp1 = _this->arr;
int tmp2 = (_this->length)++;
tmp1[tmp2] = (int)0;

And when not inlined (inside push()):

Dynamic tmp = this->arr;
int tmp1 = (this->length)++;
Dynamic tmp2 = t;
hx::IndexRef((tmp).mPtr,tmp1) = tmp2;

Is there something I'm missing that C++ does? Why would the inlined code work most of the time but then not work other times?

Latest haxe, hxcpp, openfl, etc.

like image 364
MSGhero Avatar asked Apr 28 '15 17:04

MSGhero


1 Answers

It's a haxe/hxcpp bug. I reduced it down to the base case, and it turns out that it only works properly now if you set the array variable to a new instance, which I was doing accidentally elsewhere.

https://github.com/HaxeFoundation/haxe/issues/4187

like image 130
MSGhero Avatar answered Oct 03 '22 14:10

MSGhero