<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">At some point in the algorithm of [Array.from], the newly-created array will indeed be created as sparse (at steps 9/10), but this is usually not observable (that is, unless you are creating an instance of a subclass of Array with very unusual behaviour) as far as the spec is concerned (optimisation is not part of the spec).</div><div class=""><br class=""></div><div class="">If it is important for you to circumvent the v8 limitation in its optimisation process, you should be able to write `Array.from(Array(2), _ => undefined)`: the array will be created as non-sparse at steps 5.a/b.</div><div class=""><br class=""></div><div class="">In any case, this optimisation detail is by very far not a satisfactory argument for introducing the heavy feature you proposed. It could maybe be a conceivable argument for introducing `Array.createAsNonSparse(2)`.</div><div class=""><br class=""></div><div class="">[Array.from]: <a href="https://tc39.es/ecma262/#sec-array.from" class="">https://tc39.es/ecma262/#sec-array.from</a></div><div class=""><br class=""></div><div class="">—Claude</div><div class=""><br class=""></div><div><br class=""><blockquote type="cite" class=""><div class="">Le 12 févr. 2020 à 10:23, Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com" class="">andrea.giammarchi@gmail.com</a>> a écrit :</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">Which part of `HOLEY_SMI_ELEMENTS` makes you think so?<br class=""></div><div class=""><br class=""></div><div class="">V8 version 8.2.34</div>d8> %DebugPrint(Array.from({length: 2}, (_, i) => i))<br class="">DebugPrint: 0x5ab080c5ded: [JSArray]<br class=""> - map: 0x05ab08281869 <Map(HOLEY_SMI_ELEMENTS)> [FastProperties]<br class=""> - prototype: 0x05ab08248f7d <JSArray[0]><br class=""> - elements: 0x05ab080c5dfd <FixedArray[2]> [HOLEY_SMI_ELEMENTS]<br class=""> - length: 2<br class=""> - properties: 0x05ab080406e9 <FixedArray[0]> {<br class="">    #length: 0x05ab081c0165 <AccessorInfo> (const accessor descriptor)<br class=""> }<br class=""> - elements: 0x05ab080c5dfd <FixedArray[2]> {<br class="">           0: 0<br class="">           1: 1<br class=""> }<br class="">0x5ab08281869: [Map]<br class=""> - type: JS_ARRAY_TYPE<br class=""> - instance size: 16<br class=""> - inobject properties: 0<br class=""> - elements kind: HOLEY_SMI_ELEMENTS<br class=""> - unused property fields: 0<br class=""> - enum length: invalid<br class=""> - back pointer: 0x05ab082817f1 <Map(PACKED_SMI_ELEMENTS)><br class=""> - prototype_validity cell: 0x05ab081c0451 <Cell value= 1><br class=""> - instance descriptors #1: 0x05ab08249605 <DescriptorArray[1]><br class=""> - transitions #1: 0x05ab08249639 <TransitionArray[4]>Transition array #1:<br class="">     0x05ab08042e91 <Symbol: (elements_transition_symbol)>: (transition to PACKED_DOUBLE_ELEMENTS) -> 0x05ab08281891 <Map(PACKED_DOUBLE_ELEMENTS)><br class=""><br class=""> - prototype: 0x05ab08248f7d <JSArray[0]><br class=""> - constructor: 0x05ab08248e51 <JSFunction Array (sfi = 0x5ab081cbf85)><br class=""> - dependent code: 0x05ab080401ed <Other heap object (WEAK_FIXED_ARRAY_TYPE)><br class=""> - construction counter: 0<br class=""><br class="">[0, 1]<br class=""></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Feb 12, 2020 at 7:01 AM Jordan Harband <<a href="mailto:ljharb@gmail.com" class="">ljharb@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="">No, `Array.from` never produces a holey array whatsoever; only ever a dense array.</div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Feb 9, 2020 at 11:08 PM Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com" target="_blank" class="">andrea.giammarchi@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class=""><div class="">Unfortunately, `Array.from({ length: 4 }, () => whatever)` produces a holey array, so that the `.repeat(...)` idea, if capable of packing elements in a better way, wouldn't be so terrible, as simplification.</div><div class=""><br class=""></div><div class="">Although, the intent of this proposal was to also grant "shapes" or kindness of each entry, same way typed Arrays do, but maybe that would require some better primitive, as in `const Shape = Object.defineShape(...)` and `Object.createShape(Shape)` or similar.<br class=""></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Feb 9, 2020 at 10:01 PM Jordan Harband <<a href="mailto:ljharb@gmail.com" target="_blank" class="">ljharb@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="">That already exists - `Array.from({ length: 4 }, () => whatever)` - I assume that the hope is to have an array where it is *impossible* for it to have the wrong "kind" of data, and a userland factory function wouldn't provide that.</div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Feb 9, 2020 at 10:39 AM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank" class="">kaizhu256@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class=""><div dir="ltr" class="">> It's a bit of a mess to create an Array that is not holed and gets best optimizations [1], and this proposal would like to address that exact case.</div><div dir="ltr" class=""><br class=""></div><div dir="ltr" class="">could the performance issue be resolved more easily with a simple static-function `Array.repeat(<length>, <repeater>)`?<div class=""><br class=""></div><div class=""><font face="monospace" class="">```js</font></div><div class=""><font face="monospace" class="">let structuredList;</font></div><div class=""><font face="monospace" class="">structuredList = <font color="#ff0000" class="">Array.repeat</font>(4, function (ii) {</font></div><div class=""><font face="monospace" class="">    return {</font></div><div class=""><font face="monospace" class="">        index: 2 * ii + 1,</font></div><div class=""><font face="monospace" class="">        tags: []</font></div><div class=""><font face="monospace" class="">});</font></div><div class=""><font face="monospace" class="">/*</font></div><div class=""><font face="monospace" class="">structuredList = [</font></div><div class=""><font face="monospace" class="">    { index: 1, tags: [] },</font></div><div class=""></div><div class=""><font face="monospace" class="">    { index: 3, tags: [] },</font></div><div class=""></div><div class=""><font face="monospace" class="">    { index: 5, tags: [] },</font></div><div class=""></div><div class=""><font face="monospace" class="">    { index: 7, tags: [] }</font></div><div class=""></div><div class=""><span style="font-family:monospace" class="">];</span><br class=""></div><div class=""><font face="monospace" class=""> */</font></div><div class=""><font face="monospace" class="">```</font></div><div class=""><br class=""></div><div class="">the only time i can practically enforce the shape of a "StructuredArray" is during element-insertion,</div><div class="">and a userland insertion/creation function would be just as effective as a StructuredArray constructor.</div><div class=""><br class=""></div><div class="">enforcing shapes during element deletions and updates are going to be hard</div><div class="">and likely just as confusing with StructuredArray as they are with regular Array.</div><div class=""><br class=""></div><div class="">also note that most javascript arrays need to be easily JSON-serialized for message-passing</div><div class="">over-the-wire (commonly http) to external systems.</div><div class=""><br class=""></div><div class="">-kai</div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Feb 8, 2020 at 3:46 AM Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com" target="_blank" class="">andrea.giammarchi@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class=""><div class="">> having to retroactively add checks like...</div><div class=""><br class=""></div><div class="">we already have typed arrays in JS so I don't think this would be any different</div><div class=""><br class=""></div><div class="">> I _think_ that moderns virtual machines already did these optimisations despite there isn't a TypedArray like that.</div><div class=""><br class=""></div><div class="">It's a bit of a mess to create an Array that is not holed and gets best optimizations [1], and this proposal would like to address that exact case.<br class=""></div><div class=""><br class=""></div><div class="">[1] <a href="https://v8.dev/blog/elements-kinds" target="_blank" class="">https://v8.dev/blog/elements-kinds</a></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div></div>
_______________________________________________<br class="">
es-discuss mailing list<br class="">
<a href="mailto:es-discuss@mozilla.org" target="_blank" class="">es-discuss@mozilla.org</a><br class="">
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class="">
</blockquote></div></div>
_______________________________________________<br class="">
es-discuss mailing list<br class="">
<a href="mailto:es-discuss@mozilla.org" target="_blank" class="">es-discuss@mozilla.org</a><br class="">
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class="">
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
_______________________________________________<br class="">es-discuss mailing list<br class=""><a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class="">https://mail.mozilla.org/listinfo/es-discuss<br class=""></div></blockquote></div><br class=""></body></html>