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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With