Skip to content

[BUG] built is duplicating "current" in the array for every child element #186

Closed
@LionsAd

Description

@LionsAd

To reproduce in JS console with built.mjs pasted in:

let Tab = function() { return 'Hi'; }
let index = 1;
let href='/';
let onMouseDown='';
let isAction = '';

build`<${Tab} index=${index} key=${href} href=${href} onMouseDown=${onMouseDown} isActive=${isActive}>
        ${title}
        <span>Hi</span>
      <//>`;

Expected output:

APPEND_CHILD, TAG_SET, PROP_SET, PROP_SET, CHILD_RECURSIVE

Real output:

    [0] => Array
        (
            [0] => 0
            [1] => 2
            [2] => 0
            [3] => Array
                (
                    [0] => Array
                        (
                            [0] => 0
                        )

                    [1] => 3
                    [2] => 1
                    [3] => 
                    [4] => 5
                    [5] => 2
                    [6] => 0
                    [7] => index
                    [8] => 5
                    [9] => 3
                    [10] => 0
                    [11] => key
                    [12] => 5
                    [13] => 4
                    [14] => 0
                    [15] => href
                    [16] => 5
                    [17] => 5
                    [18] => 0
                    [19] => onMouseDown
                    [20] => 5
                    [21] => 6
                    [22] => 0
                    [23] => isActive
                    [24] => 0
                    [25] => 7
                    [26] => 
                    [27] => 0
                    [28] => 0
                    [29] =>         
                    [30] => 2
                    [31] => 0
                    [32] => Array
                        (
                            [0] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => 0
                                        )

                                    [1] => 3
                                    [2] => 1
                                    [3] => 
                                    [4] => 5
                                    [5] => 2
                                    [6] => 0
                                    [7] => index
                                    [8] => 5
                                    [9] => 3
                                    [10] => 0
                                    [11] => key
                                    [12] => 5
                                    [13] => 4
                                    [14] => 0
                                    [15] => href
                                    [16] => 5
                                    [17] => 5
                                    [18] => 0
                                    [19] => onMouseDown
                                    [20] => 5
                                    [21] => 6
                                    [22] => 0
                                    [23] => isActive
                                    [24] => 0
                                    [25] => 7
                                    [26] => 
                                    [27] => 0
                                    [28] => 0
                                    [29] =>         
                                )

                            [1] => 3
                            [2] => 0
                            [3] => span
                            [4] => 0
                            [5] => 0
                            [6] => Hi
                        )

                )

        )

This is from my PHP port of preact (just an experiment), but it also happens with preact master in Javascript.

I think when recursing into the children, the data should be stored in a stack variable and not in current[0].

While for traversing that's not a problem, it increases the size of current dramatically and this - unless cleaned up - is what is cached, which is also not ideal as the sparse data should be as small as possible obviously.


To fix:

The fix is trivial also:

mode = current;

be replaced with:

	        mode = current;
                current_0 = current[0];
                mode[0] = [];
				if (MINI) {
					(current = current_0).push(h.apply(null, mode.slice(1)));
				}
				else {
					(current = current_0).push(CHILD_RECURSE, 0, mode);
				}

should be all that is needed. Also could fix the double usage of the name mode at the same time. Likely tmp or current_child or such might be better.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions