-
-
Notifications
You must be signed in to change notification settings - Fork 671
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[hl] use hl.NativeArray for Vector #11568
Conversation
Another thing to address is that we're losing the |
Thanks to @Apprentice-Alchemist for telling me how to fix the array compare problem! HL is now green, and I'd like to merge this soon so that we can use I don't know what to do with the |
I don’t know what exactly you’re talking about, but maybe it’s worth making the function inlineable so that inline vector.sort(...) can inline the callback (not sure how faster it can be on different targets) |
Huh, I thought this didn't work on HL, but it seems like I'm wrong about that: import haxe.ds.Vector;
function f<T>(x:Vector<T>) {
trace(x);
}
function main() {
var v = new Vector<Int>(1);
f(v);
} This makes me reluctant to merge this because apparently I don't understand how |
It works, as long as you don't try to access the contents of the native array. |
Right, so the situation is actually even worse than I thought. Surely this should be caught earlier... Though to be fair, I also don't catch this on the JVM target and instead let it fail in the verifier with |
Your example gives me a proper error locally though:
Do you also get that segfault locally with recent HL? |
Access violation is the Windows equivalent of a segfault, looks like HL turns those into real exceptions somehow. |
Testing locally on my Linux machine gives
HL catches the segfault too but doesn't turn it into a real exception and just prints a stack trace before letting the default signal handler run. |
Yeah okay, I can't merge this before this is improved somehow because we would be going from working code to a segfault, which isn't the best upgrading experience... |
I don't think re-implement Vector directly with
|
I'll tell you how I got here:
I'm aware of the problems you point out, but note that Vector is supposed to be completely transparent, and its type parameters are supposed to be invariant. The problem is that this cannot be expressed in our type system at the moment, so the only way to catch this is at the generator-level, where These variance violations have been failing natively since the old Flash times, and I'm fine with that, but it shouldn't fail with an incomprehensible segfault. |
I think catching this in the generator would require inserting extra type checking during the typed expr -> bytecode phase in every place where there is a potential type "conversion". This can't be done in some kind of bytecode verification phase either because the native |
Meh, I expected arrays to know their element type. In that case I don't know how to properly manage this either. |
What about checking on array access/allocation instead, at that point the generator should be able to determine whether the element type is a type parameter. Lines 2001 to 2031 in 7217530
The example with Hmm. That wouldn't fix the |
The HL code to manage different types of Arrays is quite tricky.
So we shouldn't duplicate all of these for Vector, but it being an abstract with inline functions should work well ? |
I agree it should work for normal use-cases. The problem is that currently assigning |
# Conflicts: # src/generators/hl2c.ml
I'm quite willing to merge this now unless somebody objects. This is going to cause some friction but to be fair Vector should never have been based on Array in the first place. |
I'm having 2 different errors in heaps when compiling shiro's project, could you please check before merge?
Edit: maybe it's a heaps problem? |
|
I don't really know how to deal with I also suggest put hl in the prealloc if of #if (neko || hl)
// prealloc good size
if (len > 0)
a[len - 1] = get(0); |
Dealing with heaps is usually bad for my blood pressure but I can take a look if I have to... And yes, good idea on the pre-alloc I suppose. |
Well, I made some wrong assumptions here. I thought that Array would be based on NativeArray and NativeArray would be based on Bytes, but it's actually the case that Array is based on Bytes directly (for basic types). This makes NativeArray the odd one out because we can't easily go from it to Bytes, which is what's necessary for heaps. This suggests to me that heaps actually wants to use Array instead of Vector, but I imagine that this is not an easy change to make. I really resent the fact that we have one target where Vector is just Array, so I'd still like to move forward with this PR, but I don't know how to make progress as long as heaps' Vector usage is in the way. |
I don't really like the idea of sending back For heaps I made a PR and tested on Shiro's project, seems ok for now. |
Thank you! For me this is good now. I'll let you handle the merging so that you can synchronize with the heaps change. |
Looking again at it and discussing with @yuxiaomao , I don't think that this worth it. First I don't really understand what's the problem of Vector implementation being an Array, as the API does not allow it to be resized we don't really care if it could be resized or not. Second, using NativeArray for Vector implementation will open a lot of potential issues when doing Dynamic or scripting or casting, as NativeArray are not generics in the VM, allowing to cast directly between container types, with dire consequences such as hard crashes (access violation) or crashes when reading out of the allowed bounds which should be avoided entirely when doing pure user code in Haxe/HL. Please revert :) |
All this originally comes from your commit here: 7dc9272 This introduces a hack in order to avoid |
I understand that Type.getEnumParameters might want some platform specific optimizations. But I think in that case that the correct answer would be for it to return an abstract with array access, so the actual underlying type can be platform specific based on how the platform represent enums. We could actually get entirely rid of any allocation on some platforms where the underlying type would be the enum itself. We could keep either to toArray() or even a |
@Simn up :) |
I figured Yuxiao may want to handle this because it might involve heaps changes too. It still annoys me that we have this container type that is fast on all targets except HL, but at this point in my Haxe life I don't see myself arguing this point too much, so feel free to revert all this. |
Ok I'll handle it |
This reverts commit 3b050f0.
I really think that Vector should be implemented on top of fixed array types on all targets where this is possible. I'm attempting this here for HL, which seems to work well enough on HL/JIT, but fails on hlc:
As @yuxiaomao points out, this has been reported before in #11468.
@ncannasse Any advice?