From 670731a25efe9999edcdf826ee20e934d568b85e Mon Sep 17 00:00:00 2001 From: Rick Waldron <waldron.rick@gmail.com> Date: Wed, 31 May 2017 16:05:14 -0400 Subject: [PATCH] Generate tests Signed-off-by: Rick Waldron <waldron.rick@gmail.com> --- ...nc-decl-dstr-array-elem-init-assignment.js | 47 ++++++++ ...c-decl-dstr-array-elem-init-evaluation.js} | 16 +-- ...decl-dstr-array-elem-init-fn-name-arrow.js | 54 ++++++++++ ...decl-dstr-array-elem-init-fn-name-class.js | 59 ++++++++++ ...ecl-dstr-array-elem-init-fn-name-cover.js} | 20 ++-- ...nc-decl-dstr-array-elem-init-fn-name-fn.js | 56 ++++++++++ ...c-decl-dstr-array-elem-init-fn-name-gen.js | 56 ++++++++++ ...sync-func-decl-dstr-array-elem-init-in.js} | 14 +-- ...sync-func-decl-dstr-array-elem-init-let.js | 44 ++++++++ ...c-func-decl-dstr-array-elem-init-order.js} | 16 +-- ...-dstr-array-elem-init-simple-no-strict.js} | 14 +-- ...str-array-elem-init-yield-ident-invalid.js | 33 ++++++ ...-dstr-array-elem-init-yield-ident-valid.js | 43 ++++++++ ...nc-decl-dstr-array-elem-iter-nrml-close.js | 81 ++++++++++++++ ...cl-dstr-array-elem-nested-array-invalid.js | 33 ++++++ ...-decl-dstr-array-elem-nested-array-null.js | 44 ++++++++ ...-array-elem-nested-array-undefined-hole.js | 44 ++++++++ ...r-array-elem-nested-array-undefined-own.js | 44 ++++++++ ...-dstr-array-elem-nested-array-undefined.js | 43 ++++++++ ...y-elem-nested-array-yield-ident-invalid.js | 33 ++++++ ...ray-elem-nested-array-yield-ident-valid.js | 42 ++++++++ ...-func-decl-dstr-array-elem-nested-array.js | 41 +++++++ ...decl-dstr-array-elem-nested-obj-invalid.js | 33 ++++++ ...nc-decl-dstr-array-elem-nested-obj-null.js | 42 ++++++++ ...tr-array-elem-nested-obj-undefined-hole.js | 43 ++++++++ ...str-array-elem-nested-obj-undefined-own.js | 43 ++++++++ ...cl-dstr-array-elem-nested-obj-undefined.js | 43 ++++++++ ...ray-elem-nested-obj-yield-ident-invalid.js | 33 ++++++ ...rray-elem-nested-obj-yield-ident-valid.js} | 16 +-- ...c-func-decl-dstr-array-elem-nested-obj.js} | 14 +-- ...ync-func-decl-dstr-array-elem-put-const.js | 37 +++++++ ...async-func-decl-dstr-array-elem-put-let.js | 43 ++++++++ ...cl-dstr-array-elem-put-prop-ref-no-get.js} | 14 +-- ...l-dstr-array-elem-put-prop-ref-user-err.js | 47 ++++++++ ...func-decl-dstr-array-elem-put-prop-ref.js} | 14 +-- ...r-array-elem-put-unresolvable-no-strict.js | 41 +++++++ ...dstr-array-elem-put-unresolvable-strict.js | 42 ++++++++ ...-decl-dstr-array-elem-target-identifier.js | 45 ++++++++ ...cl-dstr-array-elem-target-simple-strict.js | 33 ++++++ ...cl-dstr-array-elem-target-yield-invalid.js | 33 ++++++ ...decl-dstr-array-elem-target-yield-valid.js | 44 ++++++++ ...-trlg-iter-elision-iter-nrml-close-null.js | 78 ++++++++++++++ ...-func-decl-dstr-array-elision-val-array.js | 41 +++++++ ...func-decl-dstr-array-elision-val-string.js | 42 ++++++++ ...nc-func-decl-dstr-array-empty-val-array.js | 41 +++++++ ...c-func-decl-dstr-array-empty-val-string.js | 41 +++++++ ...func-decl-dstr-array-rest-after-element.js | 46 ++++++++ ...func-decl-dstr-array-rest-after-elision.js | 46 ++++++++ ...async-func-decl-dstr-array-rest-elision.js | 47 ++++++++ ...ync-func-decl-dstr-array-rest-iteration.js | 52 +++++++++ ...-decl-dstr-array-rest-nested-array-null.js | 44 ++++++++ ...-array-rest-nested-array-undefined-hole.js | 42 ++++++++ ...r-array-rest-nested-array-undefined-own.js | 43 ++++++++ ...-dstr-array-rest-nested-array-undefined.js | 43 ++++++++ ...ray-rest-nested-array-yield-ident-valid.js | 43 ++++++++ ...-func-decl-dstr-array-rest-nested-array.js | 42 ++++++++ ...nc-decl-dstr-array-rest-nested-obj-null.js | 43 ++++++++ ...tr-array-rest-nested-obj-undefined-hole.js | 46 ++++++++ ...str-array-rest-nested-obj-undefined-own.js | 46 ++++++++ ...cl-dstr-array-rest-nested-obj-undefined.js | 46 ++++++++ ...array-rest-nested-obj-yield-ident-valid.js | 43 ++++++++ ...nc-func-decl-dstr-array-rest-nested-obj.js | 41 +++++++ ...ecl-dstr-array-rest-put-prop-ref-no-get.js | 52 +++++++++ ...-func-decl-dstr-array-rest-put-prop-ref.js | 44 ++++++++ ...r-array-rest-put-unresolvable-no-strict.js | 40 +++++++ ...-decl-dstr-array-rest-yield-ident-valid.js | 47 ++++++++ .../async-func-decl-dstr-obj-empty-bool.js | 40 +++++++ .../async-func-decl-dstr-obj-empty-num.js | 41 +++++++ .../async-func-decl-dstr-obj-empty-obj.js | 40 +++++++ .../async-func-decl-dstr-obj-empty-string.js | 40 +++++++ .../async-func-decl-dstr-obj-empty-symbol.js | 41 +++++++ ...dstr-obj-id-identifier-resolution-first.js | 42 ++++++++ ...-dstr-obj-id-identifier-resolution-last.js | 42 ++++++++ ...-dstr-obj-id-identifier-resolution-lone.js | 41 +++++++ ...str-obj-id-identifier-resolution-middle.js | 42 ++++++++ ...dstr-obj-id-identifier-resolution-trlng.js | 41 +++++++ ...ecl-dstr-obj-id-init-assignment-missing.js | 42 ++++++++ ...c-decl-dstr-obj-id-init-assignment-null.js | 42 ++++++++ ...decl-dstr-obj-id-init-assignment-truthy.js | 42 ++++++++ ...-decl-dstr-obj-id-init-assignment-undef.js | 42 ++++++++ ...c-func-decl-dstr-obj-id-init-evaluation.js | 45 ++++++++ ...unc-decl-dstr-obj-id-init-fn-name-arrow.js | 55 ++++++++++ ...unc-decl-dstr-obj-id-init-fn-name-class.js | 58 ++++++++++ ...unc-decl-dstr-obj-id-init-fn-name-cover.js | 57 ++++++++++ ...c-func-decl-dstr-obj-id-init-fn-name-fn.js | 57 ++++++++++ ...-func-decl-dstr-obj-id-init-fn-name-gen.js | 58 ++++++++++ .../async-func-decl-dstr-obj-id-init-in.js | 42 ++++++++ .../async-func-decl-dstr-obj-id-init-order.js | 44 ++++++++ ...-decl-dstr-obj-id-init-simple-no-strict.js | 42 ++++++++ ...decl-dstr-obj-id-init-yield-ident-valid.js | 43 ++++++++ ...-dstr-obj-id-put-unresolvable-no-strict.js | 45 ++++++++ ...-func-decl-dstr-obj-id-simple-no-strict.js | 45 ++++++++ ...r-obj-prop-elem-init-assignment-missing.js | 42 ++++++++ ...dstr-obj-prop-elem-init-assignment-null.js | 41 +++++++ ...tr-obj-prop-elem-init-assignment-truthy.js | 41 +++++++ ...str-obj-prop-elem-init-assignment-undef.js | 41 +++++++ ...decl-dstr-obj-prop-elem-init-evaluation.js | 47 ++++++++ ...l-dstr-obj-prop-elem-init-fn-name-arrow.js | 53 +++++++++ ...l-dstr-obj-prop-elem-init-fn-name-class.js | 56 ++++++++++ ...l-dstr-obj-prop-elem-init-fn-name-cover.js | 55 ++++++++++ ...decl-dstr-obj-prop-elem-init-fn-name-fn.js | 55 ++++++++++ ...ecl-dstr-obj-prop-elem-init-fn-name-gen.js | 56 ++++++++++ ...nc-func-decl-dstr-obj-prop-elem-init-in.js | 42 ++++++++ ...tr-obj-prop-elem-init-yield-ident-valid.js | 42 ++++++++ ...-obj-prop-elem-target-yield-ident-valid.js | 43 ++++++++ ...tr-obj-prop-identifier-resolution-first.js | 42 ++++++++ ...str-obj-prop-identifier-resolution-last.js | 42 ++++++++ ...str-obj-prop-identifier-resolution-lone.js | 41 +++++++ ...r-obj-prop-identifier-resolution-middle.js | 42 ++++++++ ...tr-obj-prop-identifier-resolution-trlng.js | 41 +++++++ ...func-decl-dstr-obj-prop-name-evaluation.js | 44 ++++++++ ...obj-prop-nested-array-yield-ident-valid.js | 42 ++++++++ ...nc-func-decl-dstr-obj-prop-nested-array.js | 41 +++++++ ...r-obj-prop-nested-obj-yield-ident-valid.js | 42 ++++++++ ...sync-func-decl-dstr-obj-prop-nested-obj.js | 41 +++++++ ...async-func-decl-dstr-obj-prop-put-order.js | 41 +++++++ ...-decl-dstr-obj-prop-put-prop-ref-no-get.js | 49 +++++++++ ...nc-func-decl-dstr-obj-prop-put-prop-ref.js | 41 +++++++ ...str-obj-prop-put-unresolvable-no-strict.js | 45 ++++++++ ...ync-func-decl-dstr-obj-rest-descriptors.js | 54 ++++++++++ ...async-func-decl-dstr-obj-rest-empty-obj.js | 45 ++++++++ .../async-func-decl-dstr-obj-rest-getter.js | 49 +++++++++ ...cl-dstr-obj-rest-nested-obj-nested-rest.js | 56 ++++++++++ ...sync-func-decl-dstr-obj-rest-nested-obj.js | 46 ++++++++ .../async-func-decl-dstr-obj-rest-number.js | 45 ++++++++ ...unc-decl-dstr-obj-rest-obj-own-property.js | 47 ++++++++ ...async-func-decl-dstr-obj-rest-same-name.js | 56 ++++++++++ ...-decl-dstr-obj-rest-skip-non-enumerable.js | 55 ++++++++++ .../async-func-decl-dstr-obj-rest-str-val.js | 46 ++++++++ ...sync-func-decl-dstr-obj-rest-symbol-val.js | 45 ++++++++ ...l-dstr-obj-rest-to-property-with-setter.js | 54 ++++++++++ ...ync-func-decl-dstr-obj-rest-to-property.js | 48 +++++++++ ...nc-func-decl-dstr-obj-rest-valid-object.js | 55 ++++++++++ ...n-decl-dstr-array-elem-init-assignment.js} | 14 +-- ...n-decl-dstr-array-elem-init-evaluation.js} | 16 +-- ...ecl-dstr-array-elem-init-fn-name-arrow.js} | 20 ++-- ...ecl-dstr-array-elem-init-fn-name-class.js} | 20 ++-- ...decl-dstr-array-elem-init-fn-name-cover.js | 56 ++++++++++ ...en-decl-dstr-array-elem-init-fn-name-fn.js | 56 ++++++++++ ...n-decl-dstr-array-elem-init-fn-name-gen.js | 56 ++++++++++ .../async-gen-decl-dstr-array-elem-init-in.js | 42 ++++++++ ...async-gen-decl-dstr-array-elem-init-let.js | 44 ++++++++ ...ync-gen-decl-dstr-array-elem-init-order.js | 45 ++++++++ ...l-dstr-array-elem-init-simple-no-strict.js | 43 ++++++++ ...en-decl-dstr-array-elem-init-yield-expr.js | 50 +++++++++ ...c-gen-decl-dstr-array-elem-iter-get-err.js | 53 +++++++++ ...ecl-dstr-array-elem-iter-nrml-close-err.js | 68 ++++++++++++ ...cl-dstr-array-elem-iter-nrml-close-null.js | 75 +++++++++++++ ...cl-dstr-array-elem-iter-nrml-close-skip.js | 67 ++++++++++++ ...en-decl-dstr-array-elem-iter-nrml-close.js | 81 ++++++++++++++ ...cl-dstr-array-elem-iter-rtrn-close-null.js | 67 ++++++++++++ ...cl-dstr-array-elem-iter-thrw-close-skip.js | 67 ++++++++++++ ...-decl-dstr-array-elem-nested-array-null.js | 44 ++++++++ ...-array-elem-nested-array-undefined-hole.js | 44 ++++++++ ...r-array-elem-nested-array-undefined-own.js | 44 ++++++++ ...-dstr-array-elem-nested-array-undefined.js | 43 ++++++++ ...dstr-array-elem-nested-array-yield-expr.js | 51 +++++++++ ...en-decl-dstr-array-elem-nested-obj-null.js | 42 ++++++++ ...tr-array-elem-nested-obj-undefined-hole.js | 43 ++++++++ ...str-array-elem-nested-obj-undefined-own.js | 43 ++++++++ ...cl-dstr-array-elem-nested-obj-undefined.js | 43 ++++++++ ...l-dstr-array-elem-nested-obj-yield-expr.js | 51 +++++++++ ...nc-gen-decl-dstr-array-elem-nested-obj.js} | 14 +-- ...sync-gen-decl-dstr-array-elem-put-const.js | 37 +++++++ .../async-gen-decl-dstr-array-elem-put-let.js | 43 ++++++++ ...ecl-dstr-array-elem-put-prop-ref-no-get.js | 51 +++++++++ ...l-dstr-array-elem-put-prop-ref-user-err.js | 47 ++++++++ ...c-gen-decl-dstr-array-elem-put-prop-ref.js | 43 ++++++++ ...-array-elem-put-unresolvable-no-strict.js} | 13 +-- ...dstr-array-elem-put-unresolvable-strict.js | 42 ++++++++ ...dstr-array-elem-target-simple-no-strict.js | 6 +- ...-decl-dstr-array-elem-target-yield-expr.js | 12 +-- ...-array-elem-trlg-iter-elision-iter-abpt.js | 85 +++++++++++++++ ...m-trlg-iter-elision-iter-nrml-close-err.js | 82 ++++++++++++++ ...-trlg-iter-elision-iter-nrml-close-null.js | 78 ++++++++++++++ ...-trlg-iter-elision-iter-nrml-close-skip.js | 78 ++++++++++++++ ...-elem-trlg-iter-elision-iter-nrml-close.js | 93 ++++++++++++++++ ...-decl-dstr-array-elem-trlg-iter-get-err.js | 55 ++++++++++ ...rray-elem-trlg-iter-list-nrml-close-err.js | 78 ++++++++++++++ ...ray-elem-trlg-iter-list-nrml-close-null.js | 83 ++++++++++++++ ...ray-elem-trlg-iter-list-nrml-close-skip.js | 76 +++++++++++++ ...tr-array-elem-trlg-iter-list-nrml-close.js | 89 +++++++++++++++ ...rray-elem-trlg-iter-list-rtrn-close-err.js | 77 +++++++++++++ ...ray-elem-trlg-iter-list-rtrn-close-null.js | 75 +++++++++++++ ...tr-array-elem-trlg-iter-list-rtrn-close.js | 85 +++++++++++++++ ...ray-elem-trlg-iter-list-thrw-close-skip.js | 76 +++++++++++++ ...ray-elem-trlg-iter-rest-nrml-close-skip.js | 74 +++++++++++++ ...rray-elem-trlg-iter-rest-rtrn-close-err.js | 86 +++++++++++++++ ...ray-elem-trlg-iter-rest-rtrn-close-null.js | 80 ++++++++++++++ ...dstr-array-elision-iter-nrml-close-skip.js | 69 ++++++++++++ ...decl-dstr-array-elision-iter-nrml-close.js | 86 +++++++++++++++ ...c-gen-decl-dstr-array-elision-val-array.js | 41 +++++++ ...-gen-decl-dstr-array-elision-val-string.js | 42 ++++++++ ...nc-gen-decl-dstr-array-empty-iter-close.js | 80 ++++++++++++++ ...ync-gen-decl-dstr-array-empty-val-array.js | 41 +++++++ ...nc-gen-decl-dstr-array-empty-val-string.js | 41 +++++++ ...-gen-decl-dstr-array-rest-after-element.js | 46 ++++++++ ...-gen-decl-dstr-array-rest-after-elision.js | 46 ++++++++ .../async-gen-decl-dstr-array-rest-elision.js | 47 ++++++++ ...cl-dstr-array-rest-iter-nrml-close-skip.js | 69 ++++++++++++ ...sync-gen-decl-dstr-array-rest-iteration.js | 52 +++++++++ .../async-gen-decl-dstr-array-rest-lref.js | 80 ++++++++++++++ ...-decl-dstr-array-rest-nested-array-null.js | 44 ++++++++ ...-array-rest-nested-array-undefined-hole.js | 42 ++++++++ ...r-array-rest-nested-array-undefined-own.js | 43 ++++++++ ...-dstr-array-rest-nested-array-undefined.js | 43 ++++++++ ...dstr-array-rest-nested-array-yield-expr.js | 50 +++++++++ ...c-gen-decl-dstr-array-rest-nested-array.js | 42 ++++++++ ...en-decl-dstr-array-rest-nested-obj-null.js | 43 ++++++++ ...tr-array-rest-nested-obj-undefined-hole.js | 46 ++++++++ ...str-array-rest-nested-obj-undefined-own.js | 46 ++++++++ ...cl-dstr-array-rest-nested-obj-undefined.js | 46 ++++++++ ...-dstr-array-rest-nested-obj-yield-expr.js} | 18 ++-- ...ync-gen-decl-dstr-array-rest-nested-obj.js | 41 +++++++ ...ecl-dstr-array-rest-put-prop-ref-no-get.js | 52 +++++++++ ...c-gen-decl-dstr-array-rest-put-prop-ref.js | 44 ++++++++ ...r-array-rest-put-unresolvable-no-strict.js | 40 +++++++ ...ync-gen-decl-dstr-array-rest-yield-expr.js | 55 ++++++++++ .../async-gen-decl-dstr-obj-empty-bool.js | 40 +++++++ .../async-gen-decl-dstr-obj-empty-num.js | 41 +++++++ .../async-gen-decl-dstr-obj-empty-obj.js | 40 +++++++ .../async-gen-decl-dstr-obj-empty-string.js | 40 +++++++ .../async-gen-decl-dstr-obj-empty-symbol.js | 41 +++++++ ...dstr-obj-id-identifier-resolution-first.js | 42 ++++++++ ...-dstr-obj-id-identifier-resolution-last.js | 42 ++++++++ ...-dstr-obj-id-identifier-resolution-lone.js | 41 +++++++ ...str-obj-id-identifier-resolution-middle.js | 42 ++++++++ ...dstr-obj-id-identifier-resolution-trlng.js | 41 +++++++ ...ecl-dstr-obj-id-init-assignment-missing.js | 42 ++++++++ ...n-decl-dstr-obj-id-init-assignment-null.js | 42 ++++++++ ...decl-dstr-obj-id-init-assignment-truthy.js | 42 ++++++++ ...-decl-dstr-obj-id-init-assignment-undef.js | 42 ++++++++ ...nc-gen-decl-dstr-obj-id-init-evaluation.js | 45 ++++++++ ...gen-decl-dstr-obj-id-init-fn-name-arrow.js | 55 ++++++++++ ...gen-decl-dstr-obj-id-init-fn-name-class.js | 58 ++++++++++ ...gen-decl-dstr-obj-id-init-fn-name-cover.js | 57 ++++++++++ ...nc-gen-decl-dstr-obj-id-init-fn-name-fn.js | 57 ++++++++++ ...c-gen-decl-dstr-obj-id-init-fn-name-gen.js | 58 ++++++++++ .../async-gen-decl-dstr-obj-id-init-in.js | 42 ++++++++ .../async-gen-decl-dstr-obj-id-init-order.js | 44 ++++++++ ...-decl-dstr-obj-id-init-simple-no-strict.js | 42 ++++++++ ...nc-gen-decl-dstr-obj-id-init-yield-expr.js | 50 +++++++++ ...-dstr-obj-id-put-unresolvable-no-strict.js | 45 ++++++++ ...c-gen-decl-dstr-obj-id-simple-no-strict.js | 45 ++++++++ ...r-obj-prop-elem-init-assignment-missing.js | 42 ++++++++ ...dstr-obj-prop-elem-init-assignment-null.js | 41 +++++++ ...tr-obj-prop-elem-init-assignment-truthy.js | 41 +++++++ ...str-obj-prop-elem-init-assignment-undef.js | 41 +++++++ ...decl-dstr-obj-prop-elem-init-evaluation.js | 47 ++++++++ ...l-dstr-obj-prop-elem-init-fn-name-arrow.js | 53 +++++++++ ...l-dstr-obj-prop-elem-init-fn-name-class.js | 56 ++++++++++ ...l-dstr-obj-prop-elem-init-fn-name-cover.js | 55 ++++++++++ ...decl-dstr-obj-prop-elem-init-fn-name-fn.js | 55 ++++++++++ ...ecl-dstr-obj-prop-elem-init-fn-name-gen.js | 56 ++++++++++ ...ync-gen-decl-dstr-obj-prop-elem-init-in.js | 42 ++++++++ ...decl-dstr-obj-prop-elem-init-yield-expr.js | 49 +++++++++ ...cl-dstr-obj-prop-elem-target-yield-expr.js | 49 +++++++++ ...tr-obj-prop-identifier-resolution-first.js | 42 ++++++++ ...str-obj-prop-identifier-resolution-last.js | 42 ++++++++ ...str-obj-prop-identifier-resolution-lone.js | 41 +++++++ ...r-obj-prop-identifier-resolution-middle.js | 42 ++++++++ ...tr-obj-prop-identifier-resolution-trlng.js | 41 +++++++ ...-gen-decl-dstr-obj-prop-name-evaluation.js | 44 ++++++++ ...l-dstr-obj-prop-nested-array-yield-expr.js | 50 +++++++++ ...ync-gen-decl-dstr-obj-prop-nested-array.js | 41 +++++++ ...ecl-dstr-obj-prop-nested-obj-yield-expr.js | 50 +++++++++ ...async-gen-decl-dstr-obj-prop-nested-obj.js | 41 +++++++ .../async-gen-decl-dstr-obj-prop-put-order.js | 41 +++++++ ...-decl-dstr-obj-prop-put-prop-ref-no-get.js | 49 +++++++++ ...ync-gen-decl-dstr-obj-prop-put-prop-ref.js | 41 +++++++ ...str-obj-prop-put-unresolvable-no-strict.js | 45 ++++++++ ...sync-gen-decl-dstr-obj-rest-descriptors.js | 54 ++++++++++ .../async-gen-decl-dstr-obj-rest-empty-obj.js | 45 ++++++++ .../async-gen-decl-dstr-obj-rest-getter.js | 49 +++++++++ ...cl-dstr-obj-rest-nested-obj-nested-rest.js | 56 ++++++++++ ...async-gen-decl-dstr-obj-rest-nested-obj.js | 46 ++++++++ .../async-gen-decl-dstr-obj-rest-number.js | 45 ++++++++ ...gen-decl-dstr-obj-rest-obj-own-property.js | 47 ++++++++ .../async-gen-decl-dstr-obj-rest-same-name.js | 56 ++++++++++ ...-decl-dstr-obj-rest-skip-non-enumerable.js | 55 ++++++++++ .../async-gen-decl-dstr-obj-rest-str-val.js | 46 ++++++++ ...async-gen-decl-dstr-obj-rest-symbol-val.js | 45 ++++++++ ...l-dstr-obj-rest-to-property-with-setter.js | 54 ++++++++++ ...sync-gen-decl-dstr-obj-rest-to-property.js | 48 +++++++++ ...ync-gen-decl-dstr-obj-rest-valid-object.js | 55 ++++++++++ ....js => dstr-array-elem-init-assignment.js} | 13 ++- .../dstr-array-elem-init-evaluation.js | 42 ++++++++ ... => dstr-array-elem-init-fn-name-arrow.js} | 12 +-- ... => dstr-array-elem-init-fn-name-class.js} | 14 ++- ... => dstr-array-elem-init-fn-name-cover.js} | 12 +-- ....js => dstr-array-elem-init-fn-name-fn.js} | 12 +-- ...js => dstr-array-elem-init-fn-name-gen.js} | 16 +-- .../for-await-of/dstr-array-elem-init-in.js | 40 +++++++ .../dstr-array-elem-init-order.js | 43 ++++++++ .../dstr-array-elem-init-simple-no-strict.js | 41 +++++++ .../dstr-array-elem-init-yield-expr.js | 56 ++++++++++ .../dstr-array-elem-init-yield-ident-valid.js | 41 +++++++ ...> dstr-array-elem-iter-nrml-close-skip.js} | 16 +-- ....js => dstr-array-elem-iter-nrml-close.js} | 16 +-- .../dstr-array-elem-iter-rtrn-close-err.js | 79 ++++++++++++++ .../dstr-array-elem-iter-rtrn-close-null.js | 76 +++++++++++++ .../dstr-array-elem-iter-rtrn-close.js | 86 +++++++++++++++ ...dstr-array-elem-nested-array-yield-expr.js | 58 ++++++++++ ...ay-elem-nested-array-yield-ident-valid.js} | 13 ++- ...ray.js => dstr-array-elem-nested-array.js} | 13 ++- .../dstr-array-elem-nested-obj-yield-expr.js | 56 ++++++++++ ...array-elem-nested-obj-yield-ident-valid.js | 41 +++++++ .../dstr-array-elem-nested-obj.js | 40 +++++++ .../dstr-array-elem-put-prop-ref-no-get.js | 48 +++++++++ .../dstr-array-elem-put-prop-ref.js | 40 +++++++ ...r-array-elem-put-unresolvable-no-strict.js | 44 ++++++++ .../dstr-array-elem-target-identifier.js | 42 ++++++++ ...dstr-array-elem-target-simple-no-strict.js | 41 +++++++ .../dstr-array-elem-target-yield-expr.js | 58 ++++++++++ .../dstr-array-elem-target-yield-valid.js | 41 +++++++ ...-trlg-iter-elision-iter-nrml-close-skip.js | 72 +++++++++++++ ...-elem-trlg-iter-elision-iter-nrml-close.js | 87 +++++++++++++++ ...ray-elem-trlg-iter-list-nrml-close-skip.js | 73 +++++++++++++ ...tr-array-elem-trlg-iter-list-nrml-close.js | 86 +++++++++++++++ ...rray-elem-trlg-iter-list-rtrn-close-err.js | 86 +++++++++++++++ ...ray-elem-trlg-iter-list-rtrn-close-null.js | 83 ++++++++++++++ ...tr-array-elem-trlg-iter-list-rtrn-close.js | 94 ++++++++++++++++ ...ray-elem-trlg-iter-rest-nrml-close-skip.js | 73 +++++++++++++ ...rray-elem-trlg-iter-rest-rtrn-close-err.js | 95 ++++++++++++++++ ...ray-elem-trlg-iter-rest-rtrn-close-null.js | 90 ++++++++++++++++ ...tr-array-elem-trlg-iter-rest-rtrn-close.js | 101 +++++++++++++++++ ...dstr-array-elision-iter-nrml-close-skip.js | 65 +++++++++++ .../dstr-array-elision-iter-nrml-close.js | 80 ++++++++++++++ .../dstr-array-elision-val-array.js | 39 +++++++ .../dstr-array-elision-val-string.js | 39 +++++++ .../dstr-array-empty-iter-close.js | 76 +++++++++++++ .../dstr-array-empty-val-array.js | 39 +++++++ .../dstr-array-empty-val-string.js | 39 +++++++ .../for-await-of/dstr-array-iteration.js | 47 ++++++++ .../dstr-array-rest-after-element.js | 43 ++++++++ .../dstr-array-rest-after-elision.js | 42 ++++++++ .../for-await-of/dstr-array-rest-elision.js | 43 ++++++++ .../dstr-array-rest-iter-nrml-close-skip.js | 67 ++++++++++++ .../dstr-array-rest-iter-rtrn-close-err.js | 91 ++++++++++++++++ .../dstr-array-rest-iter-rtrn-close-null.js | 90 ++++++++++++++++ .../dstr-array-rest-iter-rtrn-close.js | 102 ++++++++++++++++++ .../for-await-of/dstr-array-rest-iteration.js | 48 +++++++++ .../for-await-of/dstr-array-rest-lref.js | 76 +++++++++++++ .../dstr-array-rest-nested-array-null.js | 41 +++++++ ...-array-rest-nested-array-undefined-hole.js | 40 +++++++ ...r-array-rest-nested-array-undefined-own.js | 40 +++++++ .../dstr-array-rest-nested-array-undefined.js | 40 +++++++ ...dstr-array-rest-nested-array-yield-expr.js | 58 ++++++++++ ...ray-rest-nested-array-yield-ident-valid.js | 41 +++++++ .../dstr-array-rest-nested-array.js | 40 +++++++ .../dstr-array-rest-nested-obj-null.js | 41 +++++++ ...tr-array-rest-nested-obj-undefined-hole.js | 44 ++++++++ ...str-array-rest-nested-obj-undefined-own.js | 44 ++++++++ .../dstr-array-rest-nested-obj-undefined.js | 44 ++++++++ .../dstr-array-rest-nested-obj-yield-expr.js | 56 ++++++++++ ...array-rest-nested-obj-yield-ident-valid.js | 41 +++++++ .../dstr-array-rest-nested-obj.js | 40 +++++++ .../dstr-array-rest-put-prop-ref-no-get.js | 51 +++++++++ .../dstr-array-rest-put-prop-ref.js | 43 ++++++++ ...r-array-rest-put-unresolvable-no-strict.js | 44 ++++++++ .../dstr-array-rest-yield-expr.js | 60 +++++++++++ .../dstr-array-rest-yield-ident-valid.js | 44 ++++++++ .../for-await-of/dstr-obj-empty-bool.js | 39 +++++++ .../for-await-of/dstr-obj-empty-num.js | 39 +++++++ .../for-await-of/dstr-obj-empty-obj.js | 39 +++++++ .../for-await-of/dstr-obj-empty-string.js | 39 +++++++ .../for-await-of/dstr-obj-empty-symbol.js | 40 +++++++ ...dstr-obj-id-identifier-resolution-first.js | 41 +++++++ .../dstr-obj-id-identifier-resolution-last.js | 41 +++++++ .../dstr-obj-id-identifier-resolution-lone.js | 40 +++++++ ...str-obj-id-identifier-resolution-middle.js | 41 +++++++ ...dstr-obj-id-identifier-resolution-trlng.js | 40 +++++++ ...str-obj-id-identifier-yield-ident-valid.js | 40 +++++++ .../dstr-obj-id-init-assignment-missing.js | 40 +++++++ .../dstr-obj-id-init-assignment-null.js | 40 +++++++ .../dstr-obj-id-init-assignment-truthy.js | 40 +++++++ .../dstr-obj-id-init-assignment-undef.js | 40 +++++++ .../dstr-obj-id-init-evaluation.js | 43 ++++++++ .../dstr-obj-id-init-fn-name-arrow.js | 53 +++++++++ .../dstr-obj-id-init-fn-name-class.js | 56 ++++++++++ .../dstr-obj-id-init-fn-name-cover.js | 55 ++++++++++ .../dstr-obj-id-init-fn-name-fn.js | 55 ++++++++++ .../dstr-obj-id-init-fn-name-gen.js | 55 ++++++++++ .../for-await-of/dstr-obj-id-init-in.js | 40 +++++++ .../for-await-of/dstr-obj-id-init-order.js | 43 ++++++++ .../dstr-obj-id-init-simple-no-strict.js | 41 +++++++ .../dstr-obj-id-init-yield-expr.js | 56 ++++++++++ .../dstr-obj-id-init-yield-ident-valid.js | 41 +++++++ .../dstr-obj-id-put-unresolvable-no-strict.js | 44 ++++++++ .../dstr-obj-id-simple-no-strict.js | 43 ++++++++ ...r-obj-prop-elem-init-assignment-missing.js | 40 +++++++ ...dstr-obj-prop-elem-init-assignment-null.js | 40 +++++++ ...tr-obj-prop-elem-init-assignment-truthy.js | 40 +++++++ ...str-obj-prop-elem-init-assignment-undef.js | 40 +++++++ .../dstr-obj-prop-elem-init-evaluation.js | 45 ++++++++ .../dstr-obj-prop-elem-init-fn-name-arrow.js | 54 ++++++++++ .../dstr-obj-prop-elem-init-fn-name-class.js | 57 ++++++++++ .../dstr-obj-prop-elem-init-fn-name-cover.js | 56 ++++++++++ .../dstr-obj-prop-elem-init-fn-name-fn.js | 56 ++++++++++ .../dstr-obj-prop-elem-init-fn-name-gen.js | 56 ++++++++++ .../dstr-obj-prop-elem-init-in.js | 40 +++++++ .../dstr-obj-prop-elem-init-yield-expr.js | 55 ++++++++++ ...tr-obj-prop-elem-init-yield-ident-valid.js | 41 +++++++ .../dstr-obj-prop-elem-target-yield-expr.js | 57 ++++++++++ ...-obj-prop-elem-target-yield-ident-valid.js | 41 +++++++ ...tr-obj-prop-identifier-resolution-first.js | 41 +++++++ ...str-obj-prop-identifier-resolution-last.js | 41 +++++++ ...str-obj-prop-identifier-resolution-lone.js | 40 +++++++ ...r-obj-prop-identifier-resolution-middle.js | 41 +++++++ ...tr-obj-prop-identifier-resolution-trlng.js | 40 +++++++ .../dstr-obj-prop-name-evaluation.js | 42 ++++++++ .../dstr-obj-prop-nested-array-yield-expr.js | 56 ++++++++++ ...obj-prop-nested-array-yield-ident-valid.js | 41 +++++++ .../dstr-obj-prop-nested-array.js | 40 +++++++ .../dstr-obj-prop-nested-obj-yield-expr.js | 56 ++++++++++ ...r-obj-prop-nested-obj-yield-ident-valid.js | 41 +++++++ .../for-await-of/dstr-obj-prop-nested-obj.js | 40 +++++++ .../for-await-of/dstr-obj-prop-put-order.js | 40 +++++++ .../dstr-obj-prop-put-prop-ref-no-get.js | 48 +++++++++ .../dstr-obj-prop-put-prop-ref.js | 40 +++++++ ...tr-obj-prop-put-unresolvable-no-strict.js} | 18 ++-- .../for-await-of/dstr-obj-rest-descriptors.js | 54 ++++++++++ .../for-await-of/dstr-obj-rest-empty-obj.js | 44 ++++++++ .../for-await-of/dstr-obj-rest-getter.js | 48 +++++++++ .../dstr-obj-rest-nested-obj-nested-rest.js | 55 ++++++++++ .../for-await-of/dstr-obj-rest-nested-obj.js | 45 ++++++++ .../for-await-of/dstr-obj-rest-number.js | 44 ++++++++ .../dstr-obj-rest-obj-own-property.js | 46 ++++++++ .../for-await-of/dstr-obj-rest-same-name.js | 54 ++++++++++ .../dstr-obj-rest-skip-non-enumerable.js | 54 ++++++++++ .../for-await-of/dstr-obj-rest-str-val.js | 45 ++++++++ .../for-await-of/dstr-obj-rest-symbol-val.js | 44 ++++++++ .../dstr-obj-rest-to-property-with-setter.js | 51 +++++++++ .../for-await-of/dstr-obj-rest-to-property.js | 47 ++++++++ .../dstr-obj-rest-valid-object.js | 54 ++++++++++ 435 files changed, 20412 insertions(+), 197 deletions(-) create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-assignment.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-evaluation-fn.js => async-func-decl-dstr-array-elem-init-evaluation.js} (81%) create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-arrow.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-class.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-fn-name-cover-gen.js => async-func-decl-dstr-array-elem-init-fn-name-cover.js} (78%) create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-fn.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-gen.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-in.js => async-func-decl-dstr-array-elem-init-in.js} (82%) create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-let.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-order.js => async-func-decl-dstr-array-elem-init-order.js} (82%) rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-simple-no-strict.js => async-func-decl-dstr-array-elem-init-simple-no-strict.js} (83%) create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-invalid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-iter-nrml-close.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-invalid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-null.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined-hole.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined-own.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-invalid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-invalid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-null.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined-hole.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined-own.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-yield-ident-invalid.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-nested-obj-yield-ident-valid-fn.js => async-func-decl-dstr-array-elem-nested-obj-yield-ident-valid.js} (83%) rename test/language/statements/for-await-of/{async-func-dstr-array-elem-nested-obj-fn.js => async-func-decl-dstr-array-elem-nested-obj.js} (85%) create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-const.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-let.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-put-prop-ref-no-get-fn.js => async-func-decl-dstr-array-elem-put-prop-ref-no-get.js} (84%) create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref-user-err.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-put-prop-ref-fn.js => async-func-decl-dstr-array-elem-put-prop-ref.js} (80%) create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-strict.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-identifier.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-simple-strict.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-invalid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elision-val-array.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-elision-val-string.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-empty-val-array.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-empty-val-string.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-after-element.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-after-elision.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-elision.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-iteration.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-null.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined-hole.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined-own.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-null.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined-hole.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined-own.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-prop-ref.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-array-rest-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-bool.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-num.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-obj.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-string.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-symbol.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-first.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-last.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-lone.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-middle.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-trlng.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-missing.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-null.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-truthy.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-undef.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-evaluation.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-arrow.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-class.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-cover.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-fn.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-gen.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-in.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-order.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-id-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-missing.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-null.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-truthy.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-undef.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-evaluation.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-arrow.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-class.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-cover.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-fn.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-gen.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-in.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-target-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-first.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-last.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-lone.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-middle.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-trlng.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-name-evaluation.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-obj-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-obj.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-order.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-prop-ref.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-descriptors.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-empty-obj.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-getter.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-nested-obj-nested-rest.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-nested-obj.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-number.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-obj-own-property.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-same-name.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-skip-non-enumerable.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-str-val.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-symbol-val.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property-with-setter.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property.js create mode 100644 test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-valid-object.js rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-init-assignment-gen.js => async-gen-decl-dstr-array-elem-init-assignment.js} (82%) rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-init-evaluation-gen.js => async-gen-decl-dstr-array-elem-init-evaluation.js} (81%) rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-init-fn-name-arrow-gen.js => async-gen-decl-dstr-array-elem-init-fn-name-arrow.js} (78%) rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-init-fn-name-class-gen.js => async-gen-decl-dstr-array-elem-init-fn-name-class.js} (79%) create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-cover.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-fn.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-gen.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-in.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-let.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-order.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-get-err.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-err.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-thrw-close-skip.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined-hole.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined-own.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined-hole.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined-own.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-yield-expr.js rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-nested-obj-gen.js => async-gen-decl-dstr-array-elem-nested-obj.js} (85%) create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-const.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-let.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-user-err.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref.js rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-put-unresolvable-no-strict-gen.js => async-gen-decl-dstr-array-elem-put-unresolvable-no-strict.js} (81%) create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-unresolvable-strict.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-abpt.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-get-err.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-err.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close-err.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-thrw-close-skip.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-rtrn-close-err.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-rtrn-close-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-iter-nrml-close.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-val-array.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-val-string.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-iter-close.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-val-array.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-val-string.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-after-element.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-after-elision.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-elision.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-iteration.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-lref.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined-hole.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined-own.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined-hole.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined-own.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined.js rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-nested-obj-yield-expr.js => async-gen-decl-dstr-array-rest-nested-obj-yield-expr.js} (81%) create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-prop-ref.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-bool.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-num.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-obj.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-string.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-symbol.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-first.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-last.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-lone.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-middle.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-trlng.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-missing.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-truthy.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-undef.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-evaluation.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-arrow.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-class.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-cover.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-fn.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-gen.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-in.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-order.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-missing.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-null.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-truthy.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-undef.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-evaluation.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-arrow.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-class.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-cover.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-fn.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-gen.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-in.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-target-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-first.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-last.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-lone.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-middle.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-trlng.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-name-evaluation.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj-yield-expr.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-order.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-prop-ref.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-descriptors.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-empty-obj.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-getter.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-nested-obj-nested-rest.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-nested-obj.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-number.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-obj-own-property.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-same-name.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-skip-non-enumerable.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-str-val.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-symbol-val.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property-with-setter.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property.js create mode 100644 test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-valid-object.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-assignment-fn.js => dstr-array-elem-init-assignment.js} (83%) create mode 100644 test/language/statements/for-await-of/dstr-array-elem-init-evaluation.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-fn-name-arrow-fn.js => dstr-array-elem-init-fn-name-arrow.js} (85%) rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-fn-name-class-fn.js => dstr-array-elem-init-fn-name-class.js} (86%) rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-fn-name-cover-fn.js => dstr-array-elem-init-fn-name-cover.js} (86%) rename test/language/statements/for-await-of/{async-func-dstr-array-elem-init-fn-name-fn.js => dstr-array-elem-init-fn-name-fn.js} (86%) rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-init-fn-name-gen.js => dstr-array-elem-init-fn-name-gen.js} (85%) create mode 100644 test/language/statements/for-await-of/dstr-array-elem-init-in.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-init-order.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-init-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-init-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-init-yield-ident-valid.js rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-iter-nrml-close-skip.js => dstr-array-elem-iter-nrml-close-skip.js} (83%) rename test/language/statements/for-await-of/{async-gen-dstr-array-elem-iter-nrml-close.js => dstr-array-elem-iter-nrml-close.js} (86%) create mode 100644 test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close-err.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close-null.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-nested-array-yield-expr.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-nested-array-yield-ident-valid.js => dstr-array-elem-nested-array-yield-ident-valid.js} (82%) rename test/language/statements/for-await-of/{async-func-dstr-array-elem-nested-array.js => dstr-array-elem-nested-array.js} (82%) create mode 100644 test/language/statements/for-await-of/dstr-array-elem-nested-obj-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-nested-obj-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-nested-obj.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-put-prop-ref.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-target-identifier.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-target-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-target-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-target-yield-valid.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-nrml-close.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js create mode 100644 test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js create mode 100644 test/language/statements/for-await-of/dstr-array-elision-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/dstr-array-elision-iter-nrml-close.js create mode 100644 test/language/statements/for-await-of/dstr-array-elision-val-array.js create mode 100644 test/language/statements/for-await-of/dstr-array-elision-val-string.js create mode 100644 test/language/statements/for-await-of/dstr-array-empty-iter-close.js create mode 100644 test/language/statements/for-await-of/dstr-array-empty-val-array.js create mode 100644 test/language/statements/for-await-of/dstr-array-empty-val-string.js create mode 100644 test/language/statements/for-await-of/dstr-array-iteration.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-after-element.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-after-elision.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-elision.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-iter-nrml-close-skip.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close-err.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close-null.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-iteration.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-lref.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-array-null.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined-hole.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined-own.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-array-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-array-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-array.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-obj-null.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined-hole.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined-own.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-obj-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-obj-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-nested-obj.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-put-prop-ref.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-array-rest-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-obj-empty-bool.js create mode 100644 test/language/statements/for-await-of/dstr-obj-empty-num.js create mode 100644 test/language/statements/for-await-of/dstr-obj-empty-obj.js create mode 100644 test/language/statements/for-await-of/dstr-obj-empty-string.js create mode 100644 test/language/statements/for-await-of/dstr-obj-empty-symbol.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-first.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-last.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-lone.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-middle.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-trlng.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-identifier-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-assignment-missing.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-assignment-null.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-assignment-truthy.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-assignment-undef.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-evaluation.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-fn-name-arrow.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-fn-name-class.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-fn-name-cover.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-fn-name-fn.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-fn-name-gen.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-in.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-order.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-init-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-put-unresolvable-no-strict.js create mode 100644 test/language/statements/for-await-of/dstr-obj-id-simple-no-strict.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-missing.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-null.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-truthy.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-undef.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-evaluation.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-arrow.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-class.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-cover.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-fn.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-gen.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-in.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-init-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-target-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-elem-target-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-first.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-last.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-lone.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-middle.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-trlng.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-name-evaluation.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-nested-array-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-nested-array-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-nested-array.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-nested-obj-yield-expr.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-nested-obj-yield-ident-valid.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-nested-obj.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-put-order.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-put-prop-ref-no-get.js create mode 100644 test/language/statements/for-await-of/dstr-obj-prop-put-prop-ref.js rename test/language/statements/for-await-of/{async-func-dstr-array-elem-put-unresolvable-no-strict-fn.js => dstr-obj-prop-put-unresolvable-no-strict.js} (80%) create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-descriptors.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-empty-obj.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-getter.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-nested-obj-nested-rest.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-nested-obj.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-number.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-obj-own-property.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-same-name.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-skip-non-enumerable.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-str-val.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-symbol-val.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-to-property-with-setter.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-to-property.js create mode 100644 test/language/statements/for-await-of/dstr-obj-rest-valid-object.js diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-assignment.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-assignment.js new file mode 100644 index 0000000000..950877a12b --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-assignment.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-assignment.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let v2, vNull, vHole, vUndefined, vOob; + +let iterCount = 0; +async function fn() { + for await ([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); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-evaluation-fn.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-evaluation.js similarity index 81% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-evaluation-fn.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-evaluation.js index d3f1e2c315..11b44fc7d6 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-evaluation-fn.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-evaluation.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-evaluation-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-init-evaluation.case +// - src/dstr-assignment-for-await/default/async-func-decl.template /*--- -description: The Initializer should only be evaluated if v is undefined. (for-await-of statement) +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,10 +24,10 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var flag1 = false, flag2 = false; -var _; +let flag1 = false, flag2 = false; +let _; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([ _ = flag1 = true, _ = flag2 = true ] of [[14]]) { assert.sameValue(flag1, false); @@ -38,7 +38,9 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-arrow.js new file mode 100644 index 0000000000..d37fbbd1cb --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-arrow.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-fn-name-arrow.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). + +---*/ +let arrow; + +let iterCount = 0; +async function fn() { + for await ([ arrow = () => {} ] of [[]]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-class.js new file mode 100644 index 0000000000..c346600877 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-class.js @@ -0,0 +1,59 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-fn-name-class.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). + +---*/ +let xCls, cls, xCls2; + +let iterCount = 0; +async function fn() { + for await ([ xCls = class x {}, cls = class {}, xCls2 = class { static name() {} } ] of [[]]) { + assert(xCls.name !== 'xCls'); + assert(xCls2.name !== 'xCls2'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-cover-gen.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-cover.js similarity index 78% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-cover-gen.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-cover.js index 3c9111e4a4..a689324a9d 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-cover-gen.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-cover.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-fn-name-cover-gen.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-init-fn-name-cover.case +// - src/dstr-assignment-for-await/default/async-func-decl.template /*--- -description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement) +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -29,15 +29,13 @@ info: | [...] 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)). + a. Let hasNameProperty be ? HasOwnProperty(v, "name"). + b. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). ---*/ -var xCover, cover; +let xCover, cover; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([ xCover = (0, function() {}), cover = (function() {}) ] of [[]]) { assert(xCover.name !== 'xCover'); @@ -51,6 +49,8 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..c914dfe56b --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-fn.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-fn-name-fn.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). + +---*/ +let xFnexp, fnexp; + +let iterCount = 0; +async function fn() { + for await ([ xFnexp = function x() {}, fnexp = function() {} ] of [[]]) { + assert(xFnexp.name !== 'xFnexp'); + + assert.sameValue(fnexp.name, 'fnexp'); + verifyNotEnumerable(fnexp, 'name'); + verifyNotWritable(fnexp, 'name'); + verifyConfigurable(fnexp, 'name'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..99a8a98152 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-fn-name-gen.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-fn-name-gen.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). + +---*/ +let xGen, gen; + +let iterCount = 0; +async function fn() { + for await ([ 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'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-in.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-in.js similarity index 82% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-in.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-in.js index 7067339fcc..51226d1363 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-in.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-in.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-in.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-init-in.case +// - src/dstr-assignment-for-await/default/async-func-decl.template /*--- -description: The Initializer in an AssignmentElement may be an `in` expression. (for-await-of statement) +description: The Initializer in an AssignmentElement may be an `in` expression. (for-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,9 +24,9 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var x; +let x; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([ x = 'x' in {} ] of [[]]) { assert.sameValue(x, false); @@ -35,6 +35,8 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-let.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-let.js new file mode 100644 index 0000000000..f986e64f30 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-let.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-let.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Value retrieval of Initializer obeys `let` semantics. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [let, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ([ x = y ] of [[]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(constructor, ReferenceError); +}).then($DONE, $DONE); + +let y; + diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-order.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-order.js similarity index 82% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-order.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-order.js index 01cbd0f9d7..a3dde14a34 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-order.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-order.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-order.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-init-order.case +// - src/dstr-assignment-for-await/default/async-func-decl.template /*--- -description: Initializer values should be assigned in left-to-right order. (for-await-of statement) +description: Initializer values should be assigned in left-to-right order. (for-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,10 +24,10 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var x = 0; -var a, b; +let x = 0; +let a, b; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([ a = x += 1, b = x *= 2 ] of [[]]) { assert.sameValue(a, 1); @@ -38,6 +38,8 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-simple-no-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-simple-no-strict.js similarity index 83% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-simple-no-strict.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-simple-no-strict.js index 80488ea30c..f8f7d98f46 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-simple-no-strict.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-simple-no-strict.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-simple-no-strict.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-init-simple-no-strict.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement) +description: Identifiers that appear as the DestructuringAssignmentTarget in an AssignmentElement should take on the iterated value corresponding to their position in the ArrayAssignmentPattern. (for-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, noStrict, async] @@ -24,9 +24,9 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var argument, eval; +let argument, eval; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([arguments = 4, eval = 5] of [[]]) { assert.sameValue(arguments, 4); @@ -36,6 +36,8 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-invalid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-invalid.js new file mode 100644 index 0000000000..e18b86f212 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-invalid.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-yield-ident-invalid.case +// - src/dstr-assignment-for-await/error-async-function-syntax/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, onlyStrict, async] +negative: + phase: early + type: SyntaxError +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +async function fn() { + for await ([ x = yield ] of [[]]) +} diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-valid.js new file mode 100644 index 0000000000..14c1dc8e86 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-init-yield-ident-valid.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 4; +let x; + +let iterCount = 0; +async function fn() { + for await ([ x = yield ] of [[]]) { + assert.sameValue(x, 4); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-iter-nrml-close.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-iter-nrml-close.js new file mode 100644 index 0000000000..a6fd9bc247 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-iter-nrml-close.js @@ -0,0 +1,81 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-iter-nrml-close.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: IteratorClose is called when assignment evaluation has not exhausted the iterator (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result). + 5. Return result. + + 7.4.6 IteratorClose ( iterator, completion ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +let nextCount = 0; +let returnCount = 0; +let thisValue = null; +let args = null; +let _; +let iterable = {}; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +let iterCount = 0; +async function fn() { + for await ([ _ ] 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'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-invalid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-invalid.js new file mode 100644 index 0000000000..342f68f64f --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-invalid.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-invalid.case +// - src/dstr-assignment-for-await/error-async-function-syntax/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +negative: + phase: early + type: SyntaxError +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +async function fn() { + for await ([[(x, y)]] of [[[]]]) +} diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-null.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-null.js new file mode 100644 index 0000000000..d98bee22a4 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-null.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-null.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `null`, a TypeError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let _; + + +let iterCount = 0; +async function fn() { + for await ([[ _ ]] of [[null]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined-hole.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined-hole.js new file mode 100644 index 0000000000..d25f624611 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined-hole.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-undefined-hole.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is a "hole", a TypeError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let _; + + +let iterCount = 0; +async function fn() { + for await ([[ _ ]] of [[ , ]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined-own.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined-own.js new file mode 100644 index 0000000000..62354a280f --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined-own.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-undefined-own.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `undefined`, a TypeError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let _; + + +let iterCount = 0; +async function fn() { + for await ([[ x ]] of [[undefined]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined.js new file mode 100644 index 0000000000..41e754ed3d --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-undefined.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-undefined.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and no value is defined, a TypeError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let _; + +let iterCount = 0; +async function fn() { + for await ([[ x ]] of [[]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-invalid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-invalid.js new file mode 100644 index 0000000000..8ad8499675 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-invalid.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-yield-ident-invalid.case +// - src/dstr-assignment-for-await/error-async-function-syntax/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, onlyStrict, async] +negative: + phase: early + type: SyntaxError +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +async function fn() { + for await ([[x[yield]]] of [[[]]]) +} diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..d1a4e3dc51 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array-yield-ident-valid.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 'prop'; +let x = {}; + +let iterCount = 0; +async function fn() { + for await ([[x[yield]]] of [[[22]]]) { + assert.sameValue(x.prop, 22); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array.js new file mode 100644 index 0000000000..fb381bb312 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-array.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ([[x]] of [[[1]]]) { + assert.sameValue(x, 1); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-invalid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-invalid.js new file mode 100644 index 0000000000..f9f9297cfb --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-invalid.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-invalid.case +// - src/dstr-assignment-for-await/error-async-function-syntax/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +negative: + phase: early + type: SyntaxError +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +async function fn() { + for await ([{ get x() {} }] of [[{}]]) +} diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-null.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-null.js new file mode 100644 index 0000000000..65bb92841f --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-null.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-null.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `null`, a TypeError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ([{ x }] of [[null]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined-hole.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..fc0b0cbd88 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined-hole.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-undefined-hole.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is a "hole", a TypeError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + +let iterCount = 0; +async function fn() { + for await ([{ x }] of [[ , ]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined-own.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined-own.js new file mode 100644 index 0000000000..6bbc714269 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined-own.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-undefined-own.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `undefined`, a TypeError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + +let iterCount = 0; +async function fn() { + for await ([{ x }] of [[undefined]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined.js new file mode 100644 index 0000000000..8e9ef3d850 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-undefined.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-undefined.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and no value is defined, a TypeError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + +let iterCount = 0; +async function fn() { + for await ([{ x }] of [[]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-yield-ident-invalid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-yield-ident-invalid.js new file mode 100644 index 0000000000..256d892d0a --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-yield-ident-invalid.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-yield-ident-invalid.case +// - src/dstr-assignment-for-await/error-async-function-syntax/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, onlyStrict, async] +negative: + phase: early + type: SyntaxError +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +async function fn() { + for await ([{ x = yield }] of [[{}]]) +} diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-nested-obj-yield-ident-valid-fn.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-yield-ident-valid.js similarity index 83% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-nested-obj-yield-ident-valid-fn.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-yield-ident-valid.js index 8d48973842..15ad49159f 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-nested-obj-yield-ident-valid-fn.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj-yield-ident-valid.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-nested-obj-yield-ident-valid-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-nested-obj-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement) +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-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, noStrict, async] @@ -24,10 +24,10 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var yield = 2; -var x; +let yield = 2; +let x; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([{ x = yield }] of [[{}]]) { assert.sameValue(x, 2); @@ -37,7 +37,9 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-nested-obj-fn.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj.js similarity index 85% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-nested-obj-fn.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj.js index 35726a5819..fee0c7ca9b 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-nested-obj-fn.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-nested-obj.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-nested-obj-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-nested-obj.case +// - src/dstr-assignment-for-await/default/async-func-decl.template /*--- -description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,9 +24,9 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var x; +let x; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([{ x }] of [[{ x: 2 }]]) { assert.sameValue(x, 2); @@ -37,6 +37,8 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-const.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-const.js new file mode 100644 index 0000000000..f0704628a6 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-const.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-const.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The assignment target should obey `const` semantics. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [const, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +let iterCount = 0; +async function fn() { + for await ([ c ] of [[1]]) { + + iterCount += 1; + } +} + +let promise = fn(); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-let.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-let.js new file mode 100644 index 0000000000..1568df9dd5 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-let.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-let.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The assignment target should obey `let` semantics. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [let, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ([ x ] of [[]]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, ReferenceError); +}).then($DONE, $DONE); + +let x; diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-put-prop-ref-no-get-fn.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref-no-get.js similarity index 84% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-put-prop-ref-no-get-fn.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref-no-get.js index bf751d8fb9..e5b1aa0b87 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-put-prop-ref-no-get-fn.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref-no-get.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-put-prop-ref-no-get-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-put-prop-ref-no-get.case +// - src/dstr-assignment-for-await/default/async-func-decl.template /*--- -description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement) +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,7 +24,7 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var x, setValue; +let x, setValue; x = { get y() { $ERROR('The property should not be accessed.'); @@ -34,7 +34,7 @@ x = { } }; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([x.y] of [[23]]) { assert.sameValue(setValue, 23); @@ -44,6 +44,8 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref-user-err.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref-user-err.js new file mode 100644 index 0000000000..ac096899f3 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref-user-err.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-prop-ref-user-err.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Any error raised as a result of setting the value should be forwarded to the runtime. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = { + set y(val) { + throw new Test262Error(); + } +}; + +let iterCount = 0; +async function fn() { + for await ([x.y] of [[23] +]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-put-prop-ref-fn.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref.js similarity index 80% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-put-prop-ref-fn.js rename to test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref.js index 52e30d4209..f0d8bb0398 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-put-prop-ref-fn.js +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-prop-ref.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-put-prop-ref-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment-for-await/array-elem-put-prop-ref.case +// - src/dstr-assignment-for-await/default/async-func-decl.template /*--- -description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement) +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement in an async function declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,9 +24,9 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var x = {}; +let x = {}; -var iterCount = 0; +let iterCount = 0; async function fn() { for await ([x.y] of [[4]]) { assert.sameValue(x.y, 4); @@ -36,6 +36,8 @@ async function fn() { } } -fn() +let promise = fn(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..8d3fc8d6cf --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-no-strict.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-unresolvable-no-strict.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ([ unresolvable ] of [[]]) { + assert.sameValue(unresolvable, undefined); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-strict.js new file mode 100644 index 0000000000..f0482a7b3b --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-put-unresolvable-strict.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-unresolvable-strict.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, onlyStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ([ unresolvable ] of [[] +]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, ReferenceError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-identifier.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-identifier.js new file mode 100644 index 0000000000..5d92a6feb3 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-identifier.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-target-identifier.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y, z; + +let iterCount = 0; +async function fn() { + for await ([x, y, z] of [[1, 2, 3]]) { + assert.sameValue(x, 1); + assert.sameValue(y, 2); + assert.sameValue(z, 3); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-simple-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-simple-strict.js new file mode 100644 index 0000000000..77421b3d85 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-simple-strict.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-target-simple-strict.case +// - src/dstr-assignment-for-await/error-async-function-syntax/async-func-decl.template +/*--- +description: It is a Syntax Error if LeftHandSideExpression is neither an ObjectLiteral nor an ArrayLiteral and IsValidSimpleAssignmentTarget(LeftHandSideExpression) is false. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, onlyStrict, async] +negative: + phase: early + type: SyntaxError +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +async function fn() { + for await ([arguments] of [[]]) +} diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-invalid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-invalid.js new file mode 100644 index 0000000000..6cbfb5ea2d --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-invalid.js @@ -0,0 +1,33 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-target-yield-invalid.case +// - src/dstr-assignment-for-await/error-async-function-syntax/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, onlyStrict, async] +negative: + phase: early + type: SyntaxError +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +async function fn() { + for await ([ x[yield] ] of [[]]) +} diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-valid.js new file mode 100644 index 0000000000..80227cc3fc --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-target-yield-valid.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-target-yield-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 'prop'; +let x = {}; + +let iterCount = 0; +async function fn() { + for await ([ x[yield] ] of [[33]]) { + assert.sameValue(x.prop, 33); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js new file mode 100644 index 0000000000..8bab2affad --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-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-for-await/array-elem-trlg-iter-elision-iter-nrml-close-null.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. + +---*/ +let x; +let nextCount = 0; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + return null; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function fn() { + for await ([ x , , ] of [iterable]) { + + iterCount += 1; + } +} + +let promise = fn(); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elision-val-array.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elision-val-array.js new file mode 100644 index 0000000000..450811515b --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elision-val-array.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elision-val-array.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ([,] of [[] +]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-elision-val-string.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-elision-val-string.js new file mode 100644 index 0000000000..c2af5a6fa9 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-elision-val-string.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elision-val-string.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ([,] of ['string literal' + +]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-empty-val-array.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-empty-val-array.js new file mode 100644 index 0000000000..a3ce7b4ff5 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-empty-val-array.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-empty-val-array.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ([] of [[] +]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-empty-val-string.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-empty-val-string.js new file mode 100644 index 0000000000..e1cc450e4c --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-empty-val-string.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-empty-val-string.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ([] of ['string literal' +]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-after-element.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-after-element.js new file mode 100644 index 0000000000..e20bcd3dca --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-after-element.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-after-element.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An AssignmentRestElement following an AssignmentElement consumes all remaining iterable values. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y; + +let iterCount = 0; +async function fn() { + for await ([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); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-after-elision.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-after-elision.js new file mode 100644 index 0000000000..42e76ee144 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-after-elision.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-after-elision.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An AssignmentRestElement following an elision consumes all remaining iterable values. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ([, ...x] of [[1, 2, 3]]) { + assert.sameValue(x.length, 2); + assert.sameValue(x[0], 2); + assert.sameValue(x[1], 3); + + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-elision.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-elision.js new file mode 100644 index 0000000000..ecaefd0220 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-elision.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-elision.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: ArrayAssignmentPattern may include elisions at any position preceeding a AssignmentRestElement in a AssignmentElementList. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y; + +let iterCount = 0; +async function fn() { + for await ([, , 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); + + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-iteration.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-iteration.js new file mode 100644 index 0000000000..cf3b178cdd --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-iteration.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-iteration.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: In the presense of an AssignmentRestElement, value iteration exhausts the iterable value; (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let count = 0; +let g = function*() { + count += 1; + yield; + count += 1; + yield; + count += 1; +} +let x; + +let iterCount = 0; +async function fn() { + for await ([...x] of [g()]) { + assert.sameValue(count, 3); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-null.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-null.js new file mode 100644 index 0000000000..937f233f43 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-null.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-null.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y; + +let iterCount = 0; +async function fn() { + for await ([...[x, y]] of [[null]]) { + assert.sameValue(x, null); + assert.sameValue(y, undefined); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined-hole.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined-hole.js new file mode 100644 index 0000000000..3e9e8a296d --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined-hole.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-undefined-hole.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function fn() { + for await ([...[x]] of [[ , ]]) { + assert.sameValue(x, undefined); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined-own.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined-own.js new file mode 100644 index 0000000000..57c598b06c --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined-own.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-undefined-own.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function fn() { + for await ([...[x]] of [[undefined]]) { + assert.sameValue(x, undefined); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined.js new file mode 100644 index 0000000000..21fa5b8bb0 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-undefined.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-undefined.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function fn() { + for await ([...[x]] of [[]]) { + assert.sameValue(x, undefined); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..9f20b8274a --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array-yield-ident-valid.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 'prop'; +let x = {}; + +let iterCount = 0; +async function fn() { + for await ([...[x[yield]]] of [[86]]) { + assert.sameValue(x.prop, 86); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array.js new file mode 100644 index 0000000000..23c476d56e --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-array.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ([...[x]] of [[1, 2, 3]]) { + assert.sameValue(x, 1); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-null.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-null.js new file mode 100644 index 0000000000..e41c29f130 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-null.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-null.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, length; + +let iterCount = 0; +async function fn() { + for await ([...{ 0: x, length }] of [[null]]) { + assert.sameValue(x, null); + assert.sameValue(length, 1); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined-hole.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..d04ff74f95 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined-hole.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-undefined-hole.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +let iterCount = 0; +async function fn() { + for await ([...{ 0: x, length }] of [[ , ]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 1); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined-own.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined-own.js new file mode 100644 index 0000000000..7a5954217c --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined-own.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-undefined-own.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +let iterCount = 0; +async function fn() { + for await ([...{ 0: x, length }] of [[undefined]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 1); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined.js new file mode 100644 index 0000000000..85158aa948 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-undefined.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-undefined.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +let iterCount = 0; +async function fn() { + for await ([...{ 0: x, length }] of [[]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 0); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..f06421c49b --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj-yield-ident-valid.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 2; +let x; + +let iterCount = 0; +async function fn() { + for await ([...{ x = yield }] of [[{}]]) { + assert.sameValue(x, 2); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj.js new file mode 100644 index 0000000000..3879891fd2 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-nested-obj.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ([...{ 1: x }] of [[1, 2, 3]]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-prop-ref-no-get.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-prop-ref-no-get.js new file mode 100644 index 0000000000..406fc70c3a --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-prop-ref-no-get.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-put-prop-ref-no-get.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let setValue; +let x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +let iterCount = 0; +async function fn() { + for await ([...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); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-prop-ref.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-prop-ref.js new file mode 100644 index 0000000000..16d7b6b385 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-prop-ref.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-put-prop-ref.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = {}; + +let iterCount = 0; +async function fn() { + for await ([...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); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..b645e2ceff --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-put-unresolvable-no-strict.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-put-unresolvable-no-strict.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ([ ...unresolvable ] of [[]]) { + assert.sameValue(unresolvable.length, 0); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-yield-ident-valid.js new file mode 100644 index 0000000000..f8c6e5c6ab --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-array-rest-yield-ident-valid.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 'prop'; +let x = {}; + +let iterCount = 0; +async function fn() { + for await ([...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); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-bool.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-bool.js new file mode 100644 index 0000000000..4bdd49d558 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-bool.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-bool.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (boolean value) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ({} of [false]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-num.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-num.js new file mode 100644 index 0000000000..ea00d18b20 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-num.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-num.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (number value) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ({} of [0 +]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-obj.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-obj.js new file mode 100644 index 0000000000..d043fd783a --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-obj.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-obj.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (object value) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ({} of [{}]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-string.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-string.js new file mode 100644 index 0000000000..4363db4fe7 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-string.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-string.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (string value) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function fn() { + for await ({} of ['']) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-symbol.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-symbol.js new file mode 100644 index 0000000000..7c2fbce1a5 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-empty-symbol.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-symbol.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (symbol value) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let s = Symbol(); + +let iterCount = 0; +async function fn() { + for await ({} of [s]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-first.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-first.js new file mode 100644 index 0000000000..0fec5c7ccc --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-first.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-first.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let y; + +let iterCount = 0; +async function fn() { + for await ({ x, y } of [{ x: 3 }]) { + assert.sameValue(x, 3); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-last.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-last.js new file mode 100644 index 0000000000..b137be1b69 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-last.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-last.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let w; + +let iterCount = 0; +async function fn() { + for await ({ w, x } of [{ x: 4 }]) { + assert.sameValue(x, 4); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-lone.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-lone.js new file mode 100644 index 0000000000..ba0c7f092f --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-lone.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-lone.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function fn() { + for await ({ x, } of [{ x: 2 }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-middle.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-middle.js new file mode 100644 index 0000000000..4c6a05303d --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-middle.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-middle.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let w, y; + +let iterCount = 0; +async function fn() { + for await ({ w, x, y } of [{ x: 5 }]) { + assert.sameValue(x, 5); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-trlng.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-trlng.js new file mode 100644 index 0000000000..7805c9c86f --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-identifier-resolution-trlng.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-trlng.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier with trailing comma) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function fn() { + for await ({ x } of [{ x: 1 }]) { + assert.sameValue(x, 1); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-missing.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-missing.js new file mode 100644 index 0000000000..099395f650 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-missing.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-assignment-missing.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ x = 1 } of [{}]) { + assert.sameValue(x, 1); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-null.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-null.js new file mode 100644 index 0000000000..05f6eeb48f --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-null.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-assignment-null.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ x = 1 } of [{ x: null }]) { + assert.sameValue(x, null); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-truthy.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-truthy.js new file mode 100644 index 0000000000..d15398d3df --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-truthy.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-assignment-truthy.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ x = 1 } of [{ x: 2 }]) { + assert.sameValue(x, 2); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-undef.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-undef.js new file mode 100644 index 0000000000..00b64f49cb --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-assignment-undef.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-assignment-undef.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ x = 1 } of [{ x: undefined }]) { + assert.sameValue(x, 1); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-evaluation.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-evaluation.js new file mode 100644 index 0000000000..0216a3c626 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-evaluation.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-evaluation.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let flag1 = false; +let flag2 = false; +let x, y; + +let iterCount = 0; +async function fn() { + for await ({ x = flag1 = true, y = flag2 = true } of [{ y: 1 }]) { + assert.sameValue(flag1, true); + assert.sameValue(flag2, false); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-arrow.js new file mode 100644 index 0000000000..47b035cba2 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-arrow.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-arrow.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let arrow; + +let iterCount = 0; +async function fn() { + for await ({ arrow = () => {} } of [{}]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-class.js new file mode 100644 index 0000000000..c61d422d2c --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-class.js @@ -0,0 +1,58 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-class.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let xCls, cls, xCls2; + +let iterCount = 0; +async function fn() { + for await ({ xCls = class x {}, cls = class {}, xCls2 = class { static name() {} } } of [{}]) { + assert.notSameValue(xCls.name, 'xCls'); + assert.notSameValue(xCls2.name, 'xCls2'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-cover.js new file mode 100644 index 0000000000..7d26765d6a --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-cover.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-cover.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let xCover, cover; + +let iterCount = 0; +async function fn() { + for await ({ 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'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-fn.js new file mode 100644 index 0000000000..64243ddd29 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-fn.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-fn.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let xFnexp, fnexp; + +let iterCount = 0; +async function fn() { + for await ({ xFnexp = function x() {}, fnexp = function() {} } of [{}]) { + assert.notSameValue(xFnexp.name, 'xFnexp'); + + assert.sameValue(fnexp.name, 'fnexp'); + verifyNotEnumerable(fnexp, 'name'); + verifyNotWritable(fnexp, 'name'); + verifyConfigurable(fnexp, 'name'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-gen.js new file mode 100644 index 0000000000..bd47ab1ec2 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-fn-name-gen.js @@ -0,0 +1,58 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-gen.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let xGen, gen; + +let iterCount = 0; +async function fn() { + for await ({ 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'); + + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-in.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-in.js new file mode 100644 index 0000000000..ce7d7c1ab9 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-in.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-in.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The Initializer in an AssignmentProperty may be an `in` expression. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let prop; + +let iterCount = 0; +async function fn() { + for await ({ prop = 'x' in {} } of [{}]) { + assert.sameValue(prop, false); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-order.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-order.js new file mode 100644 index 0000000000..1243e42645 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-order.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-order.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Initializer values should be assigned in left-to-right order. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = 0; +let a, b; + +let iterCount = 0; +async function fn() { + for await ({ a = x += 1, b = x *= 2 } of [{}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-simple-no-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-simple-no-strict.js new file mode 100644 index 0000000000..b6ef15a458 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-simple-no-strict.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-simple-no-strict.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let eval, arguments; + +let iterCount = 0; +async function fn() { + for await ({ eval = 3, arguments = 4 } of [{}]) { + assert.sameValue(eval, 3); + assert.sameValue(arguments, 4); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-yield-ident-valid.js new file mode 100644 index 0000000000..64098b8d67 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-init-yield-ident-valid.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 3; +let x; + +let iterCount = 0; +async function fn() { + for await ({ x = yield } of [{}]) { + assert.sameValue(x, 3); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..018ddf945c --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-put-unresolvable-no-strict.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-put-unresolvable-no-strict.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +{ + +let iterCount = 0; +async function fn() { + for await ({ unresolvable } of [{}]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => { + assert.sameValue(unresolvable, undefined); + assert.sameValue(iterCount, 1, 'iteration occurred as expected'); + }, $DONE) + .then($DONE, $DONE); +} diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-simple-no-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-simple-no-strict.js new file mode 100644 index 0000000000..3c270eb3b8 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-id-simple-no-strict.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-simple-no-strict.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let eval; + +let iterCount = 0; +async function fn() { + for await ({ eval } of [{ eval: 1 }]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => { + assert.sameValue(eval, 1); + assert.sameValue(iterCount, 1, 'iteration occurred as expected'); + }, $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-missing.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-missing.js new file mode 100644 index 0000000000..e0e4606d14 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-missing.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-assignment-missing.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ y: x = 1 } of [{}]) { + assert.sameValue(x, 1); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-null.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-null.js new file mode 100644 index 0000000000..3feba3ed63 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-null.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-assignment-null.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ y: x = 1 } of [{ y: null }]) { + assert.sameValue(x, null); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-truthy.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-truthy.js new file mode 100644 index 0000000000..bbf2d80ef9 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-truthy.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-assignment-truthy.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ y: x = 1 } of [{ y: 2 }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-undef.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-undef.js new file mode 100644 index 0000000000..6c93cfcaaf --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-assignment-undef.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-assignment-undef.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ y: x = 1 } of [{ y: undefined }]) { + assert.sameValue(x, 1); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-evaluation.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-evaluation.js new file mode 100644 index 0000000000..0254c0f651 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-evaluation.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-evaluation.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let flag1 = false; +let flag2 = false; +let x, y; + +let iterCount = 0; +async function fn() { + for await ({ 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`'); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-arrow.js new file mode 100644 index 0000000000..4410301b6c --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-arrow.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-arrow.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let arrow; + +let iterCount = 0; +async function fn() { + for await ({ x: arrow = () => {} } of [{}]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-class.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-class.js new file mode 100644 index 0000000000..adb6ee92df --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-class.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-class.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let xCls, cls, xCls2; + +let iterCount = 0; +async function fn() { + for await ({ x: xCls = class x {}, x: cls = class {}, x: xCls2 = class { static name() {} } } of [{}]) { + assert.notSameValue(xCls.name, 'xCls'); + assert.notSameValue(xCls2.name, 'xCls2'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-cover.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-cover.js new file mode 100644 index 0000000000..e525e3533f --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-cover.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-cover.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let xCover, cover; + +let iterCount = 0; +async function fn() { + for await ({ 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'); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-fn.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..3967466cbb --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-fn.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-fn.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let xFnexp, fnexp; + +let iterCount = 0; +async function fn() { + for await ({ x: xFnexp = function x() {}, x: fnexp = function() {} } of [{}]) { + assert.notSameValue(xFnexp.name, 'xFnexp'); + + assert.sameValue(fnexp.name, 'fnexp'); + verifyNotEnumerable(fnexp, 'name'); + verifyNotWritable(fnexp, 'name'); + verifyConfigurable(fnexp, 'name'); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-gen.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..a1bc7b21f2 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-fn-name-gen.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-gen.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let xGen, gen; + +let iterCount = 0; +async function fn() { + for await ({ 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'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-in.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-in.js new file mode 100644 index 0000000000..437406d99e --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-in.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-in.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let prop; + +let iterCount = 0; +async function fn() { + for await ({ x: prop = 'x' in {} } of [{}]) { + assert.sameValue(prop, false); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-yield-ident-valid.js new file mode 100644 index 0000000000..5a319f5fb0 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-init-yield-ident-valid.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 4; +let x; + +let iterCount = 0; +async function fn() { + for await ({ x: x = yield } of [{}]) { + assert.sameValue(x, 4); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-target-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-target-yield-ident-valid.js new file mode 100644 index 0000000000..a59bf84eba --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-elem-target-yield-ident-valid.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-target-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 'prop'; +let x = {}; + +let iterCount = 0; +async function fn() { + for await ({ x: x[yield] } of [{ x: 23 }]) { + assert.sameValue(x.prop, 23); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-first.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-first.js new file mode 100644 index 0000000000..f49160babe --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-first.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-first.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many). (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let y; + +let iterCount = 0; +async function fn() { + for await ({ a: x, y } of [{ a: 3 }]) { + assert.sameValue(x, 3); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-last.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-last.js new file mode 100644 index 0000000000..1c6569f420 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-last.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-last.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many). (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let w; + +let iterCount = 0; +async function fn() { + for await ({ w, a: x } of [{ a: 4 }]) { + assert.sameValue(x, 4); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-lone.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-lone.js new file mode 100644 index 0000000000..82a1baaec4 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-lone.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-lone.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element). (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function fn() { + for await ({ a: x } of [{ a: 1 }]) { + assert.sameValue(x, 1); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-middle.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-middle.js new file mode 100644 index 0000000000..04ae6c9056 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-middle.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-middle.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many). (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let w, y; + +let iterCount = 0; +async function fn() { + for await ({ w, a: x, y } of [{ a: 5 }]) { + assert.sameValue(x, 5); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-trlng.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-trlng.js new file mode 100644 index 0000000000..526e2e45cd --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-identifier-resolution-trlng.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-trlng.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element with trailing comma). (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function fn() { + for await ({ a: x, } of [{ a: 2 }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-name-evaluation.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-name-evaluation.js new file mode 100644 index 0000000000..660647f938 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-name-evaluation.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-name-evaluation.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: PropertyName of an AssignmentProperty may be a ComputedPropertyName. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y, xy; + +let iterCount = 0; +async function fn() { + for await ({ ['x' + 'y']: x } of [{ x: 1, xy: 23, y: 2 }]) { + assert.sameValue(x, 23); + assert.sameValue(y, undefined); + assert.sameValue(xy, undefined); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..47b50cb808 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array-yield-ident-valid.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-nested-array-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 22; +let x; + +let iterCount = 0; +async function fn() { + for await ({ x: [x = yield] } of [{ x: [] }]) { + assert.sameValue(x, 22); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array.js new file mode 100644 index 0000000000..653983d5e2 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-array.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-nested-array.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let y; + +let iterCount = 0; +async function fn() { + for await ({ x: [y] } of [{ x: [321] }]) { + assert.sameValue(y, 321); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-obj-yield-ident-valid.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..ef51d1ab6b --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-obj-yield-ident-valid.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-nested-obj-yield-ident-valid.case +// - src/dstr-assignment-for-await/async-function/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let yield = 2; +let result, x; + +let iterCount = 0; +async function fn() { + for await ({ x: { x = yield } } of [{ x: {} }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-obj.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-obj.js new file mode 100644 index 0000000000..b8702c1af3 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-nested-obj.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-nested-obj.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let result, y; + +let iterCount = 0; +async function fn() { + for await ({ x: { y } } of [{ x: { y: 2 } }]) { + assert.sameValue(y, 2); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-order.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-order.js new file mode 100644 index 0000000000..511c40d366 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-order.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-put-order.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The AssignmentElements in an AssignmentElementList are evaluated in left- to-right order. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function fn() { + for await ({ z: x, a: x } of [{ a: 2, z: 1 }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-prop-ref-no-get.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-prop-ref-no-get.js new file mode 100644 index 0000000000..17f1a27d16 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-prop-ref-no-get.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-put-prop-ref-no-get.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let setValue; +let x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +let iterCount = 0; +async function fn() { + for await ({ a: x.y } of [{ a: 23 }]) { + assert.sameValue(setValue, 23); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-prop-ref.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-prop-ref.js new file mode 100644 index 0000000000..b5f16422d7 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-prop-ref.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-put-prop-ref.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = {}; + +let iterCount = 0; +async function fn() { + for await ({ xy: x.y } of [{ xy: 4 }]) { + assert.sameValue(x.y, 4); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..0a9f9620c7 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-prop-put-unresolvable-no-strict.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-put-unresolvable-no-strict.case +// - src/dstr-assignment-for-await/default/async-func-decl.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-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +{ + +let iterCount = 0; +async function fn() { + for await ({ x: unresolvable } of [{}]) { + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => { + assert.sameValue(unresolvable, undefined); + assert.sameValue(iterCount, 1, 'iteration occurred as expected'); + }, $DONE) + .then($DONE, $DONE); +} diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-descriptors.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-descriptors.js new file mode 100644 index 0000000000..e7ddc432d4 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-descriptors.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-descriptors.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Object created from rest deconstruction doesn't copy source object property descriptors. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; +let obj = {}; +Object.defineProperty(obj, "a", { value: 3, configurable: false, enumerable: true }); +Object.defineProperty(obj, "b", { value: 4, writable: false, enumerable: true }); + +let iterCount = 0; +async function fn() { + for await ({...rest} of [obj]) { + assert.sameValue(rest.a, 3); + assert.sameValue(rest.b, 4); + + verifyEnumerable(rest, "a"); + verifyWritable(rest, "a"); + verifyConfigurable(rest, "a"); + + verifyEnumerable(rest, "b"); + verifyWritable(rest, "b"); + verifyConfigurable(rest, "b"); + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-empty-obj.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-empty-obj.js new file mode 100644 index 0000000000..58b333f977 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-empty-obj.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-empty-obj.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: RestBindingInitialization creates a new object even if lhs is an empty object (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; + + +let iterCount = 0; +async function fn() { + for await ({...rest} of [{}]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert.sameValue(typeof rest, "object"); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-getter.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-getter.js new file mode 100644 index 0000000000..3d277d5d02 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-getter.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-getter.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; +let count = 0; + +let iterCount = 0; +async function fn() { + for await ({...x} of [{ get v() { count++; return 2; } }]) { + assert.sameValue(x.v, 2); + assert.sameValue(count, 1); + + verifyEnumerable(x, "v"); + verifyWritable(x, "v"); + verifyConfigurable(x, "v"); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-nested-obj-nested-rest.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-nested-obj-nested-rest.js new file mode 100644 index 0000000000..76bebde8c8 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-nested-obj-nested-rest.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-nested-obj-nested-rest.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let a, b, c, rest; + +let iterCount = 0; +async function fn() { + for await ({a, b, ...{c, ...rest}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(c, 3); + + assert.sameValue(rest.d, 4); + assert.sameValue(rest.e, 5); + + verifyEnumerable(rest, "d"); + verifyWritable(rest, "d"); + verifyConfigurable(rest, "d"); + + verifyEnumerable(rest, "e"); + verifyWritable(rest, "e"); + verifyConfigurable(rest, "e"); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-nested-obj.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-nested-obj.js new file mode 100644 index 0000000000..4e9a477177 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-nested-obj.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-nested-obj.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let a, b, c, d, e; + +let iterCount = 0; +async function fn() { + for await ({a, b, ...{c, e}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(c, 3); + assert.sameValue(e, 5); + assert.sameValue(d, undefined); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-number.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-number.js new file mode 100644 index 0000000000..736ba41dc5 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-number.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-number.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: RestBindingInitialization creates a new object even if lhs is a Number (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; + + +let iterCount = 0; +async function fn() { + for await ({...rest} of [51]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert(rest instanceof Object); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-obj-own-property.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-obj-own-property.js new file mode 100644 index 0000000000..82bd5315a2 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-obj-own-property.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-obj-own-property.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Rest object contains just source object's own properties (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let o = Object.create({ x: 1, y: 2 }); +o.z = 3; + +let x, y, z; + +let iterCount = 0; +async function fn() { + for await ({ x, ...{y , z} } of [o]) { + assert.sameValue(x, 1); + assert.sameValue(y, undefined); + assert.sameValue(z, 3); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-same-name.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-same-name.js new file mode 100644 index 0000000000..15105324e2 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-same-name.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-same-name.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Proper setting in the values for rest name equal to a property name. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let o = { + x: 42, + y: 39, + z: 'cheeseburger' +}; + +let x, y, z; + +let iterCount = 0; +async function fn() { + for await ({ x, ...z } of [o]) { + assert.sameValue(x, 42); + assert.sameValue(y, undefined); + assert.sameValue(z.y, 39); + assert.sameValue(z.z, 'cheeseburger'); + + let keys = Object.keys(z); + assert.sameValue(keys.length, 2); + assert.sameValue(keys[0], 'y'); + assert.sameValue(keys[1], 'z'); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-skip-non-enumerable.js new file mode 100644 index 0000000000..8f5416ab04 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-skip-non-enumerable.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-skip-non-enumerable.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Rest object doesn't contain non-enumerable properties (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; +let obj = {a: 3, b: 4}; +Object.defineProperty(obj, "x", { value: 4, enumerable: false }); + +let iterCount = 0; +async function fn() { + for await ({...rest} of [obj]) { + assert.sameValue(rest.a, 3); + assert.sameValue(rest.b, 4); + assert.sameValue(Object.getOwnPropertyDescriptor(rest, "x"), undefined); + + verifyEnumerable(rest, "a"); + verifyWritable(rest, "a"); + verifyConfigurable(rest, "a"); + + verifyEnumerable(rest, "b"); + verifyWritable(rest, "b"); + verifyConfigurable(rest, "b"); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-str-val.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-str-val.js new file mode 100644 index 0000000000..ee545af9e5 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-str-val.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-str-val.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: RestBindingInitialization creats an object with indexes as property name (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; + + +let iterCount = 0; +async function fn() { + for await ({...rest} of ["foo"]) { + assert.sameValue(rest["0"], "f"); + assert.sameValue(rest["1"], "o"); + assert.sameValue(rest["2"], "o"); + assert(rest instanceof Object); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-symbol-val.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-symbol-val.js new file mode 100644 index 0000000000..2341fe81d5 --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-symbol-val.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-symbol-val.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: RestBindingInitialization creates a new object if lhs is a Symbol (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; + + +let iterCount = 0; +async function fn() { + for await ({...rest} of [Symbol("foo")]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert(rest instanceof Object); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property-with-setter.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property-with-setter.js new file mode 100644 index 0000000000..92b6ca76fc --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property-with-setter.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-to-property-with-setter.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object property setter, its value should be binded as rest object. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let settedValue; +let executedGetter = false; +let src = { + get y() { + executedGetter = true; + }, + set y(v) { + settedValue = v; + }, +}; +src.y = undefined; + +let iterCount = 0; +async function fn() { + for await ({...src.y} of [{ x: 1, y: 2}]) { + assert.sameValue(settedValue.x, 1); + assert.sameValue(settedValue.y, 2); + assert(!executedGetter, "The property should not be accessed"); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property.js new file mode 100644 index 0000000000..1a38884c3e --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-to-property.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-to-property.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object property, its value should be binded as rest object. (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let src = {}; + +let iterCount = 0; +async function fn() { + for await ({...src.y} of [{ x: 1, y: 2}]) { + assert.sameValue(src.y.x, 1); + assert.sameValue(src.y.y, 2); + + verifyEnumerable(src, "y"); + verifyWritable(src, "y"); + verifyConfigurable(src, "y"); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-valid-object.js b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-valid-object.js new file mode 100644 index 0000000000..cef75b021b --- /dev/null +++ b/test/language/statements/for-await-of/async-func-decl-dstr-obj-rest-valid-object.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-valid-object.case +// - src/dstr-assignment-for-await/default/async-func-decl.template +/*--- +description: Rest object contains just unextracted data (for-await-of statement in an async function declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest, a, b; + + +let iterCount = 0; +async function fn() { + for await ({a, b, ...rest} of [{x: 1, y: 2, a: 5, b: 3}]) { + assert.sameValue(rest.x, 1); + assert.sameValue(rest.y, 2); + assert.sameValue(rest.a, undefined); + assert.sameValue(rest.b, undefined); + + verifyEnumerable(rest, "x"); + verifyWritable(rest, "x"); + verifyConfigurable(rest, "x"); + + verifyEnumerable(rest, "y"); + verifyWritable(rest, "y"); + verifyConfigurable(rest, "y"); + + iterCount += 1; + } +} + +let promise = fn(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-assignment-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-assignment.js similarity index 82% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-init-assignment-gen.js rename to test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-assignment.js index 0436b47c41..4ff50c3105 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-assignment-gen.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-assignment.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-assignment-gen.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment-for-await/array-elem-init-assignment.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement) +description: If the Initializer is present and v is undefined, the Initializer should be evaluated and the result assigned to the target reference. (for-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,9 +24,9 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var v2, vNull, vHole, vUndefined, vOob; +let v2, vNull, vHole, vUndefined, vOob; -var iterCount = 0; +let iterCount = 0; async function * fn() { for await ([v2 = 10, vNull = 11, vHole = 12, vUndefined = 13, vOob = 14] of [[2, null, , undefined]]) { assert.sameValue(v2, 2); @@ -40,6 +40,8 @@ async function * fn() { } } -fn().next() +let promise = fn().next(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-evaluation-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-evaluation.js similarity index 81% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-init-evaluation-gen.js rename to test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-evaluation.js index 940dbecd19..c226693577 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-evaluation-gen.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-evaluation.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-evaluation-gen.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment-for-await/array-elem-init-evaluation.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template /*--- -description: The Initializer should only be evaluated if v is undefined. (for-await-of statement) +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,10 +24,10 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var flag1 = false, flag2 = false; -var _; +let flag1 = false, flag2 = false; +let _; -var iterCount = 0; +let iterCount = 0; async function * fn() { for await ([ _ = flag1 = true, _ = flag2 = true ] of [[14]]) { assert.sameValue(flag1, false); @@ -38,7 +38,9 @@ async function * fn() { } } -fn().next() +let promise = fn().next(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-arrow-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-arrow.js similarity index 78% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-arrow-gen.js rename to test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-arrow.js index 7418316daa..ca79b10077 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-arrow-gen.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-arrow.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-fn-name-arrow-gen.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment-for-await/array-elem-init-fn-name-arrow.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template /*--- -description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement) +description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -29,15 +29,13 @@ info: | [...] 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)). + a. Let hasNameProperty be ? HasOwnProperty(v, "name"). + b. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). ---*/ -var arrow; +let arrow; -var iterCount = 0; +let iterCount = 0; async function * fn() { for await ([ arrow = () => {} ] of [[]]) { assert.sameValue(arrow.name, 'arrow'); @@ -49,6 +47,8 @@ async function * fn() { } } -fn().next() +let promise = fn().next(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-class-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-class.js similarity index 79% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-class-gen.js rename to test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-class.js index bfa07d1986..571f68c379 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-class-gen.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-class.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-fn-name-class-gen.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment-for-await/array-elem-init-fn-name-class.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template /*--- -description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement) +description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [class, destructuring-binding, async-iteration] flags: [generated, async] @@ -29,15 +29,13 @@ info: | [...] 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)). + a. Let hasNameProperty be ? HasOwnProperty(v, "name"). + b. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). ---*/ -var xCls, cls, xCls2; +let xCls, cls, xCls2; -var iterCount = 0; +let iterCount = 0; async function * fn() { for await ([ xCls = class x {}, cls = class {}, xCls2 = class { static name() {} } ] of [[]]) { assert(xCls.name !== 'xCls'); @@ -53,7 +51,9 @@ async function * fn() { } } -fn().next() +let promise = fn().next(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-cover.js new file mode 100644 index 0000000000..0e64a556bf --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-cover.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-fn-name-cover.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). + +---*/ +let xCover, cover; + +let iterCount = 0; +async function * fn() { + for await ([ xCover = (0, function() {}), cover = (function() {}) ] of [[]]) { + assert(xCover.name !== 'xCover'); + + assert.sameValue(cover.name, 'cover'); + verifyNotEnumerable(cover, 'name'); + verifyNotWritable(cover, 'name'); + verifyConfigurable(cover, 'name'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..220dafebe1 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-fn.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-fn-name-fn.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). + +---*/ +let xFnexp, fnexp; + +let iterCount = 0; +async function * fn() { + for await ([ xFnexp = function x() {}, fnexp = function() {} ] of [[]]) { + assert(xFnexp.name !== 'xFnexp'); + + assert.sameValue(fnexp.name, 'fnexp'); + verifyNotEnumerable(fnexp, 'name'); + verifyNotWritable(fnexp, 'name'); + verifyConfigurable(fnexp, 'name'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..0d2967d037 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-fn-name-gen.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-fn-name-gen.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. If hasNameProperty is false, perform SetFunctionName(v, GetReferencedName(lref)). + +---*/ +let xGen, gen; + +let iterCount = 0; +async function * fn() { + for await ([ 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'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-in.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-in.js new file mode 100644 index 0000000000..22c115576d --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-in.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-in.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ([ x = 'x' in {} ] of [[]]) { + assert.sameValue(x, false); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-let.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-let.js new file mode 100644 index 0000000000..2ea88b545b --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-let.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-let.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Value retrieval of Initializer obeys `let` semantics. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [let, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ([ x = y ] of [[]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(constructor, ReferenceError); +}).then($DONE, $DONE); + +let y; + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-order.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-order.js new file mode 100644 index 0000000000..2d274a5ef2 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-order.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-order.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Initializer values should be assigned in left-to-right order. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = 0; +let a, b; + +let iterCount = 0; +async function * fn() { + for await ([ a = x += 1, b = x *= 2 ] of [[]]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(x, 2); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-simple-no-strict.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-simple-no-strict.js new file mode 100644 index 0000000000..0bbc13533c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-simple-no-strict.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-simple-no-strict.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let argument, eval; + +let iterCount = 0; +async function * fn() { + for await ([arguments = 4, eval = 5] of [[]]) { + assert.sameValue(arguments, 4); + assert.sameValue(eval, 5); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-yield-expr.js new file mode 100644 index 0000000000..c7326a7cf7 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-init-yield-expr.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-init-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: When a `yield` token appears within the Initializer of an AssignmentElement within a generator function body, it behaves as a YieldExpression. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let value = []; +let x; + +let iterCount = 0; +async function * fn() { + for await ([ x = yield ] of [[]]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, false); + assert.sameValue(x, undefined); + + iter.next(4).then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(x, 4); + }, $DONE).then($DONE, $DONE); +}, $DONE).catch($DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-get-err.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-get-err.js new file mode 100644 index 0000000000..06cc1bb9f7 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-get-err.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-iter-get-err.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: Abrupt completion returned from GetIterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let iterable = { + [Symbol.iterator]() { + throw new Test262Error(); + } +}; +let _; + + +let iterCount = 0; +async function * fn() { + for await ([ _ ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-err.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-err.js new file mode 100644 index 0000000000..fff9646ad7 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-err.js @@ -0,0 +1,68 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-iter-nrml-close-err.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: Abrupt completion returned from IteratorClose (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result). + +---*/ +let nextCount = 0; +let returnCount = 0; +let _; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + throw new Test262Error(); + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ _ ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 1); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-null.js new file mode 100644 index 0000000000..45b6d5ac76 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-null.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-iter-nrml-close-null.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result). + 5. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + 6. If completion.[[Type]] is throw, return Completion(completion). + 7. If innerResult.[[Type]] is throw, return Completion(innerResult). + 8. If Type(innerResult.[[Value]]) is not Object, throw a TypeError exception. + +---*/ +let _; +let nextCount = 0; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + return null; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ _ ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-skip.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-skip.js new file mode 100644 index 0000000000..48b56ad877 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close-skip.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-iter-nrml-close-skip.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is not called when assignment evaluation has exhausted the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result). + 5. Return result. + +---*/ +let nextCount = 0; +let returnCount = 0; +let _; +let iterator = { + next() { + nextCount += 1; + return { done: true }; + }, + return() { + returnCount += 1; + return {}; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ _ ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => { + assert.sameValue(iterCount, 1); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close.js new file mode 100644 index 0000000000..7a6bf4ec0a --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-nrml-close.js @@ -0,0 +1,81 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-iter-nrml-close.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: IteratorClose is called when assignment evaluation has not exhausted the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result). + 5. Return result. + + 7.4.6 IteratorClose ( iterator, completion ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +let nextCount = 0; +let returnCount = 0; +let thisValue = null; +let args = null; +let _; +let iterable = {}; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; + +let iterCount = 0; +async function * fn() { + for await ([ _ ] 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'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js new file mode 100644 index 0000000000..78a15c3efb --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-rtrn-close-null.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-iter-rtrn-close-null.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result). + 5. Return result. + + 7.4.6 IteratorClose( iterator, completion ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + 6. If completion.[[Type]] is throw, return Completion(completion). + 7. If innerResult.[[Type]] is throw, return Completion(innerResult). + 8. If Type(innerResult.[[Value]]) is not Object, throw a TypeError exception. + +---*/ +let unreachable = 0; +let iterator = { + return() { + return null; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ {}[yield] ] of [iterable]) { + unreachable += 1; + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(unreachable, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-thrw-close-skip.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-thrw-close-skip.js new file mode 100644 index 0000000000..c4fc72ee67 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-iter-thrw-close-skip.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-iter-thrw-close-skip.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is not called when iteration produces an abrupt completion (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result). + 5. Return result. + +---*/ +let nextCount = 0; +let returnCount = 0; +let iterator = { + next() { + nextCount += 1; + throw new Test262Error(); + }, + return() { + returnCount += 1; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; +let _; + + +let iterCount = 0; +async function * fn() { + for await ([ x ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-null.js new file mode 100644 index 0000000000..6ef12924f9 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-null.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-null.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `null`, a TypeError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let _; + + +let iterCount = 0; +async function * fn() { + for await ([[ _ ]] of [[null]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined-hole.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined-hole.js new file mode 100644 index 0000000000..bf93ae3a98 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined-hole.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-undefined-hole.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is a "hole", a TypeError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let _; + + +let iterCount = 0; +async function * fn() { + for await ([[ _ ]] of [[ , ]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined-own.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined-own.js new file mode 100644 index 0000000000..7dad6808d3 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined-own.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-undefined-own.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and the value is `undefined`, a TypeError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let _; + + +let iterCount = 0; +async function * fn() { + for await ([[ x ]] of [[undefined]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined.js new file mode 100644 index 0000000000..e8a5458bd3 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-undefined.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-undefined.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal and no value is defined, a TypeError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let _; + +let iterCount = 0; +async function * fn() { + for await ([[ x ]] of [[]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-yield-expr.js new file mode 100644 index 0000000000..fd39619679 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-array-yield-expr.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-array-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let value = [[22]]; +let x = {}; + + +let iterCount = 0; +async function * fn() { + for await ([[x[yield]]] of [value]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, false); + assert.sameValue(x.prop, undefined); + + iter.next('prop').then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(x.prop, 22); + }, $DONE).then($DONE, $DONE); +}, $DONE).catch($DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-null.js new file mode 100644 index 0000000000..a642c64256 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-null.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-null.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `null`, a TypeError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ([{ x }] of [[null]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined-hole.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..a2a5713c34 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined-hole.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-undefined-hole.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is a "hole", a TypeError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + +let iterCount = 0; +async function * fn() { + for await ([{ x }] of [[ , ]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined-own.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined-own.js new file mode 100644 index 0000000000..9c91bebeb5 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined-own.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-undefined-own.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and the value is `undefined`, a TypeError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + +let iterCount = 0; +async function * fn() { + for await ([{ x }] of [[undefined]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined.js new file mode 100644 index 0000000000..f3401d6902 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-undefined.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-undefined.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal and no value is defined, a TypeError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + +let iterCount = 0; +async function * fn() { + for await ([{ x }] of [[]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-yield-expr.js new file mode 100644 index 0000000000..2fe7de8d2c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj-yield-expr.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-nested-obj-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + + +let iterCount = 0; +async function * fn() { + for await ([{ x = yield }] of [[{}]]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, false); + assert.sameValue(x, undefined); + + iter.next(4).then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(x, 4); + }, $DONE).then($DONE, $DONE); +}, $DONE).catch($DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-nested-obj-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj.js similarity index 85% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-nested-obj-gen.js rename to test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj.js index 3f164e74f6..2978d2c5b9 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-nested-obj-gen.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-nested-obj.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-nested-obj-gen.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment-for-await/array-elem-nested-obj.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template /*--- -description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, async] @@ -24,9 +24,9 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var x; +let x; -var iterCount = 0; +let iterCount = 0; async function * fn() { for await ([{ x }] of [[{ x: 2 }]]) { assert.sameValue(x, 2); @@ -37,6 +37,8 @@ async function * fn() { } } -fn().next() +let promise = fn().next(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-const.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-const.js new file mode 100644 index 0000000000..614f51176f --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-const.js @@ -0,0 +1,37 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-const.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The assignment target should obey `const` semantics. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [const, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +let iterCount = 0; +async function * fn() { + for await ([ c ] of [[1]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-let.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-let.js new file mode 100644 index 0000000000..ac115be487 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-let.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-let.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The assignment target should obey `let` semantics. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [let, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ([ x ] of [[]]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, ReferenceError); +}).then($DONE, $DONE); + +let x; diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-no-get.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-no-get.js new file mode 100644 index 0000000000..1d70340cc3 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-no-get.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-prop-ref-no-get.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, setValue; +x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([x.y] of [[23]]) { + assert.sameValue(setValue, 23); + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-user-err.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-user-err.js new file mode 100644 index 0000000000..eb87181737 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref-user-err.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-prop-ref-user-err.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Any error raised as a result of setting the value should be forwarded to the runtime. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = { + set y(val) { + throw new Test262Error(); + } +}; + +let iterCount = 0; +async function * fn() { + for await ([x.y] of [[23] +]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref.js new file mode 100644 index 0000000000..21e1ceed13 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-prop-ref.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-prop-ref.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = {}; + +let iterCount = 0; +async function * fn() { + for await ([x.y] of [[4]]) { + assert.sameValue(x.y, 4); + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-put-unresolvable-no-strict-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-unresolvable-no-strict.js similarity index 81% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-put-unresolvable-no-strict-gen.js rename to test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-unresolvable-no-strict.js index 86647fda79..a216d48240 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-put-unresolvable-no-strict-gen.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-unresolvable-no-strict.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-put-unresolvable-no-strict-gen.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment-for-await/array-elem-put-unresolvable-no-strict.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement) +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-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [destructuring-binding, async-iteration] flags: [generated, noStrict, async] @@ -25,16 +25,17 @@ info: | [...] ---*/ -var iterCount = 0; +let iterCount = 0; async function * fn() { for await ([ unresolvable ] of [[]]) { assert.sameValue(unresolvable, undefined); - iterCount += 1; } } -fn().next() +let promise = fn().next(); + +promise .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-unresolvable-strict.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-unresolvable-strict.js new file mode 100644 index 0000000000..ad1e696909 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-put-unresolvable-strict.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-put-unresolvable-strict.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: In strict mode, if the the assignment target is an unresolvable reference, a ReferenceError should be thrown. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, onlyStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ([ unresolvable ] of [[] +]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise.then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, ReferenceError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-simple-no-strict.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-simple-no-strict.js index 3d8861b8a1..af7c3b755a 100644 --- a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-simple-no-strict.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-simple-no-strict.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-target-simple-no-strict.case -// - src/dstr-assignment-async-iteration/async-generator/async-gen-decl.template +// - src/dstr-assignment-for-await/array-elem-target-simple-no-strict.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -24,7 +24,7 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var argument, eval; +let argument, eval; let iterCount = 0; async function * fn() { diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-yield-expr.js index 19c4eb8003..7ab9a2b3df 100644 --- a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-yield-expr.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-target-yield-expr.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-target-yield-expr.case -// - src/dstr-assignment-async-iteration/async-generator/async-gen-decl.template +// - src/dstr-assignment-for-await/array-elem-target-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template /*--- description: When a `yield` token appears within the DestructuringAssignmentTarget of an AssignmentElement within a generator function body, it behaves as a YieldExpression. (for-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -24,9 +24,9 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var value = [33]; -var x = {}; -var iterationResult; +let value = [33]; +let x = {}; +let iterationResult; let iterCount = 0; @@ -46,8 +46,6 @@ iter.next().then(iterationResult => { assert.sameValue(iterationResult.done, false); assert.sameValue(x.prop, undefined); - // TODO add iterCount - // iter.next('prop').then(iterationResult => { assert.sameValue(iterationResult.value, undefined); assert.sameValue(iterationResult.done, true); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-abpt.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-abpt.js new file mode 100644 index 0000000000..81c2eb4337 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-abpt.js @@ -0,0 +1,85 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-elision-iter-abpt.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: Abrupt completion returned during evaluation of elision (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let nextCount = 0; +let returnCount = 0; +let x; +let iterator = { + next() { + 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() { + returnCount += 1; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ x , , ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + + +iter.next().then(() => { + iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 2); + assert.sameValue(returnCount, 0); + assert.sameValue(constructor, Test262Error); + + }).then($DONE, $DONE); +}, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js new file mode 100644 index 0000000000..aca92cc738 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-err.js @@ -0,0 +1,82 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-elision-iter-nrml-close-err.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: Abrupt completion returned from IteratorClose (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let nextCount = 0; +let returnCount = 0; +let x; +let iterator = { + next() { + nextCount += 1; + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + throw new Test262Error(); + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ x , , ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(nextCount, 2); + assert.sameValue(returnCount, 1); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); + + + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-null.js new file mode 100644 index 0000000000..55ffa40678 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-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-for-await/array-elem-trlg-iter-elision-iter-nrml-close-null.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. + +---*/ +let x; +let nextCount = 0; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + return null; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ x , , ] of [iterable]) { + + iterCount += 1; + } +} + +let promise = fn().next(); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js new file mode 100644 index 0000000000..958d507e8b --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js @@ -0,0 +1,78 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-elision-iter-nrml-close-skip.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose not invoked when elision exhausts the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 5. 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 + + [...] + + 7. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + 9. Return Completion(status). + +---*/ +let nextCount = 0; +let returnCount = 0; +let x; +let iterator = { + next() { + nextCount += 1; + + return { done: nextCount > 1 }; + }, + return() { + returnCount += 1; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ x , , ] of [iterable]) { + assert.sameValue(nextCount, 2); + assert.sameValue(returnCount, 0); + + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close.js new file mode 100644 index 0000000000..021fb58380 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-elision-iter-nrml-close.js @@ -0,0 +1,93 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-elision-iter-nrml-close.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose invoked when elision does not exhaust the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 5. 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 + + [...] + + 7. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + + 7.4.6 IteratorClose ( iterator, completion ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +let nextCount = 0; +let returnCount = 0; +let thisValue = null; +let args = null; +let x; +let iterator = { + next() { + nextCount += 1; + + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ 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'); + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-get-err.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-get-err.js new file mode 100644 index 0000000000..5f2eb34566 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-get-err.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-get-err.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: Abrupt completion returned from GetIterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let iterable = { + [Symbol.iterator]() { + throw new Test262Error(); + } +}; +let x; + +let iterCount = 0; +async function * fn() { + for await ([ x , ] of [iterable +]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-err.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-err.js new file mode 100644 index 0000000000..7d4c45eea8 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-err.js @@ -0,0 +1,78 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-list-nrml-close-err.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: Abrupt completion returned from IteratorClose (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 2. Let iteratorRecord be Record {[[Iterator]]: iterator, [[Done]]: false}. + 3. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 4. If status is an abrupt completion, then + a. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, status). + b. Return Completion(status). + +---*/ +let nextCount = 0; +let returnCount = 0; +let thrower = function() { + throw new Test262Error(); +}; +let x; +let iterator = { + next() { + nextCount += 1; + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + throw new Test262Error(); + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ x , ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 1); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); + + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-null.js new file mode 100644 index 0000000000..95bd13242a --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-null.js @@ -0,0 +1,83 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-list-nrml-close-null.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 2. Let iteratorRecord be Record {[[Iterator]]: iterator, [[Done]]: false}. + 3. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 4. 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 ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + 6. If completion.[[type]] is throw, return Completion(completion). + 7. If innerResult.[[type]] is throw, return Completion(innerResult). + 8. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +let x; +let nextCount = 0; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + return null; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ x , ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-skip.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-skip.js new file mode 100644 index 0000000000..5084b598a3 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close-skip.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-list-nrml-close-skip.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is not invoked when evaluation of AssignmentElementList exhausts the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 2. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 3. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 4. If status is an abrupt completion, then + a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator, + status). + b. Return Completion(status). + +---*/ +let nextCount = 0; +let returnCount = 0; +let thrower = function() { + throw new Test262Error(); +}; +let x; +let iterator = { + next() { + nextCount += 1; + return { done: true }; + }, + return() { + returnCount += 1; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ x , ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close.js new file mode 100644 index 0000000000..2e6b38688d --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-nrml-close.js @@ -0,0 +1,89 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-list-nrml-close.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList completes without exhausting the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 2. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}. + 3. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 4. 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 ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +let nextCount = 0; +let returnCount = 0; +let thisValue = null; +let args = null; +let x; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ 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'); + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close-err.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close-err.js new file mode 100644 index 0000000000..1f68ee6b52 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close-err.js @@ -0,0 +1,77 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-list-rtrn-close-err.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "return" completion and the iterator has not been marked as "done" (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 2. Let iteratorRecord be Record {[[Iterator]]: iterator, [[Done]]: false}. + 3. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 4. 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 ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + 6. If completion.[[type]] is throw, return Completion(completion). + 7. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +let returnCount = 0; +let unreachable = 0; +let iterator = { + return() { + returnCount += 1; + + throw new Test262Error(); + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ {}[yield] , ] of [iterable]) { + unreachable += 1; + iterCount += 1; + } +} + +let iter = fn(); + +iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(returnCount, 1); + assert.sameValue(unreachable, 0, 'Unreachable statement was not executed'); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close-null.js new file mode 100644 index 0000000000..d894b54404 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close-null.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-list-rtrn-close-null.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 2. Let iteratorRecord be Record {[[Iterator]]: iterator, [[Done]]: false}. + 3. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 4. 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 ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + 6. If completion.[[type]] is throw, return Completion(completion). + 7. If innerResult.[[type]] is throw, return Completion(innerResult). + 8. If Type(innerResult.[[value]]) is not Object, throw a TypeError + exception. + +---*/ +let iterator = { + return() { + return null; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + + +let iterCount = 0; +async function * fn() { + for await ([ {}[yield] , ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, TypeError); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close.js new file mode 100644 index 0000000000..32405bb5c4 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-rtrn-close.js @@ -0,0 +1,85 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-list-rtrn-close.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "return" completion and the iterator has not been marked as "done" (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ] + + [...] + 2. Let iteratorRecord be Record {[[Iterator]]: iterator, [[Done]]: false}. + 3. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentElementList using + iteratorRecord as the argument. + 4. 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 ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + 6. If completion.[[type]] is throw, return Completion(completion). + 7. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +let returnCount = 0; +let unreachable = 0; +let thisValue = null; +let args = null; +let iterator = { + return() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + + +let iterCount = 0; +async function * fn() { + for await ([ {}[yield] , ] of [iterable]) { + unreachable += 1; + iterCount += 1; + } +} + +let iter = fn(); + +iter.return(888).then(result => { + 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'); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-thrw-close-skip.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-thrw-close-skip.js new file mode 100644 index 0000000000..abdb0d6eb1 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-list-thrw-close-skip.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-list-thrw-close-skip.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is not invoked when evaluation of AssignmentElementList returns an abrupt completion and the iterator has been marked as "done" (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let nextCount = 0; +let returnCount = 0; +let iterable = {}; +let thrower = function() { + throw new Test262Error(); +}; +let iterator = { + next() { + nextCount += 1; + throw new Test262Error(); + }, + return() { + returnCount += 1; + } +}; +iterable[Symbol.iterator] = function() { + return iterator; +}; +let x; + +let iterCount = 0; +async function * fn() { + for await ([ x , ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + assert.sameValue(iterCount, 0); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-nrml-close-skip.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-nrml-close-skip.js new file mode 100644 index 0000000000..6e3d79b90d --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-nrml-close-skip.js @@ -0,0 +1,74 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-rest-nrml-close-skip.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is not called when rest element evaluation has exhausted the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 7. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, status). + 8. Return Completion(status). + +---*/ +let nextCount = 0; +let returnCount = 0; +let x, y; +let iterator = { + next() { + nextCount += 1; + return { value: nextCount, done: nextCount > 1 }; + }, + return() { + returnCount += 1; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ x , ...y ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => { + iter.return().then(() => { + assert.sameValue(nextCount, 2, 'nextCount'); + assert.sameValue(returnCount, 0, 'returnCount'); + assert.sameValue(x, 1, 'x'); + assert.sameValue(y.length, 0, 'y.length'); + }).then($DONE, $DONE); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-rtrn-close-err.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-rtrn-close-err.js new file mode 100644 index 0000000000..c894d48a55 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-rtrn-close-err.js @@ -0,0 +1,86 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-rest-rtrn-close-err.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "return" completion due to reference evaluation (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 7. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, status). + 8. Return Completion(status). + + 7.4.6 IteratorClose ( iterator, completion ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + 6. If completion.[[type]] is throw, return Completion(completion). + 7. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +let nextCount = 0; +let returnCount = 0; +let unreachable = 0; +let x; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + + throw new Test262Error(); + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ x , ...{}[yield] ] of [iterable]) { + unreachable += 1; + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(() => { + iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 1); + assert.sameValue(constructor, Test262Error); + }).then($DONE, $DONE); +}).then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-rtrn-close-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-rtrn-close-null.js new file mode 100644 index 0000000000..c4ede1b4e2 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elem-trlg-iter-rest-rtrn-close-null.js @@ -0,0 +1,80 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elem-trlg-iter-rest-rtrn-close-null.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 AssignmentRestElement is present, then + a. Let status be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 7. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, status). + 8. Return Completion(status). + + 7.4.6 IteratorClose ( iterator, completion ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + 6. If completion.[[type]] is throw, return Completion(completion). + 7. If innerResult.[[type]] is throw, return Completion(innerResult). + +---*/ +let nextCount = 0; +let x; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + return null; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ x , ...{}[yield] ] of [iterable]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.return().then(() => $DONE('Promise incorrectly fulfilled.'), ({ constructor }) => { + assert.sameValue(nextCount, 1); + assert.sameValue(constructor, Test262Error); +}).then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-iter-nrml-close-skip.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-iter-nrml-close-skip.js new file mode 100644 index 0000000000..eb47f59334 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-iter-nrml-close-skip.js @@ -0,0 +1,69 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elision-iter-nrml-close-skip.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is not called when iteration has exhausted the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + + [...] + + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result).. + [...] + +---*/ +let nextCount = 0; +let returnCount = 0; +let iterator = { + next() { + nextCount += 1; + return { done: true }; + }, + return() { + returnCount += 1; + return {}; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ , ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-iter-nrml-close.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-iter-nrml-close.js new file mode 100644 index 0000000000..82f5adfcce --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-iter-nrml-close.js @@ -0,0 +1,86 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elision-iter-nrml-close.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is called when assignment evaluation has not exhausted the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + + [...] + + 4. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result).. + [...] + + 7.4.6 IteratorClose ( iterator, completion ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +let nextCount = 0; +let returnCount = 0; +let thisValue = null; +let args = null; +let iterator = { + next() { + nextCount += 1; + // Set an upper-bound to limit unnecessary iteration in non-conformant + // implementations + return { done: nextCount > 10 }; + }, + return() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + + +let iterCount = 0; +async function * fn() { + for await ([ , ] 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'); + + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-val-array.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-val-array.js new file mode 100644 index 0000000000..8ae1cc8ee0 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-val-array.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elision-val-array.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ([,] of [[] +]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-val-string.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-val-string.js new file mode 100644 index 0000000000..c654c3e385 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-elision-val-string.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-elision-val-string.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ([,] of ['string literal' + +]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-iter-close.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-iter-close.js new file mode 100644 index 0000000000..ce905c5b2c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-iter-close.js @@ -0,0 +1,80 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-empty-iter-close.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: Iterator is closed without iterating (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 ) + + [...] + 5. Let innerResult be Call(return, iterator, « »). + [...] + +---*/ +let nextCount = 0; +let returnCount = 0; +let thisValue = null; +let args = null; +let iterator = { + next() { + nextCount += 1; + return { done: true }; + }, + return() { + returnCount += 1; + thisValue = this; + args = arguments; + return {}; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([] 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'); + + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-val-array.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-val-array.js new file mode 100644 index 0000000000..cc879f15fd --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-val-array.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-empty-val-array.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ([] of [[] +]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-val-string.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-val-string.js new file mode 100644 index 0000000000..98bc00820c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-empty-val-string.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-empty-val-string.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ([] of ['string literal' +]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-after-element.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-after-element.js new file mode 100644 index 0000000000..6edf078878 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-after-element.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-after-element.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An AssignmentRestElement following an AssignmentElement consumes all remaining iterable values. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y; + +let iterCount = 0; +async function * fn() { + for await ([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); + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-after-elision.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-after-elision.js new file mode 100644 index 0000000000..b6c0c7cecd --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-after-elision.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-after-elision.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An AssignmentRestElement following an elision consumes all remaining iterable values. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ([, ...x] of [[1, 2, 3]]) { + assert.sameValue(x.length, 2); + assert.sameValue(x[0], 2); + assert.sameValue(x[1], 3); + + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-elision.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-elision.js new file mode 100644 index 0000000000..7215b7fd3b --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-elision.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-elision.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: ArrayAssignmentPattern may include elisions at any position preceeding a AssignmentRestElement in a AssignmentElementList. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y; + +let iterCount = 0; +async function * fn() { + for await ([, , 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); + + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-iter-nrml-close-skip.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-iter-nrml-close-skip.js new file mode 100644 index 0000000000..7d514f2ab8 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-iter-nrml-close-skip.js @@ -0,0 +1,69 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-iter-nrml-close-skip.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: IteratorClose is not called when assignment evaluation has exhausted the iterator (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 5. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iterator, result). + 6. Return result. + +---*/ +let nextCount = 0; +let returnCount = 0; +let x; +let iterator = { + next() { + nextCount += 1; + return { done: true }; + }, + return() { + returnCount += 1; + } +}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([ ...x ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-iteration.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-iteration.js new file mode 100644 index 0000000000..82b9a8e8fc --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-iteration.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-iteration.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: In the presense of an AssignmentRestElement, value iteration exhausts the iterable value; (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let count = 0; +let g = function*() { + count += 1; + yield; + count += 1; + yield; + count += 1; +} +let x; + +let iterCount = 0; +async function * fn() { + for await ([...x] of [g()]) { + assert.sameValue(count, 3); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-lref.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-lref.js new file mode 100644 index 0000000000..8f9b8ee660 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-lref.js @@ -0,0 +1,80 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-lref.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.template +/*--- +description: Reference is evaluated during assignment (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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. Let result be the result of performing + IteratorDestructuringAssignmentEvaluation of AssignmentRestElement + with iteratorRecord as the argument. + 5. 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). + [...] + +---*/ +let nextCount = 0; +let returnCount = 0; +let iterator = { + next() { + nextCount += 1; + return { done: true }; + }, + return() { + returnCount += 1; + } +}; +let obj = {}; +let iterable = { + [Symbol.iterator]() { + return iterator; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([...obj['a' + 'b']] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + assert(!!obj.ab); + assert.sameValue(obj.ab.length, 0); + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next() + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-null.js new file mode 100644 index 0000000000..511825c414 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-null.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-null.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y; + +let iterCount = 0; +async function * fn() { + for await ([...[x, y]] of [[null]]) { + assert.sameValue(x, null); + assert.sameValue(y, undefined); + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined-hole.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined-hole.js new file mode 100644 index 0000000000..19a853a8d5 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined-hole.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-undefined-hole.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function * fn() { + for await ([...[x]] of [[ , ]]) { + assert.sameValue(x, undefined); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined-own.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined-own.js new file mode 100644 index 0000000000..a11440e335 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined-own.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-undefined-own.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function * fn() { + for await ([...[x]] of [[undefined]]) { + assert.sameValue(x, undefined); + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined.js new file mode 100644 index 0000000000..8c85dcbdfd --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-undefined.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-undefined.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function * fn() { + for await ([...[x]] of [[]]) { + assert.sameValue(x, undefined); + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-yield-expr.js new file mode 100644 index 0000000000..041d0d7fd0 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array-yield-expr.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = {}; + + +let iterCount = 0; +async function * fn() { + for await ([...[x[yield]]] of [[86]]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(iterationResult => { + assert.sameValue(iterationResult.value, undefined); + assert.sameValue(iterationResult.done, false); + assert.sameValue(x.prop, undefined); + + iter.next('prop').then(iterationResult => { + assert.sameValue(iterationResult.value, undefined); + assert.sameValue(iterationResult.done, true); + assert.sameValue(x.prop, 86); + }).then($DONE, $DONE); +}); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array.js new file mode 100644 index 0000000000..fb5268cc93 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-array.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-array.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ([...[x]] of [[1, 2, 3]]) { + assert.sameValue(x, 1); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-null.js new file mode 100644 index 0000000000..d730729e55 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-null.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-null.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, length; + +let iterCount = 0; +async function * fn() { + for await ([...{ 0: x, length }] of [[null]]) { + assert.sameValue(x, null); + assert.sameValue(length, 1); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined-hole.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..f971f90484 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined-hole.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-undefined-hole.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +let iterCount = 0; +async function * fn() { + for await ([...{ 0: x, length }] of [[ , ]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 1); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined-own.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined-own.js new file mode 100644 index 0000000000..c0507a733b --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined-own.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-undefined-own.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +let iterCount = 0; +async function * fn() { + for await ([...{ 0: x, length }] of [[undefined]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 1); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined.js new file mode 100644 index 0000000000..8b77a55570 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-undefined.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj-undefined.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +let iterCount = 0; +async function * fn() { + for await ([...{ 0: x, length }] of [[]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 0); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-nested-obj-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-yield-expr.js similarity index 81% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-nested-obj-yield-expr.js rename to test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-yield-expr.js index b23b78e865..49238f2e6b 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-nested-obj-yield-expr.js +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj-yield-expr.js @@ -1,8 +1,8 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-nested-obj-yield-expr.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment-for-await/array-rest-nested-obj-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement) +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-await-of statement in an async generator declaration) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation features: [generators, destructuring-binding, async-iteration] flags: [generated, async] @@ -24,21 +24,18 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ -var iter, x; +let x; - -var iterCount = 0; +let iterCount = 0; async function * fn() { - for await ([{ x = yield }] of [[{}]]) { + for await ([...{ x = yield }] of [[{}]]) { iterCount += 1; } } - - -iter = fn(); +let iter = fn(); iter.next().then(iterationResult => { assert.sameValue(iterationResult.value, undefined); @@ -51,3 +48,4 @@ iter.next().then(iterationResult => { assert.sameValue(x, 4); }).then($DONE, $DONE); }); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj.js new file mode 100644 index 0000000000..87dccffda1 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-nested-obj.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-nested-obj.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ([...{ 1: x }] of [[1, 2, 3]]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-prop-ref-no-get.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-prop-ref-no-get.js new file mode 100644 index 0000000000..87b4c36320 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-prop-ref-no-get.js @@ -0,0 +1,52 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-put-prop-ref-no-get.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let setValue; +let x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +let iterCount = 0; +async function * fn() { + for await ([...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); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-prop-ref.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-prop-ref.js new file mode 100644 index 0000000000..c0145afb4a --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-prop-ref.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-put-prop-ref.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = {}; + +let iterCount = 0; +async function * fn() { + for await ([...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); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..5d67f952e5 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-put-unresolvable-no-strict.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-put-unresolvable-no-strict.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ([ ...unresolvable ] of [[]]) { + assert.sameValue(unresolvable.length, 0); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-yield-expr.js new file mode 100644 index 0000000000..c38b76c306 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-array-rest-yield-expr.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/array-rest-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = {}; + + +let iterCount = 0; +async function * fn() { + for await ([...x[yield]] of [[33, 44, 55]]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(iterationResult => { + assert.sameValue(iterationResult.value, undefined); + assert.sameValue(iterationResult.done, false); + assert.sameValue(x.prop, undefined); + + iter.next('prop').then(iterationResult => { + 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); + assert.sameValue(iterCount, 1); + }).then($DONE, $DONE); +}); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-bool.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-bool.js new file mode 100644 index 0000000000..090bd94492 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-bool.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-bool.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (boolean value) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ({} of [false]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-num.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-num.js new file mode 100644 index 0000000000..e3bd2cdba4 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-num.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-num.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (number value) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ({} of [0 +]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-obj.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-obj.js new file mode 100644 index 0000000000..40d8e52b29 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-obj.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-obj.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (object value) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ({} of [{}]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-string.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-string.js new file mode 100644 index 0000000000..ad649a92ac --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-string.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-string.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (string value) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ + +let iterCount = 0; +async function * fn() { + for await ({} of ['']) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-symbol.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-symbol.js new file mode 100644 index 0000000000..92f73117fd --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-empty-symbol.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-empty-symbol.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (symbol value) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let s = Symbol(); + +let iterCount = 0; +async function * fn() { + for await ({} of [s]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-first.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-first.js new file mode 100644 index 0000000000..623cb31638 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-first.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-first.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let y; + +let iterCount = 0; +async function * fn() { + for await ({ x, y } of [{ x: 3 }]) { + assert.sameValue(x, 3); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-last.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-last.js new file mode 100644 index 0000000000..14f9b5c01f --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-last.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-last.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let w; + +let iterCount = 0; +async function * fn() { + for await ({ w, x } of [{ x: 4 }]) { + assert.sameValue(x, 4); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-lone.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-lone.js new file mode 100644 index 0000000000..b9b48d609e --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-lone.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-lone.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function * fn() { + for await ({ x, } of [{ x: 2 }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-middle.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-middle.js new file mode 100644 index 0000000000..2c83bf79f3 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-middle.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-middle.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let w, y; + +let iterCount = 0; +async function * fn() { + for await ({ w, x, y } of [{ x: 5 }]) { + assert.sameValue(x, 5); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-trlng.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-trlng.js new file mode 100644 index 0000000000..f721e4638c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-identifier-resolution-trlng.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-identifier-resolution-trlng.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier with trailing comma) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function * fn() { + for await ({ x } of [{ x: 1 }]) { + assert.sameValue(x, 1); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-missing.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-missing.js new file mode 100644 index 0000000000..72cbb9e182 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-missing.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-assignment-missing.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ x = 1 } of [{}]) { + assert.sameValue(x, 1); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-null.js new file mode 100644 index 0000000000..95b3564ea3 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-null.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-assignment-null.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ x = 1 } of [{ x: null }]) { + assert.sameValue(x, null); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-truthy.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-truthy.js new file mode 100644 index 0000000000..49d69d2122 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-truthy.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-assignment-truthy.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ x = 1 } of [{ x: 2 }]) { + assert.sameValue(x, 2); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-undef.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-undef.js new file mode 100644 index 0000000000..cfbe786cb6 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-assignment-undef.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-assignment-undef.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ x = 1 } of [{ x: undefined }]) { + assert.sameValue(x, 1); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-evaluation.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-evaluation.js new file mode 100644 index 0000000000..8fb37ae92b --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-evaluation.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-evaluation.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let flag1 = false; +let flag2 = false; +let x, y; + +let iterCount = 0; +async function * fn() { + for await ({ x = flag1 = true, y = flag2 = true } of [{ y: 1 }]) { + assert.sameValue(flag1, true); + assert.sameValue(flag2, false); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-arrow.js new file mode 100644 index 0000000000..7579a790d3 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-arrow.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-arrow.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let arrow; + +let iterCount = 0; +async function * fn() { + for await ({ arrow = () => {} } of [{}]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-class.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-class.js new file mode 100644 index 0000000000..3527600879 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-class.js @@ -0,0 +1,58 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-class.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let xCls, cls, xCls2; + +let iterCount = 0; +async function * fn() { + for await ({ xCls = class x {}, cls = class {}, xCls2 = class { static name() {} } } of [{}]) { + assert.notSameValue(xCls.name, 'xCls'); + assert.notSameValue(xCls2.name, 'xCls2'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-cover.js new file mode 100644 index 0000000000..de402137d6 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-cover.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-cover.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let xCover, cover; + +let iterCount = 0; +async function * fn() { + for await ({ 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'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-fn.js new file mode 100644 index 0000000000..ecc562de9c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-fn.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-fn.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let xFnexp, fnexp; + +let iterCount = 0; +async function * fn() { + for await ({ xFnexp = function x() {}, fnexp = function() {} } of [{}]) { + assert.notSameValue(xFnexp.name, 'xFnexp'); + + assert.sameValue(fnexp.name, 'fnexp'); + verifyNotEnumerable(fnexp, 'name'); + verifyNotWritable(fnexp, 'name'); + verifyConfigurable(fnexp, 'name'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-gen.js new file mode 100644 index 0000000000..513ded20ca --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-fn-name-gen.js @@ -0,0 +1,58 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-fn-name-gen.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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). + +---*/ +let xGen, gen; + +let iterCount = 0; +async function * fn() { + for await ({ 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'); + + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-in.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-in.js new file mode 100644 index 0000000000..577f0bd3a5 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-in.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-in.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The Initializer in an AssignmentProperty may be an `in` expression. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let prop; + +let iterCount = 0; +async function * fn() { + for await ({ prop = 'x' in {} } of [{}]) { + assert.sameValue(prop, false); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-order.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-order.js new file mode 100644 index 0000000000..1ad78bc408 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-order.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-order.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Initializer values should be assigned in left-to-right order. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = 0; +let a, b; + +let iterCount = 0; +async function * fn() { + for await ({ a = x += 1, b = x *= 2 } of [{}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-simple-no-strict.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-simple-no-strict.js new file mode 100644 index 0000000000..e62cf6d497 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-simple-no-strict.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-simple-no-strict.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let eval, arguments; + +let iterCount = 0; +async function * fn() { + for await ({ eval = 3, arguments = 4 } of [{}]) { + assert.sameValue(eval, 3); + assert.sameValue(arguments, 4); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-yield-expr.js new file mode 100644 index 0000000000..999d5a89f9 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-init-yield-expr.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-init-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + +let iterCount = 0; +async function * fn() { + for await ({ x = yield } of [{}]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, false); + assert.sameValue(x, undefined); + + iter.next(3).then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(x, 3); + }).then($DONE, $DONE); +}); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..7c60e913a7 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-put-unresolvable-no-strict.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-put-unresolvable-no-strict.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +{ + +let iterCount = 0; +async function * fn() { + for await ({ unresolvable } of [{}]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => { + assert.sameValue(unresolvable, undefined); + assert.sameValue(iterCount, 1, 'iteration occurred as expected'); + }, $DONE) + .then($DONE, $DONE); +} diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-simple-no-strict.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-simple-no-strict.js new file mode 100644 index 0000000000..02f8525a76 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-id-simple-no-strict.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-id-simple-no-strict.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let eval; + +let iterCount = 0; +async function * fn() { + for await ({ eval } of [{ eval: 1 }]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => { + assert.sameValue(eval, 1); + assert.sameValue(iterCount, 1, 'iteration occurred as expected'); + }, $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-missing.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-missing.js new file mode 100644 index 0000000000..e2f0f55941 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-missing.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-assignment-missing.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ y: x = 1 } of [{}]) { + assert.sameValue(x, 1); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-null.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-null.js new file mode 100644 index 0000000000..f8f2c8eccf --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-null.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-assignment-null.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ y: x = 1 } of [{ y: null }]) { + assert.sameValue(x, null); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-truthy.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-truthy.js new file mode 100644 index 0000000000..cf8694c14c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-truthy.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-assignment-truthy.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ y: x = 1 } of [{ y: 2 }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-undef.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-undef.js new file mode 100644 index 0000000000..3cc674501e --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-assignment-undef.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-assignment-undef.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ y: x = 1 } of [{ y: undefined }]) { + assert.sameValue(x, 1); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-evaluation.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-evaluation.js new file mode 100644 index 0000000000..aa3f3db43c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-evaluation.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-evaluation.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let flag1 = false; +let flag2 = false; +let x, y; + +let iterCount = 0; +async function * fn() { + for await ({ 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`'); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-arrow.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-arrow.js new file mode 100644 index 0000000000..e538199580 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-arrow.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-arrow.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let arrow; + +let iterCount = 0; +async function * fn() { + for await ({ x: arrow = () => {} } of [{}]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-class.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-class.js new file mode 100644 index 0000000000..f5226d2a6e --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-class.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-class.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let xCls, cls, xCls2; + +let iterCount = 0; +async function * fn() { + for await ({ x: xCls = class x {}, x: cls = class {}, x: xCls2 = class { static name() {} } } of [{}]) { + assert.notSameValue(xCls.name, 'xCls'); + assert.notSameValue(xCls2.name, 'xCls2'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-cover.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-cover.js new file mode 100644 index 0000000000..6f8eeaddae --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-cover.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-cover.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let xCover, cover; + +let iterCount = 0; +async function * fn() { + for await ({ 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'); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-fn.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..19117fb53b --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-fn.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-fn.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let xFnexp, fnexp; + +let iterCount = 0; +async function * fn() { + for await ({ x: xFnexp = function x() {}, x: fnexp = function() {} } of [{}]) { + assert.notSameValue(xFnexp.name, 'xFnexp'); + + assert.sameValue(fnexp.name, 'fnexp'); + verifyNotEnumerable(fnexp, 'name'); + verifyNotWritable(fnexp, 'name'); + verifyConfigurable(fnexp, 'name'); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-gen.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..123a0b1256 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-fn-name-gen.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-fn-name-gen.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 + [...] 6. 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. If hasNameProperty is false, perform SetFunctionName(rhsValue, GetReferencedName(lref)). + +---*/ +let xGen, gen; + +let iterCount = 0; +async function * fn() { + for await ({ 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'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-in.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-in.js new file mode 100644 index 0000000000..40e68cb4b5 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-in.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-in.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let prop; + +let iterCount = 0; +async function * fn() { + for await ({ x: prop = 'x' in {} } of [{}]) { + assert.sameValue(prop, false); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-yield-expr.js new file mode 100644 index 0000000000..8edc6fa36f --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-init-yield-expr.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-init-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ x: x = yield } of [{}]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, false); + assert.sameValue(x, undefined); + + iter.next(86).then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(x, 86); + }).then($DONE, $DONE); +}); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-target-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-target-yield-expr.js new file mode 100644 index 0000000000..5782eee952 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-elem-target-yield-expr.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-elem-target-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = {}; + +let iterCount = 0; +async function * fn() { + for await ({ x: x[yield] } of [{ x: 23 }]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, false); + assert.sameValue(x.prop, undefined); + + iter.next('prop').then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(x.prop, 23); + }).then($DONE, $DONE); +}); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-first.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-first.js new file mode 100644 index 0000000000..667f3f6cf4 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-first.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-first.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many). (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let y; + +let iterCount = 0; +async function * fn() { + for await ({ a: x, y } of [{ a: 3 }]) { + assert.sameValue(x, 3); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-last.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-last.js new file mode 100644 index 0000000000..0278acdf8a --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-last.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-last.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many). (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let w; + +let iterCount = 0; +async function * fn() { + for await ({ w, a: x } of [{ a: 4 }]) { + assert.sameValue(x, 4); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-lone.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-lone.js new file mode 100644 index 0000000000..00a81f302d --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-lone.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-lone.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element). (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function * fn() { + for await ({ a: x } of [{ a: 1 }]) { + assert.sameValue(x, 1); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-middle.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-middle.js new file mode 100644 index 0000000000..e4218776f5 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-middle.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-middle.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many). (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; +let w, y; + +let iterCount = 0; +async function * fn() { + for await ({ w, a: x, y } of [{ a: 5 }]) { + assert.sameValue(x, 5); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-trlng.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-trlng.js new file mode 100644 index 0000000000..d80b71c28a --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-identifier-resolution-trlng.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-identifier-resolution-trlng.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element with trailing comma). (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = null; + +let iterCount = 0; +async function * fn() { + for await ({ a: x, } of [{ a: 2 }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-name-evaluation.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-name-evaluation.js new file mode 100644 index 0000000000..cd0127a368 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-name-evaluation.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-name-evaluation.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: PropertyName of an AssignmentProperty may be a ComputedPropertyName. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x, y, xy; + +let iterCount = 0; +async function * fn() { + for await ({ ['x' + 'y']: x } of [{ x: 1, xy: 23, y: 2 }]) { + assert.sameValue(x, 23); + assert.sameValue(y, undefined); + assert.sameValue(xy, undefined); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array-yield-expr.js new file mode 100644 index 0000000000..b81bfe9044 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array-yield-expr.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-nested-array-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + + +let iterCount = 0; +async function * fn() { + for await ({ x: [x = yield] } of [{ x: [] }]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, false); + assert.sameValue(x, undefined); + + iter.next(24601).then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(x, 24601); + }).then($DONE, $DONE); +}); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array.js new file mode 100644 index 0000000000..132142a1b7 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-array.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-nested-array.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let y; + +let iterCount = 0; +async function * fn() { + for await ({ x: [y] } of [{ x: [321] }]) { + assert.sameValue(y, 321); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj-yield-expr.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj-yield-expr.js new file mode 100644 index 0000000000..40746e8402 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj-yield-expr.js @@ -0,0 +1,50 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-nested-obj-yield-expr.case +// - src/dstr-assignment-for-await/async-generator/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = undefined; + + +let iterCount = 0; +async function * fn() { + for await ({ x: { x = yield } } of [{ x: {} }]) { + + iterCount += 1; + } +} + +let iter = fn(); + +iter.next().then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, false); + assert.sameValue(x, undefined); + + iter.next(4).then(result => { + assert.sameValue(result.value, undefined); + assert.sameValue(result.done, true); + assert.sameValue(x, 4); + }).then($DONE, $DONE); +}); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj.js new file mode 100644 index 0000000000..f295b2d9fa --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-nested-obj.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-nested-obj.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let result, y; + +let iterCount = 0; +async function * fn() { + for await ({ x: { y } } of [{ x: { y: 2 } }]) { + assert.sameValue(y, 2); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-order.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-order.js new file mode 100644 index 0000000000..85dca9df61 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-order.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-put-order.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The AssignmentElements in an AssignmentElementList are evaluated in left- to-right order. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; + +let iterCount = 0; +async function * fn() { + for await ({ z: x, a: x } of [{ a: 2, z: 1 }]) { + assert.sameValue(x, 2); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-prop-ref-no-get.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-prop-ref-no-get.js new file mode 100644 index 0000000000..4b4dfda3f2 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-prop-ref-no-get.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-put-prop-ref-no-get.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let setValue; +let x = { + get y() { + $ERROR('The property should not be accessed.'); + }, + set y(val) { + setValue = val; + } +}; + +let iterCount = 0; +async function * fn() { + for await ({ a: x.y } of [{ a: 23 }]) { + assert.sameValue(setValue, 23); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-prop-ref.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-prop-ref.js new file mode 100644 index 0000000000..f31790d2c8 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-prop-ref.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-put-prop-ref.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x = {}; + +let iterCount = 0; +async function * fn() { + for await ({ xy: x.y } of [{ xy: 4 }]) { + assert.sameValue(x.y, 4); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..6d8efa080a --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-prop-put-unresolvable-no-strict.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-prop-put-unresolvable-no-strict.case +// - src/dstr-assignment-for-await/default/async-gen-decl.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-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +{ + +let iterCount = 0; +async function * fn() { + for await ({ x: unresolvable } of [{}]) { + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => { + assert.sameValue(unresolvable, undefined); + assert.sameValue(iterCount, 1, 'iteration occurred as expected'); + }, $DONE) + .then($DONE, $DONE); +} diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-descriptors.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-descriptors.js new file mode 100644 index 0000000000..2b7d6457d5 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-descriptors.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-descriptors.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Object created from rest deconstruction doesn't copy source object property descriptors. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; +let obj = {}; +Object.defineProperty(obj, "a", { value: 3, configurable: false, enumerable: true }); +Object.defineProperty(obj, "b", { value: 4, writable: false, enumerable: true }); + +let iterCount = 0; +async function * fn() { + for await ({...rest} of [obj]) { + assert.sameValue(rest.a, 3); + assert.sameValue(rest.b, 4); + + verifyEnumerable(rest, "a"); + verifyWritable(rest, "a"); + verifyConfigurable(rest, "a"); + + verifyEnumerable(rest, "b"); + verifyWritable(rest, "b"); + verifyConfigurable(rest, "b"); + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-empty-obj.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-empty-obj.js new file mode 100644 index 0000000000..a3328de5bd --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-empty-obj.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-empty-obj.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: RestBindingInitialization creates a new object even if lhs is an empty object (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; + + +let iterCount = 0; +async function * fn() { + for await ({...rest} of [{}]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert.sameValue(typeof rest, "object"); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-getter.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-getter.js new file mode 100644 index 0000000000..9b3a527c63 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-getter.js @@ -0,0 +1,49 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-getter.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let x; +let count = 0; + +let iterCount = 0; +async function * fn() { + for await ({...x} of [{ get v() { count++; return 2; } }]) { + assert.sameValue(x.v, 2); + assert.sameValue(count, 1); + + verifyEnumerable(x, "v"); + verifyWritable(x, "v"); + verifyConfigurable(x, "v"); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-nested-obj-nested-rest.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-nested-obj-nested-rest.js new file mode 100644 index 0000000000..468ac18a9c --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-nested-obj-nested-rest.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-nested-obj-nested-rest.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let a, b, c, rest; + +let iterCount = 0; +async function * fn() { + for await ({a, b, ...{c, ...rest}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(c, 3); + + assert.sameValue(rest.d, 4); + assert.sameValue(rest.e, 5); + + verifyEnumerable(rest, "d"); + verifyWritable(rest, "d"); + verifyConfigurable(rest, "d"); + + verifyEnumerable(rest, "e"); + verifyWritable(rest, "e"); + verifyConfigurable(rest, "e"); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-nested-obj.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-nested-obj.js new file mode 100644 index 0000000000..8575520e3d --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-nested-obj.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-nested-obj.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let a, b, c, d, e; + +let iterCount = 0; +async function * fn() { + for await ({a, b, ...{c, e}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(c, 3); + assert.sameValue(e, 5); + assert.sameValue(d, undefined); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-number.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-number.js new file mode 100644 index 0000000000..60b2313ef2 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-number.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-number.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: RestBindingInitialization creates a new object even if lhs is a Number (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; + + +let iterCount = 0; +async function * fn() { + for await ({...rest} of [51]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert(rest instanceof Object); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-obj-own-property.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-obj-own-property.js new file mode 100644 index 0000000000..bb13d0af3e --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-obj-own-property.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-obj-own-property.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Rest object contains just source object's own properties (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let o = Object.create({ x: 1, y: 2 }); +o.z = 3; + +let x, y, z; + +let iterCount = 0; +async function * fn() { + for await ({ x, ...{y , z} } of [o]) { + assert.sameValue(x, 1); + assert.sameValue(y, undefined); + assert.sameValue(z, 3); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-same-name.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-same-name.js new file mode 100644 index 0000000000..5e3f2bc946 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-same-name.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-same-name.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Proper setting in the values for rest name equal to a property name. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let o = { + x: 42, + y: 39, + z: 'cheeseburger' +}; + +let x, y, z; + +let iterCount = 0; +async function * fn() { + for await ({ x, ...z } of [o]) { + assert.sameValue(x, 42); + assert.sameValue(y, undefined); + assert.sameValue(z.y, 39); + assert.sameValue(z.z, 'cheeseburger'); + + let keys = Object.keys(z); + assert.sameValue(keys.length, 2); + assert.sameValue(keys[0], 'y'); + assert.sameValue(keys[1], 'z'); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-skip-non-enumerable.js new file mode 100644 index 0000000000..41e2fa3ab7 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-skip-non-enumerable.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-skip-non-enumerable.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Rest object doesn't contain non-enumerable properties (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; +let obj = {a: 3, b: 4}; +Object.defineProperty(obj, "x", { value: 4, enumerable: false }); + +let iterCount = 0; +async function * fn() { + for await ({...rest} of [obj]) { + assert.sameValue(rest.a, 3); + assert.sameValue(rest.b, 4); + assert.sameValue(Object.getOwnPropertyDescriptor(rest, "x"), undefined); + + verifyEnumerable(rest, "a"); + verifyWritable(rest, "a"); + verifyConfigurable(rest, "a"); + + verifyEnumerable(rest, "b"); + verifyWritable(rest, "b"); + verifyConfigurable(rest, "b"); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-str-val.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-str-val.js new file mode 100644 index 0000000000..78de675328 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-str-val.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-str-val.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: RestBindingInitialization creats an object with indexes as property name (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; + + +let iterCount = 0; +async function * fn() { + for await ({...rest} of ["foo"]) { + assert.sameValue(rest["0"], "f"); + assert.sameValue(rest["1"], "o"); + assert.sameValue(rest["2"], "o"); + assert(rest instanceof Object); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-symbol-val.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-symbol-val.js new file mode 100644 index 0000000000..cb27c04118 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-symbol-val.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-symbol-val.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: RestBindingInitialization creates a new object if lhs is a Symbol (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest; + + +let iterCount = 0; +async function * fn() { + for await ({...rest} of [Symbol("foo")]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert(rest instanceof Object); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property-with-setter.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property-with-setter.js new file mode 100644 index 0000000000..0554c4c0c5 --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property-with-setter.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-to-property-with-setter.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object property setter, its value should be binded as rest object. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let settedValue; +let executedGetter = false; +let src = { + get y() { + executedGetter = true; + }, + set y(v) { + settedValue = v; + }, +}; +src.y = undefined; + +let iterCount = 0; +async function * fn() { + for await ({...src.y} of [{ x: 1, y: 2}]) { + assert.sameValue(settedValue.x, 1); + assert.sameValue(settedValue.y, 2); + assert(!executedGetter, "The property should not be accessed"); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property.js new file mode 100644 index 0000000000..c8dee82d6a --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-to-property.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-to-property.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: When DestructuringAssignmentTarget is an object property, its value should be binded as rest object. (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let src = {}; + +let iterCount = 0; +async function * fn() { + for await ({...src.y} of [{ x: 1, y: 2}]) { + assert.sameValue(src.y.x, 1); + assert.sameValue(src.y.y, 2); + + verifyEnumerable(src, "y"); + verifyWritable(src, "y"); + verifyConfigurable(src, "y"); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-valid-object.js b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-valid-object.js new file mode 100644 index 0000000000..fa701621cd --- /dev/null +++ b/test/language/statements/for-await-of/async-gen-decl-dstr-obj-rest-valid-object.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment-for-await/obj-rest-valid-object.case +// - src/dstr-assignment-for-await/default/async-gen-decl.template +/*--- +description: Rest object contains just unextracted data (for-await-of statement in an async generator declaration) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. Assert: lhs is a LeftHandSideExpression. + b. Let assignmentPattern be the parse of the source text corresponding to + lhs using AssignmentPattern as the goal symbol. + [...] +---*/ +let rest, a, b; + + +let iterCount = 0; +async function * fn() { + for await ({a, b, ...rest} of [{x: 1, y: 2, a: 5, b: 3}]) { + assert.sameValue(rest.x, 1); + assert.sameValue(rest.y, 2); + assert.sameValue(rest.a, undefined); + assert.sameValue(rest.b, undefined); + + verifyEnumerable(rest, "x"); + verifyWritable(rest, "x"); + verifyConfigurable(rest, "x"); + + verifyEnumerable(rest, "y"); + verifyWritable(rest, "y"); + verifyConfigurable(rest, "y"); + + iterCount += 1; + } +} + +let promise = fn().next(); + +promise + .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-assignment-fn.js b/test/language/statements/for-await-of/dstr-array-elem-init-assignment.js similarity index 83% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-assignment-fn.js rename to test/language/statements/for-await-of/dstr-array-elem-init-assignment.js index b293809c0d..4ec79f5c34 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-assignment-fn.js +++ b/test/language/statements/for-await-of/dstr-array-elem-init-assignment.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-assignment-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment/array-elem-init-assignment.case +// - src/dstr-assignment/default/for-await-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-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -26,7 +26,8 @@ info: | ---*/ var v2, vNull, vHole, vUndefined, vOob; -var iterCount = 0; +var counter = 0; + async function fn() { for await ([v2 = 10, vNull = 11, vHole = 12, vUndefined = 13, vOob = 14] of [[2, null, , undefined]]) { assert.sameValue(v2, 2); @@ -34,12 +35,10 @@ async function fn() { assert.sameValue(vHole, 12); assert.sameValue(vUndefined, 13); assert.sameValue(vOob, 14); - - - iterCount += 1; + counter += 1; } } fn() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-init-evaluation.js b/test/language/statements/for-await-of/dstr-array-elem-init-evaluation.js new file mode 100644 index 0000000000..1b76dff98d --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-init-evaluation.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-evaluation.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ _ = flag1 = true, _ = flag2 = true ] of [[14]]) { + assert.sameValue(flag1, false); + assert.sameValue(flag2, true); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-arrow-fn.js b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-arrow.js similarity index 85% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-arrow-fn.js rename to test/language/statements/for-await-of/dstr-array-elem-init-fn-name-arrow.js index 7428724d0f..fea2d852e2 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-arrow-fn.js +++ b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-arrow.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-fn-name-arrow-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment/array-elem-init-fn-name-arrow.case +// - src/dstr-assignment/default/for-await-of.template /*--- description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -37,18 +37,18 @@ info: | ---*/ var arrow; -var iterCount = 0; +var counter = 0; + async function fn() { for await ([ arrow = () => {} ] of [[]]) { assert.sameValue(arrow.name, 'arrow'); verifyNotEnumerable(arrow, 'name'); verifyNotWritable(arrow, 'name'); verifyConfigurable(arrow, 'name'); - - iterCount += 1; + counter += 1; } } fn() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-class-fn.js b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-class.js similarity index 86% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-class-fn.js rename to test/language/statements/for-await-of/dstr-array-elem-init-fn-name-class.js index 88fb18c485..37525edcd4 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-class-fn.js +++ b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-class.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-fn-name-class-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment/array-elem-init-fn-name-class.case +// - src/dstr-assignment/default/for-await-of.template /*--- description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -37,7 +37,8 @@ info: | ---*/ var xCls, cls, xCls2; -var iterCount = 0; +var counter = 0; + async function fn() { for await ([ xCls = class x {}, cls = class {}, xCls2 = class { static name() {} } ] of [[]]) { assert(xCls.name !== 'xCls'); @@ -47,13 +48,10 @@ async function fn() { verifyNotEnumerable(cls, 'name'); verifyNotWritable(cls, 'name'); verifyConfigurable(cls, 'name'); - - - iterCount += 1; + counter += 1; } } fn() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); - diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-cover-fn.js b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-cover.js similarity index 86% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-cover-fn.js rename to test/language/statements/for-await-of/dstr-array-elem-init-fn-name-cover.js index f555a07115..fa0fa636c8 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-cover-fn.js +++ b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-cover.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-fn-name-cover-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment/array-elem-init-fn-name-cover.case +// - src/dstr-assignment/default/for-await-of.template /*--- description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -37,7 +37,8 @@ info: | ---*/ var xCover, cover; -var iterCount = 0; +var counter = 0; + async function fn() { for await ([ xCover = (0, function() {}), cover = (function() {}) ] of [[]]) { assert(xCover.name !== 'xCover'); @@ -46,11 +47,10 @@ async function fn() { verifyNotEnumerable(cover, 'name'); verifyNotWritable(cover, 'name'); verifyConfigurable(cover, 'name'); - - iterCount += 1; + counter += 1; } } fn() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-fn.js b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-fn.js similarity index 86% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-fn.js rename to test/language/statements/for-await-of/dstr-array-elem-init-fn-name-fn.js index e8a71bb44b..429355375d 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-init-fn-name-fn.js +++ b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-fn.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-fn-name-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment/array-elem-init-fn-name-fn.case +// - src/dstr-assignment/default/for-await-of.template /*--- description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -37,7 +37,8 @@ info: | ---*/ var xFn, fn; -var iterCount = 0; +var counter = 0; + async function fn() { for await ([ xFn = function x() {}, fn = function() {} ] of [[]]) { assert(xFn.name !== 'xFn'); @@ -46,11 +47,10 @@ async function fn() { verifyNotEnumerable(fn, 'name'); verifyNotWritable(fn, 'name'); verifyConfigurable(fn, 'name'); - - iterCount += 1; + counter += 1; } } fn() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-gen.js b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-gen.js similarity index 85% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-gen.js rename to test/language/statements/for-await-of/dstr-array-elem-init-fn-name-gen.js index 6d3002df70..4bfd111465 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-init-fn-name-gen.js +++ b/test/language/statements/for-await-of/dstr-array-elem-init-fn-name-gen.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-init-fn-name-gen.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment/array-elem-init-fn-name-gen.case +// - src/dstr-assignment/default/for-await-of.template /*--- description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -37,8 +37,9 @@ info: | ---*/ var xGen, gen; -var iterCount = 0; -async function * fn() { +var counter = 0; + +async function fn() { for await ([ xGen = function* x() {}, gen = function*() {} ] of [[]]) { assert.notSameValue(xGen.name, 'xGen'); @@ -46,11 +47,10 @@ async function * fn() { verifyNotEnumerable(gen, 'name'); verifyNotWritable(gen, 'name'); verifyConfigurable(gen, 'name'); - - iterCount += 1; + counter += 1; } } -fn().next() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-init-in.js b/test/language/statements/for-await-of/dstr-array-elem-init-in.js new file mode 100644 index 0000000000..2c35d84b24 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-init-in.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-in.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x = 'x' in {} ] of [[]]) { + assert.sameValue(x, false); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-init-order.js b/test/language/statements/for-await-of/dstr-array-elem-init-order.js new file mode 100644 index 0000000000..e145fda73d --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-init-order.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-order.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Initializer values should be assigned in left-to-right order. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ a = x += 1, b = x *= 2 ] of [[]]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-init-simple-no-strict.js b/test/language/statements/for-await-of/dstr-array-elem-init-simple-no-strict.js new file mode 100644 index 0000000000..91d88807a2 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-init-simple-no-strict.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-simple-no-strict.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([arguments = 4, eval = 5] of [[]]) { + assert.sameValue(arguments, 4); + assert.sameValue(eval, 5); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-init-yield-expr.js b/test/language/statements/for-await-of/dstr-array-elem-init-yield-expr.js new file mode 100644 index 0000000000..0b96787339 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-init-yield-expr.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x = yield ] of [[]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +})(); + +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-await-of/dstr-array-elem-init-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-array-elem-init-yield-ident-valid.js new file mode 100644 index 0000000000..cccf1aec0a --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-init-yield-ident-valid.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-init-yield-ident-valid.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x = yield ] of [[]]) { + assert.sameValue(x, 4); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-iter-nrml-close-skip.js b/test/language/statements/for-await-of/dstr-array-elem-iter-nrml-close-skip.js similarity index 83% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-iter-nrml-close-skip.js rename to test/language/statements/for-await-of/dstr-array-elem-iter-nrml-close-skip.js index 8a4a11adf8..b891fef4f6 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-iter-nrml-close-skip.js +++ b/test/language/statements/for-await-of/dstr-array-elem-iter-nrml-close-skip.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-iter-nrml-close-skip.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment/array-elem-iter-nrml-close-skip.case +// - src/dstr-assignment/default/for-await-of.template /*--- description: IteratorClose is not called when assignment evaluation has exhausted the iterator (for-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -49,16 +49,16 @@ iterable[Symbol.iterator] = function() { return iterator; }; -var iterCount = 0; -async function * fn() { +var counter = 0; + +async function fn() { for await ([ _ ] of [iterable]) { assert.sameValue(nextCount, 1); assert.sameValue(returnCount, 0); - - iterCount += 1; + counter += 1; } } -fn().next() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-gen-dstr-array-elem-iter-nrml-close.js b/test/language/statements/for-await-of/dstr-array-elem-iter-nrml-close.js similarity index 86% rename from test/language/statements/for-await-of/async-gen-dstr-array-elem-iter-nrml-close.js rename to test/language/statements/for-await-of/dstr-array-elem-iter-nrml-close.js index 767e1b4c0e..b73afb2079 100644 --- a/test/language/statements/for-await-of/async-gen-dstr-array-elem-iter-nrml-close.js +++ b/test/language/statements/for-await-of/dstr-array-elem-iter-nrml-close.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-iter-nrml-close.case -// - src/dstr-assignment-async-iteration/async-generator/for-await-of-async-gen.template +// - src/dstr-assignment/array-elem-iter-nrml-close.case +// - src/dstr-assignment/default/for-await-of.template /*--- description: IteratorClose is called when assignment evaluation has not exhausted the iterator (for-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -62,19 +62,19 @@ iterable[Symbol.iterator] = function() { return iterator; }; -var iterCount = 0; -async function * fn() { +var counter = 0; + +async function fn() { for await ([ _ ] 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'); - - iterCount += 1; + counter += 1; } } -fn().next() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close-err.js b/test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close-err.js new file mode 100644 index 0000000000..18efa99076 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close-err.js @@ -0,0 +1,79 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close-err.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ {}[ yield ] ] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} +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-await-of/dstr-array-elem-iter-rtrn-close-null.js b/test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close-null.js new file mode 100644 index 0000000000..ef43fceeee --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close-null.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close-null.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ {}[yield] ] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close.js b/test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close.js new file mode 100644 index 0000000000..303d64a37f --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-iter-rtrn-close.js @@ -0,0 +1,86 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-iter-rtrn-close.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ {}[yield] ] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} +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-await-of/dstr-array-elem-nested-array-yield-expr.js b/test/language/statements/for-await-of/dstr-array-elem-nested-array-yield-expr.js new file mode 100644 index 0000000000..9ad3e282be --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-nested-array-yield-expr.js @@ -0,0 +1,58 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-array-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([[x[yield]]] of [value]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/async-func-dstr-array-elem-nested-array-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-array-elem-nested-array-yield-ident-valid.js similarity index 82% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-nested-array-yield-ident-valid.js rename to test/language/statements/for-await-of/dstr-array-elem-nested-array-yield-ident-valid.js index 129ee714bc..e11b2b4c6c 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-nested-array-yield-ident-valid.js +++ b/test/language/statements/for-await-of/dstr-array-elem-nested-array-yield-ident-valid.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-nested-array-yield-ident-valid.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment/array-elem-nested-array-yield-ident-valid.case +// - src/dstr-assignment/default/for-await-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-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -27,10 +27,15 @@ info: | var yield = 'prop'; var x = {}; -var iterCount = 0; +var counter = 0; + async function fn() { for await ([[x[yield]]] of [[[22]]]) { assert.sameValue(x.prop, 22); - iterCount += 1; + counter += 1; } } + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-nested-array.js b/test/language/statements/for-await-of/dstr-array-elem-nested-array.js similarity index 82% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-nested-array.js rename to test/language/statements/for-await-of/dstr-array-elem-nested-array.js index 593906b97f..d6b92ee479 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-nested-array.js +++ b/test/language/statements/for-await-of/dstr-array-elem-nested-array.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-nested-array.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment/array-elem-nested-array.case +// - src/dstr-assignment/default/for-await-of.template /*--- description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -26,10 +26,15 @@ info: | ---*/ var x; -var iterCount = 0; +var counter = 0; + async function fn() { for await ([[x]] of [[[1]]]) { assert.sameValue(x, 1); - iterCount += 1; + counter += 1; } } + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-nested-obj-yield-expr.js b/test/language/statements/for-await-of/dstr-array-elem-nested-obj-yield-expr.js new file mode 100644 index 0000000000..2c33ed58e3 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-nested-obj-yield-expr.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([{ x = yield }] of [[{}]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-array-elem-nested-obj-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-array-elem-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..d503e10ee1 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-nested-obj-yield-ident-valid.js @@ -0,0 +1,41 @@ +// 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-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([{ x = yield }] of [[{}]]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-nested-obj.js b/test/language/statements/for-await-of/dstr-array-elem-nested-obj.js new file mode 100644 index 0000000000..bd47dba4fd --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-nested-obj.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-nested-obj.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([{ x }] of [[{ x: 2 }]]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-put-prop-ref-no-get.js b/test/language/statements/for-await-of/dstr-array-elem-put-prop-ref-no-get.js new file mode 100644 index 0000000000..6d1aad896f --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-put-prop-ref-no-get.js @@ -0,0 +1,48 @@ +// 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-await-of.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([x.y] of [[23]]) { + assert.sameValue(setValue, 23); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-put-prop-ref.js b/test/language/statements/for-await-of/dstr-array-elem-put-prop-ref.js new file mode 100644 index 0000000000..aa72ff286b --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-put-prop-ref.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-prop-ref.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([x.y] of [[4]]) { + assert.sameValue(x.y, 4); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/dstr-array-elem-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..256dcb8869 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-put-unresolvable-no-strict.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ unresolvable ] of [[]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/statements/for-await-of/dstr-array-elem-target-identifier.js b/test/language/statements/for-await-of/dstr-array-elem-target-identifier.js new file mode 100644 index 0000000000..f95b06dd55 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-target-identifier.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-identifier.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([x, y, z] of [[1, 2, 3]]) { + assert.sameValue(x, 1); + assert.sameValue(y, 2); + assert.sameValue(z, 3); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-target-simple-no-strict.js b/test/language/statements/for-await-of/dstr-array-elem-target-simple-no-strict.js new file mode 100644 index 0000000000..8a9990e0a3 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-target-simple-no-strict.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-simple-no-strict.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([arguments, eval] of [[2, 3]]) { + assert.sameValue(arguments, 2); + assert.sameValue(eval, 3); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-target-yield-expr.js b/test/language/statements/for-await-of/dstr-array-elem-target-yield-expr.js new file mode 100644 index 0000000000..f21bf7f7cb --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-target-yield-expr.js @@ -0,0 +1,58 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x[yield] ] of [[33]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-array-elem-target-yield-valid.js b/test/language/statements/for-await-of/dstr-array-elem-target-yield-valid.js new file mode 100644 index 0000000000..a9b16fdff3 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-target-yield-valid.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elem-target-yield-valid.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x[yield] ] of [[33]]) { + assert.sameValue(x.prop, 33); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js new file mode 100644 index 0000000000..dc73b88d05 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close-skip.js @@ -0,0 +1,72 @@ +// 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-await-of.template +/*--- +description: IteratorClose not invoked when elision exhausts the iterator (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x , , ] of [iterable]) { + assert.sameValue(nextCount, 2); + assert.sameValue(returnCount, 0); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js new file mode 100644 index 0000000000..9170bb3200 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-elision-iter-nrml-close.js @@ -0,0 +1,87 @@ +// 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-await-of.template +/*--- +description: IteratorClose invoked when elision does not exhaust the iterator (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-nrml-close-skip.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-nrml-close-skip.js new file mode 100644 index 0000000000..be57dfb781 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-nrml-close-skip.js @@ -0,0 +1,73 @@ +// 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-await-of.template +/*--- +description: IteratorClose is not invoked when evaluation of AssignmentElementList exhausts the iterator (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x , ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-nrml-close.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-nrml-close.js new file mode 100644 index 0000000000..9d98bc1758 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-nrml-close.js @@ -0,0 +1,86 @@ +// 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-await-of.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList completes without exhausting the iterator (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js new file mode 100644 index 0000000000..f7b14a4299 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close-err.js @@ -0,0 +1,86 @@ +// 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-await-of.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "return" completion and the iterator has not been marked as "done" (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ {}[yield] , ] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +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-await-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js new file mode 100644 index 0000000000..bbabb3d867 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close-null.js @@ -0,0 +1,83 @@ +// 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-await-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ {}[yield] , ] of [iterable]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close.js new file mode 100644 index 0000000000..1cab9a05b4 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-list-rtrn-close.js @@ -0,0 +1,94 @@ +// 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-await-of.template +/*--- +description: IteratorClose is invoked when evaluation of AssignmentElementList returns a "return" completion and the iterator has not been marked as "done" (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ {}[yield] , ] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}; + +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-await-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js new file mode 100644 index 0000000000..c49c8b063a --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-nrml-close-skip.js @@ -0,0 +1,73 @@ +// 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-await-of.template +/*--- +description: IteratorClose is not called when rest element evaluation has exhausted the iterator (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x , ...y ] of [iterable]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +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-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js new file mode 100644 index 0000000000..566e1a75ce --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close-err.js @@ -0,0 +1,95 @@ +// 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-await-of.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "return" completion due to reference evaluation (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x , ...{}[yield] ] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +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-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js new file mode 100644 index 0000000000..073175cf13 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close-null.js @@ -0,0 +1,90 @@ +// 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-await-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x , ...{}[yield] ] of [iterable]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); + +assert.sameValue(nextCount, 1); diff --git a/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js new file mode 100644 index 0000000000..188453533c --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elem-trlg-iter-rest-rtrn-close.js @@ -0,0 +1,101 @@ +// 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-await-of.template +/*--- +description: IteratorClose is called when AssignmentRestEvaluation produces a "return" completion due to reference evaluation (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ x , ...{}[yield] ] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +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-await-of/dstr-array-elision-iter-nrml-close-skip.js b/test/language/statements/for-await-of/dstr-array-elision-iter-nrml-close-skip.js new file mode 100644 index 0000000000..a2d2ec0139 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elision-iter-nrml-close-skip.js @@ -0,0 +1,65 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close-skip.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose is not called when iteration has exhausted the iterator (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ , ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elision-iter-nrml-close.js b/test/language/statements/for-await-of/dstr-array-elision-iter-nrml-close.js new file mode 100644 index 0000000000..509a6001c2 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elision-iter-nrml-close.js @@ -0,0 +1,80 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-iter-nrml-close.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose is called when assignment evaluation has not exhausted the iterator (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ , ] 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elision-val-array.js b/test/language/statements/for-await-of/dstr-array-elision-val-array.js new file mode 100644 index 0000000000..9d55d53877 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elision-val-array.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-array.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([,] of [[]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-elision-val-string.js b/test/language/statements/for-await-of/dstr-array-elision-val-string.js new file mode 100644 index 0000000000..ec09b914e5 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-elision-val-string.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-elision-val-string.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ArrayAssignmentPattern containing only Elisions requires iterable values (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([,] of ['string literal']) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-empty-iter-close.js b/test/language/statements/for-await-of/dstr-array-empty-iter-close.js new file mode 100644 index 0000000000..c6bf46b8ca --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-empty-iter-close.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-iter-close.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Iterator is closed without iterating (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([] 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-empty-val-array.js b/test/language/statements/for-await-of/dstr-array-empty-val-array.js new file mode 100644 index 0000000000..897d5c7e25 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-empty-val-array.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-array.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([] of [[]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-empty-val-string.js b/test/language/statements/for-await-of/dstr-array-empty-val-string.js new file mode 100644 index 0000000000..265d0f8984 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-empty-val-string.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-empty-val-string.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ArrayAssignmentPattern without an AssignmentElementList requires iterable values. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([] of ['string literal']) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-iteration.js b/test/language/statements/for-await-of/dstr-array-iteration.js new file mode 100644 index 0000000000..4552d7a751 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-iteration.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-iteration.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Value iteration only proceeds for the number of elements in the ArrayAssignmentPattern. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([,,] of [g()]) { + assert.sameValue(count, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-after-element.js b/test/language/statements/for-await-of/dstr-array-rest-after-element.js new file mode 100644 index 0000000000..d796a4d1d5 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-after-element.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-after-element.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An AssignmentRestElement following an AssignmentElement consumes all remaining iterable values. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-after-elision.js b/test/language/statements/for-await-of/dstr-array-rest-after-elision.js new file mode 100644 index 0000000000..c87534c5e8 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-after-elision.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-after-elision.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An AssignmentRestElement following an elision consumes all remaining iterable values. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([, ...x] of [[1, 2, 3]]) { + assert.sameValue(x.length, 2); + assert.sameValue(x[0], 2); + assert.sameValue(x[1], 3); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-elision.js b/test/language/statements/for-await-of/dstr-array-rest-elision.js new file mode 100644 index 0000000000..af6b841347 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-elision.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-elision.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: ArrayAssignmentPattern may include elisions at any position preceeding a AssignmentRestElement in a AssignmentElementList. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([, , 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-iter-nrml-close-skip.js b/test/language/statements/for-await-of/dstr-array-rest-iter-nrml-close-skip.js new file mode 100644 index 0000000000..c0f24a7fd9 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-iter-nrml-close-skip.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-nrml-close-skip.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose is not called when assignment evaluation has exhausted the iterator (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ ...x ] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close-err.js b/test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close-err.js new file mode 100644 index 0000000000..cfa8e8f4d2 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close-err.js @@ -0,0 +1,91 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close-err.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...{}[yield]] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +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-await-of/dstr-array-rest-iter-rtrn-close-null.js b/test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close-null.js new file mode 100644 index 0000000000..becc03c060 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close-null.js @@ -0,0 +1,90 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close-null.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose throws a TypeError when `return` returns a non-Object value (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...{}[yield]] of [iterable]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +iter = g(); +iter.next(); + +assert.throws(TypeError, function() { + iter.return(); +}); diff --git a/test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close.js b/test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close.js new file mode 100644 index 0000000000..fa4c16d68d --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-iter-rtrn-close.js @@ -0,0 +1,102 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iter-rtrn-close.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: IteratorClose is called when reference evaluation produces a "return" completion (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...{}[yield]] of [iterable]) { + unreachable += 1; + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +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-await-of/dstr-array-rest-iteration.js b/test/language/statements/for-await-of/dstr-array-rest-iteration.js new file mode 100644 index 0000000000..76dd8bd842 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-iteration.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-iteration.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: In the presense of an AssignmentRestElement, value iteration exhausts the iterable value; (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...x] of [g()]) { + assert.sameValue(count, 3); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-lref.js b/test/language/statements/for-await-of/dstr-array-rest-lref.js new file mode 100644 index 0000000000..774372e2dd --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-lref.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-lref.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Reference is evaluated during assignment (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol.iterator, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...obj['a' + 'b']] of [iterable]) { + assert.sameValue(nextCount, 1); + assert.sameValue(returnCount, 0); + assert(!!obj.ab); + assert.sameValue(obj.ab.length, 0); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-array-null.js b/test/language/statements/for-await-of/dstr-array-rest-nested-array-null.js new file mode 100644 index 0000000000..7e77f8f08d --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-array-null.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-null.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...[x, y]] of [[null]]) { + assert.sameValue(x, null); + assert.sameValue(y, undefined); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined-hole.js b/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined-hole.js new file mode 100644 index 0000000000..64475acd69 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined-hole.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined-hole.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...[x]] of [[ , ]]) { + assert.sameValue(x, undefined); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined-own.js b/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined-own.js new file mode 100644 index 0000000000..0f7d3daad2 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined-own.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined-own.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...[x]] of [[undefined]]) { + assert.sameValue(x, undefined); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined.js b/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined.js new file mode 100644 index 0000000000..7b9e140806 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-array-undefined.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-undefined.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...[x]] of [[]]) { + assert.sameValue(x, undefined); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-array-yield-expr.js b/test/language/statements/for-await-of/dstr-array-rest-nested-array-yield-expr.js new file mode 100644 index 0000000000..80e9734a7b --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-array-yield-expr.js @@ -0,0 +1,58 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...[x[yield]]] of [[86]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-array-rest-nested-array-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-array-rest-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..877c2b34eb --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-array-yield-ident-valid.js @@ -0,0 +1,41 @@ +// 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-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...[x[yield]]] of [[86]]) { + assert.sameValue(x.prop, 86); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-array.js b/test/language/statements/for-await-of/dstr-array-rest-nested-array.js new file mode 100644 index 0000000000..08e0a64144 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-array.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-array.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...[x]] of [[1, 2, 3]]) { + assert.sameValue(x, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-obj-null.js b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-null.js new file mode 100644 index 0000000000..353c891c70 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-null.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-null.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...{ 0: x, length }] of [[null]]) { + assert.sameValue(x, null); + assert.sameValue(length, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined-hole.js b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined-hole.js new file mode 100644 index 0000000000..fe597fa823 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined-hole.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined-hole.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +var counter = 0; + +async function fn() { + for await ([...{ 0: x, length }] of [[ , ]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined-own.js b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined-own.js new file mode 100644 index 0000000000..e75832cde0 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined-own.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined-own.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +var counter = 0; + +async function fn() { + for await ([...{ 0: x, length }] of [[undefined]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined.js b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined.js new file mode 100644 index 0000000000..470a0ac3cd --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-undefined.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-undefined.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; +// Use the the top-level lexical scope for 'length' to provide compatibility with browsers +// where length and name are properties of WindowProxy +let length; + +var counter = 0; + +async function fn() { + for await ([...{ 0: x, length }] of [[]]) { + assert.sameValue(x, undefined); + assert.sameValue(length, 0); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-obj-yield-expr.js b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-yield-expr.js new file mode 100644 index 0000000000..2be57590b4 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-yield-expr.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...{ x = yield }] of [[{}]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-array-rest-nested-obj-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..f2b21cfab5 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-obj-yield-ident-valid.js @@ -0,0 +1,41 @@ +// 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-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...{ x = yield }] of [[{}]]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-nested-obj.js b/test/language/statements/for-await-of/dstr-array-rest-nested-obj.js new file mode 100644 index 0000000000..4294b8c84f --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-nested-obj.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-nested-obj.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...{ 1: x }] of [[1, 2, 3]]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-put-prop-ref-no-get.js b/test/language/statements/for-await-of/dstr-array-rest-put-prop-ref-no-get.js new file mode 100644 index 0000000000..c705eae15e --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-put-prop-ref-no-get.js @@ -0,0 +1,51 @@ +// 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-await-of.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-put-prop-ref.js b/test/language/statements/for-await-of/dstr-array-rest-put-prop-ref.js new file mode 100644 index 0000000000..4fe4659dc6 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-put-prop-ref.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-prop-ref.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-array-rest-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/dstr-array-rest-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..8e6ff5b606 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-put-unresolvable-no-strict.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([ ...unresolvable ] of [[]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +assert.sameValue(unresolvable.length, 0); diff --git a/test/language/statements/for-await-of/dstr-array-rest-yield-expr.js b/test/language/statements/for-await-of/dstr-array-rest-yield-expr.js new file mode 100644 index 0000000000..c437829959 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-yield-expr.js @@ -0,0 +1,60 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...x[yield]] of [[33, 44, 55]]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-array-rest-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-array-rest-yield-ident-valid.js new file mode 100644 index 0000000000..1cb9d4ebed --- /dev/null +++ b/test/language/statements/for-await-of/dstr-array-rest-yield-ident-valid.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/array-rest-yield-ident-valid.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ([...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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-empty-bool.js b/test/language/statements/for-await-of/dstr-obj-empty-bool.js new file mode 100644 index 0000000000..ad785f1954 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-empty-bool.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-bool.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (boolean value) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({} of [false]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-empty-num.js b/test/language/statements/for-await-of/dstr-obj-empty-num.js new file mode 100644 index 0000000000..bcf4e95a44 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-empty-num.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-num.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (number value) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({} of [0]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-empty-obj.js b/test/language/statements/for-await-of/dstr-obj-empty-obj.js new file mode 100644 index 0000000000..4c0db8e5fc --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-empty-obj.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-obj.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (object value) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({} of [{}]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-empty-string.js b/test/language/statements/for-await-of/dstr-obj-empty-string.js new file mode 100644 index 0000000000..b4e26d6474 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-empty-string.js @@ -0,0 +1,39 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-string.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (string value) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({} of ['']) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-empty-symbol.js b/test/language/statements/for-await-of/dstr-obj-empty-symbol.js new file mode 100644 index 0000000000..a09130983c --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-empty-symbol.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-empty-symbol.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: An ObjectAssignmentPattern without an AssignmentPropertyList requires an object-coercible value (symbol value) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [Symbol, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({} of [s]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-first.js b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-first.js new file mode 100644 index 0000000000..7830d74f61 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-first.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-first.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x, y } of [{ x: 3 }]) { + assert.sameValue(x, 3); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-last.js b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-last.js new file mode 100644 index 0000000000..46abcb9371 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-last.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-last.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ w, x } of [{ x: 4 }]) { + assert.sameValue(x, 4); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-lone.js b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-lone.js new file mode 100644 index 0000000000..dcce9d28d9 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-lone.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-lone.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x, } of [{ x: 2 }]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-middle.js b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-middle.js new file mode 100644 index 0000000000..02ff3f7f5f --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-middle.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-middle.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ w, x, y } of [{ x: 5 }]) { + assert.sameValue(x, 5); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-trlng.js b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-trlng.js new file mode 100644 index 0000000000..dc1dfdb3f0 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-identifier-resolution-trlng.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-resolution-trlng.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone identifier with trailing comma) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x } of [{ x: 1 }]) { + assert.sameValue(x, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-identifier-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-obj-id-identifier-yield-ident-valid.js new file mode 100644 index 0000000000..cbbad6d534 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-identifier-yield-ident-valid.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-identifier-yield-ident-valid.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: yield is a valid IdentifierReference in an AssignmentProperty outside of strict mode and generator functions. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ yield } of [{ yield: 3 }]) { + assert.sameValue(yield, 3); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-assignment-missing.js b/test/language/statements/for-await-of/dstr-obj-id-init-assignment-missing.js new file mode 100644 index 0000000000..27be57883e --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-assignment-missing.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-missing.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x = 1 } of [{}]) { + assert.sameValue(x, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-assignment-null.js b/test/language/statements/for-await-of/dstr-obj-id-init-assignment-null.js new file mode 100644 index 0000000000..fce306b29f --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-assignment-null.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-null.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x = 1 } of [{ x: null }]) { + assert.sameValue(x, null); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-assignment-truthy.js b/test/language/statements/for-await-of/dstr-obj-id-init-assignment-truthy.js new file mode 100644 index 0000000000..4d64159d02 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-assignment-truthy.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-truthy.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x = 1 } of [{ x: 2 }]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-assignment-undef.js b/test/language/statements/for-await-of/dstr-obj-id-init-assignment-undef.js new file mode 100644 index 0000000000..3d414449c1 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-assignment-undef.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-assignment-undef.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x = 1 } of [{ x: undefined }]) { + assert.sameValue(x, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-evaluation.js b/test/language/statements/for-await-of/dstr-obj-id-init-evaluation.js new file mode 100644 index 0000000000..1f1c5dfbf4 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-evaluation.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-evaluation.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x = flag1 = true, y = flag2 = true } of [{ y: 1 }]) { + assert.sameValue(flag1, true); + assert.sameValue(flag2, false); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-arrow.js b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-arrow.js new file mode 100644 index 0000000000..0905a9d9f9 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-arrow.js @@ -0,0 +1,53 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-arrow.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ arrow = () => {} } of [{}]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-class.js b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-class.js new file mode 100644 index 0000000000..ac2b9629b6 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-class.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-class.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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, xCls2; + +var counter = 0; + +async function fn() { + for await ({ xCls = class x {}, cls = class {}, xCls2 = class { static name() {} } } of [{}]) { + assert.notSameValue(xCls.name, 'xCls'); + assert.notSameValue(xCls2.name, 'xCls2'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-cover.js b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-cover.js new file mode 100644 index 0000000000..a8b5ffefbf --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-cover.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-cover.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-fn.js b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-fn.js new file mode 100644 index 0000000000..52d6f587ae --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-fn.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-fn.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-gen.js b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-gen.js new file mode 100644 index 0000000000..95ffac652f --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-fn-name-gen.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-fn-name-gen.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-in.js b/test/language/statements/for-await-of/dstr-obj-id-init-in.js new file mode 100644 index 0000000000..5ccf0a6183 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-in.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-in.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The Initializer in an AssignmentProperty may be an `in` expression. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ prop = 'x' in {} } of [{}]) { + assert.sameValue(prop, false); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-order.js b/test/language/statements/for-await-of/dstr-obj-id-init-order.js new file mode 100644 index 0000000000..67b87e0f6d --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-order.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-order.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Initializer values should be assigned in left-to-right order. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ a = x += 1, b = x *= 2 } of [{}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-simple-no-strict.js b/test/language/statements/for-await-of/dstr-obj-id-init-simple-no-strict.js new file mode 100644 index 0000000000..159a1dc274 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-simple-no-strict.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-simple-no-strict.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ eval = 3, arguments = 4 } of [{}]) { + assert.sameValue(eval, 3); + assert.sameValue(arguments, 4); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-init-yield-expr.js b/test/language/statements/for-await-of/dstr-obj-id-init-yield-expr.js new file mode 100644 index 0000000000..bbe38946b1 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-yield-expr.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x = yield } of [{}]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-obj-id-init-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-obj-id-init-yield-ident-valid.js new file mode 100644 index 0000000000..b367dcca14 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-init-yield-ident-valid.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-init-yield-ident-valid.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x = yield } of [{}]) { + assert.sameValue(x, 3); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-id-put-unresolvable-no-strict.js b/test/language/statements/for-await-of/dstr-obj-id-put-unresolvable-no-strict.js new file mode 100644 index 0000000000..d385aa8367 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-put-unresolvable-no-strict.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ unresolvable } of [{}]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/statements/for-await-of/dstr-obj-id-simple-no-strict.js b/test/language/statements/for-await-of/dstr-obj-id-simple-no-strict.js new file mode 100644 index 0000000000..8f0f992cfa --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-id-simple-no-strict.js @@ -0,0 +1,43 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-id-simple-no-strict.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ eval, arguments } of [{ eval: 1, arguments: 2 }]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +assert.sameValue(eval, 1); +assert.sameValue(arguments, 2); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-missing.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-missing.js new file mode 100644 index 0000000000..6a87653fc7 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-missing.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-missing.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ y: x = 1 } of [{}]) { + assert.sameValue(x, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-null.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-null.js new file mode 100644 index 0000000000..c67bac5676 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-null.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-null.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ y: x = 1 } of [{ y: null }]) { + assert.sameValue(x, null); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-truthy.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-truthy.js new file mode 100644 index 0000000000..66c39eb535 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-truthy.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-truthy.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ y: x = 1 } of [{ y: 2 }]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-undef.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-undef.js new file mode 100644 index 0000000000..0042c030a8 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-assignment-undef.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-assignment-undef.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ y: x = 1 } of [{ y: undefined }]) { + assert.sameValue(x, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-evaluation.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-evaluation.js new file mode 100644 index 0000000000..1d70028902 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-evaluation.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-evaluation.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The Initializer should only be evaluated if v is undefined. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-arrow.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-arrow.js new file mode 100644 index 0000000000..ad7a8b4545 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-arrow.js @@ -0,0 +1,54 @@ +// 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-await-of.template +/*--- +description: Assignment of function `name` attribute (ArrowFunction) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: arrow = () => {} } of [{}]) { + assert.sameValue(arrow.name, 'arrow'); + verifyNotEnumerable(arrow, 'name'); + verifyNotWritable(arrow, 'name'); + verifyConfigurable(arrow, 'name'); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-class.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-class.js new file mode 100644 index 0000000000..d37d7ec7ce --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-class.js @@ -0,0 +1,57 @@ +// 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-await-of.template +/*--- +description: Assignment of function `name` attribute (ClassExpression) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [class, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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, xCls2; + +var counter = 0; + +async function fn() { + for await ({ x: xCls = class x {}, x: cls = class {}, x: xCls2 = class { static name() {} } } of [{}]) { + assert.notSameValue(xCls.name, 'xCls'); + assert.notSameValue(xCls2.name, 'xCls2'); + + assert.sameValue(cls.name, 'cls'); + verifyNotEnumerable(cls, 'name'); + verifyNotWritable(cls, 'name'); + verifyConfigurable(cls, 'name'); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-cover.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-cover.js new file mode 100644 index 0000000000..5b3e3105f5 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-cover.js @@ -0,0 +1,56 @@ +// 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-await-of.template +/*--- +description: Assignment of function `name` attribute (CoverParenthesizedExpression) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-fn.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-fn.js new file mode 100644 index 0000000000..933a1146d5 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-fn.js @@ -0,0 +1,56 @@ +// 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-await-of.template +/*--- +description: Assignment of function `name` attribute (FunctionExpression) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-gen.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-gen.js new file mode 100644 index 0000000000..e9ad13e072 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-fn-name-gen.js @@ -0,0 +1,56 @@ +// 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-await-of.template +/*--- +description: Assignment of function `name` attribute (GeneratorExpression) (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ 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; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-in.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-in.js new file mode 100644 index 0000000000..119402efa1 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-in.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-in.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The Initializer in an AssignmentElement may be an `in` expression. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: prop = 'x' in {} } of [{}]) { + assert.sameValue(prop, false); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-init-yield-expr.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-yield-expr.js new file mode 100644 index 0000000000..614793f468 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-yield-expr.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-init-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: x = yield } of [{}]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-obj-prop-elem-init-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-yield-ident-valid.js new file mode 100644 index 0000000000..7b559b44b2 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-init-yield-ident-valid.js @@ -0,0 +1,41 @@ +// 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-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: x = yield } of [{}]) { + assert.sameValue(x, 4); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-elem-target-yield-expr.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-target-yield-expr.js new file mode 100644 index 0000000000..c281b74ed6 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-target-yield-expr.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-elem-target-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: x[yield] } of [{ x: 23 }]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-obj-prop-elem-target-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-obj-prop-elem-target-yield-ident-valid.js new file mode 100644 index 0000000000..5670e4b7da --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-elem-target-yield-ident-valid.js @@ -0,0 +1,41 @@ +// 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-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: x[yield] } of [{ x: 23 }]) { + assert.sameValue(x.prop, 23); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-first.js b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-first.js new file mode 100644 index 0000000000..75fd082377 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-first.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-first.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (first of many). (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ a: x, y } of [{ a: 3 }]) { + assert.sameValue(x, 3); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-last.js b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-last.js new file mode 100644 index 0000000000..31e0e54ccc --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-last.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-last.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (last of many). (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ w, a: x } of [{ a: 4 }]) { + assert.sameValue(x, 4); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-lone.js b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-lone.js new file mode 100644 index 0000000000..5a5b775121 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-lone.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-lone.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element). (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ a: x } of [{ a: 1 }]) { + assert.sameValue(x, 1); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-middle.js b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-middle.js new file mode 100644 index 0000000000..827c0081f2 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-middle.js @@ -0,0 +1,41 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-middle.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (within many). (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ w, a: x, y } of [{ a: 5 }]) { + assert.sameValue(x, 5); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-trlng.js b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-trlng.js new file mode 100644 index 0000000000..34c9ed03a1 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-identifier-resolution-trlng.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-identifier-resolution-trlng.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Evaluation of DestructuringAssignmentTarget (lone element with trailing comma). (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ a: x, } of [{ a: 2 }]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-name-evaluation.js b/test/language/statements/for-await-of/dstr-obj-prop-name-evaluation.js new file mode 100644 index 0000000000..2ddb1000eb --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-name-evaluation.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-name-evaluation.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: PropertyName of an AssignmentProperty may be a ComputedPropertyName. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ ['x' + 'y']: x } of [{ x: 1, xy: 23, y: 2 }]) { + assert.sameValue(x, 23); + assert.sameValue(y, undefined); + assert.sameValue(xy, undefined); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-nested-array-yield-expr.js b/test/language/statements/for-await-of/dstr-obj-prop-nested-array-yield-expr.js new file mode 100644 index 0000000000..497cc6c313 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-nested-array-yield-expr.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: [x = yield] } of [{ x: [] }]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-obj-prop-nested-array-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-obj-prop-nested-array-yield-ident-valid.js new file mode 100644 index 0000000000..fb7d3f4132 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-nested-array-yield-ident-valid.js @@ -0,0 +1,41 @@ +// 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-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: [x = yield] } of [{ x: [] }]) { + assert.sameValue(x, 22); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-nested-array.js b/test/language/statements/for-await-of/dstr-obj-prop-nested-array.js new file mode 100644 index 0000000000..f1a26cb1a5 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-nested-array.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-array.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an array literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: [y] } of [{ x: [321] }]) { + assert.sameValue(y, 321); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-nested-obj-yield-expr.js b/test/language/statements/for-await-of/dstr-obj-prop-nested-obj-yield-expr.js new file mode 100644 index 0000000000..9219d743c5 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-nested-obj-yield-expr.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj-yield-expr.case +// - src/dstr-assignment/default/for-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [generators, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: { x = yield } } of [{ x: {} }]) { + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); + +}()); + +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-await-of/dstr-obj-prop-nested-obj-yield-ident-valid.js b/test/language/statements/for-await-of/dstr-obj-prop-nested-obj-yield-ident-valid.js new file mode 100644 index 0000000000..f7e0f63873 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-nested-obj-yield-ident-valid.js @@ -0,0 +1,41 @@ +// 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-await-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-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, noStrict, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: { x = yield } } of [{ x: {} }]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-nested-obj.js b/test/language/statements/for-await-of/dstr-obj-prop-nested-obj.js new file mode 100644 index 0000000000..55e6e14b43 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-nested-obj.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-nested-obj.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ x: { y } } of [{ x: { y: 2 } }]) { + assert.sameValue(y, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-put-order.js b/test/language/statements/for-await-of/dstr-obj-prop-put-order.js new file mode 100644 index 0000000000..0a48ac6b61 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-put-order.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-order.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The AssignmentElements in an AssignmentElementList are evaluated in left- to-right order. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ z: x, a: x } of [{ a: 2, z: 1 }]) { + assert.sameValue(x, 2); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-put-prop-ref-no-get.js b/test/language/statements/for-await-of/dstr-obj-prop-put-prop-ref-no-get.js new file mode 100644 index 0000000000..04b04ad028 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-put-prop-ref-no-get.js @@ -0,0 +1,48 @@ +// 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-await-of.template +/*--- +description: If the DestructuringAssignmentTarget of an AssignmentElement is a PropertyReference, it should not be evaluated. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ a: x.y } of [{ a: 23 }]) { + assert.sameValue(setValue, 23); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-prop-put-prop-ref.js b/test/language/statements/for-await-of/dstr-obj-prop-put-prop-ref.js new file mode 100644 index 0000000000..730e40577b --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-prop-put-prop-ref.js @@ -0,0 +1,40 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-prop-put-prop-ref.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: The DestructuringAssignmentTarget of an AssignmentElement may be a PropertyReference. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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; + +async function fn() { + for await ({ xy: x.y } of [{ xy: 4 }]) { + assert.sameValue(x.y, 4); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/async-func-dstr-array-elem-put-unresolvable-no-strict-fn.js b/test/language/statements/for-await-of/dstr-obj-prop-put-unresolvable-no-strict.js similarity index 80% rename from test/language/statements/for-await-of/async-func-dstr-array-elem-put-unresolvable-no-strict-fn.js rename to test/language/statements/for-await-of/dstr-obj-prop-put-unresolvable-no-strict.js index 68f8f99169..d374794b4b 100644 --- a/test/language/statements/for-await-of/async-func-dstr-array-elem-put-unresolvable-no-strict-fn.js +++ b/test/language/statements/for-await-of/dstr-obj-prop-put-unresolvable-no-strict.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: -// - src/dstr-assignment-async-iteration/array-elem-put-unresolvable-no-strict-fn.case -// - src/dstr-assignment-async-iteration/async-function/for-await-of-async-func.template +// - src/dstr-assignment/obj-prop-put-unresolvable-no-strict.case +// - src/dstr-assignment/default/for-await-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-await-of statement) esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation @@ -24,15 +24,21 @@ info: | lhs using AssignmentPattern as the goal symbol. [...] ---*/ +{ + +var counter = 0; -var iterCount = 0; async function fn() { - for await ([ unresolvable ] of [[]]) { + for await ({ x: unresolvable } of [{}]) { - iterCount += 1; + counter += 1; } } fn() - .then(() => assert.sameValue(iterCount, 1, 'iteration occurred as expected'), $DONE) + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) .then($DONE, $DONE); + +} + +assert.sameValue(unresolvable, undefined); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-descriptors.js b/test/language/statements/for-await-of/dstr-obj-rest-descriptors.js new file mode 100644 index 0000000000..5dcfe88c61 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-descriptors.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-descriptors.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Object created from rest deconstruction doesn't copy source object property descriptors. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 rest; +var obj = {}; +Object.defineProperty(obj, "a", { value: 3, configurable: false, enumerable: true }); +Object.defineProperty(obj, "b", { value: 4, writable: false, enumerable: true }); + +var counter = 0; + +async function fn() { + for await ({...rest} of [obj]) { + assert.sameValue(rest.a, 3); + assert.sameValue(rest.b, 4); + + verifyEnumerable(rest, "a"); + verifyWritable(rest, "a"); + verifyConfigurable(rest, "a"); + + verifyEnumerable(rest, "b"); + verifyWritable(rest, "b"); + verifyConfigurable(rest, "b"); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-empty-obj.js b/test/language/statements/for-await-of/dstr-obj-rest-empty-obj.js new file mode 100644 index 0000000000..fb8351c3b9 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-empty-obj.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-empty-obj.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: RestBindingInitialization creates a new object even if lhs is an empty object (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 rest; + + +var counter = 0; + +async function fn() { + for await ({...rest} of [{}]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert.sameValue(typeof rest, "object"); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-getter.js b/test/language/statements/for-await-of/dstr-obj-rest-getter.js new file mode 100644 index 0000000000..6c20d66a60 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-getter.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-getter.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Getter is called when obj is being deconstructed to a rest Object (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 count = 0; + +var counter = 0; + +async function fn() { + for await ({...x} of [{ get v() { count++; return 2; } }]) { + assert.sameValue(x.v, 2); + assert.sameValue(count, 1); + + verifyEnumerable(x, "v"); + verifyWritable(x, "v"); + verifyConfigurable(x, "v"); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-nested-obj-nested-rest.js b/test/language/statements/for-await-of/dstr-obj-rest-nested-obj-nested-rest.js new file mode 100644 index 0000000000..eb5fbd358a --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-nested-obj-nested-rest.js @@ -0,0 +1,55 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-nested-obj-nested-rest.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment and object rest desconstruction is allowed in that case. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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, b, c, rest; + +var counter = 0; + +async function fn() { + for await ({a, b, ...{c, ...rest}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(c, 3); + + assert.sameValue(rest.d, 4); + assert.sameValue(rest.e, 5); + + verifyEnumerable(rest, "d"); + verifyWritable(rest, "d"); + verifyConfigurable(rest, "d"); + + verifyEnumerable(rest, "e"); + verifyWritable(rest, "e"); + verifyConfigurable(rest, "e"); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-nested-obj.js b/test/language/statements/for-await-of/dstr-obj-rest-nested-obj.js new file mode 100644 index 0000000000..54b86c9406 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-nested-obj.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-nested-obj.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an object literal, it should be parsed parsed as a DestructuringAssignmentPattern and evaluated as a destructuring assignment. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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, b, c, d, e; + +var counter = 0; + +async function fn() { + for await ({a, b, ...{c, e}} of [{a: 1, b: 2, c: 3, d: 4, e: 5}]) { + assert.sameValue(a, 1); + assert.sameValue(b, 2); + assert.sameValue(c, 3); + assert.sameValue(e, 5); + assert.sameValue(d, undefined); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-number.js b/test/language/statements/for-await-of/dstr-obj-rest-number.js new file mode 100644 index 0000000000..fcc93e86bd --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-number.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-number.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: RestBindingInitialization creates a new object even if lhs is a Number (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 rest; + + +var counter = 0; + +async function fn() { + for await ({...rest} of [51]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert(rest instanceof Object); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-obj-own-property.js b/test/language/statements/for-await-of/dstr-obj-rest-obj-own-property.js new file mode 100644 index 0000000000..d6e9b17555 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-obj-own-property.js @@ -0,0 +1,46 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-obj-own-property.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Rest object contains just source object's own properties (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 o = Object.create({ x: 1, y: 2 }); +o.z = 3; + +var x, y, z; + +var counter = 0; + +async function fn() { + for await ({ x, ...{y , z} } of [o]) { + assert.sameValue(x, 1); + assert.sameValue(y, undefined); + assert.sameValue(z, 3); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-same-name.js b/test/language/statements/for-await-of/dstr-obj-rest-same-name.js new file mode 100644 index 0000000000..63c531898d --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-same-name.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-same-name.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Proper setting in the values for rest name equal to a property name. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 o = { + x: 42, + y: 39, + z: 'cheeseburger' +}; + +var x, y, z; + +var counter = 0; + +async function fn() { + for await ({ x, ...z } of [o]) { + assert.sameValue(x, 42); + assert.sameValue(y, undefined); + assert.sameValue(z.y, 39); + assert.sameValue(z.z, 'cheeseburger'); + + var keys = Object.keys(z); + assert.sameValue(keys.length, 2); + assert.sameValue(keys[0], 'y'); + assert.sameValue(keys[1], 'z'); + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-skip-non-enumerable.js b/test/language/statements/for-await-of/dstr-obj-rest-skip-non-enumerable.js new file mode 100644 index 0000000000..70f108e0d0 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-skip-non-enumerable.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-skip-non-enumerable.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Rest object doesn't contain non-enumerable properties (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 rest; +var obj = {a: 3, b: 4}; +Object.defineProperty(obj, "x", { value: 4, enumerable: false }); + +var counter = 0; + +async function fn() { + for await ({...rest} of [obj]) { + assert.sameValue(rest.a, 3); + assert.sameValue(rest.b, 4); + assert.sameValue(Object.getOwnPropertyDescriptor(rest, "x"), undefined); + + verifyEnumerable(rest, "a"); + verifyWritable(rest, "a"); + verifyConfigurable(rest, "a"); + + verifyEnumerable(rest, "b"); + verifyWritable(rest, "b"); + verifyConfigurable(rest, "b"); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-str-val.js b/test/language/statements/for-await-of/dstr-obj-rest-str-val.js new file mode 100644 index 0000000000..be48d9b239 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-str-val.js @@ -0,0 +1,45 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-str-val.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: RestBindingInitialization creats an object with indexes as property name (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 rest; + + +var counter = 0; + +async function fn() { + for await ({...rest} of ["foo"]) { + assert.sameValue(rest["0"], "f"); + assert.sameValue(rest["1"], "o"); + assert.sameValue(rest["2"], "o"); + assert(rest instanceof Object); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-symbol-val.js b/test/language/statements/for-await-of/dstr-obj-rest-symbol-val.js new file mode 100644 index 0000000000..77b0e7fdf7 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-symbol-val.js @@ -0,0 +1,44 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-symbol-val.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: RestBindingInitialization creates a new object if lhs is a Symbol (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 rest; + + +var counter = 0; + +async function fn() { + for await ({...rest} of [Symbol("foo")]) { + assert.notSameValue(rest, undefined); + assert.notSameValue(rest, null); + assert(rest instanceof Object); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-to-property-with-setter.js b/test/language/statements/for-await-of/dstr-obj-rest-to-property-with-setter.js new file mode 100644 index 0000000000..9c28cb5805 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-to-property-with-setter.js @@ -0,0 +1,51 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-to-property-with-setter.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an object property setter, its value should be binded as rest object. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 settedValue; +var executedGetter = false; +var src = { + get y() { executedGetter = true; }, + set y(v) { + settedValue = v; + } +} +src.y = undefined; + +var counter = 0; + +async function fn() { + for await ({...src.y} of [{ x: 1, y: 2}]) { + assert.sameValue(settedValue.x, 1); + assert.sameValue(settedValue.y, 2); + assert(!executedGetter, "The property should not be accessed"); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-to-property.js b/test/language/statements/for-await-of/dstr-obj-rest-to-property.js new file mode 100644 index 0000000000..3f8a1e9d87 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-to-property.js @@ -0,0 +1,47 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-to-property.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: When DestructuringAssignmentTarget is an object property, its value should be binded as rest object. (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 src = {}; + +var counter = 0; + +async function fn() { + for await ({...src.y} of [{ x: 1, y: 2}]) { + assert.sameValue(src.y.x, 1); + assert.sameValue(src.y.y, 2); + + verifyEnumerable(src, "y"); + verifyWritable(src, "y"); + verifyConfigurable(src, "y"); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); diff --git a/test/language/statements/for-await-of/dstr-obj-rest-valid-object.js b/test/language/statements/for-await-of/dstr-obj-rest-valid-object.js new file mode 100644 index 0000000000..5462f7fa22 --- /dev/null +++ b/test/language/statements/for-await-of/dstr-obj-rest-valid-object.js @@ -0,0 +1,54 @@ +// This file was procedurally generated from the following sources: +// - src/dstr-assignment/obj-rest-valid-object.case +// - src/dstr-assignment/default/for-await-of.template +/*--- +description: Rest object contains just unextracted data (for-await-of statement) +esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation +features: [object-rest, destructuring-binding, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + IterationStatement : + for await ( LeftHandSideExpression of AssignmentExpression ) Statement + + 1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« », + AssignmentExpression, iterate). + 2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, + keyResult, assignment, labelSet). + + 13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation + + [...] + 5. If destructuring is true and if lhsKind is assignment, then + a. 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 rest, a, b; + + +var counter = 0; + +async function fn() { + for await ({a, b, ...rest} of [{x: 1, y: 2, a: 5, b: 3}]) { + assert.sameValue(rest.x, 1); + assert.sameValue(rest.y, 2); + assert.sameValue(rest.a, undefined); + assert.sameValue(rest.b, undefined); + + verifyEnumerable(rest, "x"); + verifyWritable(rest, "x"); + verifyConfigurable(rest, "x"); + + verifyEnumerable(rest, "y"); + verifyWritable(rest, "y"); + verifyConfigurable(rest, "y"); + + counter += 1; + } +} + +fn() + .then(() => assert.sameValue(counter, 1, 'iteration occurred as expected'), $DONE) + .then($DONE, $DONE); -- GitLab