Re:Node occasionally gives multiple files/folders the same i...
by MaulingMonkey on Wednesday April 19, 2017 @07:46AM
(#14147032)
I've done the high/lo "struct" split for pointers in Flash when porting from 32-bit to 64-bit, and it was a pain in the ass (in part because of the ==/=== behavior with arrays you point out). In retrospect I should've gone with strings. I think we may have even eliminated the pointers before shipping anything, and wouldn't have been a significant perf hit even if we hadn't. (For all I know, it might've even been a perf gain...)
[ Parent
| on HN ]
Re:Node occasionally gives multiple files/folders the same i...
by fastftw on Wednesday April 19, 2017 @12:26PM
(#14148986)
Mind explaining the ==/=== issue which arises from the high/lo and array solution?
Re:Node occasionally gives multiple files/folders the same i...
by MaulingMonkey on Wednesday April 19, 2017 @03:44PM
(#14151076)
As parent mentions, comparison with ==/=== are "broken" for arrays or classes. Or more accurately, they now do reference comparisons instead of value comparisons. This means you have to replace a lot of this (using Flash/ActionScript as the example here):
function updateIcon(id: int, ...) {
for (var icon in icons) {
if (icon.id === id) {
...
}
}
}
With, say, something like this: function updateIcon(id: Ptr, ...) {
for (var icon in icons) {
if (Ptr.compare(icon.id, id) === 0) {
...
}
}
}
Or: function updateIcon(id: Array, ...) {
for (var icon in icons) {
if (ObjectUtil.compare(icon.id, id) === 0) {
...
}
}
}
Assuming you want to preserve the exact semantics of the existing code. If you miss a single comparison, your code will still compile. You will get no runtime exceptions, because == and === are still legal. It'll just have a subtle runtime flaw that will only manifest itself if two interop sites construct the same pointer value as different Ptr or array instances without interning (read: caching/leaking Ptr or array instances, which has it's own problems.) You cannot override == or === to do the right thing (tm) either.In the unlikely event you do a large refactoring or conversion completely flawlessly, your coworker's muscle memory will, rather understandably, still end up causing problems.
function updateIcon(id: String, ...) {
for (var icon in icons) {
if (icon.id === id) {
...
}
}
}
This is less refactoring, and just works(tm), because String ==/=== already compares the value of the strings. No muscle memory to update, easier to print in debug and trace statements, etc...