From 88879de7359a31f0a9edac5e43505329e1e16e82 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Wed, 25 May 2016 17:29:27 -0400 Subject: [PATCH] Generate tests --- .../dstr-array-elem-init-assignment.js | 32 ++++++ .../dstr-array-elem-init-evaluation.js | 30 ++++++ .../dstr-array-elem-init-fn-name-arrow.js | 42 ++++++++ .../dstr-array-elem-init-fn-name-class.js | 44 +++++++++ .../dstr-array-elem-init-fn-name-cover.js | 44 +++++++++ .../dstr-array-elem-init-fn-name-fn.js | 44 +++++++++ .../dstr-array-elem-init-fn-name-gen.js | 44 +++++++++ .../assignment/dstr-array-elem-init-in.js | 28 ++++++ .../assignment/dstr-array-elem-init-let.js | 25 +++++ .../assignment/dstr-array-elem-init-order.js | 31 ++++++ .../dstr-array-elem-init-simple-no-strict.js | 29 ++++++ .../dstr-array-elem-init-simple-strict.js | 21 ++++ .../dstr-array-elem-init-yield-expr.js | 44 +++++++++ ...str-array-elem-init-yield-ident-invalid.js | 21 ++++ .../dstr-array-elem-init-yield-ident-valid.js | 29 ++++++ .../dstr-array-elem-iter-get-err.js | 33 +++++++ .../dstr-array-elem-iter-nrml-close-err.js | 50 ++++++++++ .../dstr-array-elem-iter-nrml-close-null.js | 56 +++++++++++ .../dstr-array-elem-iter-nrml-close-skip.js | 52 ++++++++++ .../dstr-array-elem-iter-nrml-close.js | 68 +++++++++++++ .../dstr-array-elem-iter-rtrn-close-err.js | 67 +++++++++++++ .../dstr-array-elem-iter-rtrn-close-null.js | 64 ++++++++++++ .../dstr-array-elem-iter-rtrn-close.js | 74 ++++++++++++++ .../dstr-array-elem-iter-thrw-close-err.js | 55 +++++++++++ .../dstr-array-elem-iter-thrw-close-skip.js | 49 +++++++++ .../dstr-array-elem-iter-thrw-close.js | 64 ++++++++++++ .../dstr-array-elem-nested-array-invalid.js | 21 ++++ .../dstr-array-elem-nested-array-null.js | 23 +++++ ...-array-elem-nested-array-undefined-hole.js | 23 +++++ ...r-array-elem-nested-array-undefined-own.js | 23 +++++ .../dstr-array-elem-nested-array-undefined.js | 23 +++++ ...dstr-array-elem-nested-array-yield-expr.js | 46 +++++++++ ...y-elem-nested-array-yield-ident-invalid.js | 21 ++++ ...ray-elem-nested-array-yield-ident-valid.js | 29 ++++++ .../dstr-array-elem-nested-array.js | 28 ++++++ .../dstr-array-elem-nested-obj-invalid.js | 21 ++++ .../dstr-array-elem-nested-obj-null.js | 23 +++++ ...tr-array-elem-nested-obj-undefined-hole.js | 23 +++++ ...str-array-elem-nested-obj-undefined-own.js | 23 +++++ .../dstr-array-elem-nested-obj-undefined.js | 23 +++++ .../dstr-array-elem-nested-obj-yield-expr.js | 44 +++++++++ ...ray-elem-nested-obj-yield-ident-invalid.js | 21 ++++ ...array-elem-nested-obj-yield-ident-valid.js | 29 ++++++ .../assignment/dstr-array-elem-nested-obj.js | 28 ++++++ .../assignment/dstr-array-elem-put-const.js | 23 +++++ .../assignment/dstr-array-elem-put-let.js | 24 +++++ .../dstr-array-elem-put-prop-ref-no-get.js | 36 +++++++ .../dstr-array-elem-put-prop-ref-user-err.js | 27 +++++ .../dstr-array-elem-put-prop-ref.js | 28 ++++++ ...r-array-elem-put-unresolvable-no-strict.js | 32 ++++++ ...dstr-array-elem-put-unresolvable-strict.js | 22 +++++ .../dstr-array-elem-target-identifier.js | 30 ++++++ ...dstr-array-elem-target-simple-no-strict.js | 29 ++++++ .../dstr-array-elem-target-simple-strict.js | 21 ++++ .../dstr-array-elem-target-yield-expr.js | 46 +++++++++ .../dstr-array-elem-target-yield-invalid.js | 21 ++++ .../dstr-array-elem-target-yield-valid.js | 29 ++++++ ...-array-elem-trlg-iter-elision-iter-abpt.js | 63 ++++++++++++ ...m-trlg-iter-elision-iter-nrml-close-err.js | 59 +++++++++++ ...-trlg-iter-elision-iter-nrml-close-null.js | 62 ++++++++++++ ...-trlg-iter-elision-iter-nrml-close-skip.js | 60 +++++++++++ ...-elem-trlg-iter-elision-iter-nrml-close.js | 75 ++++++++++++++ .../dstr-array-elem-trlg-iter-get-err.js | 34 +++++++ ...rray-elem-trlg-iter-list-nrml-close-err.js | 59 +++++++++++ ...ray-elem-trlg-iter-list-nrml-close-null.js | 62 ++++++++++++ ...ray-elem-trlg-iter-list-nrml-close-skip.js | 61 ++++++++++++ ...tr-array-elem-trlg-iter-list-nrml-close.js | 74 ++++++++++++++ ...rray-elem-trlg-iter-list-rtrn-close-err.js | 74 ++++++++++++++ ...ray-elem-trlg-iter-list-rtrn-close-null.js | 71 +++++++++++++ ...tr-array-elem-trlg-iter-list-rtrn-close.js | 82 +++++++++++++++ ...rray-elem-trlg-iter-list-thrw-close-err.js | 67 +++++++++++++ ...ray-elem-trlg-iter-list-thrw-close-skip.js | 58 +++++++++++ ...tr-array-elem-trlg-iter-list-thrw-close.js | 70 +++++++++++++ ...ray-elem-trlg-iter-rest-nrml-close-skip.js | 61 ++++++++++++ ...rray-elem-trlg-iter-rest-rtrn-close-err.js | 83 ++++++++++++++++ ...ray-elem-trlg-iter-rest-rtrn-close-null.js | 78 +++++++++++++++ ...tr-array-elem-trlg-iter-rest-rtrn-close.js | 89 +++++++++++++++++ ...rray-elem-trlg-iter-rest-thrw-close-err.js | 68 +++++++++++++ ...ray-elem-trlg-iter-rest-thrw-close-skip.js | 61 ++++++++++++ ...tr-array-elem-trlg-iter-rest-thrw-close.js | 72 ++++++++++++++ .../dstr-array-elision-iter-abpt.js | 49 +++++++++ .../dstr-array-elision-iter-get-err.js | 32 ++++++ .../dstr-array-elision-iter-nrml-close-err.js | 52 ++++++++++ ...dstr-array-elision-iter-nrml-close-null.js | 56 +++++++++++ ...dstr-array-elision-iter-nrml-close-skip.js | 53 ++++++++++ .../dstr-array-elision-iter-nrml-close.js | 68 +++++++++++++ .../dstr-array-elision-val-array.js | 27 +++++ .../assignment/dstr-array-elision-val-bool.js | 22 +++++ .../assignment/dstr-array-elision-val-null.js | 22 +++++ .../assignment/dstr-array-elision-val-num.js | 22 +++++ .../dstr-array-elision-val-string.js | 27 +++++ .../dstr-array-elision-val-symbol.js | 23 +++++ .../dstr-array-elision-val-undef.js | 22 +++++ .../dstr-array-empty-iter-close-err.js | 48 +++++++++ .../dstr-array-empty-iter-close-null.js | 50 ++++++++++ .../assignment/dstr-array-empty-iter-close.js | 64 ++++++++++++ .../dstr-array-empty-iter-get-err.js | 32 ++++++ .../assignment/dstr-array-empty-val-array.js | 27 +++++ .../assignment/dstr-array-empty-val-bool.js | 22 +++++ .../assignment/dstr-array-empty-val-null.js | 22 +++++ .../assignment/dstr-array-empty-val-num.js | 22 +++++ .../assignment/dstr-array-empty-val-string.js | 27 +++++ .../assignment/dstr-array-empty-val-symbol.js | 23 +++++ .../assignment/dstr-array-empty-val-undef.js | 22 +++++ .../assignment/dstr-array-iteration.js | 35 +++++++ .../dstr-array-rest-after-element.js | 31 ++++++ .../dstr-array-rest-after-elision.js | 30 ++++++ .../dstr-array-rest-before-element.js | 21 ++++ .../dstr-array-rest-before-elision.js | 21 ++++ .../assignment/dstr-array-rest-before-rest.js | 21 ++++ .../dstr-array-rest-elision-invalid.js | 21 ++++ .../dstr-array-rest-elision-iter-abpt.js | 54 ++++++++++ .../assignment/dstr-array-rest-elision.js | 31 ++++++ .../assignment/dstr-array-rest-init.js | 22 +++++ .../dstr-array-rest-iter-get-err.js | 33 +++++++ .../dstr-array-rest-iter-nrml-close-skip.js | 55 +++++++++++ .../dstr-array-rest-iter-rtrn-close-err.js | 79 +++++++++++++++ .../dstr-array-rest-iter-rtrn-close-null.js | 78 +++++++++++++++ .../dstr-array-rest-iter-rtrn-close.js | 90 +++++++++++++++++ .../dstr-array-rest-iter-thrw-close-err.js | 68 +++++++++++++ .../dstr-array-rest-iter-thrw-close-skip.js | 51 ++++++++++ .../dstr-array-rest-iter-thrw-close.js | 76 ++++++++++++++ .../assignment/dstr-array-rest-iteration.js | 36 +++++++ .../assignment/dstr-array-rest-lref-err.js | 60 +++++++++++ .../assignment/dstr-array-rest-lref.js | 64 ++++++++++++ .../dstr-array-rest-nested-array-invalid.js | 21 ++++ ...-rest-nested-array-iter-thrw-close-skip.js | 63 ++++++++++++ .../dstr-array-rest-nested-array-null.js | 29 ++++++ ...-array-rest-nested-array-undefined-hole.js | 28 ++++++ ...r-array-rest-nested-array-undefined-own.js | 28 ++++++ .../dstr-array-rest-nested-array-undefined.js | 28 ++++++ ...dstr-array-rest-nested-array-yield-expr.js | 46 +++++++++ ...y-rest-nested-array-yield-ident-invalid.js | 21 ++++ ...ray-rest-nested-array-yield-ident-valid.js | 29 ++++++ .../dstr-array-rest-nested-array.js | 28 ++++++ .../dstr-array-rest-nested-obj-invalid.js | 21 ++++ .../dstr-array-rest-nested-obj-null.js | 29 ++++++ ...tr-array-rest-nested-obj-undefined-hole.js | 30 ++++++ ...str-array-rest-nested-obj-undefined-own.js | 30 ++++++ .../dstr-array-rest-nested-obj-undefined.js | 30 ++++++ .../dstr-array-rest-nested-obj-yield-expr.js | 44 +++++++++ ...ray-rest-nested-obj-yield-ident-invalid.js | 21 ++++ ...array-rest-nested-obj-yield-ident-valid.js | 29 ++++++ .../assignment/dstr-array-rest-nested-obj.js | 28 ++++++ .../assignment/dstr-array-rest-put-const.js | 23 +++++ .../assignment/dstr-array-rest-put-let.js | 24 +++++ .../dstr-array-rest-put-prop-ref-no-get.js | 39 ++++++++ ...t-put-prop-ref-user-err-iter-close-skip.js | 66 +++++++++++++ .../dstr-array-rest-put-prop-ref-user-err.js | 27 +++++ .../dstr-array-rest-put-prop-ref.js | 31 ++++++ ...r-array-rest-put-unresolvable-no-strict.js | 32 ++++++ ...dstr-array-rest-put-unresolvable-strict.js | 22 +++++ .../assignment/dstr-array-rest-yield-expr.js | 48 +++++++++ .../dstr-array-rest-yield-ident-invalid.js | 22 +++++ .../dstr-array-rest-yield-ident-valid.js | 32 ++++++ .../assignment/dstr-obj-empty-bool.js | 27 +++++ .../assignment/dstr-obj-empty-null.js | 22 +++++ .../assignment/dstr-obj-empty-num.js | 27 +++++ .../assignment/dstr-obj-empty-obj.js | 27 +++++ .../assignment/dstr-obj-empty-string.js | 27 +++++ .../assignment/dstr-obj-empty-symbol.js | 28 ++++++ .../assignment/dstr-obj-empty-undef.js | 22 +++++ ...dstr-obj-id-identifier-resolution-first.js | 29 ++++++ .../dstr-obj-id-identifier-resolution-last.js | 29 ++++++ .../dstr-obj-id-identifier-resolution-lone.js | 28 ++++++ ...str-obj-id-identifier-resolution-middle.js | 29 ++++++ ...dstr-obj-id-identifier-resolution-trlng.js | 28 ++++++ .../dstr-obj-id-identifier-yield-expr.js | 24 +++++ ...r-obj-id-identifier-yield-ident-invalid.js | 21 ++++ ...str-obj-id-identifier-yield-ident-valid.js | 28 ++++++ .../dstr-obj-id-init-assignment-missing.js | 28 ++++++ .../dstr-obj-id-init-assignment-null.js | 28 ++++++ .../dstr-obj-id-init-assignment-truthy.js | 28 ++++++ .../dstr-obj-id-init-assignment-undef.js | 28 ++++++ .../assignment/dstr-obj-id-init-evaluation.js | 31 ++++++ .../dstr-obj-id-init-fn-name-arrow.js | 41 ++++++++ .../dstr-obj-id-init-fn-name-class.js | 43 ++++++++ .../dstr-obj-id-init-fn-name-cover.js | 43 ++++++++ .../assignment/dstr-obj-id-init-fn-name-fn.js | 43 ++++++++ .../dstr-obj-id-init-fn-name-gen.js | 43 ++++++++ .../assignment/dstr-obj-id-init-in.js | 28 ++++++ .../assignment/dstr-obj-id-init-let.js | 25 +++++ .../assignment/dstr-obj-id-init-order.js | 31 ++++++ .../dstr-obj-id-init-simple-no-strict.js | 29 ++++++ .../dstr-obj-id-init-simple-strict.js | 21 ++++ .../assignment/dstr-obj-id-init-yield-expr.js | 44 +++++++++ .../dstr-obj-id-init-yield-ident-invalid.js | 21 ++++ .../dstr-obj-id-init-yield-ident-valid.js | 29 ++++++ .../assignment/dstr-obj-id-put-const.js | 23 +++++ .../assignment/dstr-obj-id-put-let.js | 24 +++++ .../dstr-obj-id-put-unresolvable-no-strict.js | 32 ++++++ .../dstr-obj-id-put-unresolvable-strict.js | 22 +++++ .../dstr-obj-id-simple-no-strict.js | 31 ++++++ .../assignment/dstr-obj-id-simple-strict.js | 21 ++++ ...r-obj-prop-elem-init-assignment-missing.js | 28 ++++++ ...dstr-obj-prop-elem-init-assignment-null.js | 28 ++++++ ...tr-obj-prop-elem-init-assignment-truthy.js | 28 ++++++ ...str-obj-prop-elem-init-assignment-undef.js | 28 ++++++ .../dstr-obj-prop-elem-init-evaluation.js | 33 +++++++ .../dstr-obj-prop-elem-init-fn-name-arrow.js | 42 ++++++++ .../dstr-obj-prop-elem-init-fn-name-class.js | 44 +++++++++ .../dstr-obj-prop-elem-init-fn-name-cover.js | 44 +++++++++ .../dstr-obj-prop-elem-init-fn-name-fn.js | 44 +++++++++ .../dstr-obj-prop-elem-init-fn-name-gen.js | 44 +++++++++ .../assignment/dstr-obj-prop-elem-init-in.js | 28 ++++++ .../assignment/dstr-obj-prop-elem-init-let.js | 25 +++++ .../dstr-obj-prop-elem-init-yield-expr.js | 43 ++++++++ ...-obj-prop-elem-init-yield-ident-invalid.js | 21 ++++ ...tr-obj-prop-elem-init-yield-ident-valid.js | 29 ++++++ .../dstr-obj-prop-elem-target-yield-expr.js | 45 +++++++++ ...bj-prop-elem-target-yield-ident-invalid.js | 21 ++++ ...-obj-prop-elem-target-yield-ident-valid.js | 29 ++++++ ...tr-obj-prop-identifier-resolution-first.js | 29 ++++++ ...str-obj-prop-identifier-resolution-last.js | 29 ++++++ ...str-obj-prop-identifier-resolution-lone.js | 28 ++++++ ...r-obj-prop-identifier-resolution-middle.js | 29 ++++++ ...tr-obj-prop-identifier-resolution-trlng.js | 28 ++++++ .../dstr-obj-prop-name-evaluation-error.js | 23 +++++ .../dstr-obj-prop-name-evaluation.js | 30 ++++++ .../dstr-obj-prop-nested-array-invalid.js | 21 ++++ .../dstr-obj-prop-nested-array-null.js | 23 +++++ ...str-obj-prop-nested-array-undefined-own.js | 23 +++++ .../dstr-obj-prop-nested-array-undefined.js | 23 +++++ .../dstr-obj-prop-nested-array-yield-expr.js | 44 +++++++++ ...j-prop-nested-array-yield-ident-invalid.js | 21 ++++ ...obj-prop-nested-array-yield-ident-valid.js | 29 ++++++ .../assignment/dstr-obj-prop-nested-array.js | 28 ++++++ .../dstr-obj-prop-nested-obj-invalid.js | 21 ++++ .../dstr-obj-prop-nested-obj-null.js | 23 +++++ .../dstr-obj-prop-nested-obj-undefined-own.js | 23 +++++ .../dstr-obj-prop-nested-obj-undefined.js | 23 +++++ .../dstr-obj-prop-nested-obj-yield-expr.js | 44 +++++++++ ...obj-prop-nested-obj-yield-ident-invalid.js | 21 ++++ ...r-obj-prop-nested-obj-yield-ident-valid.js | 29 ++++++ .../assignment/dstr-obj-prop-nested-obj.js | 28 ++++++ .../assignment/dstr-obj-prop-put-const.js | 23 +++++ .../assignment/dstr-obj-prop-put-let.js | 24 +++++ .../assignment/dstr-obj-prop-put-order.js | 28 ++++++ .../dstr-obj-prop-put-prop-ref-no-get.js | 36 +++++++ .../dstr-obj-prop-put-prop-ref-user-err.js | 27 +++++ .../assignment/dstr-obj-prop-put-prop-ref.js | 28 ++++++ ...str-obj-prop-put-unresolvable-no-strict.js | 32 ++++++ .../dstr-obj-prop-put-unresolvable-strict.js | 22 +++++ .../dstr-array-elem-init-simple-strict.js | 30 ++++++ ...str-array-elem-init-yield-ident-invalid.js | 30 ++++++ .../dstr-array-elem-nested-array-invalid.js | 30 ++++++ ...y-elem-nested-array-yield-ident-invalid.js | 30 ++++++ .../dstr-array-elem-nested-obj-invalid.js | 30 ++++++ ...ray-elem-nested-obj-yield-ident-invalid.js | 30 ++++++ .../dstr-array-elem-target-simple-strict.js | 30 ++++++ .../dstr-array-elem-target-yield-invalid.js | 30 ++++++ .../for-in/dstr-array-rest-before-element.js | 30 ++++++ .../for-in/dstr-array-rest-before-elision.js | 30 ++++++ .../for-in/dstr-array-rest-before-rest.js | 30 ++++++ .../for-in/dstr-array-rest-elision-invalid.js | 30 ++++++ .../statements/for-in/dstr-array-rest-init.js | 31 ++++++ .../dstr-array-rest-nested-array-invalid.js | 30 ++++++ ...y-rest-nested-array-yield-ident-invalid.js | 30 ++++++ .../dstr-array-rest-nested-obj-invalid.js | 30 ++++++ ...ray-rest-nested-obj-yield-ident-invalid.js | 30 ++++++ .../dstr-array-rest-yield-ident-invalid.js | 31 ++++++ .../dstr-obj-id-identifier-yield-expr.js | 33 +++++++ ...r-obj-id-identifier-yield-ident-invalid.js | 30 ++++++ .../for-in/dstr-obj-id-init-simple-strict.js | 30 ++++++ .../dstr-obj-id-init-yield-ident-invalid.js | 30 ++++++ .../for-in/dstr-obj-id-simple-strict.js | 30 ++++++ ...-obj-prop-elem-init-yield-ident-invalid.js | 30 ++++++ ...bj-prop-elem-target-yield-ident-invalid.js | 30 ++++++ .../dstr-obj-prop-nested-array-invalid.js | 30 ++++++ ...j-prop-nested-array-yield-ident-invalid.js | 30 ++++++ .../dstr-obj-prop-nested-obj-invalid.js | 30 ++++++ ...obj-prop-nested-obj-yield-ident-invalid.js | 30 ++++++ .../for-of/dstr-array-elem-init-assignment.js | 41 ++++++++ .../for-of/dstr-array-elem-init-evaluation.js | 39 ++++++++ .../dstr-array-elem-init-fn-name-arrow.js | 51 ++++++++++ .../dstr-array-elem-init-fn-name-class.js | 53 ++++++++++ .../dstr-array-elem-init-fn-name-cover.js | 53 ++++++++++ .../for-of/dstr-array-elem-init-fn-name-fn.js | 53 ++++++++++ .../dstr-array-elem-init-fn-name-gen.js | 53 ++++++++++ .../for-of/dstr-array-elem-init-in.js | 37 +++++++ .../for-of/dstr-array-elem-init-let.js | 41 ++++++++ .../for-of/dstr-array-elem-init-order.js | 40 ++++++++ .../dstr-array-elem-init-simple-no-strict.js | 38 +++++++ .../dstr-array-elem-init-simple-strict.js | 30 ++++++ .../for-of/dstr-array-elem-init-yield-expr.js | 53 ++++++++++ ...str-array-elem-init-yield-ident-invalid.js | 30 ++++++ .../dstr-array-elem-init-yield-ident-valid.js | 38 +++++++ .../for-of/dstr-array-elem-iter-get-err.js | 49 +++++++++ .../dstr-array-elem-iter-nrml-close-err.js | 66 +++++++++++++ .../dstr-array-elem-iter-nrml-close-null.js | 72 ++++++++++++++ .../dstr-array-elem-iter-nrml-close-skip.js | 61 ++++++++++++ .../for-of/dstr-array-elem-iter-nrml-close.js | 77 +++++++++++++++ .../dstr-array-elem-iter-rtrn-close-err.js | 76 ++++++++++++++ .../dstr-array-elem-iter-rtrn-close-null.js | 73 ++++++++++++++ .../for-of/dstr-array-elem-iter-rtrn-close.js | 83 ++++++++++++++++ .../dstr-array-elem-iter-thrw-close-err.js | 71 +++++++++++++ .../dstr-array-elem-iter-thrw-close-skip.js | 65 ++++++++++++ .../for-of/dstr-array-elem-iter-thrw-close.js | 80 +++++++++++++++ .../dstr-array-elem-nested-array-invalid.js | 30 ++++++ .../dstr-array-elem-nested-array-null.js | 39 ++++++++ ...-array-elem-nested-array-undefined-hole.js | 39 ++++++++ ...r-array-elem-nested-array-undefined-own.js | 39 ++++++++ .../dstr-array-elem-nested-array-undefined.js | 39 ++++++++ ...dstr-array-elem-nested-array-yield-expr.js | 55 +++++++++++ ...y-elem-nested-array-yield-ident-invalid.js | 30 ++++++ ...ray-elem-nested-array-yield-ident-valid.js | 38 +++++++ .../for-of/dstr-array-elem-nested-array.js | 37 +++++++ .../dstr-array-elem-nested-obj-invalid.js | 30 ++++++ .../for-of/dstr-array-elem-nested-obj-null.js | 39 ++++++++ ...tr-array-elem-nested-obj-undefined-hole.js | 39 ++++++++ ...str-array-elem-nested-obj-undefined-own.js | 39 ++++++++ .../dstr-array-elem-nested-obj-undefined.js | 39 ++++++++ .../dstr-array-elem-nested-obj-yield-expr.js | 53 ++++++++++ ...ray-elem-nested-obj-yield-ident-invalid.js | 30 ++++++ ...array-elem-nested-obj-yield-ident-valid.js | 38 +++++++ .../for-of/dstr-array-elem-nested-obj.js | 37 +++++++ .../for-of/dstr-array-elem-put-const.js | 39 ++++++++ .../for-of/dstr-array-elem-put-let.js | 40 ++++++++ .../dstr-array-elem-put-prop-ref-no-get.js | 45 +++++++++ .../dstr-array-elem-put-prop-ref-user-err.js | 43 ++++++++ .../for-of/dstr-array-elem-put-prop-ref.js | 37 +++++++ ...r-array-elem-put-unresolvable-no-strict.js | 41 ++++++++ ...dstr-array-elem-put-unresolvable-strict.js | 38 +++++++ .../dstr-array-elem-target-identifier.js | 39 ++++++++ ...dstr-array-elem-target-simple-no-strict.js | 38 +++++++ .../dstr-array-elem-target-simple-strict.js | 30 ++++++ .../dstr-array-elem-target-yield-expr.js | 55 +++++++++++ .../dstr-array-elem-target-yield-invalid.js | 30 ++++++ .../dstr-array-elem-target-yield-valid.js | 38 +++++++ ...-array-elem-trlg-iter-elision-iter-abpt.js | 79 +++++++++++++++ ...m-trlg-iter-elision-iter-nrml-close-err.js | 75 ++++++++++++++ ...-trlg-iter-elision-iter-nrml-close-null.js | 78 +++++++++++++++ ...-trlg-iter-elision-iter-nrml-close-skip.js | 69 +++++++++++++ ...-elem-trlg-iter-elision-iter-nrml-close.js | 84 ++++++++++++++++ .../dstr-array-elem-trlg-iter-get-err.js | 50 ++++++++++ ...rray-elem-trlg-iter-list-nrml-close-err.js | 75 ++++++++++++++ ...ray-elem-trlg-iter-list-nrml-close-null.js | 78 +++++++++++++++ ...ray-elem-trlg-iter-list-nrml-close-skip.js | 70 +++++++++++++ ...tr-array-elem-trlg-iter-list-nrml-close.js | 83 ++++++++++++++++ ...rray-elem-trlg-iter-list-rtrn-close-err.js | 83 ++++++++++++++++ ...ray-elem-trlg-iter-list-rtrn-close-null.js | 80 +++++++++++++++ ...tr-array-elem-trlg-iter-list-rtrn-close.js | 91 +++++++++++++++++ ...rray-elem-trlg-iter-list-thrw-close-err.js | 83 ++++++++++++++++ ...ray-elem-trlg-iter-list-thrw-close-skip.js | 74 ++++++++++++++ ...tr-array-elem-trlg-iter-list-thrw-close.js | 86 ++++++++++++++++ ...ray-elem-trlg-iter-rest-nrml-close-skip.js | 70 +++++++++++++ ...rray-elem-trlg-iter-rest-rtrn-close-err.js | 92 +++++++++++++++++ ...ray-elem-trlg-iter-rest-rtrn-close-null.js | 87 ++++++++++++++++ ...tr-array-elem-trlg-iter-rest-rtrn-close.js | 98 ++++++++++++++++++ ...rray-elem-trlg-iter-rest-thrw-close-err.js | 84 ++++++++++++++++ ...ray-elem-trlg-iter-rest-thrw-close-skip.js | 77 +++++++++++++++ ...tr-array-elem-trlg-iter-rest-thrw-close.js | 88 +++++++++++++++++ .../for-of/dstr-array-elision-iter-abpt.js | 65 ++++++++++++ .../for-of/dstr-array-elision-iter-get-err.js | 48 +++++++++ .../dstr-array-elision-iter-nrml-close-err.js | 68 +++++++++++++ ...dstr-array-elision-iter-nrml-close-null.js | 72 ++++++++++++++ ...dstr-array-elision-iter-nrml-close-skip.js | 62 ++++++++++++ .../dstr-array-elision-iter-nrml-close.js | 77 +++++++++++++++ .../for-of/dstr-array-elision-val-array.js | 36 +++++++ .../for-of/dstr-array-elision-val-bool.js | 38 +++++++ .../for-of/dstr-array-elision-val-null.js | 38 +++++++ .../for-of/dstr-array-elision-val-num.js | 38 +++++++ .../for-of/dstr-array-elision-val-string.js | 36 +++++++ .../for-of/dstr-array-elision-val-symbol.js | 39 ++++++++ .../for-of/dstr-array-elision-val-undef.js | 38 +++++++ .../for-of/dstr-array-empty-iter-close-err.js | 64 ++++++++++++ .../dstr-array-empty-iter-close-null.js | 66 +++++++++++++ .../for-of/dstr-array-empty-iter-close.js | 73 ++++++++++++++ .../for-of/dstr-array-empty-iter-get-err.js | 48 +++++++++ .../for-of/dstr-array-empty-val-array.js | 36 +++++++ .../for-of/dstr-array-empty-val-bool.js | 38 +++++++ .../for-of/dstr-array-empty-val-null.js | 38 +++++++ .../for-of/dstr-array-empty-val-num.js | 38 +++++++ .../for-of/dstr-array-empty-val-string.js | 36 +++++++ .../for-of/dstr-array-empty-val-symbol.js | 39 ++++++++ .../for-of/dstr-array-empty-val-undef.js | 38 +++++++ .../statements/for-of/dstr-array-iteration.js | 44 +++++++++ .../for-of/dstr-array-rest-after-element.js | 40 ++++++++ .../for-of/dstr-array-rest-after-elision.js | 39 ++++++++ .../for-of/dstr-array-rest-before-element.js | 30 ++++++ .../for-of/dstr-array-rest-before-elision.js | 30 ++++++ .../for-of/dstr-array-rest-before-rest.js | 30 ++++++ .../for-of/dstr-array-rest-elision-invalid.js | 30 ++++++ .../dstr-array-rest-elision-iter-abpt.js | 70 +++++++++++++ .../for-of/dstr-array-rest-elision.js | 40 ++++++++ .../statements/for-of/dstr-array-rest-init.js | 31 ++++++ .../for-of/dstr-array-rest-iter-get-err.js | 49 +++++++++ .../dstr-array-rest-iter-nrml-close-skip.js | 64 ++++++++++++ .../dstr-array-rest-iter-rtrn-close-err.js | 88 +++++++++++++++++ .../dstr-array-rest-iter-rtrn-close-null.js | 87 ++++++++++++++++ .../for-of/dstr-array-rest-iter-rtrn-close.js | 99 +++++++++++++++++++ .../dstr-array-rest-iter-thrw-close-err.js | 84 ++++++++++++++++ .../dstr-array-rest-iter-thrw-close-skip.js | 67 +++++++++++++ .../for-of/dstr-array-rest-iter-thrw-close.js | 92 +++++++++++++++++ .../for-of/dstr-array-rest-iteration.js | 45 +++++++++ .../for-of/dstr-array-rest-lref-err.js | 76 ++++++++++++++ .../statements/for-of/dstr-array-rest-lref.js | 73 ++++++++++++++ .../dstr-array-rest-nested-array-invalid.js | 30 ++++++ ...-rest-nested-array-iter-thrw-close-skip.js | 79 +++++++++++++++ .../dstr-array-rest-nested-array-null.js | 38 +++++++ ...-array-rest-nested-array-undefined-hole.js | 37 +++++++ ...r-array-rest-nested-array-undefined-own.js | 37 +++++++ .../dstr-array-rest-nested-array-undefined.js | 37 +++++++ ...dstr-array-rest-nested-array-yield-expr.js | 55 +++++++++++ ...y-rest-nested-array-yield-ident-invalid.js | 30 ++++++ ...ray-rest-nested-array-yield-ident-valid.js | 38 +++++++ .../for-of/dstr-array-rest-nested-array.js | 37 +++++++ .../dstr-array-rest-nested-obj-invalid.js | 30 ++++++ .../for-of/dstr-array-rest-nested-obj-null.js | 38 +++++++ ...tr-array-rest-nested-obj-undefined-hole.js | 39 ++++++++ ...str-array-rest-nested-obj-undefined-own.js | 39 ++++++++ .../dstr-array-rest-nested-obj-undefined.js | 39 ++++++++ .../dstr-array-rest-nested-obj-yield-expr.js | 53 ++++++++++ ...ray-rest-nested-obj-yield-ident-invalid.js | 30 ++++++ ...array-rest-nested-obj-yield-ident-valid.js | 38 +++++++ .../for-of/dstr-array-rest-nested-obj.js | 37 +++++++ .../for-of/dstr-array-rest-put-const.js | 39 ++++++++ .../for-of/dstr-array-rest-put-let.js | 40 ++++++++ .../dstr-array-rest-put-prop-ref-no-get.js | 48 +++++++++ ...t-put-prop-ref-user-err-iter-close-skip.js | 82 +++++++++++++++ .../dstr-array-rest-put-prop-ref-user-err.js | 43 ++++++++ .../for-of/dstr-array-rest-put-prop-ref.js | 40 ++++++++ ...r-array-rest-put-unresolvable-no-strict.js | 41 ++++++++ ...dstr-array-rest-put-unresolvable-strict.js | 38 +++++++ .../for-of/dstr-array-rest-yield-expr.js | 57 +++++++++++ .../dstr-array-rest-yield-ident-invalid.js | 31 ++++++ .../dstr-array-rest-yield-ident-valid.js | 41 ++++++++ .../statements/for-of/dstr-obj-empty-bool.js | 36 +++++++ .../statements/for-of/dstr-obj-empty-null.js | 38 +++++++ .../statements/for-of/dstr-obj-empty-num.js | 36 +++++++ .../statements/for-of/dstr-obj-empty-obj.js | 36 +++++++ .../for-of/dstr-obj-empty-string.js | 36 +++++++ .../for-of/dstr-obj-empty-symbol.js | 37 +++++++ .../statements/for-of/dstr-obj-empty-undef.js | 38 +++++++ ...dstr-obj-id-identifier-resolution-first.js | 38 +++++++ .../dstr-obj-id-identifier-resolution-last.js | 38 +++++++ .../dstr-obj-id-identifier-resolution-lone.js | 37 +++++++ ...str-obj-id-identifier-resolution-middle.js | 38 +++++++ ...dstr-obj-id-identifier-resolution-trlng.js | 37 +++++++ .../dstr-obj-id-identifier-yield-expr.js | 33 +++++++ ...r-obj-id-identifier-yield-ident-invalid.js | 30 ++++++ ...str-obj-id-identifier-yield-ident-valid.js | 37 +++++++ .../dstr-obj-id-init-assignment-missing.js | 37 +++++++ .../dstr-obj-id-init-assignment-null.js | 37 +++++++ .../dstr-obj-id-init-assignment-truthy.js | 37 +++++++ .../dstr-obj-id-init-assignment-undef.js | 37 +++++++ .../for-of/dstr-obj-id-init-evaluation.js | 40 ++++++++ .../for-of/dstr-obj-id-init-fn-name-arrow.js | 50 ++++++++++ .../for-of/dstr-obj-id-init-fn-name-class.js | 52 ++++++++++ .../for-of/dstr-obj-id-init-fn-name-cover.js | 52 ++++++++++ .../for-of/dstr-obj-id-init-fn-name-fn.js | 52 ++++++++++ .../for-of/dstr-obj-id-init-fn-name-gen.js | 52 ++++++++++ .../statements/for-of/dstr-obj-id-init-in.js | 37 +++++++ .../statements/for-of/dstr-obj-id-init-let.js | 41 ++++++++ .../for-of/dstr-obj-id-init-order.js | 40 ++++++++ .../dstr-obj-id-init-simple-no-strict.js | 38 +++++++ .../for-of/dstr-obj-id-init-simple-strict.js | 30 ++++++ .../for-of/dstr-obj-id-init-yield-expr.js | 53 ++++++++++ .../dstr-obj-id-init-yield-ident-invalid.js | 30 ++++++ .../dstr-obj-id-init-yield-ident-valid.js | 38 +++++++ .../for-of/dstr-obj-id-put-const.js | 39 ++++++++ .../statements/for-of/dstr-obj-id-put-let.js | 40 ++++++++ .../dstr-obj-id-put-unresolvable-no-strict.js | 41 ++++++++ .../dstr-obj-id-put-unresolvable-strict.js | 38 +++++++ .../for-of/dstr-obj-id-simple-no-strict.js | 40 ++++++++ .../for-of/dstr-obj-id-simple-strict.js | 30 ++++++ ...r-obj-prop-elem-init-assignment-missing.js | 37 +++++++ ...dstr-obj-prop-elem-init-assignment-null.js | 37 +++++++ ...tr-obj-prop-elem-init-assignment-truthy.js | 37 +++++++ ...str-obj-prop-elem-init-assignment-undef.js | 37 +++++++ .../dstr-obj-prop-elem-init-evaluation.js | 42 ++++++++ .../dstr-obj-prop-elem-init-fn-name-arrow.js | 51 ++++++++++ .../dstr-obj-prop-elem-init-fn-name-class.js | 53 ++++++++++ .../dstr-obj-prop-elem-init-fn-name-cover.js | 53 ++++++++++ .../dstr-obj-prop-elem-init-fn-name-fn.js | 53 ++++++++++ .../dstr-obj-prop-elem-init-fn-name-gen.js | 53 ++++++++++ .../for-of/dstr-obj-prop-elem-init-in.js | 37 +++++++ .../for-of/dstr-obj-prop-elem-init-let.js | 41 ++++++++ .../dstr-obj-prop-elem-init-yield-expr.js | 52 ++++++++++ ...-obj-prop-elem-init-yield-ident-invalid.js | 30 ++++++ ...tr-obj-prop-elem-init-yield-ident-valid.js | 38 +++++++ .../dstr-obj-prop-elem-target-yield-expr.js | 54 ++++++++++ ...bj-prop-elem-target-yield-ident-invalid.js | 30 ++++++ ...-obj-prop-elem-target-yield-ident-valid.js | 38 +++++++ ...tr-obj-prop-identifier-resolution-first.js | 38 +++++++ ...str-obj-prop-identifier-resolution-last.js | 38 +++++++ ...str-obj-prop-identifier-resolution-lone.js | 37 +++++++ ...r-obj-prop-identifier-resolution-middle.js | 38 +++++++ ...tr-obj-prop-identifier-resolution-trlng.js | 37 +++++++ .../dstr-obj-prop-name-evaluation-error.js | 39 ++++++++ .../for-of/dstr-obj-prop-name-evaluation.js | 39 ++++++++ .../dstr-obj-prop-nested-array-invalid.js | 30 ++++++ .../for-of/dstr-obj-prop-nested-array-null.js | 39 ++++++++ ...str-obj-prop-nested-array-undefined-own.js | 39 ++++++++ .../dstr-obj-prop-nested-array-undefined.js | 39 ++++++++ .../dstr-obj-prop-nested-array-yield-expr.js | 53 ++++++++++ ...j-prop-nested-array-yield-ident-invalid.js | 30 ++++++ ...obj-prop-nested-array-yield-ident-valid.js | 38 +++++++ .../for-of/dstr-obj-prop-nested-array.js | 37 +++++++ .../dstr-obj-prop-nested-obj-invalid.js | 30 ++++++ .../for-of/dstr-obj-prop-nested-obj-null.js | 39 ++++++++ .../dstr-obj-prop-nested-obj-undefined-own.js | 39 ++++++++ .../dstr-obj-prop-nested-obj-undefined.js | 39 ++++++++ .../dstr-obj-prop-nested-obj-yield-expr.js | 53 ++++++++++ ...obj-prop-nested-obj-yield-ident-invalid.js | 30 ++++++ ...r-obj-prop-nested-obj-yield-ident-valid.js | 38 +++++++ .../for-of/dstr-obj-prop-nested-obj.js | 37 +++++++ .../for-of/dstr-obj-prop-put-const.js | 39 ++++++++ .../for-of/dstr-obj-prop-put-let.js | 40 ++++++++ .../for-of/dstr-obj-prop-put-order.js | 37 +++++++ .../dstr-obj-prop-put-prop-ref-no-get.js | 45 +++++++++ .../dstr-obj-prop-put-prop-ref-user-err.js | 43 ++++++++ .../for-of/dstr-obj-prop-put-prop-ref.js | 37 +++++++ ...str-obj-prop-put-unresolvable-no-strict.js | 41 ++++++++ .../dstr-obj-prop-put-unresolvable-strict.js | 38 +++++++ 515 files changed, 21328 insertions(+) create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-assignment.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-evaluation.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-fn-name-arrow.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-fn-name-class.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-fn-name-cover.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-fn-name-fn.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-fn-name-gen.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-in.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-let.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-order.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-simple-no-strict.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-simple-strict.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-init-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-get-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-nrml-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-thrw-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-thrw-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-iter-thrw-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array-undefined-hole.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array-undefined-own.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array-undefined.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-array.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined-hole.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined-own.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-nested-obj.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-put-const.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-put-let.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-put-prop-ref-no-get.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-put-prop-ref-user-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-put-prop-ref.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-put-unresolvable-no-strict.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-put-unresolvable-strict.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-target-identifier.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-target-simple-no-strict.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-target-simple-strict.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-target-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-target-yield-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-target-yield-valid.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-abpt.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-get-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-iter-abpt.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-iter-get-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-iter-nrml-close.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-val-array.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-val-bool.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-val-null.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-val-num.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-val-string.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-val-symbol.js create mode 100644 test/language/expressions/assignment/dstr-array-elision-val-undef.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-iter-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-iter-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-iter-close.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-iter-get-err.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-val-array.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-val-bool.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-val-null.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-val-num.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-val-string.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-val-symbol.js create mode 100644 test/language/expressions/assignment/dstr-array-empty-val-undef.js create mode 100644 test/language/expressions/assignment/dstr-array-iteration.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-after-element.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-after-elision.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-before-element.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-before-elision.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-before-rest.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-elision-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-elision-iter-abpt.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-elision.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-init.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iter-get-err.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iter-nrml-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close-null.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iter-thrw-close-err.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iter-thrw-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iter-thrw-close.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-iteration.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-lref-err.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-lref.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-iter-thrw-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-null.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-undefined-hole.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-undefined-own.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-undefined.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-array.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj-null.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-hole.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-own.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-nested-obj.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-put-const.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-put-let.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-put-prop-ref-no-get.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-put-prop-ref-user-err.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-put-prop-ref.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-put-unresolvable-no-strict.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-put-unresolvable-strict.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-array-rest-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-obj-empty-bool.js create mode 100644 test/language/expressions/assignment/dstr-obj-empty-null.js create mode 100644 test/language/expressions/assignment/dstr-obj-empty-num.js create mode 100644 test/language/expressions/assignment/dstr-obj-empty-obj.js create mode 100644 test/language/expressions/assignment/dstr-obj-empty-string.js create mode 100644 test/language/expressions/assignment/dstr-obj-empty-symbol.js create mode 100644 test/language/expressions/assignment/dstr-obj-empty-undef.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-identifier-resolution-first.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-identifier-resolution-last.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-identifier-resolution-lone.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-identifier-resolution-middle.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-identifier-resolution-trlng.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-identifier-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-identifier-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-identifier-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-assignment-missing.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-assignment-null.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-assignment-truthy.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-assignment-undef.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-evaluation.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-fn-name-arrow.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-fn-name-class.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-fn-name-cover.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-fn-name-fn.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-fn-name-gen.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-in.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-let.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-order.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-simple-no-strict.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-simple-strict.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-init-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-put-const.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-put-let.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-put-unresolvable-no-strict.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-put-unresolvable-strict.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-simple-no-strict.js create mode 100644 test/language/expressions/assignment/dstr-obj-id-simple-strict.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-missing.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-null.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-truthy.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-undef.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-evaluation.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-arrow.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-class.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-cover.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-fn.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-gen.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-in.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-let.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-first.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-last.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-lone.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-middle.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-trlng.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-name-evaluation-error.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-name-evaluation.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-array-invalid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-array-null.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-array-undefined-own.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-array-undefined.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-array.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-obj-invalid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-obj-null.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-obj-undefined-own.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-obj-undefined.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-expr.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-ident-invalid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-ident-valid.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-nested-obj.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-put-const.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-put-let.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-put-order.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-put-prop-ref-no-get.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-put-prop-ref-user-err.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-put-prop-ref.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-put-unresolvable-no-strict.js create mode 100644 test/language/expressions/assignment/dstr-obj-prop-put-unresolvable-strict.js create mode 100644 test/language/statements/for-in/dstr-array-elem-init-simple-strict.js create mode 100644 test/language/statements/for-in/dstr-array-elem-init-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-elem-nested-array-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-elem-nested-array-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-elem-nested-obj-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-elem-nested-obj-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-elem-target-simple-strict.js create mode 100644 test/language/statements/for-in/dstr-array-elem-target-yield-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-rest-before-element.js create mode 100644 test/language/statements/for-in/dstr-array-rest-before-elision.js create mode 100644 test/language/statements/for-in/dstr-array-rest-before-rest.js create mode 100644 test/language/statements/for-in/dstr-array-rest-elision-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-rest-init.js create mode 100644 test/language/statements/for-in/dstr-array-rest-nested-array-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-rest-nested-array-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-rest-nested-obj-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-rest-nested-obj-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-array-rest-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-obj-id-identifier-yield-expr.js create mode 100644 test/language/statements/for-in/dstr-obj-id-identifier-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-obj-id-init-simple-strict.js create mode 100644 test/language/statements/for-in/dstr-obj-id-init-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-obj-id-simple-strict.js create mode 100644 test/language/statements/for-in/dstr-obj-prop-elem-init-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-obj-prop-elem-target-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-obj-prop-nested-array-invalid.js create mode 100644 test/language/statements/for-in/dstr-obj-prop-nested-array-yield-ident-invalid.js create mode 100644 test/language/statements/for-in/dstr-obj-prop-nested-obj-invalid.js create mode 100644 test/language/statements/for-in/dstr-obj-prop-nested-obj-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-assignment.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-evaluation.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-fn-name-arrow.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-fn-name-class.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-fn-name-cover.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-fn-name-fn.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-fn-name-gen.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-in.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-let.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-order.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-simple-no-strict.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-simple-strict.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-init-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-get-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-nrml-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-nrml-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-nrml-close.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-thrw-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-thrw-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-elem-iter-thrw-close.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array-null.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array-undefined-hole.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array-undefined-own.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array-undefined.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-array.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj-null.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj-undefined-hole.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj-undefined-own.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj-undefined.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-nested-obj.js create mode 100644 test/language/statements/for-of/dstr-array-elem-put-const.js create mode 100644 test/language/statements/for-of/dstr-array-elem-put-let.js create mode 100644 test/language/statements/for-of/dstr-array-elem-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-of/dstr-array-elem-put-prop-ref-user-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-put-prop-ref.js create mode 100644 test/language/statements/for-of/dstr-array-elem-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-of/dstr-array-elem-put-unresolvable-strict.js create mode 100644 test/language/statements/for-of/dstr-array-elem-target-identifier.js create mode 100644 test/language/statements/for-of/dstr-array-elem-target-simple-no-strict.js create mode 100644 test/language/statements/for-of/dstr-array-elem-target-simple-strict.js create mode 100644 test/language/statements/for-of/dstr-array-elem-target-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-array-elem-target-yield-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-target-yield-valid.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-abpt.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-get-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close.js create mode 100644 test/language/statements/for-of/dstr-array-elision-iter-abpt.js create mode 100644 test/language/statements/for-of/dstr-array-elision-iter-get-err.js create mode 100644 test/language/statements/for-of/dstr-array-elision-iter-nrml-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-elision-iter-nrml-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-elision-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-elision-iter-nrml-close.js create mode 100644 test/language/statements/for-of/dstr-array-elision-val-array.js create mode 100644 test/language/statements/for-of/dstr-array-elision-val-bool.js create mode 100644 test/language/statements/for-of/dstr-array-elision-val-null.js create mode 100644 test/language/statements/for-of/dstr-array-elision-val-num.js create mode 100644 test/language/statements/for-of/dstr-array-elision-val-string.js create mode 100644 test/language/statements/for-of/dstr-array-elision-val-symbol.js create mode 100644 test/language/statements/for-of/dstr-array-elision-val-undef.js create mode 100644 test/language/statements/for-of/dstr-array-empty-iter-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-empty-iter-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-empty-iter-close.js create mode 100644 test/language/statements/for-of/dstr-array-empty-iter-get-err.js create mode 100644 test/language/statements/for-of/dstr-array-empty-val-array.js create mode 100644 test/language/statements/for-of/dstr-array-empty-val-bool.js create mode 100644 test/language/statements/for-of/dstr-array-empty-val-null.js create mode 100644 test/language/statements/for-of/dstr-array-empty-val-num.js create mode 100644 test/language/statements/for-of/dstr-array-empty-val-string.js create mode 100644 test/language/statements/for-of/dstr-array-empty-val-symbol.js create mode 100644 test/language/statements/for-of/dstr-array-empty-val-undef.js create mode 100644 test/language/statements/for-of/dstr-array-iteration.js create mode 100644 test/language/statements/for-of/dstr-array-rest-after-element.js create mode 100644 test/language/statements/for-of/dstr-array-rest-after-elision.js create mode 100644 test/language/statements/for-of/dstr-array-rest-before-element.js create mode 100644 test/language/statements/for-of/dstr-array-rest-before-elision.js create mode 100644 test/language/statements/for-of/dstr-array-rest-before-rest.js create mode 100644 test/language/statements/for-of/dstr-array-rest-elision-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-rest-elision-iter-abpt.js create mode 100644 test/language/statements/for-of/dstr-array-rest-elision.js create mode 100644 test/language/statements/for-of/dstr-array-rest-init.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iter-get-err.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iter-rtrn-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iter-rtrn-close-null.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iter-rtrn-close.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iter-thrw-close-err.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iter-thrw-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iter-thrw-close.js create mode 100644 test/language/statements/for-of/dstr-array-rest-iteration.js create mode 100644 test/language/statements/for-of/dstr-array-rest-lref-err.js create mode 100644 test/language/statements/for-of/dstr-array-rest-lref.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-iter-thrw-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-null.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-undefined-hole.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-undefined-own.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-undefined.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-array.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj-null.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj-undefined-hole.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj-undefined-own.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj-undefined.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-array-rest-nested-obj.js create mode 100644 test/language/statements/for-of/dstr-array-rest-put-const.js create mode 100644 test/language/statements/for-of/dstr-array-rest-put-let.js create mode 100644 test/language/statements/for-of/dstr-array-rest-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-of/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js create mode 100644 test/language/statements/for-of/dstr-array-rest-put-prop-ref-user-err.js create mode 100644 test/language/statements/for-of/dstr-array-rest-put-prop-ref.js create mode 100644 test/language/statements/for-of/dstr-array-rest-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-of/dstr-array-rest-put-unresolvable-strict.js create mode 100644 test/language/statements/for-of/dstr-array-rest-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-array-rest-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-array-rest-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-obj-empty-bool.js create mode 100644 test/language/statements/for-of/dstr-obj-empty-null.js create mode 100644 test/language/statements/for-of/dstr-obj-empty-num.js create mode 100644 test/language/statements/for-of/dstr-obj-empty-obj.js create mode 100644 test/language/statements/for-of/dstr-obj-empty-string.js create mode 100644 test/language/statements/for-of/dstr-obj-empty-symbol.js create mode 100644 test/language/statements/for-of/dstr-obj-empty-undef.js create mode 100644 test/language/statements/for-of/dstr-obj-id-identifier-resolution-first.js create mode 100644 test/language/statements/for-of/dstr-obj-id-identifier-resolution-last.js create mode 100644 test/language/statements/for-of/dstr-obj-id-identifier-resolution-lone.js create mode 100644 test/language/statements/for-of/dstr-obj-id-identifier-resolution-middle.js create mode 100644 test/language/statements/for-of/dstr-obj-id-identifier-resolution-trlng.js create mode 100644 test/language/statements/for-of/dstr-obj-id-identifier-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-obj-id-identifier-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-obj-id-identifier-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-assignment-missing.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-assignment-null.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-assignment-truthy.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-assignment-undef.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-evaluation.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-fn-name-arrow.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-fn-name-class.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-fn-name-cover.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-fn-name-fn.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-fn-name-gen.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-in.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-let.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-order.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-simple-no-strict.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-simple-strict.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-obj-id-init-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-obj-id-put-const.js create mode 100644 test/language/statements/for-of/dstr-obj-id-put-let.js create mode 100644 test/language/statements/for-of/dstr-obj-id-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-of/dstr-obj-id-put-unresolvable-strict.js create mode 100644 test/language/statements/for-of/dstr-obj-id-simple-no-strict.js create mode 100644 test/language/statements/for-of/dstr-obj-id-simple-strict.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-missing.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-null.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-truthy.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-undef.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-evaluation.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-arrow.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-class.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-cover.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-fn.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-gen.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-in.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-let.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-target-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-identifier-resolution-first.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-identifier-resolution-last.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-identifier-resolution-lone.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-identifier-resolution-middle.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-identifier-resolution-trlng.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-name-evaluation-error.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-name-evaluation.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-array-invalid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-array-null.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-array-undefined-own.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-array-undefined.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-array-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-array.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-obj-invalid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-obj-null.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-obj-undefined-own.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-obj-undefined.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-expr.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-invalid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-valid.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-nested-obj.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-put-const.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-put-let.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-put-order.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-put-prop-ref-user-err.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-put-prop-ref.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-of/dstr-obj-prop-put-unresolvable-strict.js diff --git a/test/language/expressions/assignment/dstr-array-elem-init-assignment.js b/test/language/expressions/assignment/dstr-array-elem-init-assignment.js new file mode 100644 index 0000000000..b8d441f65f --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-assignment.js @@ -0,0 +1,32 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-assignment.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var v2, vNull, vHole, vUndefined, vOob; + +var result; +var vals = [2, null, , undefined]; + +result = [v2 = 10, vNull = 11, vHole = 12, vUndefined = 13, vOob = 14] = vals; + +assert.sameValue(v2, 2); +assert.sameValue(vNull, null); +assert.sameValue(vHole, 12); +assert.sameValue(vUndefined, 13); +assert.sameValue(vOob, 14); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-evaluation.js b/test/language/expressions/assignment/dstr-array-elem-init-evaluation.js new file mode 100644 index 0000000000..26d9f72f98 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-evaluation.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-evaluation.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var flag1 = false, flag2 = false; +var _; + +var result; +var vals = [14]; + +result = [ _ = flag1 = true, _ = flag2 = true ] = vals; + +assert.sameValue(flag1, false); +assert.sameValue(flag2, true); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-fn-name-arrow.js b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-arrow.js new file mode 100644 index 0000000000..5a07af0e6d --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-arrow.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-arrow.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var arrow; + +var result; +var vals = []; + +result = [ arrow = () => {} ] = vals; + +assert.sameValue(arrow.name, 'arrow'); +verifyNotEnumerable(arrow, 'name'); +verifyNotWritable(arrow, 'name'); +verifyConfigurable(arrow, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-fn-name-class.js b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-class.js new file mode 100644 index 0000000000..20c1ce8e82 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-class.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-class.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [class, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var xCls, cls; + +var result; +var vals = []; + +result = [ xCls = class x {},cls = class {} ] = vals; + +assert(xCls.name !== 'xCls'); + +assert.sameValue(cls.name, 'cls'); +verifyNotEnumerable(cls, 'name'); +verifyNotWritable(cls, 'name'); +verifyConfigurable(cls, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-fn-name-cover.js b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-cover.js new file mode 100644 index 0000000000..b252e27c14 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-cover.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-cover.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var xCover, cover; + +var result; +var vals = []; + +result = [ xCover = (0, function() {}), cover = (function() {}) ] = vals; + +assert(xCover.name !== 'xCover'); + +assert.sameValue(cover.name, 'cover'); +verifyNotEnumerable(cover, 'name'); +verifyNotWritable(cover, 'name'); +verifyConfigurable(cover, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-fn-name-fn.js b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..e52e9adce4 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-fn.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-fn.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [class, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var xFn, fn; + +var result; +var vals = []; + +result = [ xFn = function x() {}, fn = function() {} ] = vals; + +assert(xFn.name !== 'xFn'); + +assert.sameValue(fn.name, 'fn'); +verifyNotEnumerable(fn, 'name'); +verifyNotWritable(fn, 'name'); +verifyConfigurable(fn, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-fn-name-gen.js b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..b60cf0dbad --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-fn-name-gen.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-gen.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var xGen, gen; + +var result; +var vals = []; + +result = [ xGen = function* x() {}, gen = function*() {} ] = vals; + +assert.notSameValue(xGen.name, 'xGen'); + +assert.sameValue(gen.name, 'gen'); +verifyNotEnumerable(gen, 'name'); +verifyNotWritable(gen, 'name'); +verifyConfigurable(gen, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-in.js b/test/language/expressions/assignment/dstr-array-elem-init-in.js new file mode 100644 index 0000000000..37c51335a1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-in.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-in.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = []; + +result = [ x = 'x' in {} ] = vals; + +assert.sameValue(x, false); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-let.js b/test/language/expressions/assignment/dstr-array-elem-init-let.js new file mode 100644 index 0000000000..5710473f57 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-let.js @@ -0,0 +1,25 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-let.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Value retrieval of Initializer obeys `let` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [let, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(ReferenceError, function() { + 0, [ x = y ] = []; +}); + +let y; diff --git a/test/language/expressions/assignment/dstr-array-elem-init-order.js b/test/language/expressions/assignment/dstr-array-elem-init-order.js new file mode 100644 index 0000000000..78b92ff233 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-order.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-order.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Initializer values should be assigned in left-to-right order. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = 0; +var a, b; + +var result; +var vals = []; + +result = [ a = x += 1, b = x *= 2 ] = vals; + +assert.sameValue(a, 1); +assert.sameValue(b, 2); +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-simple-no-strict.js b/test/language/expressions/assignment/dstr-array-elem-init-simple-no-strict.js new file mode 100644 index 0000000000..d3400ff5f8 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-simple-no-strict.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-simple-no-strict.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Identifiers that appear as the DestructuringAssignmentTarget in an AssignmentElement should take on the iterated value corresponding to their position in the ArrayAssignmentPattern. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var argument, eval; + +var result; +var vals = []; + +result = [arguments = 4, eval = 5] = vals; + +assert.sameValue(arguments, 4); +assert.sameValue(eval, 5); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-simple-strict.js b/test/language/expressions/assignment/dstr-array-elem-init-simple-strict.js new file mode 100644 index 0000000000..6e76aa791b --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-simple-strict.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-simple-strict.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget(LeftHandSideExpression) is false. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [arguments] = ; diff --git a/test/language/expressions/assignment/dstr-array-elem-init-yield-expr.js b/test/language/expressions/assignment/dstr-array-elem-init-yield-expr.js new file mode 100644 index 0000000000..f2af1b9d6c --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-yield-expr.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement within a generator function body, it behaves as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var value = []; +var iterationResult, iter, x; +iter = (function*() { + +var result; +var vals = []; + +result = [ x = yield ] = vals; + + + +assert.sameValue(result, vals); + +})(); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(86); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 86); diff --git a/test/language/expressions/assignment/dstr-array-elem-init-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-array-elem-init-yield-ident-invalid.js new file mode 100644 index 0000000000..d1720c3c7e --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement outside of a generator function body, it behaves as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [ x = yield ] = []; diff --git a/test/language/expressions/assignment/dstr-array-elem-init-yield-ident-valid.js b/test/language/expressions/assignment/dstr-array-elem-init-yield-ident-valid.js new file mode 100644 index 0000000000..1daccdfef9 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-init-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement outside of a generator function body, it behaves as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 4; +var x; + +var result; +var vals = []; + +result = [ x = yield ] = vals; + +assert.sameValue(x, 4); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-get-err.js b/test/language/expressions/assignment/dstr-array-elem-iter-get-err.js new file mode 100644 index 0000000000..c88c8adbdb --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-get-err.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-get-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from GetIterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; +var _; + +assert.throws(Test262Error, function() { + 0, [ _ ] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-err.js b/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-err.js new file mode 100644 index 0000000000..9157b36a34 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-err.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-nrml-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from IteratorClose (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, result). + +---*/ +var nextCount = 0; +var returnCount = 0; +var _; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ _ ] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-null.js b/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-null.js new file mode 100644 index 0000000000..daeed08fd0 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-null.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-nrml-close-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var _; +var iterable = {}; +var nextCount = 0; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(TypeError, function() { + 0, [ _ ] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-skip.js b/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-skip.js new file mode 100644 index 0000000000..5f3f4ba58f --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close-skip.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-nrml-close-skip.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is not called when assignment evaluation has exhausted the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, result). + 6. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +var _; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ _ ] = vals; + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close.js b/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close.js new file mode 100644 index 0000000000..c08e077388 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-nrml-close.js @@ -0,0 +1,68 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-nrml-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is called when assignment evaluation has not exhausted the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var _; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ _ ] = vals; + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-err.js b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-err.js new file mode 100644 index 0000000000..6b6fa55b2d --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-err.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close-err.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [ {}[ yield ] ] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +} +iter = g(); +iter.next(); +assert.throws(Test262Error, function() { + iter.return(); +}); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js new file mode 100644 index 0000000000..012dc89929 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-null.js @@ -0,0 +1,64 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close-null.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var iterator = { + return: function() { + return null; + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; +function* g() { + +var result; +var vals = iterable; + +result = [ {}[yield] ] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js new file mode 100644 index 0000000000..628357252a --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close.js @@ -0,0 +1,74 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +var iter, result; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [ {}[yield] ] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +} +iter = g(); +iter.next(); +result = iter.return(777); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); +assert.sameValue(result.value, 777); +assert(result.done, 'Iterator correctly closed'); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close-err.js b/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close-err.js new file mode 100644 index 0000000000..3e8b409f1d --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close-err.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-thrw-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces a "throw" completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +function ReturnError() {} +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + + // This value should be discarded. + throw new ReturnError(); + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ {}[thrower()] ] = iterable; +}); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close-skip.js b/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close-skip.js new file mode 100644 index 0000000000..f4a3fdad94 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close-skip.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-thrw-close-skip.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is not called when iteration produces an abrupt completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; +var _; + +assert.throws(Test262Error, function() { + 0, [ x ] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close.js b/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close.js new file mode 100644 index 0000000000..d5088fddb6 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-iter-thrw-close.js @@ -0,0 +1,64 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-thrw-close.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces a "throw" completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ {}[thrower()] ] = iterable; +}); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array-invalid.js b/test/language/expressions/assignment/dstr-array-elem-nested-array-invalid.js new file mode 100644 index 0000000000..bc332cc21f --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [[(x, y)]] = [[]]; diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array-null.js b/test/language/expressions/assignment/dstr-array-elem-nested-array-null.js new file mode 100644 index 0000000000..7c4bf12cbd --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array-null.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `null`, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var _; + +assert.throws(TypeError, function() { + 0, [[ _ ]] = [null]; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined-hole.js b/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined-hole.js new file mode 100644 index 0000000000..8acf3347d7 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined-hole.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-undefined-hole.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is a "hole", a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var _; + +assert.throws(TypeError, function() { + 0, [[ _ ]] = [ , ]; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined-own.js b/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined-own.js new file mode 100644 index 0000000000..009ceeece7 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined-own.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-undefined-own.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `undefined`, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var _; + +assert.throws(TypeError, function() { + 0, [[ x ]] = [undefined]; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined.js b/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined.js new file mode 100644 index 0000000000..d3e8139ba0 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array-undefined.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-undefined.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and no value is defined, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var _; + +assert.throws(TypeError, function() { + 0, [[ x ]] = []; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-expr.js b/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-expr.js new file mode 100644 index 0000000000..7a4b4746f7 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-expr.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and within a generator function body, it behaves as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var value = [[22]]; +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var result; +var vals = value; + +result = [[x[yield]]] = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop, 22); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..a1d282f4ed --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment outside of strict mode, it behaves as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [[x[yield]]] = [[]]; diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-valid.js b/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..8f3572c93a --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment outside of strict mode, it behaves as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 'prop'; +var x = {}; + +var result; +var vals = [[22]]; + +result = [[x[yield]]] = vals; + +assert.sameValue(x.prop, 22); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-array.js b/test/language/expressions/assignment/dstr-array-elem-nested-array.js new file mode 100644 index 0000000000..b010d859f4 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-array.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = [[1]]; + +result = [[x]] = vals; + +assert.sameValue(x, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj-invalid.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj-invalid.js new file mode 100644 index 0000000000..1f4c1b2130 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [{ get x() {} }] = [{}]; diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj-null.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj-null.js new file mode 100644 index 0000000000..d9fc123c85 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj-null.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `null`, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, [{ x }] = [null]; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined-hole.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..a64c935e1e --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined-hole.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-undefined-hole.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is a "hole", a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, [{ x }] = [ , ]; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined-own.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined-own.js new file mode 100644 index 0000000000..b60a4d1937 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined-own.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-undefined-own.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `undefined`, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, [{ x }] = [undefined]; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined.js new file mode 100644 index 0000000000..e4faed63a6 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj-undefined.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-undefined.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and no value is defined, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, [{ x }] = []; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-expr.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-expr.js new file mode 100644 index 0000000000..ad80b1e959 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-expr.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and within a generator function body, it behaves as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var iterationResult, iter, x; + +iter = (function*() { + +var result; +var vals = [{}]; + +result = [{ x = yield }] = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(4); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 4); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..697a59cebb --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment outside of a generator function body, it behaves as a IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [{ x = yield }] = [{}]; diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-ident-valid.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..2a380afb48 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment outside of a generator function body, it behaves as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 2; +var x; + +var result; +var vals = [{}]; + +result = [{ x = yield }] = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-nested-obj.js b/test/language/expressions/assignment/dstr-array-elem-nested-obj.js new file mode 100644 index 0000000000..cfc1b91d50 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-nested-obj.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = [{ x: 2 }]; + +result = [{ x }] = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-put-const.js b/test/language/expressions/assignment/dstr-array-elem-put-const.js new file mode 100644 index 0000000000..6a8b827cc8 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-put-const.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-const.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: The assignment target should obey `const` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [const, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +const c = null; + +assert.throws(TypeError, function() { + 0, [ c ] = [1]; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-put-let.js b/test/language/expressions/assignment/dstr-array-elem-put-let.js new file mode 100644 index 0000000000..b3818309c3 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-put-let.js @@ -0,0 +1,24 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-let.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: The assignment target should obey `let` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [let, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(ReferenceError, function() { + 0, [ x ] = []; +}); + +let x; diff --git a/test/language/expressions/assignment/dstr-array-elem-put-prop-ref-no-get.js b/test/language/expressions/assignment/dstr-array-elem-put-prop-ref-no-get.js new file mode 100644 index 0000000000..c0b0b004f5 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-put-prop-ref-no-get.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-prop-ref-no-get.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x, setValue; +x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +var result; +var vals = [23]; + +result = [x.y] = vals; + +assert.sameValue(setValue, 23); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-put-prop-ref-user-err.js b/test/language/expressions/assignment/dstr-array-elem-put-prop-ref-user-err.js new file mode 100644 index 0000000000..4c8820ab0d --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-put-prop-ref-user-err.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-prop-ref-user-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Any error raised as a result of setting the value should be forwarded to the runtime. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = { + set y(val) { + throw new Test262Error(); + } +}; + +assert.throws(Test262Error, function() { + 0, [x.y] = [23]; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-put-prop-ref.js b/test/language/expressions/assignment/dstr-array-elem-put-prop-ref.js new file mode 100644 index 0000000000..ed045cf4c2 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-put-prop-ref.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-prop-ref.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = {}; + +var result; +var vals = [4]; + +result = [x.y] = vals; + +assert.sameValue(x.y, 4); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-put-unresolvable-no-strict.js b/test/language/expressions/assignment/dstr-array-elem-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..8bce4126f8 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-put-unresolvable-no-strict.js @@ -0,0 +1,32 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Outside of strict mode, if the the assignment target is an unresolvable reference, a new `var` binding should be created in the environment record. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +{ + +var result; +var vals = []; + +result = [ unresolvable ] = vals; + + + +assert.sameValue(result, vals); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/expressions/assignment/dstr-array-elem-put-unresolvable-strict.js b/test/language/expressions/assignment/dstr-array-elem-put-unresolvable-strict.js new file mode 100644 index 0000000000..e08b3b6ba5 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-put-unresolvable-strict.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-unresolvable-strict.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(ReferenceError, function() { + 0, [ unresolvable ] = []; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-target-identifier.js b/test/language/expressions/assignment/dstr-array-elem-target-identifier.js new file mode 100644 index 0000000000..4940264ea5 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-target-identifier.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-identifier.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Identifiers that appear as the DestructuringAssignmentTarget in an AssignmentElement should take on the iterated value corresponding to their position in the ArrayAssignmentPattern. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x, y, z; + +var result; +var vals = [1, 2, 3]; + +result = [x, y, z] = vals; + +assert.sameValue(x, 1); +assert.sameValue(y, 2); +assert.sameValue(z, 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-target-simple-no-strict.js b/test/language/expressions/assignment/dstr-array-elem-target-simple-no-strict.js new file mode 100644 index 0000000000..543bc54927 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-target-simple-no-strict.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-simple-no-strict.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Identifiers that appear as the DestructuringAssignmentTarget in an AssignmentElement should take on the iterated value corresponding to their position in the ArrayAssignmentPattern. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var argument, eval; + +var result; +var vals = [2, 3]; + +result = [arguments, eval] = vals; + +assert.sameValue(arguments, 2); +assert.sameValue(eval, 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-target-simple-strict.js b/test/language/expressions/assignment/dstr-array-elem-target-simple-strict.js new file mode 100644 index 0000000000..6f52f990cc --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-target-simple-strict.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-simple-strict.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget(LeftHandSideExpression) is false. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [arguments] = []; diff --git a/test/language/expressions/assignment/dstr-array-elem-target-yield-expr.js b/test/language/expressions/assignment/dstr-array-elem-target-yield-expr.js new file mode 100644 index 0000000000..ce84c80970 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-target-yield-expr.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement within a generator function body, it behaves as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var value = [33]; +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var result; +var vals = [33]; + +result = [ x[yield] ] = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop, 33); diff --git a/test/language/expressions/assignment/dstr-array-elem-target-yield-invalid.js b/test/language/expressions/assignment/dstr-array-elem-target-yield-invalid.js new file mode 100644 index 0000000000..59c9a950d1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-target-yield-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and outside of a generator function body, it behaves as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [ x[yield] ] = []; diff --git a/test/language/expressions/assignment/dstr-array-elem-target-yield-valid.js b/test/language/expressions/assignment/dstr-array-elem-target-yield-valid.js new file mode 100644 index 0000000000..fd47690f36 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-target-yield-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement outside of a generator function body, it behaves as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 'prop'; +var x = {}; + +var result; +var vals = [33]; + +result = [ x[yield] ] = vals; + +assert.sameValue(x.prop, 33); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-abpt.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-abpt.js new file mode 100644 index 0000000000..ea71596445 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-abpt.js @@ -0,0 +1,63 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-abpt.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned during evaluation of elision (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + i. If iteratorRecord.[[done]] is false, return + IteratorClose(iterator, status). + ii. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + if (nextCount === 2) { + throw new Test262Error(); + } + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + + +assert.throws(Test262Error, function() { + 0, [ x , , ] = iterable; +}); + +assert.sameValue(nextCount, 2); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js new file mode 100644 index 0000000000..04a59cd1a1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js @@ -0,0 +1,59 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from IteratorClose (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + [...] + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ x , , ] = iterable; +}); + +assert.sameValue(nextCount, 2); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js new file mode 100644 index 0000000000..83e9b18291 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js @@ -0,0 +1,62 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + [...] + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var x; +var nextCount = 0; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(TypeError, function() { + 0, [ x , , ] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js new file mode 100644 index 0000000000..69543ef31e --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js @@ -0,0 +1,60 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-skip.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose not invoked when elision exhausts the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + [...] + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + return { done: nextCount > 1 }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ x , , ] = vals; + +assert.sameValue(nextCount, 2); +assert.sameValue(returnCount, 0); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js new file mode 100644 index 0000000000..78449e9061 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose invoked when elision does not exhaust the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + [...] + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ x , , ] = vals; + +assert.sameValue(nextCount, 2); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-get-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-get-err.js new file mode 100644 index 0000000000..dc58e251a1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-get-err.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-get-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from GetIterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; +var x; + +assert.throws(Test262Error, function() { + 0, [ x , ] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-err.js new file mode 100644 index 0000000000..3a9b11e1ce --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-err.js @@ -0,0 +1,59 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from IteratorClose (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +var x; +var iterator = { + next: function() { + nextCount += 1; + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ x , ] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-null.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-null.js new file mode 100644 index 0000000000..8e9df97b8b --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-null.js @@ -0,0 +1,62 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var x; +var nextCount = 0; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(TypeError, function() { + 0, [ x , ] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-skip.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-skip.js new file mode 100644 index 0000000000..e5c961d9d2 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close-skip.js @@ -0,0 +1,61 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-skip.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is not invoked when evaluation of AssignmentElementList exhausts the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +var x; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ x , ] = vals; + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close.js new file mode 100644 index 0000000000..6e93891663 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-nrml-close.js @@ -0,0 +1,74 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-nrml-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList completes without exhausting the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ x , ] = vals; + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js new file mode 100644 index 0000000000..af2468b11f --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-err.js @@ -0,0 +1,74 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "return" completion and the iterator has not been marked as "done" (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + + throw new Test262Error(); + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [ {}[yield] , ] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); +assert.throws(Test262Error, function() { + iter.return(); +}); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js new file mode 100644 index 0000000000..f622e7d898 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close-null.js @@ -0,0 +1,71 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var iterator = { + return: function() { + return null; + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [ {}[yield] , ] = vals; + + + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js new file mode 100644 index 0000000000..23110527ea --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-rtrn-close.js @@ -0,0 +1,82 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "return" completion and the iterator has not been marked as "done" (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +var iter, result; + +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [ {}[yield] , ] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +}; + +iter = g(); +iter.next(); +result = iter.return(888); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); +assert.sameValue(result.value, 888); +assert(result.done, 'Iterator correctly closed'); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-err.js new file mode 100644 index 0000000000..e39edc5faf --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-err.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "throw" completion and the iterator has not been marked as "done" (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 7. If completion.[[type]] is throw, return Completion(completion). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +function ReturnError() {} +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + + // This value should be discarded. + throw new ReturnError(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + + +assert.throws(Test262Error, function() { + 0, [ {}[thrower()] , ] = iterable; +}); + + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-skip.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-skip.js new file mode 100644 index 0000000000..3bf2364bde --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close-skip.js @@ -0,0 +1,58 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-skip.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is not invoked when evaluation of AssignmentElementList returns an abrupt completion and the iterator has been marked as "done" (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; +var x; + +assert.throws(Test262Error, function() { + 0, [ x , ] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close.js new file mode 100644 index 0000000000..44610340bd --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-list-thrw-close.js @@ -0,0 +1,70 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-thrw-close.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "throw" completion and the iterator has not been marked as "done" (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ {}[thrower()] , ] = iterable; +}); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js new file mode 100644 index 0000000000..8db3107a14 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js @@ -0,0 +1,61 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-nrml-close-skip.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is not called when rest element evaluation has exhausted the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x, y; +var iterator = { + next: function() { + nextCount += 1; + return { value: nextCount, done: nextCount > 1 }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ x , ...y ] = vals; + + + +assert.sameValue(result, vals); + +assert.sameValue(nextCount, 2, 'nextCount'); +assert.sameValue(returnCount, 0, 'returnCount'); +assert.sameValue(x, 1, 'x'); +assert.sameValue(y.length, 0, 'y.length'); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js new file mode 100644 index 0000000000..fdedff0982 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js @@ -0,0 +1,83 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-err.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "return" completion due to reference evaluation (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var nextCount = 0; +var returnCount = 0; +var unreachable = 0; +var x; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + + throw new Test262Error(); + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; +function* g() { + +var result; +var vals = iterable; + +result = [ x , ...{}[yield] ] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); + +assert.throws(Test262Error, function() { + iter.return(); +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js new file mode 100644 index 0000000000..c383c8f2df --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js @@ -0,0 +1,78 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-null.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var nextCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [ x , ...{}[yield] ] = vals; + + + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); + +assert.sameValue(nextCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close.js new file mode 100644 index 0000000000..daebe1fbd6 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-rtrn-close.js @@ -0,0 +1,89 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "return" completion due to reference evaluation (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var nextCount = 0; +var returnCount = 0; +var unreachable = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +var iter, result; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [ x , ...{}[yield] ] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); +result = iter.return(999); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); +assert.sameValue(result.value, 999); +assert(result.done, 'Iterator correctly closed'); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-err.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-err.js new file mode 100644 index 0000000000..f64b4614f4 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-err.js @@ -0,0 +1,68 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "throw" completion due to reference evaluation (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 7. If completion.[[type]] is throw, return Completion(completion) + +---*/ +var nextCount = 0; +var returnCount = 0; +var x; +function ReturnError() {} +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + + // This value should be discarded. + throw new ReturnError(); + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ x , ...{}[thrower()] ] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-skip.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-skip.js new file mode 100644 index 0000000000..e766f8b167 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close-skip.js @@ -0,0 +1,61 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-skip.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned during iteration for rest element (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + if (nextCount === 2) { + throw new Test262Error(); + } + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ x , ...x ] = iterable; +}); + +assert.sameValue(nextCount, 2); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close.js b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close.js new file mode 100644 index 0000000000..61e470d60f --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elem-trlg-iter-rest-thrw-close.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "throw" completion due to reference evaluation (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ x , ...{}[thrower()] ] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/expressions/assignment/dstr-array-elision-iter-abpt.js b/test/language/expressions/assignment/dstr-array-elision-iter-abpt.js new file mode 100644 index 0000000000..1467f5159d --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-iter-abpt.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-abpt.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is not called when iteration produces an abrupt completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ , ] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-elision-iter-get-err.js b/test/language/expressions/assignment/dstr-array-elision-iter-get-err.js new file mode 100644 index 0000000000..a0327e08a8 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-iter-get-err.js @@ -0,0 +1,32 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-get-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from GetIterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; + +assert.throws(Test262Error, function() { + 0, [ , ] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-err.js b/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-err.js new file mode 100644 index 0000000000..3748199a85 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-err.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from IteratorClose (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [ , ] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-null.js b/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-null.js new file mode 100644 index 0000000000..e00ac5673c --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-null.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + [...] + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var nextCount = 0; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(TypeError, function() { + 0, [ , ] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-skip.js b/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-skip.js new file mode 100644 index 0000000000..c8f770a1d3 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close-skip.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close-skip.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is not called when iteration has exhausted the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ , ] = vals; + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close.js b/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close.js new file mode 100644 index 0000000000..8c2c28a86f --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-iter-nrml-close.js @@ -0,0 +1,68 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is called when assignment evaluation has not exhausted the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + [...] + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ , ] = vals; + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elision-val-array.js b/test/language/expressions/assignment/dstr-array-elision-val-array.js new file mode 100644 index 0000000000..60af029511 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-val-array.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-array.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +var result; +var vals = []; + +result = [,] = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elision-val-bool.js b/test/language/expressions/assignment/dstr-array-elision-val-bool.js new file mode 100644 index 0000000000..df78fb3ea4 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-val-bool.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-bool.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for boolean values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, [,] = true; +}); diff --git a/test/language/expressions/assignment/dstr-array-elision-val-null.js b/test/language/expressions/assignment/dstr-array-elision-val-null.js new file mode 100644 index 0000000000..58d29eaba9 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-val-null.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for `null`. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, [,] = null; +}); diff --git a/test/language/expressions/assignment/dstr-array-elision-val-num.js b/test/language/expressions/assignment/dstr-array-elision-val-num.js new file mode 100644 index 0000000000..4efb1edc73 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-val-num.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-num.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for number values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, [,] = 1; +}); diff --git a/test/language/expressions/assignment/dstr-array-elision-val-string.js b/test/language/expressions/assignment/dstr-array-elision-val-string.js new file mode 100644 index 0000000000..3e82658797 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-val-string.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-string.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +var result; +var vals = 'string literal'; + +result = [,] = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-elision-val-symbol.js b/test/language/expressions/assignment/dstr-array-elision-val-symbol.js new file mode 100644 index 0000000000..cf8202c284 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-val-symbol.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-symbol.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for symbol values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var s = Symbol(); + +assert.throws(TypeError, function() { + 0, [,] = s; +}); diff --git a/test/language/expressions/assignment/dstr-array-elision-val-undef.js b/test/language/expressions/assignment/dstr-array-elision-val-undef.js new file mode 100644 index 0000000000..d1c328fa2b --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-elision-val-undef.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-undef.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for `undefined`. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, [,] = undefined; +}); diff --git a/test/language/expressions/assignment/dstr-array-empty-iter-close-err.js b/test/language/expressions/assignment/dstr-array-empty-iter-close-err.js new file mode 100644 index 0000000000..e321f6bd28 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-iter-close-err.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from IteratorClose (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + 3. Return IteratorClose(iterator, NormalCompletion(empty)). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [] = iterable; +}); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-empty-iter-close-null.js b/test/language/expressions/assignment/dstr-array-empty-iter-close-null.js new file mode 100644 index 0000000000..af087ba0e1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-iter-close-null.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-close-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + 3. Return IteratorClose(iterator, NormalCompletion(empty)). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var iterator = { + next: function() { + return { done: true }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(TypeError, function() { + 0, [] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-empty-iter-close.js b/test/language/expressions/assignment/dstr-array-empty-iter-close.js new file mode 100644 index 0000000000..e0cf140a67 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-iter-close.js @@ -0,0 +1,64 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Iterator is closed without iterating (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + 3. Return IteratorClose(iterator, NormalCompletion(empty)). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [] = vals; + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-empty-iter-get-err.js b/test/language/expressions/assignment/dstr-array-empty-iter-get-err.js new file mode 100644 index 0000000000..9c7eff294d --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-iter-get-err.js @@ -0,0 +1,32 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-get-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from GetIterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; + +assert.throws(Test262Error, function() { + 0, [] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-empty-val-array.js b/test/language/expressions/assignment/dstr-array-empty-val-array.js new file mode 100644 index 0000000000..3c923620df --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-val-array.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-array.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +var result; +var vals = []; + +result = [] = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-empty-val-bool.js b/test/language/expressions/assignment/dstr-array-empty-val-bool.js new file mode 100644 index 0000000000..c177da2723 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-val-bool.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-bool.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for boolean values (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, [] = true; +}); diff --git a/test/language/expressions/assignment/dstr-array-empty-val-null.js b/test/language/expressions/assignment/dstr-array-empty-val-null.js new file mode 100644 index 0000000000..723b00567b --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-val-null.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for `null`. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, [] = null; +}); diff --git a/test/language/expressions/assignment/dstr-array-empty-val-num.js b/test/language/expressions/assignment/dstr-array-empty-val-num.js new file mode 100644 index 0000000000..e9f56c1cd4 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-val-num.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-num.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for number values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, [] = 1; +}); diff --git a/test/language/expressions/assignment/dstr-array-empty-val-string.js b/test/language/expressions/assignment/dstr-array-empty-val-string.js new file mode 100644 index 0000000000..8655fc51af --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-val-string.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-string.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +var result; +var vals = 'string literal'; + +result = [] = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-empty-val-symbol.js b/test/language/expressions/assignment/dstr-array-empty-val-symbol.js new file mode 100644 index 0000000000..1938b2e015 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-val-symbol.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-symbol.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for Symbol values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var s = Symbol(); + +assert.throws(TypeError, function() { + 0, [] = s; +}); diff --git a/test/language/expressions/assignment/dstr-array-empty-val-undef.js b/test/language/expressions/assignment/dstr-array-empty-val-undef.js new file mode 100644 index 0000000000..08dd5c823e --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-empty-val-undef.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-undef.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for `undefined`. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, [] = undefined; +}); diff --git a/test/language/expressions/assignment/dstr-array-iteration.js b/test/language/expressions/assignment/dstr-array-iteration.js new file mode 100644 index 0000000000..bb561f3276 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-iteration.js @@ -0,0 +1,35 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-iteration.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Value iteration only proceeds for the number of elements in the ArrayAssignmentPattern. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var count = 0; +var g = function*() { + count += 1; + yield; + count += 1; + yield; + count += 1; +} + +var result; +var vals = g(); + +result = [,,] = vals; + +assert.sameValue(count, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-after-element.js b/test/language/expressions/assignment/dstr-array-rest-after-element.js new file mode 100644 index 0000000000..93fbf591b2 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-after-element.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-after-element.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An AssignmentRestElement following an AssignmentElement consumes all remaining iterable values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x, y; + +var result; +var vals = [1, 2, 3]; + +result = [x, ...y] = vals; + +assert.sameValue(x, 1); +assert.sameValue(y.length, 2); +assert.sameValue(y[0], 2); +assert.sameValue(y[1], 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-after-elision.js b/test/language/expressions/assignment/dstr-array-rest-after-elision.js new file mode 100644 index 0000000000..0f96c207b1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-after-elision.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-after-elision.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An AssignmentRestElement following an elision consumes all remaining iterable values. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = [1, 2, 3]; + +result = [, ...x] = vals; + +assert.sameValue(x.length, 2); +assert.sameValue(x[0], 2); +assert.sameValue(x[1], 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-before-element.js b/test/language/expressions/assignment/dstr-array-rest-before-element.js new file mode 100644 index 0000000000..2e564cdb58 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-before-element.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-element.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: An AssignmentElement may not follow an AssignmentRestElement in an AssignmentElementList. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [...x, y] = []; diff --git a/test/language/expressions/assignment/dstr-array-rest-before-elision.js b/test/language/expressions/assignment/dstr-array-rest-before-elision.js new file mode 100644 index 0000000000..64ff235d75 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-before-elision.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-elision.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: An elision may not follow an AssignmentRestElement in an AssignmentElementList. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [...x,] = []; diff --git a/test/language/expressions/assignment/dstr-array-rest-before-rest.js b/test/language/expressions/assignment/dstr-array-rest-before-rest.js new file mode 100644 index 0000000000..6e71a160dc --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-before-rest.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-rest.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: An AssignmentRestElement may not follow another AssignmentRestElement in an AssignmentElementList. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [...x, ...y] = []; diff --git a/test/language/expressions/assignment/dstr-array-rest-elision-invalid.js b/test/language/expressions/assignment/dstr-array-rest-elision-invalid.js new file mode 100644 index 0000000000..e21fba847b --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-elision-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-elision-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: ArrayAssignmentPattern may not include elisions following an AssignmentRestElement in a AssignmentElementList. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [...x,] = []; diff --git a/test/language/expressions/assignment/dstr-array-rest-elision-iter-abpt.js b/test/language/expressions/assignment/dstr-array-rest-elision-iter-abpt.js new file mode 100644 index 0000000000..e738d2c806 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-elision-iter-abpt.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-elision-iter-abpt.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is not called when assignment evaluation produces an abrupt completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 4. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + i. If iteratorRecord.[[done]] is false, return + IteratorClose(iterator, status). + ii. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; +var x; + +assert.throws(Test262Error, function() { + 0, [ , ...x] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-rest-elision.js b/test/language/expressions/assignment/dstr-array-rest-elision.js new file mode 100644 index 0000000000..84074ae5d1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-elision.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-elision.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: ArrayAssignmentPattern may include elisions at any position preceeding a AssignmentRestElement in a AssignmentElementList. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x, y; + +var result; +var vals = [1, 2, 3, 4, 5, 6]; + +result = [, , x, , ...y] = vals; + +assert.sameValue(x, 3); +assert.sameValue(y.length, 2); +assert.sameValue(y[0], 5); +assert.sameValue(y[1], 6); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-init.js b/test/language/expressions/assignment/dstr-array-rest-init.js new file mode 100644 index 0000000000..c5060f0071 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-init.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-init.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: The AssignmentRestElement does not support an initializer. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +0, [...x = 1] = []; diff --git a/test/language/expressions/assignment/dstr-array-rest-iter-get-err.js b/test/language/expressions/assignment/dstr-array-rest-iter-get-err.js new file mode 100644 index 0000000000..11d5056e00 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iter-get-err.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-get-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Abrupt completion returned from GetIterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +var x; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; + +assert.throws(Test262Error, function() { + 0, [...x] = iterable; +}); diff --git a/test/language/expressions/assignment/dstr-array-rest-iter-nrml-close-skip.js b/test/language/expressions/assignment/dstr-array-rest-iter-nrml-close-skip.js new file mode 100644 index 0000000000..01b23a4f41 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iter-nrml-close-skip.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-nrml-close-skip.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is not called when assignment evaluation has exhausted the iterator (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 7. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +var x; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [ ...x ] = vals; + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close-err.js b/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close-err.js new file mode 100644 index 0000000000..a4a64b8818 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close-err.js @@ -0,0 +1,79 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close-err.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +function ReturnError() {} +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + + throw new Test262Error(); + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [...{}[yield]] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); +assert.throws(Test262Error, function() { + iter.return(); +}); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close-null.js b/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close-null.js new file mode 100644 index 0000000000..cf138d00a1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close-null.js @@ -0,0 +1,78 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close-null.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var iterable = {}; +var iterator = { + return: function() { + return null; + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [...{}[yield]] = vals; + + + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close.js b/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close.js new file mode 100644 index 0000000000..bd2ec5590f --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iter-rtrn-close.js @@ -0,0 +1,90 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +var iter, result; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var result; +var vals = iterable; + +result = [...{}[yield]] = vals; + +unreachable += 1; + +assert.sameValue(result, vals); + +} + +iter = g(); +iter.next(); +result = iter.return(444); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); +assert.sameValue(result.value, 444); +assert(result.done, 'Iterator correctly closed'); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close-err.js b/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close-err.js new file mode 100644 index 0000000000..2b62e493fd --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close-err.js @@ -0,0 +1,68 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-thrw-close-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces a "throw" completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + +---*/ +var nextCount = 0; +var returnCount = 0; +var x; +function ReturnError() {} +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + + // This value should be discarded. + throw new ReturnError(); + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + + +assert.throws(Test262Error, function() { + 0, [...{}[thrower()]] = iterable; +}); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close-skip.js b/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close-skip.js new file mode 100644 index 0000000000..fc140e82ca --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close-skip.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-thrw-close-skip.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is not called when iteration produces an abrupt completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + +---*/ +var nextCount = 0; +var returnCount = 0; +var x; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [...x] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close.js b/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close.js new file mode 100644 index 0000000000..78e65dec71 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iter-thrw-close.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-thrw-close.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces a "throw" completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var x; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [...{}[thrower()]] = iterable; +}); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/expressions/assignment/dstr-array-rest-iteration.js b/test/language/expressions/assignment/dstr-array-rest-iteration.js new file mode 100644 index 0000000000..90bc5a5b1d --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-iteration.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iteration.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: In the presense of an AssignmentRestElement, value iteration exhausts the iterable value; (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var count = 0; +var g = function*() { + count += 1; + yield; + count += 1; + yield; + count += 1; +} +var x; + +var result; +var vals = g(); + +result = [...x] = vals; + +assert.sameValue(count, 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-lref-err.js b/test/language/expressions/assignment/dstr-array-rest-lref-err.js new file mode 100644 index 0000000000..bb90311ebd --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-lref-err.js @@ -0,0 +1,60 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-lref-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is called when reference evaluation produces an abrupt completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [...{}[thrower()]] = iterable; +}); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/expressions/assignment/dstr-array-rest-lref.js b/test/language/expressions/assignment/dstr-array-rest-lref.js new file mode 100644 index 0000000000..7cc4bed084 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-lref.js @@ -0,0 +1,64 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-lref.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Reference is evaluated during assignment (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +var obj = {}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var result; +var vals = iterable; + +result = [...obj['a' + 'b']] = vals; + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); +assert(!!obj.ab); +assert.sameValue(obj.ab.length, 0); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-invalid.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-invalid.js new file mode 100644 index 0000000000..76218cb566 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [...[(x, y)]] = [[]]; diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-iter-thrw-close-skip.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-iter-thrw-close-skip.js new file mode 100644 index 0000000000..5076e7599a --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-iter-thrw-close-skip.js @@ -0,0 +1,63 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-iter-thrw-close-skip.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is not called when nested array pattern evaluation produces an abrupt completion (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + [...] + 4. Repeat while iteratorRecord.[[done]] is false + [...] + d. If next is false, set iteratorRecord.[[done]] to true. + [...] + 7. Return the result of performing DestructuringAssignmentEvaluation of + nestedAssignmentPattern with A as the argument. + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [...[...{}[thrower()]]] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-null.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-null.js new file mode 100644 index 0000000000..14b0d60f3e --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-null.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-null.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable emits `null` as the only value, an array with a single `null` element should be used as the value of the nested DestructuringAssignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x, y; + +var result; +var vals = [null]; + +result = [...[x, y]] = vals; + +assert.sameValue(x, null); +assert.sameValue(y, undefined); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined-hole.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined-hole.js new file mode 100644 index 0000000000..581d1b9f5a --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined-hole.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined-hole.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable is an array with a "hole", an array with a single `undefined` element should be used as the value of the nested DestructuringAssignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; + +var result; +var vals = [ , ]; + +result = [...[x]] = vals; + +assert.sameValue(x, undefined); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined-own.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined-own.js new file mode 100644 index 0000000000..10054adb7b --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined-own.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined-own.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable emits `undefined` as the only value, an array with a single `undefined` element should be used as the value of the nested DestructuringAssignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; + +var result; +var vals = [undefined]; + +result = [...[x]] = vals; + +assert.sameValue(x, undefined); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined.js new file mode 100644 index 0000000000..c999165d54 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-undefined.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable is emits no values, an empty array should be used as the value of the nested DestructuringAssignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; + +var result; +var vals = []; + +result = [...[x]] = vals; + +assert.sameValue(x, undefined); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-expr.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-expr.js new file mode 100644 index 0000000000..d94e900fea --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-expr.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and within a generator function body, it should behave as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var value = [86]; +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var result; +var vals = [86]; + +result = [...[x[yield]]] = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop, 86); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..26da6af702 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [...[x[yield]]] = []; diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-ident-valid.js b/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..490e2e83b6 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 'prop'; +var x = {}; + +var result; +var vals = [86]; + +result = [...[x[yield]]] = vals; + +assert.sameValue(x.prop, 86); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-array.js b/test/language/expressions/assignment/dstr-array-rest-nested-array.js new file mode 100644 index 0000000000..3356e8e039 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-array.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = [1, 2, 3]; + +result = [...[x]] = vals; + +assert.sameValue(x, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj-invalid.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj-invalid.js new file mode 100644 index 0000000000..7398cf2fa8 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [...{ get x() {} }] = [[]]; diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj-null.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj-null.js new file mode 100644 index 0000000000..fb6188e7d5 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj-null.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-null.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the iterable emits `null` as the only value, an array with a single `null` element should be used as the value of the nested DestructuringAssignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x, length; + +var result; +var vals = [null]; + +result = [...{ 0: x, length }] = vals; + +assert.sameValue(x, null); +assert.sameValue(length, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-hole.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..c274ff785a --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-hole.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined-hole.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable is an array with a "hole", an array with a single `undefined` element should be used as the value of the nested DestructuringAssignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var length; + +var result; +var vals = [ , ]; + +result = [...{ 0: x, length }] = vals; + +assert.sameValue(x, undefined); +assert.sameValue(length, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-own.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-own.js new file mode 100644 index 0000000000..935e04cfe0 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-own.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined-own.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable emits `undefined` as the only value, an array with a single `undefined` element should be used as the value of the nested DestructuringAssignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var length; + +var result; +var vals = [undefined]; + +result = [...{ 0: x, length }] = vals; + +assert.sameValue(x, undefined); +assert.sameValue(length, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined.js new file mode 100644 index 0000000000..19f376b313 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj-undefined.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an obect literal and the iterable is emits no values, an empty array should be used as the value of the nested DestructuringAssignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var length; + +var result; +var vals = []; + +result = [...{ 0: x, length }] = vals; + +assert.sameValue(x, undefined); +assert.sameValue(length, 0); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-expr.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-expr.js new file mode 100644 index 0000000000..6573e1a3d0 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-expr.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and within a generator function body, it should behave as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var iterationResult, iter, x; + +iter = (function*() { + +var result; +var vals = [{}]; + +result = [...{ x = yield }] = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(4); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 4); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..d89d68fe2b --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, [...{ x = yield }] = [{}]; diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-valid.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..9c97d8feb1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 2; +var x; + +var result; +var vals = [{}]; + +result = [...{ x = yield }] = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-nested-obj.js b/test/language/expressions/assignment/dstr-array-rest-nested-obj.js new file mode 100644 index 0000000000..b543abf2e9 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-nested-obj.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = [1, 2, 3]; + +result = [...{ 1: x }] = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-put-const.js b/test/language/expressions/assignment/dstr-array-rest-put-const.js new file mode 100644 index 0000000000..2661b4bdd0 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-put-const.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-const.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: The assignment target should obey `const` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [const, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +const c = null; + +assert.throws(TypeError, function() { + 0, [ ...c ] = [1]; +}); diff --git a/test/language/expressions/assignment/dstr-array-rest-put-let.js b/test/language/expressions/assignment/dstr-array-rest-put-let.js new file mode 100644 index 0000000000..437cfcac13 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-put-let.js @@ -0,0 +1,24 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-let.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: The assignment target should obey `let` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [let, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(ReferenceError, function() { + 0, [ ...x ] = []; +}); + +let x; diff --git a/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-no-get.js b/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-no-get.js new file mode 100644 index 0000000000..a608e049ae --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-no-get.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref-no-get.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var setValue; +var x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +var result; +var vals = [23, 45, 99]; + +result = [...x.y] = vals; + +assert.sameValue(setValue.length, 3); +assert.sameValue(setValue[0], 23); +assert.sameValue(setValue[1], 45); +assert.sameValue(setValue[2], 99); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js b/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js new file mode 100644 index 0000000000..662fff9f6f --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref-user-err-iter-close-skip.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: IteratorClose is not called when value assignment produces an abrupt completion. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + [...] + 4. Repeat while iteratorRecord.[[done]] is false + [...] + d. If next is false, set iteratorRecord.[[done]] to true. + [...] + 5. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Return PutValue(lref, A). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +var obj = Object.defineProperty({}, 'poisoned', { + set: function(x) { + throw new Test262Error(); + } +}); +iterable[Symbol.iterator] = function() { + return iterator; +}; + +assert.throws(Test262Error, function() { + 0, [...obj.poisoned] = iterable; +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-user-err.js b/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-user-err.js new file mode 100644 index 0000000000..5862de9fc9 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-put-prop-ref-user-err.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref-user-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Any error raised as a result of setting the value should be forwarded to the runtime. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = { + set y(val) { + throw new Test262Error(); + } +}; + +assert.throws(Test262Error, function() { + 0, [...x.y] = [23]; +}); diff --git a/test/language/expressions/assignment/dstr-array-rest-put-prop-ref.js b/test/language/expressions/assignment/dstr-array-rest-put-prop-ref.js new file mode 100644 index 0000000000..4a2e57e446 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-put-prop-ref.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = {}; + +var result; +var vals = [4, 3, 2]; + +result = [...x.y] = vals; + +assert.sameValue(x.y.length, 3); +assert.sameValue(x.y[0], 4); +assert.sameValue(x.y[1], 3); +assert.sameValue(x.y[2], 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-array-rest-put-unresolvable-no-strict.js b/test/language/expressions/assignment/dstr-array-rest-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..00970f8106 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-put-unresolvable-no-strict.js @@ -0,0 +1,32 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Outside of strict mode, if the the assignment target is an unresolvable reference, a new `var` binding should be created in the environment record. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +{ + +var result; +var vals = []; + +result = [ ...unresolvable ] = vals; + + + +assert.sameValue(result, vals); + +} + +assert.sameValue(unresolvable.length, 0); diff --git a/test/language/expressions/assignment/dstr-array-rest-put-unresolvable-strict.js b/test/language/expressions/assignment/dstr-array-rest-put-unresolvable-strict.js new file mode 100644 index 0000000000..156a2fc038 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-put-unresolvable-strict.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-unresolvable-strict.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(ReferenceError, function() { + 0, [ ...unresolvable ] = []; +}); diff --git a/test/language/expressions/assignment/dstr-array-rest-yield-expr.js b/test/language/expressions/assignment/dstr-array-rest-yield-expr.js new file mode 100644 index 0000000000..b03071cd9e --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-yield-expr.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentRestElement and within the body of a generator function, it should behave as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var result; +var vals = [33, 44, 55]; + +result = [...x[yield]] = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop.length, 3); +assert.sameValue(x.prop[0], 33); +assert.sameValue(x.prop[1], 44); +assert.sameValue(x.prop[2], 55); diff --git a/test/language/expressions/assignment/dstr-array-rest-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-array-rest-yield-ident-invalid.js new file mode 100644 index 0000000000..ced6e4a006 --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-yield-ident-invalid.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentRestElement and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = {}; + +0, [...x[yield]] = []; diff --git a/test/language/expressions/assignment/dstr-array-rest-yield-ident-valid.js b/test/language/expressions/assignment/dstr-array-rest-yield-ident-valid.js new file mode 100644 index 0000000000..0b2fb794fd --- /dev/null +++ b/test/language/expressions/assignment/dstr-array-rest-yield-ident-valid.js @@ -0,0 +1,32 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentRestElement and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 'prop'; +var x = {}; + +var result; +var vals = [33, 44, 55]; + +result = [...x[yield]] = vals; + +assert.sameValue(x.prop.length, 3); +assert.sameValue(x.prop[0], 33); +assert.sameValue(x.prop[1], 44); +assert.sameValue(x.prop[2], 55); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-empty-bool.js b/test/language/expressions/assignment/dstr-obj-empty-bool.js new file mode 100644 index 0000000000..e4ea0a72da --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-empty-bool.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-bool.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (boolean value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +var result; +var vals = false; + +result = {} = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-empty-null.js b/test/language/expressions/assignment/dstr-obj-empty-null.js new file mode 100644 index 0000000000..c3ac620bc0 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-empty-null.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (null value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, {} = null; +}); diff --git a/test/language/expressions/assignment/dstr-obj-empty-num.js b/test/language/expressions/assignment/dstr-obj-empty-num.js new file mode 100644 index 0000000000..a8e1b0bd9b --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-empty-num.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-num.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (number value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +var result; +var vals = 0; + +result = {} = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-empty-obj.js b/test/language/expressions/assignment/dstr-obj-empty-obj.js new file mode 100644 index 0000000000..1dd88242a6 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-empty-obj.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-obj.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (object value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +var result; +var vals = {}; + +result = {} = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-empty-string.js b/test/language/expressions/assignment/dstr-obj-empty-string.js new file mode 100644 index 0000000000..31378e1734 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-empty-string.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-string.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (string value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +var result; +var vals = ''; + +result = {} = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-empty-symbol.js b/test/language/expressions/assignment/dstr-obj-empty-symbol.js new file mode 100644 index 0000000000..4a22f2eb6f --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-empty-symbol.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-symbol.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (symbol value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [Symbol, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var s = Symbol(); + +var result; +var vals = s; + +result = {} = vals; + + + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-empty-undef.js b/test/language/expressions/assignment/dstr-obj-empty-undef.js new file mode 100644 index 0000000000..fb7b67b269 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-empty-undef.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-undef.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (undefined value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(TypeError, function() { + 0, {} = undefined; +}); diff --git a/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-first.js b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-first.js new file mode 100644 index 0000000000..1b2c9cbf38 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-first.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-first.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var y; + +var result; +var vals = { x: 3 }; + +result = { x, y } = vals; + +assert.sameValue(x, 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-last.js b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-last.js new file mode 100644 index 0000000000..2cb4190014 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-last.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-last.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var w; + +var result; +var vals = { x: 4 }; + +result = { w, x } = vals; + +assert.sameValue(x, 4); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-lone.js b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-lone.js new file mode 100644 index 0000000000..841d35a0ce --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-lone.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-lone.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; + +var result; +var vals = { x: 2 }; + +result = { x, } = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-middle.js b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-middle.js new file mode 100644 index 0000000000..1fe3c7ef13 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-middle.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-middle.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var w, y; + +var result; +var vals = { x: 5 }; + +result = { w, x, y } = vals; + +assert.sameValue(x, 5); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-trlng.js b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-trlng.js new file mode 100644 index 0000000000..94a7db4714 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-identifier-resolution-trlng.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-trlng.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier with trailing comma) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; + +var result; +var vals = { x: 1 }; + +result = { x } = vals; + +assert.sameValue(x, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-identifier-yield-expr.js b/test/language/expressions/assignment/dstr-obj-id-identifier-yield-expr.js new file mode 100644 index 0000000000..ba6f300be5 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-identifier-yield-expr.js @@ -0,0 +1,24 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-expr.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: yield is not a valid IdentifierReference in an AssignmentProperty within generator function bodies. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated, noStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +(function*() { + +0, { yield } = {}; + +}); diff --git a/test/language/expressions/assignment/dstr-obj-id-identifier-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-obj-id-identifier-yield-ident-invalid.js new file mode 100644 index 0000000000..2f322d4a2f --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-identifier-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: yield is not a valid IdentifierReference in an AssignmentProperty within strict mode code. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { yield } = {}; diff --git a/test/language/expressions/assignment/dstr-obj-id-identifier-yield-ident-valid.js b/test/language/expressions/assignment/dstr-obj-id-identifier-yield-ident-valid.js new file mode 100644 index 0000000000..49bcdb7fda --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-identifier-yield-ident-valid.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: yield is a valid IdentifierReference in an AssignmentProperty outside of strict mode and generator functions. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield; + +var result; +var vals = { yield: 3 }; + +result = { yield } = vals; + +assert.sameValue(yield, 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-assignment-missing.js b/test/language/expressions/assignment/dstr-obj-id-init-assignment-missing.js new file mode 100644 index 0000000000..80d7aa6e67 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-assignment-missing.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-missing.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (no corresponding property defined). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = {}; + +result = { x = 1 } = vals; + +assert.sameValue(x, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-assignment-null.js b/test/language/expressions/assignment/dstr-obj-id-init-assignment-null.js new file mode 100644 index 0000000000..2aa61c8e61 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-assignment-null.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-null.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (null property value defined). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = { x: null }; + +result = { x = 1 } = vals; + +assert.sameValue(x, null); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-assignment-truthy.js b/test/language/expressions/assignment/dstr-obj-id-init-assignment-truthy.js new file mode 100644 index 0000000000..0e8b204003 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-assignment-truthy.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-truthy.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (truthy property value defined). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = { x: 2 }; + +result = { x = 1 } = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-assignment-undef.js b/test/language/expressions/assignment/dstr-obj-id-init-assignment-undef.js new file mode 100644 index 0000000000..367abf7e31 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-assignment-undef.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-undef.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference ("undefined" property value defined). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = { x: undefined }; + +result = { x = 1 } = vals; + +assert.sameValue(x, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-evaluation.js b/test/language/expressions/assignment/dstr-obj-id-init-evaluation.js new file mode 100644 index 0000000000..e45550bcdf --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-evaluation.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-evaluation.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var flag1 = false; +var flag2 = false; +var x, y; + +var result; +var vals = { y: 1 }; + +result = { x = flag1 = true, y = flag2 = true } = vals; + +assert.sameValue(flag1, true); +assert.sameValue(flag2, false); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-fn-name-arrow.js b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-arrow.js new file mode 100644 index 0000000000..e723f4acc7 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-arrow.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-arrow.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var arrow; + +var result; +var vals = {}; + +result = { arrow = () => {} } = vals; + +assert.sameValue(arrow.name, 'arrow'); +verifyNotEnumerable(arrow, 'name'); +verifyNotWritable(arrow, 'name'); +verifyConfigurable(arrow, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-fn-name-class.js b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-class.js new file mode 100644 index 0000000000..6ea372c0ea --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-class.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-class.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [class, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var xCls, cls; + +var result; +var vals = {}; + +result = { xCls = class x {}, cls = class {} } = vals; + +assert.notSameValue(xCls.name, 'xCls'); + +assert.sameValue(cls.name, 'cls'); +verifyNotEnumerable(cls, 'name'); +verifyNotWritable(cls, 'name'); +verifyConfigurable(cls, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-fn-name-cover.js b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-cover.js new file mode 100644 index 0000000000..b178e1d7b4 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-cover.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-cover.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var xCover, cover; + +var result; +var vals = {}; + +result = { xCover = (0, function() {}), cover = (function() {}) } = vals; + +assert.notSameValue(xCover.name, 'xCover'); + +assert.sameValue(cover.name, 'cover'); +verifyNotEnumerable(cover, 'name'); +verifyNotWritable(cover, 'name'); +verifyConfigurable(cover, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-fn-name-fn.js b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-fn.js new file mode 100644 index 0000000000..e8ba1aacce --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-fn.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-fn.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var xFn, fn; + +var result; +var vals = {}; + +result = { xFn = function x() {}, fn = function() {} } = vals; + +assert.notSameValue(xFn.name, 'xFn'); + +assert.sameValue(fn.name, 'fn'); +verifyNotEnumerable(fn, 'name'); +verifyNotWritable(fn, 'name'); +verifyConfigurable(fn, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-fn-name-gen.js b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-gen.js new file mode 100644 index 0000000000..800c2183ab --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-fn-name-gen.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-gen.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var xGen, gen; + +var result; +var vals = {}; + +result = { xGen = function* x() {}, gen = function*() {} } = vals; + +assert.notSameValue(xGen.name, 'xGen'); + +assert.sameValue(gen.name, 'gen'); +verifyNotEnumerable(gen, 'name'); +verifyNotWritable(gen, 'name'); +verifyConfigurable(gen, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-in.js b/test/language/expressions/assignment/dstr-obj-id-init-in.js new file mode 100644 index 0000000000..a6eff2ce26 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-in.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-in.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The Initializer in an AssignmentProperty may be an `in` expression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var prop; + +var result; +var vals = {}; + +result = { prop = 'x' in {} } = vals; + +assert.sameValue(prop, false); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-let.js b/test/language/expressions/assignment/dstr-obj-id-init-let.js new file mode 100644 index 0000000000..85f7c1c73f --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-let.js @@ -0,0 +1,25 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-let.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Value retrieval of Initializer obeys `let` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [let, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(ReferenceError, function() { + 0, { x = y } = {}; +}); + +let y; diff --git a/test/language/expressions/assignment/dstr-obj-id-init-order.js b/test/language/expressions/assignment/dstr-obj-id-init-order.js new file mode 100644 index 0000000000..d1ffdccab5 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-order.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-order.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Initializer values should be assigned in left-to-right order. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = 0; +var a, b; + +var result; +var vals = {}; + +result = { a = x += 1, b = x *= 2 } = vals; + +assert.sameValue(a, 1); +assert.sameValue(b, 2); +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-simple-no-strict.js b/test/language/expressions/assignment/dstr-obj-id-init-simple-no-strict.js new file mode 100644 index 0000000000..a06122c02f --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-simple-no-strict.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-simple-no-strict.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var eval, arguments; + +var result; +var vals = {}; + +result = { eval = 3, arguments = 4 } = vals; + +assert.sameValue(eval, 3); +assert.sameValue(arguments, 4); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-simple-strict.js b/test/language/expressions/assignment/dstr-obj-id-init-simple-strict.js new file mode 100644 index 0000000000..6d8cf05b5c --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-simple-strict.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-simple-strict.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if IsValidSimpleAssignmentTarget of IdentifierReference is false. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { eval = 0 } = {}; diff --git a/test/language/expressions/assignment/dstr-obj-id-init-yield-expr.js b/test/language/expressions/assignment/dstr-obj-id-init-yield-expr.js new file mode 100644 index 0000000000..53449cd5e6 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-yield-expr.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentProperty and within a generator function body, it should behave as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var iterationResult, x, iter; + +iter = (function*() { + +var result; +var vals = {}; + +result = { x = yield } = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(3); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 3); diff --git a/test/language/expressions/assignment/dstr-obj-id-init-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-obj-id-init-yield-ident-invalid.js new file mode 100644 index 0000000000..554ab7b198 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentProperty and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { x = yield } = {}; diff --git a/test/language/expressions/assignment/dstr-obj-id-init-yield-ident-valid.js b/test/language/expressions/assignment/dstr-obj-id-init-yield-ident-valid.js new file mode 100644 index 0000000000..a7a83425c2 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-init-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentProperty and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 3; +var x; + +var result; +var vals = {}; + +result = { x = yield } = vals; + +assert.sameValue(x, 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-id-put-const.js b/test/language/expressions/assignment/dstr-obj-id-put-const.js new file mode 100644 index 0000000000..1effef98d8 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-put-const.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-const.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: The assignment target should obey `const` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [const, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +const c = null; + +assert.throws(TypeError, function() { + 0, { c } = { c: 1 }; +}); diff --git a/test/language/expressions/assignment/dstr-obj-id-put-let.js b/test/language/expressions/assignment/dstr-obj-id-put-let.js new file mode 100644 index 0000000000..d6c53a0fb3 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-put-let.js @@ -0,0 +1,24 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-let.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: The assignment target should obey `let` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [let, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(ReferenceError, function() { + 0, { x } = {}; +}); + +let x; diff --git a/test/language/expressions/assignment/dstr-obj-id-put-unresolvable-no-strict.js b/test/language/expressions/assignment/dstr-obj-id-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..9c34ff9cce --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-put-unresolvable-no-strict.js @@ -0,0 +1,32 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Outside of strict mode, if the the assignment target is an unresolvable reference, a new `var` binding should be created in the environment record. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +{ + +var result; +var vals = {}; + +result = { unresolvable } = vals; + + + +assert.sameValue(result, vals); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/expressions/assignment/dstr-obj-id-put-unresolvable-strict.js b/test/language/expressions/assignment/dstr-obj-id-put-unresolvable-strict.js new file mode 100644 index 0000000000..5d3a4b3180 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-put-unresolvable-strict.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-unresolvable-strict.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(ReferenceError, function() { + 0, { unresolvable } = {}; +}); diff --git a/test/language/expressions/assignment/dstr-obj-id-simple-no-strict.js b/test/language/expressions/assignment/dstr-obj-id-simple-no-strict.js new file mode 100644 index 0000000000..d763729210 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-simple-no-strict.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-simple-no-strict.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var eval, arguments; + +var result; +var vals = { eval: 1, arguments: 2 }; + +result = { eval, arguments } = vals; + + + +assert.sameValue(result, vals); + +assert.sameValue(eval, 1); +assert.sameValue(arguments, 2); diff --git a/test/language/expressions/assignment/dstr-obj-id-simple-strict.js b/test/language/expressions/assignment/dstr-obj-id-simple-strict.js new file mode 100644 index 0000000000..9dc0badeca --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-id-simple-strict.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-simple-strict.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if IsValidSimpleAssignmentTarget of IdentifierReference is false. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { eval } = {}; diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-missing.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-missing.js new file mode 100644 index 0000000000..e37419693a --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-missing.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-missing.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (non-existent property) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = {}; + +result = { y: x = 1 } = vals; + +assert.sameValue(x, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-null.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-null.js new file mode 100644 index 0000000000..4d0da4dc49 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-null.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-null.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is not undefined, the Initializer should be evaluated and the result assigned to the target reference (null value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = { y: null }; + +result = { y: x = 1 } = vals; + +assert.sameValue(x, null); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-truthy.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-truthy.js new file mode 100644 index 0000000000..36d5f7ff3b --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-truthy.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-truthy.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is not undefined, the Initializer should be evaluated and the result assigned to the target reference (truthy value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = { y: 2 }; + +result = { y: x = 1 } = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-undef.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-undef.js new file mode 100644 index 0000000000..a41e292c41 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-assignment-undef.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-undef.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (undefined value) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = { y: undefined }; + +result = { y: x = 1 } = vals; + +assert.sameValue(x, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-evaluation.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-evaluation.js new file mode 100644 index 0000000000..7531aa881e --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-evaluation.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-evaluation.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var flag1 = false; +var flag2 = false; +var x, y; + +var result; +var vals = { y: 1 }; + +result = { x: x = flag1 = true, y: y = flag2 = true } = vals; + +assert.sameValue(x, true, 'value of `x`'); +assert.sameValue(flag1, true, 'value of `flag1`'); +assert.sameValue(y, 1, 'value of `y`'); +assert.sameValue(flag2, false, 'value of `flag2`'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-arrow.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-arrow.js new file mode 100644 index 0000000000..d40f3fc2a4 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-arrow.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-arrow.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var arrow; + +var result; +var vals = {}; + +result = { x: arrow = () => {} } = vals; + +assert.sameValue(arrow.name, 'arrow'); +verifyNotEnumerable(arrow, 'name'); +verifyNotWritable(arrow, 'name'); +verifyConfigurable(arrow, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-class.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-class.js new file mode 100644 index 0000000000..807d410c5f --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-class.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-class.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [class, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var xCls, cls; + +var result; +var vals = {}; + +result = { x: xCls = class x {}, x: cls = class {} } = vals; + +assert.notSameValue(xCls.name, 'xCls'); + +assert.sameValue(cls.name, 'cls'); +verifyNotEnumerable(cls, 'name'); +verifyNotWritable(cls, 'name'); +verifyConfigurable(cls, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-cover.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-cover.js new file mode 100644 index 0000000000..6ee0e71820 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-cover.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-cover.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var xCover, cover; + +var result; +var vals = {}; + +result = { x: xCover = (0, function() {}), x: cover = (function() {}) } = vals; + +assert.notSameValue(xCover.name, 'xCover'); + +assert.sameValue(cover.name, 'cover'); +verifyNotEnumerable(cover, 'name'); +verifyNotWritable(cover, 'name'); +verifyConfigurable(cover, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-fn.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..1697f6b118 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-fn.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-fn.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var xFn, fn; + +var result; +var vals = {}; + +result = { x: xFn = function x() {}, x: fn = function() {} } = vals; + +assert.notSameValue(xFn.name, 'xFn'); + +assert.sameValue(fn.name, 'fn'); +verifyNotEnumerable(fn, 'name'); +verifyNotWritable(fn, 'name'); +verifyConfigurable(fn, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-gen.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..07a9755273 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-fn-name-gen.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-gen.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var xGen, gen; + +var result; +var vals = {}; + +result = { x: xGen = function* x() {}, x: gen = function*() {} } = vals; + +assert.notSameValue(xGen.name, 'xGen'); + +assert.sameValue(gen.name, 'gen'); +verifyNotEnumerable(gen, 'name'); +verifyNotWritable(gen, 'name'); +verifyConfigurable(gen, 'name'); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-in.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-in.js new file mode 100644 index 0000000000..30e35912ba --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-in.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-in.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var prop; + +var result; +var vals = {}; + +result = { x: prop = 'x' in {} } = vals; + +assert.sameValue(prop, false); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-let.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-let.js new file mode 100644 index 0000000000..bb4d39bf31 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-let.js @@ -0,0 +1,25 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-let.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Value retrieval of Initializer obeys `let` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [let, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(ReferenceError, function() { + 0, { x: x = y } = {}; +}); + +let y; diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-expr.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-expr.js new file mode 100644 index 0000000000..30ce88202e --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-expr.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement and within a generator function body, it should behave as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var iterationResult, iter, x; +iter = (function*() { + +var result; +var vals = {}; + +result = { x: x = yield } = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(86); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 86); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-ident-invalid.js new file mode 100644 index 0000000000..c4aa226997 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { x: x = yield } = {}; diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-ident-valid.js b/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-ident-valid.js new file mode 100644 index 0000000000..4ce31208a5 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-init-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 4; +var x; + +var result; +var vals = {}; + +result = { x: x = yield } = vals; + +assert.sameValue(x, 4); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-expr.js b/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-expr.js new file mode 100644 index 0000000000..426bed36b8 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-expr.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-target-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and within a generator function body, it should behave as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var result; +var vals = { x: 23 }; + +result = { x: x[yield] } = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop, 23); diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-invalid.js new file mode 100644 index 0000000000..8651add4de --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-target-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { x: x[yield] } = {}; diff --git a/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-valid.js b/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-valid.js new file mode 100644 index 0000000000..e1c68c3aae --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-elem-target-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-target-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 'prop'; +var x = {}; + +var result; +var vals = { x: 23 }; + +result = { x: x[yield] } = vals; + +assert.sameValue(x.prop, 23); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-first.js b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-first.js new file mode 100644 index 0000000000..f346f25255 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-first.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-first.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var y; + +var result; +var vals = { a: 3 }; + +result = { a: x, y } = vals; + +assert.sameValue(x, 3); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-last.js b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-last.js new file mode 100644 index 0000000000..81fc829e55 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-last.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-last.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var w; + +var result; +var vals = { a: 4 }; + +result = { w, a: x } = vals; + +assert.sameValue(x, 4); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-lone.js b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-lone.js new file mode 100644 index 0000000000..3c96c9a1f8 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-lone.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-lone.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; + +var result; +var vals = { a: 1 }; + +result = { a: x } = vals; + +assert.sameValue(x, 1); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-middle.js b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-middle.js new file mode 100644 index 0000000000..dc0bd60254 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-middle.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-middle.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; +var w, y; + +var result; +var vals = { a: 5 }; + +result = { w, a: x, y } = vals; + +assert.sameValue(x, 5); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-trlng.js b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-trlng.js new file mode 100644 index 0000000000..81e2db3587 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-identifier-resolution-trlng.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-trlng.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element with trailing comma). (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = null; + +var result; +var vals = { a: 2 }; + +result = { a: x, } = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-name-evaluation-error.js b/test/language/expressions/assignment/dstr-obj-prop-name-evaluation-error.js new file mode 100644 index 0000000000..9ee5cdad1a --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-name-evaluation-error.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-name-evaluation-error.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Any error raised as a result of evaluating PropertyName should be forwarded to the runtime. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var a, x; + +assert.throws(TypeError, function() { + 0, { [a.b]: x } = {}; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-name-evaluation.js b/test/language/expressions/assignment/dstr-obj-prop-name-evaluation.js new file mode 100644 index 0000000000..d2930443d1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-name-evaluation.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-name-evaluation.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: PropertyName of an AssignmentProperty may be a ComputedPropertyName. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x, y, xy; + +var result; +var vals = { x: 1, xy: 23, y: 2 }; + +result = { ['x' + 'y']: x } = vals; + +assert.sameValue(x, 23); +assert.sameValue(y, undefined); +assert.sameValue(xy, undefined); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-array-invalid.js b/test/language/expressions/assignment/dstr-obj-prop-nested-array-invalid.js new file mode 100644 index 0000000000..823daca3e5 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-array-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { x: [(x, y)] } = { x: [] }; diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-array-null.js b/test/language/expressions/assignment/dstr-obj-prop-nested-array-null.js new file mode 100644 index 0000000000..dff3f67eb3 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-array-null.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `null`, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, { x: [ x ] } = { x: null }; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-array-undefined-own.js b/test/language/expressions/assignment/dstr-obj-prop-nested-array-undefined-own.js new file mode 100644 index 0000000000..16a8b09aa1 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-array-undefined-own.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-undefined-own.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `undefined`, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, { x: [ x ] } = { x: undefined }; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-array-undefined.js b/test/language/expressions/assignment/dstr-obj-prop-nested-array-undefined.js new file mode 100644 index 0000000000..5ffe738bb9 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-array-undefined.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-undefined.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is not defined, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, { x: [ x ] } = {}; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-expr.js b/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-expr.js new file mode 100644 index 0000000000..6f981966b4 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-expr.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and within a generator function body, it should behave as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var iterationResult, iter, x; + +iter = (function*() { + +var result; +var vals = { x: [] }; + +result = { x: [x = yield] } = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(24601); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 24601); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..71fac25e20 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { x: [x = yield] } = { x: [] }; diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-ident-valid.js b/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..f677df3565 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-array-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 22; +var x; + +var result; +var vals = { x: [] }; + +result = { x: [x = yield] } = vals; + +assert.sameValue(x, 22); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-array.js b/test/language/expressions/assignment/dstr-obj-prop-nested-array.js new file mode 100644 index 0000000000..6b32143d1c --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-array.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var y; + +var result; +var vals = { x: [321] }; + +result = { x: [y] } = vals; + +assert.sameValue(y, 321); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-obj-invalid.js b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-invalid.js new file mode 100644 index 0000000000..59ee0a3f82 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { x: { get x() {} } } = { x: {} }; diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-obj-null.js b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-null.js new file mode 100644 index 0000000000..7ed0840d23 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-null.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-null.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `null`, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, { x: { x } } = { x: null }; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-obj-undefined-own.js b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-undefined-own.js new file mode 100644 index 0000000000..590d087f4d --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-undefined-own.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-undefined-own.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `undefined`, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, { x: { x } } = { x: undefined }; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-obj-undefined.js b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-undefined.js new file mode 100644 index 0000000000..e0c168fcdd --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-undefined.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-undefined.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is not defined, a TypeError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +assert.throws(TypeError, function() { + 0, { x: { x } } = {}; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-expr.js b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-expr.js new file mode 100644 index 0000000000..bdff5e4464 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-expr.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-yield-expr.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and within a generator function body, it should behave as a YieldExpression. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [generators, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var iterationResult, iter, x = undefined; + +iter = (function*() { + +var result; +var vals = { x: {} }; + +result = { x: { x = yield } } = vals; + + + +assert.sameValue(result, vals); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(4); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 4); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-ident-invalid.js b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..166e8ded73 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-ident-invalid.js @@ -0,0 +1,21 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +0, { x: { x = yield } } = { x: {} }; diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-ident-valid.js b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..1d62703ed3 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-obj-yield-ident-valid.js @@ -0,0 +1,29 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-yield-ident-valid.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var yield = 2; +var result, x; + +var result; +var vals = { x: {} }; + +result = { x: { x = yield } } = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-nested-obj.js b/test/language/expressions/assignment/dstr-obj-prop-nested-obj.js new file mode 100644 index 0000000000..3fa897ba6e --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-nested-obj.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var result, y; + +var result; +var vals = { x: { y: 2 } }; + +result = { x: { y } } = vals; + +assert.sameValue(y, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-put-const.js b/test/language/expressions/assignment/dstr-obj-prop-put-const.js new file mode 100644 index 0000000000..986ca5eb0e --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-put-const.js @@ -0,0 +1,23 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-const.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: The assignment target should obey `const` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [const, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +const c = 1; + +assert.throws(TypeError, function() { + 0, { a: c } = { a: 2 }; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-put-let.js b/test/language/expressions/assignment/dstr-obj-prop-put-let.js new file mode 100644 index 0000000000..84dc4163b9 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-put-let.js @@ -0,0 +1,24 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-let.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: The assignment target should obey `let` semantics. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [let, destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(ReferenceError, function() { + 0, { a: x } = {}; +}); + +let x; diff --git a/test/language/expressions/assignment/dstr-obj-prop-put-order.js b/test/language/expressions/assignment/dstr-obj-prop-put-order.js new file mode 100644 index 0000000000..bf1b1a8890 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-put-order.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-order.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The AssignmentElements in an AssignmentElementList are evaluated in left- to-right order. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x; + +var result; +var vals = { a: 2, z: 1 }; + +result = { z: x, a: x } = vals; + +assert.sameValue(x, 2); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref-no-get.js b/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref-no-get.js new file mode 100644 index 0000000000..bbed98495f --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref-no-get.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-prop-ref-no-get.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var setValue; +var x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +var result; +var vals = { a: 23 }; + +result = { a: x.y } = vals; + +assert.sameValue(setValue, 23); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref-user-err.js b/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref-user-err.js new file mode 100644 index 0000000000..6da57335fb --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref-user-err.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-prop-ref-user-err.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: Any error raised as a result of setting the value should be forwarded to the runtime. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = { + set y(val) { + throw new Test262Error(); + } +}; + +assert.throws(Test262Error, function() { + 0, { a: x.y } = { a: 23 }; +}); diff --git a/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref.js b/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref.js new file mode 100644 index 0000000000..aee96df871 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-put-prop-ref.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-prop-ref.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +var x = {}; + +var result; +var vals = { xy: 4 }; + +result = { xy: x.y } = vals; + +assert.sameValue(x.y, 4); + +assert.sameValue(result, vals); diff --git a/test/language/expressions/assignment/dstr-obj-prop-put-unresolvable-no-strict.js b/test/language/expressions/assignment/dstr-obj-prop-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..46154d32cd --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-put-unresolvable-no-strict.js @@ -0,0 +1,32 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/assignment-expr.template +/*--- +description: Outside of strict mode, if the the assignment target is an unresolvable reference, a new `var` binding should be created in the environment record. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ +{ + +var result; +var vals = {}; + +result = { x: unresolvable } = vals; + + + +assert.sameValue(result, vals); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/expressions/assignment/dstr-obj-prop-put-unresolvable-strict.js b/test/language/expressions/assignment/dstr-obj-prop-put-unresolvable-strict.js new file mode 100644 index 0000000000..8614011c20 --- /dev/null +++ b/test/language/expressions/assignment/dstr-obj-prop-put-unresolvable-strict.js @@ -0,0 +1,22 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-unresolvable-strict.case +// - src/dstr-assignment/error/assignment-expr.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (AssignmentExpression) +esid: sec-variable-statement-runtime-semantics-evaluation +es6id: 13.3.2.4 +features: [destructuring-binding] +flags: [generated, onlyStrict] +info: | + VariableDeclaration : BindingPattern Initializer + + 1. Let rhs be the result of evaluating Initializer. + 2. Let rval be GetValue(rhs). + 3. ReturnIfAbrupt(rval). + 4. Return the result of performing BindingInitialization for + BindingPattern passing rval and undefined as arguments. +---*/ + +assert.throws(ReferenceError, function() { + 0, { x: unresolvable } = {}; +}); diff --git a/test/language/statements/for-in/dstr-array-elem-init-simple-strict.js b/test/language/statements/for-in/dstr-array-elem-init-simple-strict.js new file mode 100644 index 0000000000..2c0539ca9f --- /dev/null +++ b/test/language/statements/for-in/dstr-array-elem-init-simple-strict.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-simple-strict.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget(LeftHandSideExpression) is false. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([arguments] in []) ; diff --git a/test/language/statements/for-in/dstr-array-elem-init-yield-ident-invalid.js b/test/language/statements/for-in/dstr-array-elem-init-yield-ident-invalid.js new file mode 100644 index 0000000000..5be7151345 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-elem-init-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement outside of a generator function body, it behaves as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([ x = yield ] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-elem-nested-array-invalid.js b/test/language/statements/for-in/dstr-array-elem-nested-array-invalid.js new file mode 100644 index 0000000000..6285773c11 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-elem-nested-array-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([[(x, y)]] in [[[]]]) ; diff --git a/test/language/statements/for-in/dstr-array-elem-nested-array-yield-ident-invalid.js b/test/language/statements/for-in/dstr-array-elem-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..dfbd4be4e2 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-elem-nested-array-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment outside of strict mode, it behaves as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([[x[yield]]] in [[[]]]) ; diff --git a/test/language/statements/for-in/dstr-array-elem-nested-obj-invalid.js b/test/language/statements/for-in/dstr-array-elem-nested-obj-invalid.js new file mode 100644 index 0000000000..f543fc09d6 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-elem-nested-obj-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([{ get x() {} }] in [[{}]]) ; diff --git a/test/language/statements/for-in/dstr-array-elem-nested-obj-yield-ident-invalid.js b/test/language/statements/for-in/dstr-array-elem-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..a6071c2582 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-elem-nested-obj-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment outside of a generator function body, it behaves as a IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([{ x = yield }] in [[{}]]) ; diff --git a/test/language/statements/for-in/dstr-array-elem-target-simple-strict.js b/test/language/statements/for-in/dstr-array-elem-target-simple-strict.js new file mode 100644 index 0000000000..f69ea5b517 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-elem-target-simple-strict.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-simple-strict.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget(LeftHandSideExpression) is false. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([arguments] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-elem-target-yield-invalid.js b/test/language/statements/for-in/dstr-array-elem-target-yield-invalid.js new file mode 100644 index 0000000000..0a7f0ac566 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-elem-target-yield-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and outside of a generator function body, it behaves as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([ x[yield] ] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-before-element.js b/test/language/statements/for-in/dstr-array-rest-before-element.js new file mode 100644 index 0000000000..058e92d439 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-before-element.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-element.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: An AssignmentElement may not follow an AssignmentRestElement in an AssignmentElementList. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...x, y] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-before-elision.js b/test/language/statements/for-in/dstr-array-rest-before-elision.js new file mode 100644 index 0000000000..90d0d410d0 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-before-elision.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-elision.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: An elision may not follow an AssignmentRestElement in an AssignmentElementList. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...x,] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-before-rest.js b/test/language/statements/for-in/dstr-array-rest-before-rest.js new file mode 100644 index 0000000000..64b7ed0734 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-before-rest.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-rest.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: An AssignmentRestElement may not follow another AssignmentRestElement in an AssignmentElementList. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...x, ...y] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-elision-invalid.js b/test/language/statements/for-in/dstr-array-rest-elision-invalid.js new file mode 100644 index 0000000000..94d7175fb5 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-elision-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-elision-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: ArrayAssignmentPattern may not include elisions following an AssignmentRestElement in a AssignmentElementList. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...x,] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-init.js b/test/language/statements/for-in/dstr-array-rest-init.js new file mode 100644 index 0000000000..83d3e0d225 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-init.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-init.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: The AssignmentRestElement does not support an initializer. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +for ([...x = 1] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-nested-array-invalid.js b/test/language/statements/for-in/dstr-array-rest-nested-array-invalid.js new file mode 100644 index 0000000000..46f1589299 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-nested-array-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...[(x, y)]] in [[[]]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-nested-array-yield-ident-invalid.js b/test/language/statements/for-in/dstr-array-rest-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..5a3e1da8ff --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-nested-array-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...[x[yield]]] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-nested-obj-invalid.js b/test/language/statements/for-in/dstr-array-rest-nested-obj-invalid.js new file mode 100644 index 0000000000..c983ea7657 --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-nested-obj-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...{ get x() {} }] in [[[]]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-nested-obj-yield-ident-invalid.js b/test/language/statements/for-in/dstr-array-rest-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..75390433bd --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-nested-obj-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...{ x = yield }] in [[{}]]) ; diff --git a/test/language/statements/for-in/dstr-array-rest-yield-ident-invalid.js b/test/language/statements/for-in/dstr-array-rest-yield-ident-invalid.js new file mode 100644 index 0000000000..95ffc2e89d --- /dev/null +++ b/test/language/statements/for-in/dstr-array-rest-yield-ident-invalid.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentRestElement and outside of a generator function body, it should behave as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = {}; + +for ([...x[yield]] in [[]]) ; diff --git a/test/language/statements/for-in/dstr-obj-id-identifier-yield-expr.js b/test/language/statements/for-in/dstr-obj-id-identifier-yield-expr.js new file mode 100644 index 0000000000..3a127d0ea9 --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-id-identifier-yield-expr.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-expr.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: yield is not a valid IdentifierReference in an AssignmentProperty within generator function bodies. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated, noStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +(function*() { + +for ({ yield } in [{}]) ; + +}); diff --git a/test/language/statements/for-in/dstr-obj-id-identifier-yield-ident-invalid.js b/test/language/statements/for-in/dstr-obj-id-identifier-yield-ident-invalid.js new file mode 100644 index 0000000000..a862834eb2 --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-id-identifier-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: yield is not a valid IdentifierReference in an AssignmentProperty within strict mode code. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ yield } in [{}]) ; diff --git a/test/language/statements/for-in/dstr-obj-id-init-simple-strict.js b/test/language/statements/for-in/dstr-obj-id-init-simple-strict.js new file mode 100644 index 0000000000..8cfbe1a2ec --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-id-init-simple-strict.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-simple-strict.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if IsValidSimpleAssignmentTarget of IdentifierReference is false. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ eval = 0 } in [{}]) ; diff --git a/test/language/statements/for-in/dstr-obj-id-init-yield-ident-invalid.js b/test/language/statements/for-in/dstr-obj-id-init-yield-ident-invalid.js new file mode 100644 index 0000000000..1e4ee9e2a7 --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-id-init-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentProperty and outside of a generator function body, it should behave as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x = yield } in [{}]) ; diff --git a/test/language/statements/for-in/dstr-obj-id-simple-strict.js b/test/language/statements/for-in/dstr-obj-id-simple-strict.js new file mode 100644 index 0000000000..4d59e9be58 --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-id-simple-strict.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-simple-strict.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if IsValidSimpleAssignmentTarget of IdentifierReference is false. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ eval } in [{}]) ; diff --git a/test/language/statements/for-in/dstr-obj-prop-elem-init-yield-ident-invalid.js b/test/language/statements/for-in/dstr-obj-prop-elem-init-yield-ident-invalid.js new file mode 100644 index 0000000000..ab7c6bb9e7 --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-prop-elem-init-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: x = yield } in [{}]) ; diff --git a/test/language/statements/for-in/dstr-obj-prop-elem-target-yield-ident-invalid.js b/test/language/statements/for-in/dstr-obj-prop-elem-target-yield-ident-invalid.js new file mode 100644 index 0000000000..7484fe6959 --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-prop-elem-target-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-target-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: x[yield] } in [{}]) ; diff --git a/test/language/statements/for-in/dstr-obj-prop-nested-array-invalid.js b/test/language/statements/for-in/dstr-obj-prop-nested-array-invalid.js new file mode 100644 index 0000000000..1aaceffa8d --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-prop-nested-array-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: [(x, y)] } in [{ x: [] }]) ; diff --git a/test/language/statements/for-in/dstr-obj-prop-nested-array-yield-ident-invalid.js b/test/language/statements/for-in/dstr-obj-prop-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..d4fddf009a --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-prop-nested-array-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: [x = yield] } in [{ x: [] }]) ; diff --git a/test/language/statements/for-in/dstr-obj-prop-nested-obj-invalid.js b/test/language/statements/for-in/dstr-obj-prop-nested-obj-invalid.js new file mode 100644 index 0000000000..d9cfe9e3ec --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-prop-nested-obj-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: { get x() {} } } in [{ x: {} }]) ; diff --git a/test/language/statements/for-in/dstr-obj-prop-nested-obj-yield-ident-invalid.js b/test/language/statements/for-in/dstr-obj-prop-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..0559dd12bd --- /dev/null +++ b/test/language/statements/for-in/dstr-obj-prop-nested-obj-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-in.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (For..in statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: { x = yield } } in [{ x: {} }]) ; diff --git a/test/language/statements/for-of/dstr-array-elem-init-assignment.js b/test/language/statements/for-of/dstr-array-elem-init-assignment.js new file mode 100644 index 0000000000..043c0e72e6 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-assignment.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-assignment.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var v2, vNull, vHole, vUndefined, vOob; + +var counter = 0; + +for ([v2 = 10, vNull = 11, vHole = 12, vUndefined = 13, vOob = 14] of [[2, null, , undefined]]) { + assert.sameValue(v2, 2); + assert.sameValue(vNull, null); + assert.sameValue(vHole, 12); + assert.sameValue(vUndefined, 13); + assert.sameValue(vOob, 14); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-evaluation.js b/test/language/statements/for-of/dstr-array-elem-init-evaluation.js new file mode 100644 index 0000000000..c1f0cca2e7 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-evaluation.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-evaluation.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var flag1 = false, flag2 = false; +var _; + +var counter = 0; + +for ([ _ = flag1 = true, _ = flag2 = true ] of [[14]]) { + assert.sameValue(flag1, false); + assert.sameValue(flag2, true); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-fn-name-arrow.js b/test/language/statements/for-of/dstr-array-elem-init-fn-name-arrow.js new file mode 100644 index 0000000000..459ebab6f4 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-fn-name-arrow.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-arrow.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var arrow; + +var counter = 0; + +for ([ arrow = () => {} ] of [[]]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-fn-name-class.js b/test/language/statements/for-of/dstr-array-elem-init-fn-name-class.js new file mode 100644 index 0000000000..24c777260f --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-fn-name-class.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-class.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [class, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var xCls, cls; + +var counter = 0; + +for ([ xCls = class x {},cls = class {} ] of [[]]) { + assert(xCls.name !== 'xCls'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-fn-name-cover.js b/test/language/statements/for-of/dstr-array-elem-init-fn-name-cover.js new file mode 100644 index 0000000000..bafaded3e2 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-fn-name-cover.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-cover.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var xCover, cover; + +var counter = 0; + +for ([ xCover = (0, function() {}), cover = (function() {}) ] of [[]]) { + assert(xCover.name !== 'xCover'); + + assert.sameValue(cover.name, 'cover'); + verifyNotEnumerable(cover, 'name'); + verifyNotWritable(cover, 'name'); + verifyConfigurable(cover, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-fn-name-fn.js b/test/language/statements/for-of/dstr-array-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..3fd4ce331e --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-fn-name-fn.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-fn.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [class, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var xFn, fn; + +var counter = 0; + +for ([ xFn = function x() {}, fn = function() {} ] of [[]]) { + assert(xFn.name !== 'xFn'); + + assert.sameValue(fn.name, 'fn'); + verifyNotEnumerable(fn, 'name'); + verifyNotWritable(fn, 'name'); + verifyConfigurable(fn, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-fn-name-gen.js b/test/language/statements/for-of/dstr-array-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..e51d7bc2c5 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-fn-name-gen.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-fn-name-gen.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and value is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(v, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(v, + GetReferencedName(lref)). + +---*/ +var xGen, gen; + +var counter = 0; + +for ([ xGen = function* x() {}, gen = function*() {} ] of [[]]) { + assert.notSameValue(xGen.name, 'xGen'); + + assert.sameValue(gen.name, 'gen'); + verifyNotEnumerable(gen, 'name'); + verifyNotWritable(gen, 'name'); + verifyConfigurable(gen, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-in.js b/test/language/statements/for-of/dstr-array-elem-init-in.js new file mode 100644 index 0000000000..a38f58040d --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-in.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-in.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ([ x = 'x' in {} ] of [[]]) { + assert.sameValue(x, false); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-let.js b/test/language/statements/for-of/dstr-array-elem-init-let.js new file mode 100644 index 0000000000..6c58963b0a --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-let.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-let.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Value retrieval of Initializer obeys `let` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [let, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ([ x = y ] of [[]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +let y; diff --git a/test/language/statements/for-of/dstr-array-elem-init-order.js b/test/language/statements/for-of/dstr-array-elem-init-order.js new file mode 100644 index 0000000000..c12629c817 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-order.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-order.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Initializer values should be assigned in left-to-right order. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = 0; +var a, b; + +var counter = 0; + +for ([ a = x += 1, b = x *= 2 ] of [[]]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-simple-no-strict.js b/test/language/statements/for-of/dstr-array-elem-init-simple-no-strict.js new file mode 100644 index 0000000000..226eef3a6e --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-simple-no-strict.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-simple-no-strict.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Identifiers that appear as the DestructuringAssignmentTarget in an AssignmentElement should take on the iterated value corresponding to their position in the ArrayAssignmentPattern. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var argument, eval; + +var counter = 0; + +for ([arguments = 4, eval = 5] of [[]]) { + assert.sameValue(arguments, 4); + assert.sameValue(eval, 5); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-init-simple-strict.js b/test/language/statements/for-of/dstr-array-elem-init-simple-strict.js new file mode 100644 index 0000000000..82b297cbe5 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-simple-strict.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-simple-strict.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget(LeftHandSideExpression) is false. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([arguments] of []) ; diff --git a/test/language/statements/for-of/dstr-array-elem-init-yield-expr.js b/test/language/statements/for-of/dstr-array-elem-init-yield-expr.js new file mode 100644 index 0000000000..978446c569 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-yield-expr.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement within a generator function body, it behaves as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var value = []; +var iterationResult, iter, x; +iter = (function*() { + +var counter = 0; + +for ([ x = yield ] of [[]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +})(); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(86); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 86); diff --git a/test/language/statements/for-of/dstr-array-elem-init-yield-ident-invalid.js b/test/language/statements/for-of/dstr-array-elem-init-yield-ident-invalid.js new file mode 100644 index 0000000000..0aa39bfec6 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement outside of a generator function body, it behaves as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([ x = yield ] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-elem-init-yield-ident-valid.js b/test/language/statements/for-of/dstr-array-elem-init-yield-ident-valid.js new file mode 100644 index 0000000000..057f448093 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-init-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement outside of a generator function body, it behaves as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 4; +var x; + +var counter = 0; + +for ([ x = yield ] of [[]]) { + assert.sameValue(x, 4); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-get-err.js b/test/language/statements/for-of/dstr-array-elem-iter-get-err.js new file mode 100644 index 0000000000..3af552eec4 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-get-err.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-get-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from GetIterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; +var _; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ _ ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-err.js b/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-err.js new file mode 100644 index 0000000000..4d360a1db7 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-err.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-nrml-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from IteratorClose (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, result). + +---*/ +var nextCount = 0; +var returnCount = 0; +var _; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ _ ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-null.js b/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-null.js new file mode 100644 index 0000000000..3fdd02c3d2 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-null.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-nrml-close-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var _; +var iterable = {}; +var nextCount = 0; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([ _ ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-skip.js b/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-skip.js new file mode 100644 index 0000000000..b53b1bb8e0 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-nrml-close-skip.js @@ -0,0 +1,61 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-nrml-close-skip.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is not called when assignment evaluation has exhausted the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, result). + 6. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +var _; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ _ ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-nrml-close.js b/test/language/statements/for-of/dstr-array-elem-iter-nrml-close.js new file mode 100644 index 0000000000..24df868e45 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-nrml-close.js @@ -0,0 +1,77 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-nrml-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is called when assignment evaluation has not exhausted the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var _; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ _ ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 1); + assert.sameValue(thisValue, iterator, 'correct `this` value'); + assert(!!args, 'arguments object provided'); + assert.sameValue(args.length, 0, 'zero arguments specified'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-err.js b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-err.js new file mode 100644 index 0000000000..f643013cde --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-err.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close-err.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([ {}[ yield ] ] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +} +iter = g(); +iter.next(); +assert.throws(Test262Error, function() { + iter.return(); +}); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js new file mode 100644 index 0000000000..ba47174659 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close-null.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close-null.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var iterator = { + return: function() { + return null; + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; +function* g() { + +var counter = 0; + +for ([ {}[yield] ] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js new file mode 100644 index 0000000000..84175bc503 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-rtrn-close.js @@ -0,0 +1,83 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +var iter, result; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([ {}[yield] ] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +} +iter = g(); +iter.next(); +result = iter.return(777); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); +assert.sameValue(result.value, 777); +assert(result.done, 'Iterator correctly closed'); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-thrw-close-err.js b/test/language/statements/for-of/dstr-array-elem-iter-thrw-close-err.js new file mode 100644 index 0000000000..70711a7615 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-thrw-close-err.js @@ -0,0 +1,71 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-thrw-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "throw" completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +function ReturnError() {} +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + + // This value should be discarded. + throw new ReturnError(); + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ {}[thrower()] ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-thrw-close-skip.js b/test/language/statements/for-of/dstr-array-elem-iter-thrw-close-skip.js new file mode 100644 index 0000000000..377d2db291 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-thrw-close-skip.js @@ -0,0 +1,65 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-thrw-close-skip.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is not called when iteration produces an abrupt completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; +var _; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-iter-thrw-close.js b/test/language/statements/for-of/dstr-array-elem-iter-thrw-close.js new file mode 100644 index 0000000000..a12ebb7364 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-iter-thrw-close.js @@ -0,0 +1,80 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-thrw-close.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "throw" completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ AssignmentElementList ] + + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ {}[thrower()] ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array-invalid.js b/test/language/statements/for-of/dstr-array-elem-nested-array-invalid.js new file mode 100644 index 0000000000..0a7c778c4a --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([[(x, y)]] of [[[]]]) ; diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array-null.js b/test/language/statements/for-of/dstr-array-elem-nested-array-null.js new file mode 100644 index 0000000000..766d157cde --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array-null.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `null`, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var _; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([[ _ ]] of [[null]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array-undefined-hole.js b/test/language/statements/for-of/dstr-array-elem-nested-array-undefined-hole.js new file mode 100644 index 0000000000..9086a0fcd4 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array-undefined-hole.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-undefined-hole.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is a "hole", a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var _; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([[ _ ]] of [[ , ]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array-undefined-own.js b/test/language/statements/for-of/dstr-array-elem-nested-array-undefined-own.js new file mode 100644 index 0000000000..cc7209d704 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array-undefined-own.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-undefined-own.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `undefined`, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var _; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([[ x ]] of [[undefined]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array-undefined.js b/test/language/statements/for-of/dstr-array-elem-nested-array-undefined.js new file mode 100644 index 0000000000..19c6e12fbb --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array-undefined.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-undefined.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and no value is defined, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var _; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([[ x ]] of [[]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array-yield-expr.js b/test/language/statements/for-of/dstr-array-elem-nested-array-yield-expr.js new file mode 100644 index 0000000000..11ae31fab6 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array-yield-expr.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and within a generator function body, it behaves as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var value = [[22]]; +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var counter = 0; + +for ([[x[yield]]] of [value]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop, 22); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array-yield-ident-invalid.js b/test/language/statements/for-of/dstr-array-elem-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..7a207726f0 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment outside of strict mode, it behaves as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([[x[yield]]] of [[[]]]) ; diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array-yield-ident-valid.js b/test/language/statements/for-of/dstr-array-elem-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..24c88bed29 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment outside of strict mode, it behaves as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 'prop'; +var x = {}; + +var counter = 0; + +for ([[x[yield]]] of [[[22]]]) { + assert.sameValue(x.prop, 22); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-array.js b/test/language/statements/for-of/dstr-array-elem-nested-array.js new file mode 100644 index 0000000000..a0ff6c09b6 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-array.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ([[x]] of [[[1]]]) { + assert.sameValue(x, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj-invalid.js b/test/language/statements/for-of/dstr-array-elem-nested-obj-invalid.js new file mode 100644 index 0000000000..dd64e31887 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([{ get x() {} }] of [[{}]]) ; diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj-null.js b/test/language/statements/for-of/dstr-array-elem-nested-obj-null.js new file mode 100644 index 0000000000..b881f55445 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj-null.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `null`, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([{ x }] of [[null]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined-hole.js b/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..3640e694bd --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined-hole.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-undefined-hole.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is a "hole", a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([{ x }] of [[ , ]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined-own.js b/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined-own.js new file mode 100644 index 0000000000..d9b6e945cf --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined-own.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-undefined-own.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `undefined`, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([{ x }] of [[undefined]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined.js b/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined.js new file mode 100644 index 0000000000..3c9f1c9c56 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj-undefined.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-undefined.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and no value is defined, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([{ x }] of [[]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-expr.js b/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-expr.js new file mode 100644 index 0000000000..44a9460a54 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-expr.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and within a generator function body, it behaves as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var iterationResult, iter, x; + +iter = (function*() { + +var counter = 0; + +for ([{ x = yield }] of [[{}]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(4); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 4); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-invalid.js b/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..e90df0a152 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment outside of a generator function body, it behaves as a IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([{ x = yield }] of [[{}]]) ; diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-valid.js b/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..af82e89a34 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment outside of a generator function body, it behaves as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 2; +var x; + +var counter = 0; + +for ([{ x = yield }] of [[{}]]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-nested-obj.js b/test/language/statements/for-of/dstr-array-elem-nested-obj.js new file mode 100644 index 0000000000..992e35cd02 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-nested-obj.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ([{ x }] of [[{ x: 2 }]]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-put-const.js b/test/language/statements/for-of/dstr-array-elem-put-const.js new file mode 100644 index 0000000000..686c0cde02 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-put-const.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-const.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: The assignment target should obey `const` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [const, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +const c = null; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([ c ] of [[1]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-put-let.js b/test/language/statements/for-of/dstr-array-elem-put-let.js new file mode 100644 index 0000000000..ac941eb4b0 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-put-let.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-let.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: The assignment target should obey `let` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [let, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ([ x ] of [[]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +let x; diff --git a/test/language/statements/for-of/dstr-array-elem-put-prop-ref-no-get.js b/test/language/statements/for-of/dstr-array-elem-put-prop-ref-no-get.js new file mode 100644 index 0000000000..f427e2ea29 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-put-prop-ref-no-get.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-prop-ref-no-get.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x, setValue; +x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +var counter = 0; + +for ([x.y] of [[23]]) { + assert.sameValue(setValue, 23); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-put-prop-ref-user-err.js b/test/language/statements/for-of/dstr-array-elem-put-prop-ref-user-err.js new file mode 100644 index 0000000000..165b2a6d50 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-put-prop-ref-user-err.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-prop-ref-user-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Any error raised as a result of setting the value should be forwarded to the runtime. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = { + set y(val) { + throw new Test262Error(); + } +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([x.y] of [[23]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-put-prop-ref.js b/test/language/statements/for-of/dstr-array-elem-put-prop-ref.js new file mode 100644 index 0000000000..d0dc27bcd1 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-put-prop-ref.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-prop-ref.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = {}; + +var counter = 0; + +for ([x.y] of [[4]]) { + assert.sameValue(x.y, 4); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-put-unresolvable-no-strict.js b/test/language/statements/for-of/dstr-array-elem-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..fb9238f106 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-put-unresolvable-no-strict.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Outside of strict mode, if the the assignment target is an unresolvable reference, a new `var` binding should be created in the environment record. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +{ + +var counter = 0; + +for ([ unresolvable ] of [[]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/statements/for-of/dstr-array-elem-put-unresolvable-strict.js b/test/language/statements/for-of/dstr-array-elem-put-unresolvable-strict.js new file mode 100644 index 0000000000..1561f730b7 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-put-unresolvable-strict.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-unresolvable-strict.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ([ unresolvable ] of [[]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-target-identifier.js b/test/language/statements/for-of/dstr-array-elem-target-identifier.js new file mode 100644 index 0000000000..a042180522 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-target-identifier.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-identifier.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Identifiers that appear as the DestructuringAssignmentTarget in an AssignmentElement should take on the iterated value corresponding to their position in the ArrayAssignmentPattern. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x, y, z; + +var counter = 0; + +for ([x, y, z] of [[1, 2, 3]]) { + assert.sameValue(x, 1); + assert.sameValue(y, 2); + assert.sameValue(z, 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-target-simple-no-strict.js b/test/language/statements/for-of/dstr-array-elem-target-simple-no-strict.js new file mode 100644 index 0000000000..c9228fd3b1 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-target-simple-no-strict.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-simple-no-strict.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Identifiers that appear as the DestructuringAssignmentTarget in an AssignmentElement should take on the iterated value corresponding to their position in the ArrayAssignmentPattern. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var argument, eval; + +var counter = 0; + +for ([arguments, eval] of [[2, 3]]) { + assert.sameValue(arguments, 2); + assert.sameValue(eval, 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-target-simple-strict.js b/test/language/statements/for-of/dstr-array-elem-target-simple-strict.js new file mode 100644 index 0000000000..996ebd40b1 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-target-simple-strict.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-simple-strict.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget(LeftHandSideExpression) is false. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([arguments] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-elem-target-yield-expr.js b/test/language/statements/for-of/dstr-array-elem-target-yield-expr.js new file mode 100644 index 0000000000..e68ab90049 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-target-yield-expr.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement within a generator function body, it behaves as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var value = [33]; +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var counter = 0; + +for ([ x[yield] ] of [[33]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop, 33); diff --git a/test/language/statements/for-of/dstr-array-elem-target-yield-invalid.js b/test/language/statements/for-of/dstr-array-elem-target-yield-invalid.js new file mode 100644 index 0000000000..7ea2d77899 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-target-yield-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and outside of a generator function body, it behaves as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([ x[yield] ] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-elem-target-yield-valid.js b/test/language/statements/for-of/dstr-array-elem-target-yield-valid.js new file mode 100644 index 0000000000..8930189e37 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-target-yield-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement outside of a generator function body, it behaves as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 'prop'; +var x = {}; + +var counter = 0; + +for ([ x[yield] ] of [[33]]) { + assert.sameValue(x.prop, 33); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-abpt.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-abpt.js new file mode 100644 index 0000000000..b68ad60e59 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-abpt.js @@ -0,0 +1,79 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-abpt.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned during evaluation of elision (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + i. If iteratorRecord.[[done]] is false, return + IteratorClose(iterator, status). + ii. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + if (nextCount === 2) { + throw new Test262Error(); + } + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x , , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 2); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js new file mode 100644 index 0000000000..0c01d35da6 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from IteratorClose (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + [...] + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x , , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 2); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js new file mode 100644 index 0000000000..f82286c3a9 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js @@ -0,0 +1,78 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + [...] + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var x; +var nextCount = 0; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([ x , , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js new file mode 100644 index 0000000000..ebdac88d28 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js @@ -0,0 +1,69 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close-skip.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose not invoked when elision exhausts the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + [...] + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + return { done: nextCount > 1 }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ x , , ] of [iterable]) { + assert.sameValue(nextCount, 2); + assert.sameValue(returnCount, 0); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js new file mode 100644 index 0000000000..d5d17e8b82 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js @@ -0,0 +1,84 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-elision-iter-nrml-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose invoked when elision does not exhaust the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 6. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + [...] + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ x , , ] of [iterable]) { + assert.sameValue(nextCount, 2); + assert.sameValue(returnCount, 1); + assert.sameValue(thisValue, iterator, 'correct `this` value'); + assert(!!args, 'arguments object provided'); + assert.sameValue(args.length, 0, 'zero arguments specified'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-get-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-get-err.js new file mode 100644 index 0000000000..f8f3c9b030 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-get-err.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-get-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from GetIterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; +var x; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-err.js new file mode 100644 index 0000000000..4e9247788b --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-err.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from IteratorClose (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +var x; +var iterator = { + next: function() { + nextCount += 1; + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-null.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-null.js new file mode 100644 index 0000000000..9b1bf36b94 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-null.js @@ -0,0 +1,78 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var x; +var nextCount = 0; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([ x , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-skip.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-skip.js new file mode 100644 index 0000000000..af48aa9a05 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close-skip.js @@ -0,0 +1,70 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-nrml-close-skip.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is not invoked when evaluation of AssignmentElementList exhausts the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +var x; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ x , ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close.js new file mode 100644 index 0000000000..6688fcb69d --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-nrml-close.js @@ -0,0 +1,83 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-nrml-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList completes without exhausting the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ x , ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 1); + assert.sameValue(thisValue, iterator, 'correct `this` value'); + assert(!!args, 'arguments object provided'); + assert.sameValue(args.length, 0, 'zero arguments specified'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js new file mode 100644 index 0000000000..c5137f4e28 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js @@ -0,0 +1,83 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-err.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "return" completion and the iterator has not been marked as "done" (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + + throw new Test262Error(); + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([ {}[yield] , ] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); +assert.throws(Test262Error, function() { + iter.return(); +}); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js new file mode 100644 index 0000000000..0ee69ab93f --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js @@ -0,0 +1,80 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close-null.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var iterator = { + return: function() { + return null; + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([ {}[yield] , ] of [iterable]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js new file mode 100644 index 0000000000..eb1c4c749b --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-rtrn-close.js @@ -0,0 +1,91 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-rtrn-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "return" completion and the iterator has not been marked as "done" (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +var iter, result; + +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([ {}[yield] , ] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +}; + +iter = g(); +iter.next(); +result = iter.return(888); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); +assert.sameValue(result.value, 888); +assert(result.done, 'Iterator correctly closed'); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-err.js new file mode 100644 index 0000000000..3ba08cc7f4 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-err.js @@ -0,0 +1,83 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "throw" completion and the iterator has not been marked as "done" (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 7. If completion.[[type]] is throw, return Completion(completion). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +function ReturnError() {} +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + + // This value should be discarded. + throw new ReturnError(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ {}[thrower()] , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-skip.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-skip.js new file mode 100644 index 0000000000..eb63d54851 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close-skip.js @@ -0,0 +1,74 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-thrw-close-skip.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is not invoked when evaluation of AssignmentElementList returns an abrupt completion and the iterator has been marked as "done" (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; +var x; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close.js new file mode 100644 index 0000000000..048223b855 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-list-thrw-close.js @@ -0,0 +1,86 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-list-thrw-close.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "throw" completion and the iterator has not been marked as "done" (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 4. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 5. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var thrower = function() { + throw new Test262Error(); +}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ {}[thrower()] , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js new file mode 100644 index 0000000000..f8f692ac81 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js @@ -0,0 +1,70 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-nrml-close-skip.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is not called when rest element evaluation has exhausted the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x, y; +var iterator = { + next: function() { + nextCount += 1; + return { value: nextCount, done: nextCount > 1 }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ x , ...y ] of [iterable]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +assert.sameValue(nextCount, 2, 'nextCount'); +assert.sameValue(returnCount, 0, 'returnCount'); +assert.sameValue(x, 1, 'x'); +assert.sameValue(y.length, 0, 'y.length'); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js new file mode 100644 index 0000000000..6823462df4 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js @@ -0,0 +1,92 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-err.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "return" completion due to reference evaluation (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var nextCount = 0; +var returnCount = 0; +var unreachable = 0; +var x; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + + throw new Test262Error(); + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; +function* g() { + +var counter = 0; + +for ([ x , ...{}[yield] ] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); + +assert.throws(Test262Error, function() { + iter.return(); +}); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js new file mode 100644 index 0000000000..6b49baa65c --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js @@ -0,0 +1,87 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close-null.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var nextCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([ x , ...{}[yield] ] of [iterable]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); + +assert.sameValue(nextCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js new file mode 100644 index 0000000000..80ccd68084 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js @@ -0,0 +1,98 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-rtrn-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "return" completion due to reference evaluation (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var nextCount = 0; +var returnCount = 0; +var unreachable = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +var iter, result; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([ x , ...{}[yield] ] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); +result = iter.return(999); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); +assert.sameValue(result.value, 999); +assert(result.done, 'Iterator correctly closed'); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-err.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-err.js new file mode 100644 index 0000000000..177f013272 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-err.js @@ -0,0 +1,84 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "throw" completion due to reference evaluation (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 7. If completion.[[type]] is throw, return Completion(completion) + +---*/ +var nextCount = 0; +var returnCount = 0; +var x; +function ReturnError() {} +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + + // This value should be discarded. + throw new ReturnError(); + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x , ...{}[thrower()] ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-skip.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-skip.js new file mode 100644 index 0000000000..e140f2c6e9 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close-skip.js @@ -0,0 +1,77 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close-skip.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned during iteration for rest element (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + + if (nextCount === 2) { + throw new Test262Error(); + } + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x , ...x ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 2); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close.js b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close.js new file mode 100644 index 0000000000..d34bf0a3c5 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elem-trlg-iter-rest-thrw-close.js @@ -0,0 +1,88 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-trlg-iter-rest-thrw-close.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "throw" completion due to reference evaluation (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : + [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] + + [...] + 7. If AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 8. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var x; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ x , ...{}[thrower()] ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/statements/for-of/dstr-array-elision-iter-abpt.js b/test/language/statements/for-of/dstr-array-elision-iter-abpt.js new file mode 100644 index 0000000000..ef2568cf6d --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-iter-abpt.js @@ -0,0 +1,65 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-abpt.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is not called when iteration produces an abrupt completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-elision-iter-get-err.js b/test/language/statements/for-of/dstr-array-elision-iter-get-err.js new file mode 100644 index 0000000000..08563edd79 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-iter-get-err.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-get-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from GetIterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-err.js b/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-err.js new file mode 100644 index 0000000000..62f3f54981 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-err.js @@ -0,0 +1,68 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from IteratorClose (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 6. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-null.js b/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-null.js new file mode 100644 index 0000000000..748130761d --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-null.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + [...] + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var nextCount = 0; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([ , ] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-skip.js b/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-skip.js new file mode 100644 index 0000000000..abf29c0296 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-iter-nrml-close-skip.js @@ -0,0 +1,62 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close-skip.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is not called when iteration has exhausted the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ , ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elision-iter-nrml-close.js b/test/language/statements/for-of/dstr-array-elision-iter-nrml-close.js new file mode 100644 index 0000000000..c8b37ad71d --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-iter-nrml-close.js @@ -0,0 +1,77 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is called when assignment evaluation has not exhausted the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elision ] + + 1. Let iterator be GetIterator(value). + [...] + 5. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + [...] + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ , ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 1); + assert.sameValue(thisValue, iterator, 'correct `this` value'); + assert(!!args, 'arguments object provided'); + assert.sameValue(args.length, 0, 'zero arguments specified'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elision-val-array.js b/test/language/statements/for-of/dstr-array-elision-val-array.js new file mode 100644 index 0000000000..dbab48d289 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-val-array.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-array.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +for ([,] of [[]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elision-val-bool.js b/test/language/statements/for-of/dstr-array-elision-val-bool.js new file mode 100644 index 0000000000..912643be2f --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-val-bool.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-bool.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for boolean values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ([,] of [true]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elision-val-null.js b/test/language/statements/for-of/dstr-array-elision-val-null.js new file mode 100644 index 0000000000..a0970f3dcb --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-val-null.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for `null`. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ([,] of [null]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elision-val-num.js b/test/language/statements/for-of/dstr-array-elision-val-num.js new file mode 100644 index 0000000000..ecfa025a13 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-val-num.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-num.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for number values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ([,] of [1]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elision-val-string.js b/test/language/statements/for-of/dstr-array-elision-val-string.js new file mode 100644 index 0000000000..4b04ac1763 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-val-string.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-string.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +for ([,] of ['string literal']) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-elision-val-symbol.js b/test/language/statements/for-of/dstr-array-elision-val-symbol.js new file mode 100644 index 0000000000..47cf227803 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-val-symbol.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-symbol.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for symbol values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var s = Symbol(); + +var counter = 0; + +assert.throws(TypeError, function() { + for ([,] of [s]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-elision-val-undef.js b/test/language/statements/for-of/dstr-array-elision-val-undef.js new file mode 100644 index 0000000000..6d152e327c --- /dev/null +++ b/test/language/statements/for-of/dstr-array-elision-val-undef.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-undef.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values and throws for `undefined`. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ([,] of [undefined]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-empty-iter-close-err.js b/test/language/statements/for-of/dstr-array-empty-iter-close-err.js new file mode 100644 index 0000000000..78002a047c --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-iter-close-err.js @@ -0,0 +1,64 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from IteratorClose (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + 3. Return IteratorClose(iterator, NormalCompletion(empty)). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + throw new Test262Error(); + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-empty-iter-close-null.js b/test/language/statements/for-of/dstr-array-empty-iter-close-null.js new file mode 100644 index 0000000000..348555325f --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-iter-close-null.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-close-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + 3. Return IteratorClose(iterator, NormalCompletion(empty)). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + 9. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +var iterable = {}; +var iterator = { + next: function() { + return { done: true }; + }, + return: function() { + return null; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-empty-iter-close.js b/test/language/statements/for-of/dstr-array-empty-iter-close.js new file mode 100644 index 0000000000..1bb0441e0b --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-iter-close.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Iterator is closed without iterating (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + 3. Return IteratorClose(iterator, NormalCompletion(empty)). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([] of [iterable]) { + assert.sameValue(nextCount, 0); + assert.sameValue(returnCount, 1); + assert.sameValue(thisValue, iterator, 'correct `this` value'); + assert(!!args, 'arguments object provided'); + assert.sameValue(args.length, 0, 'zero arguments specified'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-empty-iter-get-err.js b/test/language/statements/for-of/dstr-array-empty-iter-get-err.js new file mode 100644 index 0000000000..6ab8c8d0a6 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-iter-get-err.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-get-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from GetIterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-empty-val-array.js b/test/language/statements/for-of/dstr-array-empty-val-array.js new file mode 100644 index 0000000000..1781306fbc --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-val-array.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-array.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +for ([] of [[]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-empty-val-bool.js b/test/language/statements/for-of/dstr-array-empty-val-bool.js new file mode 100644 index 0000000000..ed23e0fdb0 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-val-bool.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-bool.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for boolean values (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ([] of [true]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-empty-val-null.js b/test/language/statements/for-of/dstr-array-empty-val-null.js new file mode 100644 index 0000000000..2b75f0fbb1 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-val-null.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for `null`. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ([] of [null]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-empty-val-num.js b/test/language/statements/for-of/dstr-array-empty-val-num.js new file mode 100644 index 0000000000..cee38d9362 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-val-num.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-num.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for number values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ([] of [1]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-empty-val-string.js b/test/language/statements/for-of/dstr-array-empty-val-string.js new file mode 100644 index 0000000000..e49bcfb5eb --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-val-string.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-string.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +for ([] of ['string literal']) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-empty-val-symbol.js b/test/language/statements/for-of/dstr-array-empty-val-symbol.js new file mode 100644 index 0000000000..bf8aa5b99c --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-val-symbol.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-symbol.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for Symbol values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var s = Symbol(); + +var counter = 0; + +assert.throws(TypeError, function() { + for ([] of [s]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-empty-val-undef.js b/test/language/statements/for-of/dstr-array-empty-val-undef.js new file mode 100644 index 0000000000..4a54b7fd38 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-empty-val-undef.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-undef.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values and throws for `undefined`. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ([] of [undefined]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-iteration.js b/test/language/statements/for-of/dstr-array-iteration.js new file mode 100644 index 0000000000..8f522409b2 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-iteration.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-iteration.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Value iteration only proceeds for the number of elements in the ArrayAssignmentPattern. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var count = 0; +var g = function*() { + count += 1; + yield; + count += 1; + yield; + count += 1; +} + +var counter = 0; + +for ([,,] of [g()]) { + assert.sameValue(count, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-after-element.js b/test/language/statements/for-of/dstr-array-rest-after-element.js new file mode 100644 index 0000000000..ae677c5919 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-after-element.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-after-element.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An AssignmentRestElement following an AssignmentElement consumes all remaining iterable values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x, y; + +var counter = 0; + +for ([x, ...y] of [[1, 2, 3]]) { + assert.sameValue(x, 1); + assert.sameValue(y.length, 2); + assert.sameValue(y[0], 2); + assert.sameValue(y[1], 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-after-elision.js b/test/language/statements/for-of/dstr-array-rest-after-elision.js new file mode 100644 index 0000000000..1fadc1ea85 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-after-elision.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-after-elision.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An AssignmentRestElement following an elision consumes all remaining iterable values. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ([, ...x] of [[1, 2, 3]]) { + assert.sameValue(x.length, 2); + assert.sameValue(x[0], 2); + assert.sameValue(x[1], 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-before-element.js b/test/language/statements/for-of/dstr-array-rest-before-element.js new file mode 100644 index 0000000000..8278ee7485 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-before-element.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-element.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: An AssignmentElement may not follow an AssignmentRestElement in an AssignmentElementList. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...x, y] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-before-elision.js b/test/language/statements/for-of/dstr-array-rest-before-elision.js new file mode 100644 index 0000000000..45b151db48 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-before-elision.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-elision.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: An elision may not follow an AssignmentRestElement in an AssignmentElementList. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...x,] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-before-rest.js b/test/language/statements/for-of/dstr-array-rest-before-rest.js new file mode 100644 index 0000000000..1510b3bccc --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-before-rest.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-before-rest.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: An AssignmentRestElement may not follow another AssignmentRestElement in an AssignmentElementList. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...x, ...y] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-elision-invalid.js b/test/language/statements/for-of/dstr-array-rest-elision-invalid.js new file mode 100644 index 0000000000..1eacb7487c --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-elision-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-elision-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: ArrayAssignmentPattern may not include elisions following an AssignmentRestElement in a AssignmentElementList. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...x,] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-elision-iter-abpt.js b/test/language/statements/for-of/dstr-array-rest-elision-iter-abpt.js new file mode 100644 index 0000000000..8d8060368e --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-elision-iter-abpt.js @@ -0,0 +1,70 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-elision-iter-abpt.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is not called when assignment evaluation produces an abrupt completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 4. If Elision is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of Elision with + iteratorRecord as the argument. + b. If status is an abrupt completion, then + i. If iteratorRecord.[[done]] is false, return + IteratorClose(iterator, status). + ii. Return Completion(status). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; +var x; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([ , ...x] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-elision.js b/test/language/statements/for-of/dstr-array-rest-elision.js new file mode 100644 index 0000000000..b020b1ffb7 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-elision.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-elision.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: ArrayAssignmentPattern may include elisions at any position preceeding a AssignmentRestElement in a AssignmentElementList. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x, y; + +var counter = 0; + +for ([, , x, , ...y] of [[1, 2, 3, 4, 5, 6]]) { + assert.sameValue(x, 3); + assert.sameValue(y.length, 2); + assert.sameValue(y[0], 5); + assert.sameValue(y[1], 6); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-init.js b/test/language/statements/for-of/dstr-array-rest-init.js new file mode 100644 index 0000000000..4bb7e9b48a --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-init.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-init.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: The AssignmentRestElement does not support an initializer. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +for ([...x = 1] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-iter-get-err.js b/test/language/statements/for-of/dstr-array-rest-iter-get-err.js new file mode 100644 index 0000000000..91c549e70f --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iter-get-err.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-get-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Abrupt completion returned from GetIterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + 1. Let iterator be GetIterator(value). + 2. ReturnIfAbrupt(iterator). + +---*/ +var iterable = {}; +var x; +iterable[Symbol.iterator] = function() { + throw new Test262Error(); +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([...x] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-iter-nrml-close-skip.js b/test/language/statements/for-of/dstr-array-rest-iter-nrml-close-skip.js new file mode 100644 index 0000000000..242712f2c0 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iter-nrml-close-skip.js @@ -0,0 +1,64 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-nrml-close-skip.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is not called when assignment evaluation has exhausted the iterator (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + 7. Return result. + +---*/ +var nextCount = 0; +var returnCount = 0; +var x; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([ ...x ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close-err.js b/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close-err.js new file mode 100644 index 0000000000..06710dffcb --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close-err.js @@ -0,0 +1,88 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close-err.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +function ReturnError() {} +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + + throw new Test262Error(); + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([...{}[yield]] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); +assert.throws(Test262Error, function() { + iter.return(); +}); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); diff --git a/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close-null.js b/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close-null.js new file mode 100644 index 0000000000..2e1a39f127 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close-null.js @@ -0,0 +1,87 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close-null.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var iterable = {}; +var iterator = { + return: function() { + return null; + } +}; +var iter; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([...{}[yield]] of [iterable]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close.js b/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close.js new file mode 100644 index 0000000000..8dba9a9fd4 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iter-rtrn-close.js @@ -0,0 +1,99 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + 7. If completion.[[type]] is throw, return Completion(completion). + 8. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +var returnCount = 0; +var unreachable = 0; +var thisValue = null; +var args = null; +var iterable = {}; +var iterator = { + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +var iter, result; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +function* g() { + +var counter = 0; + +for ([...{}[yield]] of [iterable]) { + unreachable += 1; + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +iter = g(); +iter.next(); +result = iter.return(444); + +assert.sameValue(returnCount, 1); +assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); +assert.sameValue(result.value, 444); +assert(result.done, 'Iterator correctly closed'); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/statements/for-of/dstr-array-rest-iter-thrw-close-err.js b/test/language/statements/for-of/dstr-array-rest-iter-thrw-close-err.js new file mode 100644 index 0000000000..8903b66da2 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iter-thrw-close-err.js @@ -0,0 +1,84 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-thrw-close-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "throw" completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + +---*/ +var nextCount = 0; +var returnCount = 0; +var x; +function ReturnError() {} +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + + // This value should be discarded. + throw new ReturnError(); + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([...{}[thrower()]] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-iter-thrw-close-skip.js b/test/language/statements/for-of/dstr-array-rest-iter-thrw-close-skip.js new file mode 100644 index 0000000000..6edaa67a08 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iter-thrw-close-skip.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-thrw-close-skip.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is not called when iteration produces an abrupt completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + +---*/ +var nextCount = 0; +var returnCount = 0; +var x; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + throw new Test262Error(); + }, + return: function() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([...x] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-iter-thrw-close.js b/test/language/statements/for-of/dstr-array-rest-iter-thrw-close.js new file mode 100644 index 0000000000..c4b24b2b3c --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iter-thrw-close.js @@ -0,0 +1,92 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-thrw-close.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "throw" completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 6. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var thisValue = null; +var args = null; +var x; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return: function() { + returnCount += 1; + thisValue = this; + args = arguments; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([...{}[thrower()]] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); +assert.sameValue(thisValue, iterator, 'correct `this` value'); +assert(!!args, 'arguments object provided'); +assert.sameValue(args.length, 0, 'zero arguments specified'); diff --git a/test/language/statements/for-of/dstr-array-rest-iteration.js b/test/language/statements/for-of/dstr-array-rest-iteration.js new file mode 100644 index 0000000000..bc666b785d --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-iteration.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iteration.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: In the presense of an AssignmentRestElement, value iteration exhausts the iterable value; (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var count = 0; +var g = function*() { + count += 1; + yield; + count += 1; + yield; + count += 1; +} +var x; + +var counter = 0; + +for ([...x] of [g()]) { + assert.sameValue(count, 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-lref-err.js b/test/language/statements/for-of/dstr-array-rest-lref-err.js new file mode 100644 index 0000000000..9eaefcba08 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-lref-err.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-lref-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is called when reference evaluation produces an abrupt completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([...{}[thrower()]] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 0); +assert.sameValue(returnCount, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-lref.js b/test/language/statements/for-of/dstr-array-rest-lref.js new file mode 100644 index 0000000000..096510227c --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-lref.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-lref.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Reference is evaluated during assignment (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + 1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Let lref be the result of evaluating DestructuringAssignmentTarget. + b. ReturnIfAbrupt(lref). + [...] + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +var obj = {}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +for ([...obj['a' + 'b']] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + assert(!!obj.ab); + assert.sameValue(obj.ab.length, 0); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-invalid.js b/test/language/statements/for-of/dstr-array-rest-nested-array-invalid.js new file mode 100644 index 0000000000..1efe016a10 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...[(x, y)]] of [[[]]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-iter-thrw-close-skip.js b/test/language/statements/for-of/dstr-array-rest-nested-array-iter-thrw-close-skip.js new file mode 100644 index 0000000000..cdd0975145 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-iter-thrw-close-skip.js @@ -0,0 +1,79 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-iter-thrw-close-skip.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is not called when nested array pattern evaluation produces an abrupt completion (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + [...] + 4. Repeat while iteratorRecord.[[done]] is false + [...] + d. If next is false, set iteratorRecord.[[done]] to true. + [...] + 7. Return the result of performing DestructuringAssignmentEvaluation of + nestedAssignmentPattern with A as the argument. + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +var thrower = function() { + throw new Test262Error(); +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([...[...{}[thrower()]]] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-null.js b/test/language/statements/for-of/dstr-array-rest-nested-array-null.js new file mode 100644 index 0000000000..ca29d3d882 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-null.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-null.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable emits `null` as the only value, an array with a single `null` element should be used as the value of the nested DestructuringAssignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x, y; + +var counter = 0; + +for ([...[x, y]] of [[null]]) { + assert.sameValue(x, null); + assert.sameValue(y, undefined); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-undefined-hole.js b/test/language/statements/for-of/dstr-array-rest-nested-array-undefined-hole.js new file mode 100644 index 0000000000..33f260d2ef --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-undefined-hole.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined-hole.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable is an array with a "hole", an array with a single `undefined` element should be used as the value of the nested DestructuringAssignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; + +var counter = 0; + +for ([...[x]] of [[ , ]]) { + assert.sameValue(x, undefined); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-undefined-own.js b/test/language/statements/for-of/dstr-array-rest-nested-array-undefined-own.js new file mode 100644 index 0000000000..0d849bf5c8 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-undefined-own.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined-own.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable emits `undefined` as the only value, an array with a single `undefined` element should be used as the value of the nested DestructuringAssignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; + +var counter = 0; + +for ([...[x]] of [[undefined]]) { + assert.sameValue(x, undefined); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-undefined.js b/test/language/statements/for-of/dstr-array-rest-nested-array-undefined.js new file mode 100644 index 0000000000..cf531368bf --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-undefined.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable is emits no values, an empty array should be used as the value of the nested DestructuringAssignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; + +var counter = 0; + +for ([...[x]] of [[]]) { + assert.sameValue(x, undefined); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-yield-expr.js b/test/language/statements/for-of/dstr-array-rest-nested-array-yield-expr.js new file mode 100644 index 0000000000..41109ea2b8 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-yield-expr.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and within a generator function body, it should behave as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var value = [86]; +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var counter = 0; + +for ([...[x[yield]]] of [[86]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop, 86); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-yield-ident-invalid.js b/test/language/statements/for-of/dstr-array-rest-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..8058bce733 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...[x[yield]]] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array-yield-ident-valid.js b/test/language/statements/for-of/dstr-array-rest-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..27a1a4bd80 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 'prop'; +var x = {}; + +var counter = 0; + +for ([...[x[yield]]] of [[86]]) { + assert.sameValue(x.prop, 86); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-array.js b/test/language/statements/for-of/dstr-array-rest-nested-array.js new file mode 100644 index 0000000000..a5213dff84 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-array.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ([...[x]] of [[1, 2, 3]]) { + assert.sameValue(x, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj-invalid.js b/test/language/statements/for-of/dstr-array-rest-nested-obj-invalid.js new file mode 100644 index 0000000000..3d89a6b124 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...{ get x() {} }] of [[[]]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj-null.js b/test/language/statements/for-of/dstr-array-rest-nested-obj-null.js new file mode 100644 index 0000000000..34ddc54418 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj-null.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-null.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the iterable emits `null` as the only value, an array with a single `null` element should be used as the value of the nested DestructuringAssignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x, length; + +var counter = 0; + +for ([...{ 0: x, length }] of [[null]]) { + assert.sameValue(x, null); + assert.sameValue(length, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined-hole.js b/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..df81e50009 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined-hole.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined-hole.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable is an array with a "hole", an array with a single `undefined` element should be used as the value of the nested DestructuringAssignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var length; + +var counter = 0; + +for ([...{ 0: x, length }] of [[ , ]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined-own.js b/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined-own.js new file mode 100644 index 0000000000..2ddd8bf6e1 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined-own.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined-own.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the iterable emits `undefined` as the only value, an array with a single `undefined` element should be used as the value of the nested DestructuringAssignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var length; + +var counter = 0; + +for ([...{ 0: x, length }] of [[undefined]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined.js b/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined.js new file mode 100644 index 0000000000..7bcd45f947 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj-undefined.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an obect literal and the iterable is emits no values, an empty array should be used as the value of the nested DestructuringAssignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var length; + +var counter = 0; + +for ([...{ 0: x, length }] of [[]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 0); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-expr.js b/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-expr.js new file mode 100644 index 0000000000..29afa94ddb --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-expr.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and within a generator function body, it should behave as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var iterationResult, iter, x; + +iter = (function*() { + +var counter = 0; + +for ([...{ x = yield }] of [[{}]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(4); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 4); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-invalid.js b/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..b29ac0f2d7 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ([...{ x = yield }] of [[{}]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-valid.js b/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..edb363d4ef --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 2; +var x; + +var counter = 0; + +for ([...{ x = yield }] of [[{}]]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-nested-obj.js b/test/language/statements/for-of/dstr-array-rest-nested-obj.js new file mode 100644 index 0000000000..422093c69a --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-nested-obj.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ([...{ 1: x }] of [[1, 2, 3]]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-put-const.js b/test/language/statements/for-of/dstr-array-rest-put-const.js new file mode 100644 index 0000000000..6415c59e92 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-put-const.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-const.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: The assignment target should obey `const` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [const, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +const c = null; + +var counter = 0; + +assert.throws(TypeError, function() { + for ([ ...c ] of [[1]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-put-let.js b/test/language/statements/for-of/dstr-array-rest-put-let.js new file mode 100644 index 0000000000..208cfe694f --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-put-let.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-let.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: The assignment target should obey `let` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [let, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ([ ...x ] of [[]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +let x; diff --git a/test/language/statements/for-of/dstr-array-rest-put-prop-ref-no-get.js b/test/language/statements/for-of/dstr-array-rest-put-prop-ref-no-get.js new file mode 100644 index 0000000000..36a2810280 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-put-prop-ref-no-get.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref-no-get.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var setValue; +var x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +var counter = 0; + +for ([...x.y] of [[23, 45, 99]]) { + assert.sameValue(setValue.length, 3); + assert.sameValue(setValue[0], 23); + assert.sameValue(setValue[1], 45); + assert.sameValue(setValue[2], 99); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js b/test/language/statements/for-of/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js new file mode 100644 index 0000000000..66beaf4514 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-put-prop-ref-user-err-iter-close-skip.js @@ -0,0 +1,82 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref-user-err-iter-close-skip.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: IteratorClose is not called when value assignment produces an abrupt completion. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol.iterator, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] + + [...] + 5. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with + iteratorRecord as the argument + 6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + result). + + AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget + + [...] + 4. Repeat while iteratorRecord.[[done]] is false + [...] + d. If next is false, set iteratorRecord.[[done]] to true. + [...] + 5. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an + ArrayLiteral, then + a. Return PutValue(lref, A). + +---*/ +var nextCount = 0; +var returnCount = 0; +var iterable = {}; +var iterator = { + next: function() { + nextCount += 1; + return { done: true }; + }, + return: function() { + returnCount += 1; + } +}; +var obj = Object.defineProperty({}, 'poisoned', { + set: function(x) { + throw new Test262Error(); + } +}); +iterable[Symbol.iterator] = function() { + return iterator; +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([...obj.poisoned] of [iterable]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +assert.sameValue(nextCount, 1); +assert.sameValue(returnCount, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-put-prop-ref-user-err.js b/test/language/statements/for-of/dstr-array-rest-put-prop-ref-user-err.js new file mode 100644 index 0000000000..ae836d3416 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-put-prop-ref-user-err.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref-user-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Any error raised as a result of setting the value should be forwarded to the runtime. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = { + set y(val) { + throw new Test262Error(); + } +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ([...x.y] of [[23]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-put-prop-ref.js b/test/language/statements/for-of/dstr-array-rest-put-prop-ref.js new file mode 100644 index 0000000000..aacc377ca2 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-put-prop-ref.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = {}; + +var counter = 0; + +for ([...x.y] of [[4, 3, 2]]) { + assert.sameValue(x.y.length, 3); + assert.sameValue(x.y[0], 4); + assert.sameValue(x.y[1], 3); + assert.sameValue(x.y[2], 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-array-rest-put-unresolvable-no-strict.js b/test/language/statements/for-of/dstr-array-rest-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..a3a751748b --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-put-unresolvable-no-strict.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Outside of strict mode, if the the assignment target is an unresolvable reference, a new `var` binding should be created in the environment record. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +{ + +var counter = 0; + +for ([ ...unresolvable ] of [[]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +assert.sameValue(unresolvable.length, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-put-unresolvable-strict.js b/test/language/statements/for-of/dstr-array-rest-put-unresolvable-strict.js new file mode 100644 index 0000000000..cc05841466 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-put-unresolvable-strict.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-unresolvable-strict.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ([ ...unresolvable ] of [[]]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-array-rest-yield-expr.js b/test/language/statements/for-of/dstr-array-rest-yield-expr.js new file mode 100644 index 0000000000..2cbd60bfaa --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-yield-expr.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentRestElement and within the body of a generator function, it should behave as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var counter = 0; + +for ([...x[yield]] of [[33, 44, 55]]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop.length, 3); +assert.sameValue(x.prop[0], 33); +assert.sameValue(x.prop[1], 44); +assert.sameValue(x.prop[2], 55); diff --git a/test/language/statements/for-of/dstr-array-rest-yield-ident-invalid.js b/test/language/statements/for-of/dstr-array-rest-yield-ident-invalid.js new file mode 100644 index 0000000000..0348219f28 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-yield-ident-invalid.js @@ -0,0 +1,31 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentRestElement and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = {}; + +for ([...x[yield]] of [[]]) ; diff --git a/test/language/statements/for-of/dstr-array-rest-yield-ident-valid.js b/test/language/statements/for-of/dstr-array-rest-yield-ident-valid.js new file mode 100644 index 0000000000..8e73b902c8 --- /dev/null +++ b/test/language/statements/for-of/dstr-array-rest-yield-ident-valid.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentRestElement and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 'prop'; +var x = {}; + +var counter = 0; + +for ([...x[yield]] of [[33, 44, 55]]) { + assert.sameValue(x.prop.length, 3); + assert.sameValue(x.prop[0], 33); + assert.sameValue(x.prop[1], 44); + assert.sameValue(x.prop[2], 55); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-empty-bool.js b/test/language/statements/for-of/dstr-obj-empty-bool.js new file mode 100644 index 0000000000..bdd517c9bf --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-empty-bool.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-bool.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (boolean value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +for ({} of [false]) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-empty-null.js b/test/language/statements/for-of/dstr-obj-empty-null.js new file mode 100644 index 0000000000..97384cdfce --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-empty-null.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (null value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ({} of [null]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-empty-num.js b/test/language/statements/for-of/dstr-obj-empty-num.js new file mode 100644 index 0000000000..be9f77209a --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-empty-num.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-num.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (number value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +for ({} of [0]) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-empty-obj.js b/test/language/statements/for-of/dstr-obj-empty-obj.js new file mode 100644 index 0000000000..e148b2f5cf --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-empty-obj.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-obj.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (object value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +for ({} of [{}]) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-empty-string.js b/test/language/statements/for-of/dstr-obj-empty-string.js new file mode 100644 index 0000000000..575a8c7424 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-empty-string.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-string.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (string value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +for ({} of ['']) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-empty-symbol.js b/test/language/statements/for-of/dstr-obj-empty-symbol.js new file mode 100644 index 0000000000..e4ef786a45 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-empty-symbol.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-symbol.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (symbol value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [Symbol, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var s = Symbol(); + +var counter = 0; + +for ({} of [s]) { + + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-empty-undef.js b/test/language/statements/for-of/dstr-obj-empty-undef.js new file mode 100644 index 0000000000..56bbe87e06 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-empty-undef.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-undef.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (undefined value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(TypeError, function() { + for ({} of [undefined]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-id-identifier-resolution-first.js b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-first.js new file mode 100644 index 0000000000..2d75d4486c --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-first.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-first.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var y; + +var counter = 0; + +for ({ x, y } of [{ x: 3 }]) { + assert.sameValue(x, 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-identifier-resolution-last.js b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-last.js new file mode 100644 index 0000000000..1b3160ee4b --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-last.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-last.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var w; + +var counter = 0; + +for ({ w, x } of [{ x: 4 }]) { + assert.sameValue(x, 4); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-identifier-resolution-lone.js b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-lone.js new file mode 100644 index 0000000000..269c8a7945 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-lone.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-lone.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; + +var counter = 0; + +for ({ x, } of [{ x: 2 }]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-identifier-resolution-middle.js b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-middle.js new file mode 100644 index 0000000000..6b586581f6 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-middle.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-middle.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var w, y; + +var counter = 0; + +for ({ w, x, y } of [{ x: 5 }]) { + assert.sameValue(x, 5); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-identifier-resolution-trlng.js b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-trlng.js new file mode 100644 index 0000000000..ef0ee379b6 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-identifier-resolution-trlng.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-trlng.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier with trailing comma) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; + +var counter = 0; + +for ({ x } of [{ x: 1 }]) { + assert.sameValue(x, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-identifier-yield-expr.js b/test/language/statements/for-of/dstr-obj-id-identifier-yield-expr.js new file mode 100644 index 0000000000..6cd810de7d --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-identifier-yield-expr.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-expr.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: yield is not a valid IdentifierReference in an AssignmentProperty within generator function bodies. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated, noStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +(function*() { + +for ({ yield } of [{}]) ; + +}); diff --git a/test/language/statements/for-of/dstr-obj-id-identifier-yield-ident-invalid.js b/test/language/statements/for-of/dstr-obj-id-identifier-yield-ident-invalid.js new file mode 100644 index 0000000000..41ec261777 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-identifier-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: yield is not a valid IdentifierReference in an AssignmentProperty within strict mode code. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ yield } of [{}]) ; diff --git a/test/language/statements/for-of/dstr-obj-id-identifier-yield-ident-valid.js b/test/language/statements/for-of/dstr-obj-id-identifier-yield-ident-valid.js new file mode 100644 index 0000000000..fc069cc491 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-identifier-yield-ident-valid.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: yield is a valid IdentifierReference in an AssignmentProperty outside of strict mode and generator functions. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield; + +var counter = 0; + +for ({ yield } of [{ yield: 3 }]) { + assert.sameValue(yield, 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-assignment-missing.js b/test/language/statements/for-of/dstr-obj-id-init-assignment-missing.js new file mode 100644 index 0000000000..fa01390eed --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-assignment-missing.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-missing.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (no corresponding property defined). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ x = 1 } of [{}]) { + assert.sameValue(x, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-assignment-null.js b/test/language/statements/for-of/dstr-obj-id-init-assignment-null.js new file mode 100644 index 0000000000..e7c33b1377 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-assignment-null.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-null.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (null property value defined). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ x = 1 } of [{ x: null }]) { + assert.sameValue(x, null); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-assignment-truthy.js b/test/language/statements/for-of/dstr-obj-id-init-assignment-truthy.js new file mode 100644 index 0000000000..a665a105fe --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-assignment-truthy.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-truthy.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (truthy property value defined). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ x = 1 } of [{ x: 2 }]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-assignment-undef.js b/test/language/statements/for-of/dstr-obj-id-init-assignment-undef.js new file mode 100644 index 0000000000..61fd505c59 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-assignment-undef.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-undef.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference ("undefined" property value defined). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ x = 1 } of [{ x: undefined }]) { + assert.sameValue(x, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-evaluation.js b/test/language/statements/for-of/dstr-obj-id-init-evaluation.js new file mode 100644 index 0000000000..f2408416c9 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-evaluation.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-evaluation.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var flag1 = false; +var flag2 = false; +var x, y; + +var counter = 0; + +for ({ x = flag1 = true, y = flag2 = true } of [{ y: 1 }]) { + assert.sameValue(flag1, true); + assert.sameValue(flag2, false); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-fn-name-arrow.js b/test/language/statements/for-of/dstr-obj-id-init-fn-name-arrow.js new file mode 100644 index 0000000000..86056c4c0a --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-fn-name-arrow.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-arrow.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var arrow; + +var counter = 0; + +for ({ arrow = () => {} } of [{}]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-fn-name-class.js b/test/language/statements/for-of/dstr-obj-id-init-fn-name-class.js new file mode 100644 index 0000000000..4be54b8add --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-fn-name-class.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-class.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [class, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var xCls, cls; + +var counter = 0; + +for ({ xCls = class x {}, cls = class {} } of [{}]) { + assert.notSameValue(xCls.name, 'xCls'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-fn-name-cover.js b/test/language/statements/for-of/dstr-obj-id-init-fn-name-cover.js new file mode 100644 index 0000000000..0b1ffc3e7d --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-fn-name-cover.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-cover.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var xCover, cover; + +var counter = 0; + +for ({ xCover = (0, function() {}), cover = (function() {}) } of [{}]) { + assert.notSameValue(xCover.name, 'xCover'); + + assert.sameValue(cover.name, 'cover'); + verifyNotEnumerable(cover, 'name'); + verifyNotWritable(cover, 'name'); + verifyConfigurable(cover, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-fn-name-fn.js b/test/language/statements/for-of/dstr-obj-id-init-fn-name-fn.js new file mode 100644 index 0000000000..05c0a65a3c --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-fn-name-fn.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-fn.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var xFn, fn; + +var counter = 0; + +for ({ xFn = function x() {}, fn = function() {} } of [{}]) { + assert.notSameValue(xFn.name, 'xFn'); + + assert.sameValue(fn.name, 'fn'); + verifyNotEnumerable(fn, 'name'); + verifyNotWritable(fn, 'name'); + verifyConfigurable(fn, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-fn-name-gen.js b/test/language/statements/for-of/dstr-obj-id-init-fn-name-gen.js new file mode 100644 index 0000000000..f7e2bf22a9 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-fn-name-gen.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-gen.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentProperty : IdentifierReference Initializeropt + [...] 6. If Initializeropt is present and v is undefined, then + [...] + d. If IsAnonymousFunctionDefinition(Initializer) is true, then + i. Let hasNameProperty be HasOwnProperty(v, "name"). + ii. ReturnIfAbrupt(hasNameProperty). + iii. If hasNameProperty is false, perform SetFunctionName(v, P). + +---*/ +var xGen, gen; + +var counter = 0; + +for ({ xGen = function* x() {}, gen = function*() {} } of [{}]) { + assert.notSameValue(xGen.name, 'xGen'); + + assert.sameValue(gen.name, 'gen'); + verifyNotEnumerable(gen, 'name'); + verifyNotWritable(gen, 'name'); + verifyConfigurable(gen, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-in.js b/test/language/statements/for-of/dstr-obj-id-init-in.js new file mode 100644 index 0000000000..633c7788fe --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-in.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-in.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The Initializer in an AssignmentProperty may be an `in` expression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var prop; + +var counter = 0; + +for ({ prop = 'x' in {} } of [{}]) { + assert.sameValue(prop, false); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-let.js b/test/language/statements/for-of/dstr-obj-id-init-let.js new file mode 100644 index 0000000000..c86c2eb2f6 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-let.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-let.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Value retrieval of Initializer obeys `let` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [let, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ({ x = y } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +let y; diff --git a/test/language/statements/for-of/dstr-obj-id-init-order.js b/test/language/statements/for-of/dstr-obj-id-init-order.js new file mode 100644 index 0000000000..a9b417cf7d --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-order.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-order.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Initializer values should be assigned in left-to-right order. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = 0; +var a, b; + +var counter = 0; + +for ({ a = x += 1, b = x *= 2 } of [{}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-simple-no-strict.js b/test/language/statements/for-of/dstr-obj-id-init-simple-no-strict.js new file mode 100644 index 0000000000..c714a61d17 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-simple-no-strict.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-simple-no-strict.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var eval, arguments; + +var counter = 0; + +for ({ eval = 3, arguments = 4 } of [{}]) { + assert.sameValue(eval, 3); + assert.sameValue(arguments, 4); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-init-simple-strict.js b/test/language/statements/for-of/dstr-obj-id-init-simple-strict.js new file mode 100644 index 0000000000..88f4795606 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-simple-strict.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-simple-strict.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if IsValidSimpleAssignmentTarget of IdentifierReference is false. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ eval = 0 } of [{}]) ; diff --git a/test/language/statements/for-of/dstr-obj-id-init-yield-expr.js b/test/language/statements/for-of/dstr-obj-id-init-yield-expr.js new file mode 100644 index 0000000000..c69df1c4bf --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-yield-expr.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentProperty and within a generator function body, it should behave as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var iterationResult, x, iter; + +iter = (function*() { + +var counter = 0; + +for ({ x = yield } of [{}]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(3); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 3); diff --git a/test/language/statements/for-of/dstr-obj-id-init-yield-ident-invalid.js b/test/language/statements/for-of/dstr-obj-id-init-yield-ident-invalid.js new file mode 100644 index 0000000000..5d3661cae4 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentProperty and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x = yield } of [{}]) ; diff --git a/test/language/statements/for-of/dstr-obj-id-init-yield-ident-valid.js b/test/language/statements/for-of/dstr-obj-id-init-yield-ident-valid.js new file mode 100644 index 0000000000..2d65fb29d1 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-init-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentProperty and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 3; +var x; + +var counter = 0; + +for ({ x = yield } of [{}]) { + assert.sameValue(x, 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-id-put-const.js b/test/language/statements/for-of/dstr-obj-id-put-const.js new file mode 100644 index 0000000000..d35634db2c --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-put-const.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-const.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: The assignment target should obey `const` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [const, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +const c = null; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ c } of [{ c: 1 }]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-id-put-let.js b/test/language/statements/for-of/dstr-obj-id-put-let.js new file mode 100644 index 0000000000..c64463edf2 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-put-let.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-let.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: The assignment target should obey `let` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [let, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ({ x } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +let x; diff --git a/test/language/statements/for-of/dstr-obj-id-put-unresolvable-no-strict.js b/test/language/statements/for-of/dstr-obj-id-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..8edec73b5d --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-put-unresolvable-no-strict.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Outside of strict mode, if the the assignment target is an unresolvable reference, a new `var` binding should be created in the environment record. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +{ + +var counter = 0; + +for ({ unresolvable } of [{}]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/statements/for-of/dstr-obj-id-put-unresolvable-strict.js b/test/language/statements/for-of/dstr-obj-id-put-unresolvable-strict.js new file mode 100644 index 0000000000..0c0a73d562 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-put-unresolvable-strict.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-unresolvable-strict.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ({ unresolvable } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-id-simple-no-strict.js b/test/language/statements/for-of/dstr-obj-id-simple-no-strict.js new file mode 100644 index 0000000000..4a1378bba0 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-simple-no-strict.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-simple-no-strict.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var eval, arguments; + +var counter = 0; + +for ({ eval, arguments } of [{ eval: 1, arguments: 2 }]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +assert.sameValue(eval, 1); +assert.sameValue(arguments, 2); diff --git a/test/language/statements/for-of/dstr-obj-id-simple-strict.js b/test/language/statements/for-of/dstr-obj-id-simple-strict.js new file mode 100644 index 0000000000..778bf69926 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-id-simple-strict.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-simple-strict.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if IsValidSimpleAssignmentTarget of IdentifierReference is false. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ eval } of [{}]) ; diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-missing.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-missing.js new file mode 100644 index 0000000000..dde9738d5f --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-missing.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-missing.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (non-existent property) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ y: x = 1 } of [{}]) { + assert.sameValue(x, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-null.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-null.js new file mode 100644 index 0000000000..cd83ee02db --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-null.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-null.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is not undefined, the Initializer should be evaluated and the result assigned to the target reference (null value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ y: x = 1 } of [{ y: null }]) { + assert.sameValue(x, null); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-truthy.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-truthy.js new file mode 100644 index 0000000000..16bd1f2748 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-truthy.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-truthy.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is not undefined, the Initializer should be evaluated and the result assigned to the target reference (truthy value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ y: x = 1 } of [{ y: 2 }]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-undef.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-undef.js new file mode 100644 index 0000000000..4a405e9177 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-assignment-undef.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-undef.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference (undefined value) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ y: x = 1 } of [{ y: undefined }]) { + assert.sameValue(x, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-evaluation.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-evaluation.js new file mode 100644 index 0000000000..192c45e20b --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-evaluation.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-evaluation.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var flag1 = false; +var flag2 = false; +var x, y; + +var counter = 0; + +for ({ x: x = flag1 = true, y: y = flag2 = true } of [{ y: 1 }]) { + assert.sameValue(x, true, 'value of `x`'); + assert.sameValue(flag1, true, 'value of `flag1`'); + assert.sameValue(y, 1, 'value of `y`'); + assert.sameValue(flag2, false, 'value of `flag2`'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-arrow.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-arrow.js new file mode 100644 index 0000000000..1d54425b1b --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-arrow.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-arrow.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var arrow; + +var counter = 0; + +for ({ x: arrow = () => {} } of [{}]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-class.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-class.js new file mode 100644 index 0000000000..0796361460 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-class.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-class.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [class, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var xCls, cls; + +var counter = 0; + +for ({ x: xCls = class x {}, x: cls = class {} } of [{}]) { + assert.notSameValue(xCls.name, 'xCls'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-cover.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-cover.js new file mode 100644 index 0000000000..529ad3585c --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-cover.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-cover.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var xCover, cover; + +var counter = 0; + +for ({ x: xCover = (0, function() {}), x: cover = (function() {}) } of [{}]) { + assert.notSameValue(xCover.name, 'xCover'); + + assert.sameValue(cover.name, 'cover'); + verifyNotEnumerable(cover, 'name'); + verifyNotWritable(cover, 'name'); + verifyConfigurable(cover, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-fn.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..2d8273fd4c --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-fn.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-fn.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var xFn, fn; + +var counter = 0; + +for ({ x: xFn = function x() {}, x: fn = function() {} } of [{}]) { + assert.notSameValue(xFn.name, 'xFn'); + + assert.sameValue(fn.name, 'fn'); + verifyNotEnumerable(fn, 'name'); + verifyNotWritable(fn, 'name'); + verifyConfigurable(fn, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-gen.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..d73ad5f2c4 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-fn-name-gen.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-fn-name-gen.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +includes: [propertyHelper.js] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] + + AssignmentElement[Yield] : DestructuringAssignmentTarget Initializeropt + [...] 7. If Initializer is present and v is undefined and + IsAnonymousFunctionDefinition(Initializer) and IsIdentifierRef of + DestructuringAssignmentTarget are both true, then + a. Let hasNameProperty be HasOwnProperty(rhsValue, "name"). + b. ReturnIfAbrupt(hasNameProperty). + c. If hasNameProperty is false, perform SetFunctionName(rhsValue, + GetReferencedName(lref)). + +---*/ +var xGen, gen; + +var counter = 0; + +for ({ x: xGen = function* x() {}, x: gen = function*() {} } of [{}]) { + assert.notSameValue(xGen.name, 'xGen'); + + assert.sameValue(gen.name, 'gen'); + verifyNotEnumerable(gen, 'name'); + verifyNotWritable(gen, 'name'); + verifyConfigurable(gen, 'name'); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-in.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-in.js new file mode 100644 index 0000000000..6dda755ad7 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-in.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-in.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var prop; + +var counter = 0; + +for ({ x: prop = 'x' in {} } of [{}]) { + assert.sameValue(prop, false); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-let.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-let.js new file mode 100644 index 0000000000..89f9644c0c --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-let.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-let.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Value retrieval of Initializer obeys `let` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [let, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ({ x: x = y } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +let y; diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-expr.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-expr.js new file mode 100644 index 0000000000..80f7711dd4 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-expr.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement and within a generator function body, it should behave as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var iterationResult, iter, x; +iter = (function*() { + +var counter = 0; + +for ({ x: x = yield } of [{}]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(86); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 86); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-invalid.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-invalid.js new file mode 100644 index 0000000000..b0172f958e --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: x = yield } of [{}]) ; diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-valid.js b/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-valid.js new file mode 100644 index 0000000000..82c5b856d1 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-init-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 4; +var x; + +var counter = 0; + +for ({ x: x = yield } of [{}]) { + assert.sameValue(x, 4); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-expr.js b/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-expr.js new file mode 100644 index 0000000000..ac13dd8c6a --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-expr.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-target-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and within a generator function body, it should behave as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = {}; +var iterationResult, iter; + +iter = (function*() { + +var counter = 0; + +for ({ x: x[yield] } of [{ x: 23 }]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x.prop, undefined); + +iterationResult = iter.next('prop'); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x.prop, 23); diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-invalid.js b/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-invalid.js new file mode 100644 index 0000000000..e4067d0308 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-target-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: x[yield] } of [{}]) ; diff --git a/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-valid.js b/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-valid.js new file mode 100644 index 0000000000..2d4df319b4 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-elem-target-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-target-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 'prop'; +var x = {}; + +var counter = 0; + +for ({ x: x[yield] } of [{ x: 23 }]) { + assert.sameValue(x.prop, 23); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-first.js b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-first.js new file mode 100644 index 0000000000..f2fce4e190 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-first.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-first.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var y; + +var counter = 0; + +for ({ a: x, y } of [{ a: 3 }]) { + assert.sameValue(x, 3); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-last.js b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-last.js new file mode 100644 index 0000000000..7155a7dac1 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-last.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-last.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var w; + +var counter = 0; + +for ({ w, a: x } of [{ a: 4 }]) { + assert.sameValue(x, 4); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-lone.js b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-lone.js new file mode 100644 index 0000000000..2b3e6ea194 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-lone.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-lone.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; + +var counter = 0; + +for ({ a: x } of [{ a: 1 }]) { + assert.sameValue(x, 1); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-middle.js b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-middle.js new file mode 100644 index 0000000000..3372e21b69 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-middle.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-middle.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; +var w, y; + +var counter = 0; + +for ({ w, a: x, y } of [{ a: 5 }]) { + assert.sameValue(x, 5); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-trlng.js b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-trlng.js new file mode 100644 index 0000000000..35a902d6ba --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-identifier-resolution-trlng.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-trlng.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element with trailing comma). (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = null; + +var counter = 0; + +for ({ a: x, } of [{ a: 2 }]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-name-evaluation-error.js b/test/language/statements/for-of/dstr-obj-prop-name-evaluation-error.js new file mode 100644 index 0000000000..8a2998734e --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-name-evaluation-error.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-name-evaluation-error.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Any error raised as a result of evaluating PropertyName should be forwarded to the runtime. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var a, x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ [a.b]: x } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-name-evaluation.js b/test/language/statements/for-of/dstr-obj-prop-name-evaluation.js new file mode 100644 index 0000000000..3df6820539 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-name-evaluation.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-name-evaluation.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: PropertyName of an AssignmentProperty may be a ComputedPropertyName. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x, y, xy; + +var counter = 0; + +for ({ ['x' + 'y']: x } of [{ x: 1, xy: 23, y: 2 }]) { + assert.sameValue(x, 23); + assert.sameValue(y, undefined); + assert.sameValue(xy, undefined); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-array-invalid.js b/test/language/statements/for-of/dstr-obj-prop-nested-array-invalid.js new file mode 100644 index 0000000000..507fa926a5 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-array-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: [(x, y)] } of [{ x: [] }]) ; diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-array-null.js b/test/language/statements/for-of/dstr-obj-prop-nested-array-null.js new file mode 100644 index 0000000000..773345ece5 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-array-null.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `null`, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ x: [ x ] } of [{ x: null }]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-array-undefined-own.js b/test/language/statements/for-of/dstr-obj-prop-nested-array-undefined-own.js new file mode 100644 index 0000000000..c778ef0ecb --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-array-undefined-own.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-undefined-own.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `undefined`, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ x: [ x ] } of [{ x: undefined }]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-array-undefined.js b/test/language/statements/for-of/dstr-obj-prop-nested-array-undefined.js new file mode 100644 index 0000000000..66bda92467 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-array-undefined.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-undefined.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is not defined, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ x: [ x ] } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-expr.js b/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-expr.js new file mode 100644 index 0000000000..22c1ce988b --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-expr.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and within a generator function body, it should behave as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var iterationResult, iter, x; + +iter = (function*() { + +var counter = 0; + +for ({ x: [x = yield] } of [{ x: [] }]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(24601); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 24601); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-invalid.js b/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..a69caf807d --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: [x = yield] } of [{ x: [] }]) ; diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-valid.js b/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..06c7aaf14b --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-array-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 22; +var x; + +var counter = 0; + +for ({ x: [x = yield] } of [{ x: [] }]) { + assert.sameValue(x, 22); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-array.js b/test/language/statements/for-of/dstr-obj-prop-nested-array.js new file mode 100644 index 0000000000..a4043ee811 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-array.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var y; + +var counter = 0; + +for ({ x: [y] } of [{ x: [321] }]) { + assert.sameValue(y, 321); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-obj-invalid.js b/test/language/statements/for-of/dstr-obj-prop-nested-obj-invalid.js new file mode 100644 index 0000000000..c35fd2ce6b --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-obj-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is either an ObjectLiteral or an ArrayLiteral and if the lexical token sequence matched by LeftHandSideExpression cannot be parsed with no tokens left over using AssignmentPattern as the goal symbol. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: { get x() {} } } of [{ x: {} }]) ; diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-obj-null.js b/test/language/statements/for-of/dstr-obj-prop-nested-obj-null.js new file mode 100644 index 0000000000..f8bbb1728c --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-obj-null.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-null.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `null`, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ x: { x } } of [{ x: null }]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-obj-undefined-own.js b/test/language/statements/for-of/dstr-obj-prop-nested-obj-undefined-own.js new file mode 100644 index 0000000000..7a1d2fded4 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-obj-undefined-own.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-undefined-own.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `undefined`, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ x: { x } } of [{ x: undefined }]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-obj-undefined.js b/test/language/statements/for-of/dstr-obj-prop-nested-obj-undefined.js new file mode 100644 index 0000000000..6357746d8f --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-obj-undefined.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-undefined.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is not defined, a TypeError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ x: { x } } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-expr.js b/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-expr.js new file mode 100644 index 0000000000..5e67fb23b1 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-expr.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-yield-expr.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and within a generator function body, it should behave as a YieldExpression. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [generators, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var iterationResult, iter, x = undefined; + +iter = (function*() { + +var counter = 0; + +for ({ x: { x = yield } } of [{ x: {} }]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +}()); + +iterationResult = iter.next(); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, false); +assert.sameValue(x, undefined); + +iterationResult = iter.next(4); + +assert.sameValue(iterationResult.value, undefined); +assert.sameValue(iterationResult.done, true); +assert.sameValue(x, 4); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-invalid.js b/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..61b0241786 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-invalid.js @@ -0,0 +1,30 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment/syntax/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +negative: SyntaxError +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +for ({ x: { x = yield } } of [{ x: {} }]) ; diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-valid.js b/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..834bc0adda --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-obj-yield-ident-valid.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-yield-ident-valid.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When a `yield` token appears within the Initializer of a nested destructuring assignment and outside of a generator function body, it should behave as an IdentifierReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var yield = 2; +var result, x; + +var counter = 0; + +for ({ x: { x = yield } } of [{ x: {} }]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-nested-obj.js b/test/language/statements/for-of/dstr-obj-prop-nested-obj.js new file mode 100644 index 0000000000..7bac39f583 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-nested-obj.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var result, y; + +var counter = 0; + +for ({ x: { y } } of [{ x: { y: 2 } }]) { + assert.sameValue(y, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-put-const.js b/test/language/statements/for-of/dstr-obj-prop-put-const.js new file mode 100644 index 0000000000..3df627bef4 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-put-const.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-const.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: The assignment target should obey `const` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [const, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +const c = 1; + +var counter = 0; + +assert.throws(TypeError, function() { + for ({ a: c } of [{ a: 2 }]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-put-let.js b/test/language/statements/for-of/dstr-obj-prop-put-let.js new file mode 100644 index 0000000000..de776e39f6 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-put-let.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-let.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: The assignment target should obey `let` semantics. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [let, destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ({ a: x } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); + +let x; diff --git a/test/language/statements/for-of/dstr-obj-prop-put-order.js b/test/language/statements/for-of/dstr-obj-prop-put-order.js new file mode 100644 index 0000000000..b4c58b033e --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-put-order.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-order.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The AssignmentElements in an AssignmentElementList are evaluated in left- to-right order. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x; + +var counter = 0; + +for ({ z: x, a: x } of [{ a: 2, z: 1 }]) { + assert.sameValue(x, 2); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-put-prop-ref-no-get.js b/test/language/statements/for-of/dstr-obj-prop-put-prop-ref-no-get.js new file mode 100644 index 0000000000..7c3bedbb78 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-put-prop-ref-no-get.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-prop-ref-no-get.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var setValue; +var x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +var counter = 0; + +for ({ a: x.y } of [{ a: 23 }]) { + assert.sameValue(setValue, 23); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-put-prop-ref-user-err.js b/test/language/statements/for-of/dstr-obj-prop-put-prop-ref-user-err.js new file mode 100644 index 0000000000..c65ef29c3b --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-put-prop-ref-user-err.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-prop-ref-user-err.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: Any error raised as a result of setting the value should be forwarded to the runtime. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = { + set y(val) { + throw new Test262Error(); + } +}; + +var counter = 0; + +assert.throws(Test262Error, function() { + for ({ a: x.y } of [{ a: 23 }]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0); diff --git a/test/language/statements/for-of/dstr-obj-prop-put-prop-ref.js b/test/language/statements/for-of/dstr-obj-prop-put-prop-ref.js new file mode 100644 index 0000000000..2d25454950 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-put-prop-ref.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-prop-ref.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +var x = {}; + +var counter = 0; + +for ({ xy: x.y } of [{ xy: 4 }]) { + assert.sameValue(x.y, 4); + counter += 1; +} + +assert.sameValue(counter, 1); diff --git a/test/language/statements/for-of/dstr-obj-prop-put-unresolvable-no-strict.js b/test/language/statements/for-of/dstr-obj-prop-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..67b143c9d4 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-put-unresolvable-no-strict.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/for-of.template +/*--- +description: Outside of strict mode, if the the assignment target is an unresolvable reference, a new `var` binding should be created in the environment record. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, noStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +{ + +var counter = 0; + +for ({ x: unresolvable } of [{}]) { + + counter += 1; +} + +assert.sameValue(counter, 1); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/statements/for-of/dstr-obj-prop-put-unresolvable-strict.js b/test/language/statements/for-of/dstr-obj-prop-put-unresolvable-strict.js new file mode 100644 index 0000000000..7895517f31 --- /dev/null +++ b/test/language/statements/for-of/dstr-obj-prop-put-unresolvable-strict.js @@ -0,0 +1,38 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-unresolvable-strict.case +// - src/dstr-assignment/error/for-of.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (For..of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +es6id: 13.7.5.11 +features: [destructuring-binding] +flags: [generated, onlyStrict] +info: | + IterationStatement : + for ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 4. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +var counter = 0; + +assert.throws(ReferenceError, function() { + for ({ x: unresolvable } of [{}]) { + counter += 1; + } + counter += 1; +}); + +assert.sameValue(counter, 0);