Backed out 10 changesets (bug 1439855) for build bustages at /builds/worker/workspace/build/src/obj-firefox/dist/include/mozilla/Result.h:308 on a CLOSED TREE
authorAndreea Pavel <apavel@mozilla.com>
Mon, 16 Apr 2018 18:36:43 +0300
changeset 467441 7e193e0b874428ab3905591d34b4e2090bc172cc
parent 467440 b584ff6f5afa5010f52016832e598e712288b47e
child 467442 eb41147ad8b7973a13912c774977ef729ecfa5bd
push id9165
push userasasaki@mozilla.com
push dateThu, 26 Apr 2018 21:04:54 +0000
treeherdermozilla-beta@064c3804de2e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1439855
milestone61.0a1
backs out4a36617f7f0d97cc20e2fa428292da1d714c27be
da50d0cc6c5b51bf094f5fe795ccde6e7c34eddf
e1ac1d0b4ea1c80cf6b9fa9052f2b98792de045a
f5acf9dfb9ad6bffd7a48b87f470b57efa0e2e29
16a32f1eddb24a7df4273cb00165ab973b0fd87b
00aa64418797b8117a67c8f1d67d388231ec9624
59838090809b894a64a13b1961bf85183cff06a7
2916fe19f035c3fcd9b3d0341f6614c6f5daba93
f8dabfc553ff8d588d0c4a3865a730e15333c9b1
41c442ae9e6c764a18af4db8c7e9149d3e5af20c
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 10 changesets (bug 1439855) for build bustages at /builds/worker/workspace/build/src/obj-firefox/dist/include/mozilla/Result.h:308 on a CLOSED TREE Backed out changeset 4a36617f7f0d (bug 1439855) Backed out changeset da50d0cc6c5b (bug 1439855) Backed out changeset e1ac1d0b4ea1 (bug 1439855) Backed out changeset f5acf9dfb9ad (bug 1439855) Backed out changeset 16a32f1eddb2 (bug 1439855) Backed out changeset 00aa64418797 (bug 1439855) Backed out changeset 59838090809b (bug 1439855) Backed out changeset 2916fe19f035 (bug 1439855) Backed out changeset f8dabfc553ff (bug 1439855) Backed out changeset 41c442ae9e6c (bug 1439855)
js/src/frontend/BinSource-auto.cpp
js/src/frontend/BinSource-auto.h
js/src/frontend/BinSource-macros.h
js/src/frontend/BinSource.cpp
js/src/frontend/BinSource.h
js/src/frontend/BinSource.webidl_
js/src/frontend/BinSource.yaml
js/src/frontend/BinSourceRuntimeSupport.h
js/src/frontend/BinToken.cpp
js/src/frontend/BinToken.h
js/src/frontend/BinTokenReaderBase.cpp
js/src/frontend/BinTokenReaderBase.h
js/src/frontend/BinTokenReaderMultipart.cpp
js/src/frontend/BinTokenReaderMultipart.h
js/src/frontend/BinTokenReaderTester.cpp
js/src/frontend/BinTokenReaderTester.h
js/src/frontend/binsource/src/main.rs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/boolean-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/boolean-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/boolean-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/boolean-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/date-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/date-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/date-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/date-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/date-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/date-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-005.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-005.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-006.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-006.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-007.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-007.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-008.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-008.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-009.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-009.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-010-n.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-010-n.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-011-n.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/exception-011-n.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-005.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-005.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-006.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-006.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-007.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-007.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-008.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-008.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-009.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-009.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-010.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-010.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-011.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-011.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-012.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-012.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-013.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-013.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-014.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-014.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-015.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-015.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-016.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-016.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-017.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-017.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-019.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/expression-019.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/function-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/function-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/global-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/global-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/global-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/global-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-005.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-005.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-006.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-006.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-007.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-007.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-008.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-008.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-009.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-009.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-011.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-011.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-012.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-012.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-013.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-013.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-014.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-014.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-015.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-015.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-016.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-016.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-017.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-017.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-018.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-018.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-019.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-019.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-020.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-020.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-021.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-021.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-023.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-023.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-024.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-024.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-025.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-025.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-026.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-026.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-027.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-027.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-028.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-028.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-029.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-029.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-030.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-030.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-031.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-031.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-032.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-032.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-033.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-033.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-034.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-034.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-035.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-035.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-036.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-036.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-037.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-037.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-038.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-038.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-039.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-039.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-040.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-040.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-041.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-041.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-042.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-042.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-047.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-047.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-048.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-048.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-049.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-049.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-050.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-050.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-051.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-051.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-052.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-052.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-053.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-053.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-054.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/lexical-054.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/number-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/number-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/number-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/number-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/number-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/number-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-005.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-005.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-006.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-006.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-007.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-007.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-008.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-008.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-009.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/statement-009.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/string-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/string-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/string-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Exceptions/string-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Expressions/StrictEquality-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Expressions/StrictEquality-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Expressions/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Expressions/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Expressions/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Expressions/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/FunctionObjects/apply-001-n.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/FunctionObjects/apply-001-n.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/FunctionObjects/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/FunctionObjects/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/FunctionObjects/call-1.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/FunctionObjects/call-1.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/FunctionObjects/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/FunctionObjects/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/keywords-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/keywords-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/regexp-literals-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/regexp-literals-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/regexp-literals-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/regexp-literals-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/LexicalConventions/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/constructor-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/constructor-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/exec-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/exec-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/hex-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/hex-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/multiline-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/multiline-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/octal-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/octal-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/octal-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/octal-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/octal-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/octal-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/properties-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/properties-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/properties-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/properties-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/regexp-enumerate-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/regexp-enumerate-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/regress-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/regress-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/unicode-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/RegExp/unicode-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-005.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-005.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-006.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-006.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-007.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/dowhile-007.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/forin-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/forin-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/forin-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/forin-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/if-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/if-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/label-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/label-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/label-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/label-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/label-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/label-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/switch-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/switch-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/switch-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/switch-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/switch-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/switch-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/switch-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/switch-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-005.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-005.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-006.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-006.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-007.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-007.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-008.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-008.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-009.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-009.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-010.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-010.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-012.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/try-012.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/while-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/while-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/while-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/while-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/while-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/while-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/while-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/Statements/while-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/match-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/match-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/match-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/match-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/match-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/match-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/match-004.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/match-004.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/split-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/split-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/split-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/split-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/split-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/String/split-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/constructor-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/constructor-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/function-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/function-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-003-n.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-003-n.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-004-n.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-004-n.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-005-n.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-005-n.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-006.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/instanceof-006.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/extensions/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/browser.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/browser.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/instanceof-001.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/instanceof-001.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/instanceof-002.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/instanceof-002.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/instanceof-003.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/instanceof-003.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/regress-7635.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/regress-7635.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/instanceof/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/shell.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/shell.js
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/template.binjs
js/src/jsapi-tests/binast/parser/multipart/spidermonkey/ecma_2/template.js
js/src/jsapi-tests/binast/parser/tester/frameworks/angular-1.2.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/angular-1.2.js
js/src/jsapi-tests/binast/parser/tester/frameworks/backbone-1.1.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/backbone-1.1.js
js/src/jsapi-tests/binast/parser/tester/frameworks/benchmark.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/benchmark.js
js/src/jsapi-tests/binast/parser/tester/frameworks/jquery-1.9.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/jquery-1.9.js
js/src/jsapi-tests/binast/parser/tester/frameworks/jquery.mobile-1.4.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/jquery.mobile-1.4.js
js/src/jsapi-tests/binast/parser/tester/frameworks/mootools-1.4.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/mootools-1.4.js
js/src/jsapi-tests/binast/parser/tester/frameworks/underscore-1.5.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/underscore-1.5.js
js/src/jsapi-tests/binast/parser/tester/frameworks/yui-3.12.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/yui-3.12.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/boolean-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/boolean-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-010-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-011-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-010.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-011.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-012.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-013.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-014.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-015.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-016.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-017.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-019.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/function-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/global-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/global-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-011.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-012.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-013.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-014.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-015.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-016.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-017.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-018.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-019.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-020.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-021.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-023.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-024.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-025.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-026.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-027.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-028.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-029.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-030.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-031.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-032.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-033.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-034.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-035.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-036.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-037.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-038.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-039.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-040.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-041.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-042.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-047.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-048.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-049.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-050.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-051.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-052.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-053.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-054.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/string-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/string-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/StrictEquality-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/apply-001-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/call-1.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/keywords-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/regexp-literals-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/regexp-literals-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/constructor-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/exec-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/hex-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/multiline-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/properties-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/properties-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/regexp-enumerate-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/regress-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/unicode-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/forin-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/forin-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/if-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-010.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-012.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/constructor-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/function-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-003-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-004-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-005-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/regress-7635.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/template.binjs
js/src/jsapi-tests/binast/tokenizer/tester/test-empty-list.binjs
js/src/jsapi-tests/binast/tokenizer/tester/test-nested-lists.binjs
js/src/jsapi-tests/binast/tokenizer/tester/test-trivial-list.binjs
js/src/jsapi-tests/testBinASTReader.cpp
js/src/jsapi-tests/testBinTokenReaderTester.cpp
js/src/jsapi.h
js/src/moz.build
js/src/shell/js.cpp
js/src/vm/Runtime.h
--- a/js/src/frontend/BinSource-auto.cpp
+++ b/js/src/frontend/BinSource-auto.cpp
@@ -11,103 +11,159 @@
 
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/Casting.h"
 #include "mozilla/Maybe.h"
 #include "mozilla/Move.h"
 #include "mozilla/PodOperations.h"
 #include "mozilla/Vector.h"
 
-#include "frontend/BinSource-macros.h"
 #include "frontend/BinSource.h"
 #include "frontend/BinTokenReaderTester.h"
 #include "frontend/FullParseHandler.h"
 #include "frontend/Parser.h"
 #include "frontend/SharedContext.h"
 
 #include "vm/RegExpObject.h"
 
 #include "frontend/ParseContext-inl.h"
 #include "frontend/ParseNode-inl.h"
 
 namespace js {
 namespace frontend {
 
+using AutoList = BinTokenReaderTester::AutoList;
+using AutoTaggedTuple = BinTokenReaderTester::AutoTaggedTuple;
+using AutoTuple = BinTokenReaderTester::AutoTuple;
+using BinFields = BinTokenReaderTester::BinFields;
+using Chars = BinTokenReaderTester::Chars;
+using NameBag = GCHashSet<JSString*>;
+using Names = GCVector<JSString*, 8>;
+using UsedNamePtr = UsedNameTracker::UsedNameMap::Ptr;
+
+// Evaluate an expression EXPR, checking that the result is not falsy.
+//
+// Throw `cx->alreadyReportedError()` if it returns 0/nullptr.
+#define TRY(EXPR) \
+    do { \
+        if (!EXPR) \
+            return cx_->alreadyReportedError(); \
+    } while(false)
+
+
+// Evaluate an expression EXPR, checking that the result is not falsy.
+// In case of success, assign the result to VAR.
+//
+// Throw `cx->alreadyReportedError()` if it returns 0/nullptr.
+#define TRY_VAR(VAR, EXPR) \
+    do { \
+        VAR = EXPR; \
+        if (!VAR) \
+            return cx_->alreadyReportedError(); \
+    } while (false)
+
+// Evaluate an expression EXPR, checking that the result is not falsy.
+// In case of success, assign the result to a new variable VAR.
+//
+// Throw `cx->alreadyReportedError()` if it returns 0/nullptr.
+#define TRY_DECL(VAR, EXPR) \
+    auto VAR = EXPR; \
+    if (!VAR) \
+        return cx_->alreadyReportedError();
+
+// Evaluate an expression EXPR, checking that the result is a success.
+// In case of success, unwrap and assign the result to a new variable VAR.
+//
+// In case of error, propagate the error.
+#define MOZ_TRY_DECL(VAR, EXPR) \
+    auto _##VAR = EXPR; \
+    if (_##VAR.isErr()) \
+        return ::mozilla::Err(_##VAR.unwrapErr()); \
+    auto VAR = _##VAR.unwrap();
+
+// Ensure that we are visiting the right fields.
+template<size_t N>
+JS::Result<Ok, JS::Error&>
+BinASTParser::checkFields(const BinKind kind, const BinFields& actual, const BinField (&expected)[N])
+{
+    if (actual.length() != N)
+        return raiseInvalidNumberOfFields(kind, N, actual.length());
+
+    for (size_t i = 0; i < N; ++i) {
+        if (actual[i] != expected[i])
+            return raiseInvalidField(describeBinKind(kind), actual[i]);
+    }
+
+    return Ok();
+}
+
+// Special case for N=0, as empty arrays are not permitted in C++
+JS::Result<Ok, JS::Error&>
+BinASTParser::checkFields0(const BinKind kind, const BinFields& actual)
+{
+    if (actual.length() != 0)
+        return raiseInvalidNumberOfFields(kind, 0, actual.length());
+
+    return Ok();
+}
+
 // Compare a bunch of `uint8_t` values (as returned by the tokenizer_) with
 // a string literal (and ONLY a string literal).
-template<typename Tok, size_t N>
-bool operator==(const typename Tok::Chars& left, const char (&right)[N]) {
-    return Tok::equals(left, right);
-}
+template<size_t N>
+bool operator==(const Chars& left, const char (&right)[N]) {
+    return BinTokenReaderTester::equals(left, right);
+}
+
+// Helper class: Restore field `variableDeclarationKind_` upon leaving a scope.
+class MOZ_RAII AutoVariableDeclarationKind {
+  public:
+    explicit AutoVariableDeclarationKind(BinASTParser* parser
+                                         MOZ_GUARD_OBJECT_NOTIFIER_PARAM) :
+      parser_(parser),
+      kind(parser->variableDeclarationKind_)
+    {
+        MOZ_GUARD_OBJECT_NOTIFIER_INIT;
+    }
+    ~AutoVariableDeclarationKind() {
+        parser_->variableDeclarationKind_ = kind;
+    }
+  private:
+    BinASTParser* parser_;
+    BinASTParser::VariableDeclarationKind kind;
+    MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
+};
 
 
 // ----- Sums of interfaces (autogenerated, by lexicographical order)
 // Sums of sums are flattened.
 /*
-ArrowExpression ::= EagerArrowExpression
-    SkippableArrowExpression
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseArrowExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumArrowExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumArrowExpression(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch(kind) {
-      case BinKind::EagerArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableArrowExpression(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("ArrowExpression", kind);
-    }
-    return result;
-}
-
-/*
 AssignmentTarget ::= ArrayAssignmentTarget
     AssignmentTargetIdentifier
     ComputedMemberAssignmentTarget
     ObjectAssignmentTarget
     StaticMemberAssignmentTarget
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTarget()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumAssignmentTarget(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentTarget()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumAssignmentTarget(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayAssignmentTarget:
         MOZ_TRY_VAR(result, parseInterfaceArrayAssignmentTarget(start, kind, fields));
         break;
       case BinKind::AssignmentTargetIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentTargetIdentifier(start, kind, fields));
@@ -130,34 +186,34 @@ BinASTParser<Tok>::parseSumAssignmentTar
 /*
 AssignmentTargetOrAssignmentTargetWithInitializer ::= ArrayAssignmentTarget
     AssignmentTargetIdentifier
     AssignmentTargetWithInitializer
     ComputedMemberAssignmentTarget
     ObjectAssignmentTarget
     StaticMemberAssignmentTarget
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetOrAssignmentTargetWithInitializer()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumAssignmentTargetOrAssignmentTargetWithInitializer(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumAssignmentTargetOrAssignmentTargetWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentTargetOrAssignmentTargetWithInitializer()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumAssignmentTargetOrAssignmentTargetWithInitializer(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumAssignmentTargetOrAssignmentTargetWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayAssignmentTarget:
         MOZ_TRY_VAR(result, parseInterfaceArrayAssignmentTarget(start, kind, fields));
         break;
       case BinKind::AssignmentTargetIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentTargetIdentifier(start, kind, fields));
@@ -179,34 +235,34 @@ BinASTParser<Tok>::parseSumAssignmentTar
     }
     return result;
 }
 
 /*
 AssignmentTargetPattern ::= ArrayAssignmentTarget
     ObjectAssignmentTarget
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetPattern()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumAssignmentTargetPattern(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumAssignmentTargetPattern(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentTargetPattern()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumAssignmentTargetPattern(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumAssignmentTargetPattern(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayAssignmentTarget:
         MOZ_TRY_VAR(result, parseInterfaceArrayAssignmentTarget(start, kind, fields));
         break;
       case BinKind::ObjectAssignmentTarget:
         MOZ_TRY_VAR(result, parseInterfaceObjectAssignmentTarget(start, kind, fields));
@@ -216,34 +272,34 @@ BinASTParser<Tok>::parseSumAssignmentTar
     }
     return result;
 }
 
 /*
 AssignmentTargetProperty ::= AssignmentTargetPropertyIdentifier
     AssignmentTargetPropertyProperty
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumAssignmentTargetProperty(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumAssignmentTargetProperty(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentTargetProperty()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumAssignmentTargetProperty(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumAssignmentTargetProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::AssignmentTargetPropertyIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentTargetPropertyIdentifier(start, kind, fields));
         break;
       case BinKind::AssignmentTargetPropertyProperty:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentTargetPropertyProperty(start, kind, fields));
@@ -254,34 +310,34 @@ BinASTParser<Tok>::parseSumAssignmentTar
     return result;
 }
 
 /*
 Binding ::= ArrayBinding
     BindingIdentifier
     ObjectBinding
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBinding()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumBinding(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumBinding(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBinding()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumBinding(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumBinding(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayBinding:
         MOZ_TRY_VAR(result, parseInterfaceArrayBinding(start, kind, fields));
         break;
       case BinKind::BindingIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceBindingIdentifier(start, kind, fields));
@@ -296,34 +352,34 @@ BinASTParser<Tok>::parseSumBinding(const
 }
 
 /*
 BindingOrBindingWithInitializer ::= ArrayBinding
     BindingIdentifier
     BindingWithInitializer
     ObjectBinding
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingOrBindingWithInitializer()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumBindingOrBindingWithInitializer(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumBindingOrBindingWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBindingOrBindingWithInitializer()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumBindingOrBindingWithInitializer(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumBindingOrBindingWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayBinding:
         MOZ_TRY_VAR(result, parseInterfaceArrayBinding(start, kind, fields));
         break;
       case BinKind::BindingIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceBindingIdentifier(start, kind, fields));
@@ -339,34 +395,34 @@ BinASTParser<Tok>::parseSumBindingOrBind
     }
     return result;
 }
 
 /*
 BindingPattern ::= ArrayBinding
     ObjectBinding
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingPattern()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumBindingPattern(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumBindingPattern(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBindingPattern()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumBindingPattern(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumBindingPattern(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayBinding:
         MOZ_TRY_VAR(result, parseInterfaceArrayBinding(start, kind, fields));
         break;
       case BinKind::ObjectBinding:
         MOZ_TRY_VAR(result, parseInterfaceObjectBinding(start, kind, fields));
@@ -376,34 +432,34 @@ BinASTParser<Tok>::parseSumBindingPatter
     }
     return result;
 }
 
 /*
 BindingProperty ::= BindingPropertyIdentifier
     BindingPropertyProperty
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumBindingProperty(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumBindingProperty(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBindingProperty()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumBindingProperty(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumBindingProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::BindingPropertyIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceBindingPropertyIdentifier(start, kind, fields));
         break;
       case BinKind::BindingPropertyProperty:
         MOZ_TRY_VAR(result, parseInterfaceBindingPropertyProperty(start, kind, fields));
@@ -416,34 +472,34 @@ BinASTParser<Tok>::parseSumBindingProper
 
 /*
 ExportDeclaration ::= Export
     ExportAllFrom
     ExportDefault
     ExportFrom
     ExportLocals
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExportDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumExportDeclaration(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumExportDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseExportDeclaration()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumExportDeclaration(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumExportDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::Export:
         MOZ_TRY_VAR(result, parseInterfaceExport(start, kind, fields));
         break;
       case BinKind::ExportAllFrom:
         MOZ_TRY_VAR(result, parseInterfaceExportAllFrom(start, kind, fields));
@@ -460,70 +516,71 @@ BinASTParser<Tok>::parseSumExportDeclara
       default:
         return raiseInvalidKind("ExportDeclaration", kind);
     }
     return result;
 }
 
 /*
 Expression ::= ArrayExpression
+    ArrowExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassExpression
     CompoundAssignmentExpression
     ComputedMemberExpression
     ConditionalExpression
-    EagerArrowExpression
-    EagerFunctionExpression
+    FunctionExpression
     IdentifierExpression
     LiteralBooleanExpression
     LiteralInfinityExpression
     LiteralNullExpression
     LiteralNumericExpression
     LiteralRegExpExpression
     LiteralStringExpression
     NewExpression
     NewTargetExpression
     ObjectExpression
-    SkippableArrowExpression
-    SkippableFunctionExpression
     StaticMemberExpression
     TemplateExpression
     ThisExpression
     UnaryExpression
     UpdateExpression
     YieldExpression
     YieldStarExpression
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumExpression(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayExpression:
         MOZ_TRY_VAR(result, parseInterfaceArrayExpression(start, kind, fields));
         break;
+      case BinKind::ArrowExpression:
+        MOZ_TRY_VAR(result, parseInterfaceArrowExpression(start, kind, fields));
+        break;
       case BinKind::AssignmentExpression:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentExpression(start, kind, fields));
         break;
       case BinKind::AwaitExpression:
         MOZ_TRY_VAR(result, parseInterfaceAwaitExpression(start, kind, fields));
         break;
       case BinKind::BinaryExpression:
         MOZ_TRY_VAR(result, parseInterfaceBinaryExpression(start, kind, fields));
@@ -538,21 +595,18 @@ BinASTParser<Tok>::parseSumExpression(co
         MOZ_TRY_VAR(result, parseInterfaceCompoundAssignmentExpression(start, kind, fields));
         break;
       case BinKind::ComputedMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceComputedMemberExpression(start, kind, fields));
         break;
       case BinKind::ConditionalExpression:
         MOZ_TRY_VAR(result, parseInterfaceConditionalExpression(start, kind, fields));
         break;
-      case BinKind::EagerArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpression(start, kind, fields));
-        break;
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
+      case BinKind::FunctionExpression:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionExpression(start, kind, fields));
         break;
       case BinKind::IdentifierExpression:
         MOZ_TRY_VAR(result, parseInterfaceIdentifierExpression(start, kind, fields));
         break;
       case BinKind::LiteralBooleanExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
         break;
       case BinKind::LiteralInfinityExpression:
@@ -574,22 +628,16 @@ BinASTParser<Tok>::parseSumExpression(co
         MOZ_TRY_VAR(result, parseInterfaceNewExpression(start, kind, fields));
         break;
       case BinKind::NewTargetExpression:
         MOZ_TRY_VAR(result, parseInterfaceNewTargetExpression(start, kind, fields));
         break;
       case BinKind::ObjectExpression:
         MOZ_TRY_VAR(result, parseInterfaceObjectExpression(start, kind, fields));
         break;
-      case BinKind::SkippableArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableArrowExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionExpression(start, kind, fields));
-        break;
       case BinKind::StaticMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceStaticMemberExpression(start, kind, fields));
         break;
       case BinKind::TemplateExpression:
         MOZ_TRY_VAR(result, parseInterfaceTemplateExpression(start, kind, fields));
         break;
       case BinKind::ThisExpression:
         MOZ_TRY_VAR(result, parseInterfaceThisExpression(start, kind, fields));
@@ -609,71 +657,72 @@ BinASTParser<Tok>::parseSumExpression(co
       default:
         return raiseInvalidKind("Expression", kind);
     }
     return result;
 }
 
 /*
 ExpressionOrSuper ::= ArrayExpression
+    ArrowExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassExpression
     CompoundAssignmentExpression
     ComputedMemberExpression
     ConditionalExpression
-    EagerArrowExpression
-    EagerFunctionExpression
+    FunctionExpression
     IdentifierExpression
     LiteralBooleanExpression
     LiteralInfinityExpression
     LiteralNullExpression
     LiteralNumericExpression
     LiteralRegExpExpression
     LiteralStringExpression
     NewExpression
     NewTargetExpression
     ObjectExpression
-    SkippableArrowExpression
-    SkippableFunctionExpression
     StaticMemberExpression
     Super
     TemplateExpression
     ThisExpression
     UnaryExpression
     UpdateExpression
     YieldExpression
     YieldStarExpression
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExpressionOrSuper()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumExpressionOrSuper(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumExpressionOrSuper(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseExpressionOrSuper()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumExpressionOrSuper(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumExpressionOrSuper(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayExpression:
         MOZ_TRY_VAR(result, parseInterfaceArrayExpression(start, kind, fields));
         break;
+      case BinKind::ArrowExpression:
+        MOZ_TRY_VAR(result, parseInterfaceArrowExpression(start, kind, fields));
+        break;
       case BinKind::AssignmentExpression:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentExpression(start, kind, fields));
         break;
       case BinKind::AwaitExpression:
         MOZ_TRY_VAR(result, parseInterfaceAwaitExpression(start, kind, fields));
         break;
       case BinKind::BinaryExpression:
         MOZ_TRY_VAR(result, parseInterfaceBinaryExpression(start, kind, fields));
@@ -688,21 +737,18 @@ BinASTParser<Tok>::parseSumExpressionOrS
         MOZ_TRY_VAR(result, parseInterfaceCompoundAssignmentExpression(start, kind, fields));
         break;
       case BinKind::ComputedMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceComputedMemberExpression(start, kind, fields));
         break;
       case BinKind::ConditionalExpression:
         MOZ_TRY_VAR(result, parseInterfaceConditionalExpression(start, kind, fields));
         break;
-      case BinKind::EagerArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpression(start, kind, fields));
-        break;
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
+      case BinKind::FunctionExpression:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionExpression(start, kind, fields));
         break;
       case BinKind::IdentifierExpression:
         MOZ_TRY_VAR(result, parseInterfaceIdentifierExpression(start, kind, fields));
         break;
       case BinKind::LiteralBooleanExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
         break;
       case BinKind::LiteralInfinityExpression:
@@ -724,22 +770,16 @@ BinASTParser<Tok>::parseSumExpressionOrS
         MOZ_TRY_VAR(result, parseInterfaceNewExpression(start, kind, fields));
         break;
       case BinKind::NewTargetExpression:
         MOZ_TRY_VAR(result, parseInterfaceNewTargetExpression(start, kind, fields));
         break;
       case BinKind::ObjectExpression:
         MOZ_TRY_VAR(result, parseInterfaceObjectExpression(start, kind, fields));
         break;
-      case BinKind::SkippableArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableArrowExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionExpression(start, kind, fields));
-        break;
       case BinKind::StaticMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceStaticMemberExpression(start, kind, fields));
         break;
       case BinKind::Super:
         MOZ_TRY_VAR(result, parseInterfaceSuper(start, kind, fields));
         break;
       case BinKind::TemplateExpression:
         MOZ_TRY_VAR(result, parseInterfaceTemplateExpression(start, kind, fields));
@@ -762,71 +802,72 @@ BinASTParser<Tok>::parseSumExpressionOrS
       default:
         return raiseInvalidKind("ExpressionOrSuper", kind);
     }
     return result;
 }
 
 /*
 ExpressionOrTemplateElement ::= ArrayExpression
+    ArrowExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassExpression
     CompoundAssignmentExpression
     ComputedMemberExpression
     ConditionalExpression
-    EagerArrowExpression
-    EagerFunctionExpression
+    FunctionExpression
     IdentifierExpression
     LiteralBooleanExpression
     LiteralInfinityExpression
     LiteralNullExpression
     LiteralNumericExpression
     LiteralRegExpExpression
     LiteralStringExpression
     NewExpression
     NewTargetExpression
     ObjectExpression
-    SkippableArrowExpression
-    SkippableFunctionExpression
     StaticMemberExpression
     TemplateElement
     TemplateExpression
     ThisExpression
     UnaryExpression
     UpdateExpression
     YieldExpression
     YieldStarExpression
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseExpressionOrTemplateElement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumExpressionOrTemplateElement(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumExpressionOrTemplateElement(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseExpressionOrTemplateElement()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumExpressionOrTemplateElement(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumExpressionOrTemplateElement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayExpression:
         MOZ_TRY_VAR(result, parseInterfaceArrayExpression(start, kind, fields));
         break;
+      case BinKind::ArrowExpression:
+        MOZ_TRY_VAR(result, parseInterfaceArrowExpression(start, kind, fields));
+        break;
       case BinKind::AssignmentExpression:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentExpression(start, kind, fields));
         break;
       case BinKind::AwaitExpression:
         MOZ_TRY_VAR(result, parseInterfaceAwaitExpression(start, kind, fields));
         break;
       case BinKind::BinaryExpression:
         MOZ_TRY_VAR(result, parseInterfaceBinaryExpression(start, kind, fields));
@@ -841,21 +882,18 @@ BinASTParser<Tok>::parseSumExpressionOrT
         MOZ_TRY_VAR(result, parseInterfaceCompoundAssignmentExpression(start, kind, fields));
         break;
       case BinKind::ComputedMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceComputedMemberExpression(start, kind, fields));
         break;
       case BinKind::ConditionalExpression:
         MOZ_TRY_VAR(result, parseInterfaceConditionalExpression(start, kind, fields));
         break;
-      case BinKind::EagerArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpression(start, kind, fields));
-        break;
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
+      case BinKind::FunctionExpression:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionExpression(start, kind, fields));
         break;
       case BinKind::IdentifierExpression:
         MOZ_TRY_VAR(result, parseInterfaceIdentifierExpression(start, kind, fields));
         break;
       case BinKind::LiteralBooleanExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
         break;
       case BinKind::LiteralInfinityExpression:
@@ -877,22 +915,16 @@ BinASTParser<Tok>::parseSumExpressionOrT
         MOZ_TRY_VAR(result, parseInterfaceNewExpression(start, kind, fields));
         break;
       case BinKind::NewTargetExpression:
         MOZ_TRY_VAR(result, parseInterfaceNewTargetExpression(start, kind, fields));
         break;
       case BinKind::ObjectExpression:
         MOZ_TRY_VAR(result, parseInterfaceObjectExpression(start, kind, fields));
         break;
-      case BinKind::SkippableArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableArrowExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionExpression(start, kind, fields));
-        break;
       case BinKind::StaticMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceStaticMemberExpression(start, kind, fields));
         break;
       case BinKind::TemplateElement:
         MOZ_TRY_VAR(result, parseInterfaceTemplateElement(start, kind, fields));
         break;
       case BinKind::TemplateExpression:
         MOZ_TRY_VAR(result, parseInterfaceTemplateExpression(start, kind, fields));
@@ -921,34 +953,34 @@ BinASTParser<Tok>::parseSumExpressionOrT
 /*
 ForInOfBindingOrAssignmentTarget ::= ArrayAssignmentTarget
     AssignmentTargetIdentifier
     ComputedMemberAssignmentTarget
     ForInOfBinding
     ObjectAssignmentTarget
     StaticMemberAssignmentTarget
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseForInOfBindingOrAssignmentTarget()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumForInOfBindingOrAssignmentTarget(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumForInOfBindingOrAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseForInOfBindingOrAssignmentTarget()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumForInOfBindingOrAssignmentTarget(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumForInOfBindingOrAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayAssignmentTarget:
         MOZ_TRY_VAR(result, parseInterfaceArrayAssignmentTarget(start, kind, fields));
         break;
       case BinKind::AssignmentTargetIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentTargetIdentifier(start, kind, fields));
@@ -968,71 +1000,72 @@ BinASTParser<Tok>::parseSumForInOfBindin
       default:
         return raiseInvalidKind("ForInOfBindingOrAssignmentTarget", kind);
     }
     return result;
 }
 
 /*
 FunctionBodyOrExpression ::= ArrayExpression
+    ArrowExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassExpression
     CompoundAssignmentExpression
     ComputedMemberExpression
     ConditionalExpression
-    EagerArrowExpression
-    EagerFunctionExpression
     FunctionBody
+    FunctionExpression
     IdentifierExpression
     LiteralBooleanExpression
     LiteralInfinityExpression
     LiteralNullExpression
     LiteralNumericExpression
     LiteralRegExpExpression
     LiteralStringExpression
     NewExpression
     NewTargetExpression
     ObjectExpression
-    SkippableArrowExpression
-    SkippableFunctionExpression
     StaticMemberExpression
     TemplateExpression
     ThisExpression
     UnaryExpression
     UpdateExpression
     YieldExpression
     YieldStarExpression
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseFunctionBodyOrExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumFunctionBodyOrExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumFunctionBodyOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseFunctionBodyOrExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumFunctionBodyOrExpression(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumFunctionBodyOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayExpression:
         MOZ_TRY_VAR(result, parseInterfaceArrayExpression(start, kind, fields));
         break;
+      case BinKind::ArrowExpression:
+        MOZ_TRY_VAR(result, parseInterfaceArrowExpression(start, kind, fields));
+        break;
       case BinKind::AssignmentExpression:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentExpression(start, kind, fields));
         break;
       case BinKind::AwaitExpression:
         MOZ_TRY_VAR(result, parseInterfaceAwaitExpression(start, kind, fields));
         break;
       case BinKind::BinaryExpression:
         MOZ_TRY_VAR(result, parseInterfaceBinaryExpression(start, kind, fields));
@@ -1047,25 +1080,22 @@ BinASTParser<Tok>::parseSumFunctionBodyO
         MOZ_TRY_VAR(result, parseInterfaceCompoundAssignmentExpression(start, kind, fields));
         break;
       case BinKind::ComputedMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceComputedMemberExpression(start, kind, fields));
         break;
       case BinKind::ConditionalExpression:
         MOZ_TRY_VAR(result, parseInterfaceConditionalExpression(start, kind, fields));
         break;
-      case BinKind::EagerArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpression(start, kind, fields));
-        break;
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
-        break;
       case BinKind::FunctionBody:
         MOZ_TRY_VAR(result, parseInterfaceFunctionBody(start, kind, fields));
         break;
+      case BinKind::FunctionExpression:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionExpression(start, kind, fields));
+        break;
       case BinKind::IdentifierExpression:
         MOZ_TRY_VAR(result, parseInterfaceIdentifierExpression(start, kind, fields));
         break;
       case BinKind::LiteralBooleanExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
         break;
       case BinKind::LiteralInfinityExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralInfinityExpression(start, kind, fields));
@@ -1086,22 +1116,16 @@ BinASTParser<Tok>::parseSumFunctionBodyO
         MOZ_TRY_VAR(result, parseInterfaceNewExpression(start, kind, fields));
         break;
       case BinKind::NewTargetExpression:
         MOZ_TRY_VAR(result, parseInterfaceNewTargetExpression(start, kind, fields));
         break;
       case BinKind::ObjectExpression:
         MOZ_TRY_VAR(result, parseInterfaceObjectExpression(start, kind, fields));
         break;
-      case BinKind::SkippableArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableArrowExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionExpression(start, kind, fields));
-        break;
       case BinKind::StaticMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceStaticMemberExpression(start, kind, fields));
         break;
       case BinKind::TemplateExpression:
         MOZ_TRY_VAR(result, parseInterfaceTemplateExpression(start, kind, fields));
         break;
       case BinKind::ThisExpression:
         MOZ_TRY_VAR(result, parseInterfaceThisExpression(start, kind, fields));
@@ -1120,111 +1144,74 @@ BinASTParser<Tok>::parseSumFunctionBodyO
         break;
       default:
         return raiseInvalidKind("FunctionBodyOrExpression", kind);
     }
     return result;
 }
 
 /*
-FunctionDeclaration ::= EagerFunctionDeclaration
-    SkippableFunctionDeclaration
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseFunctionDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumFunctionDeclaration(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumFunctionDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch(kind) {
-      case BinKind::EagerFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionDeclaration(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionDeclaration(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("FunctionDeclaration", kind);
-    }
-    return result;
-}
-
-/*
 FunctionDeclarationOrClassDeclarationOrExpression ::= ArrayExpression
+    ArrowExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassDeclaration
     ClassExpression
     CompoundAssignmentExpression
     ComputedMemberExpression
     ConditionalExpression
-    EagerArrowExpression
-    EagerFunctionDeclaration
-    EagerFunctionExpression
+    FunctionDeclaration
+    FunctionExpression
     IdentifierExpression
     LiteralBooleanExpression
     LiteralInfinityExpression
     LiteralNullExpression
     LiteralNumericExpression
     LiteralRegExpExpression
     LiteralStringExpression
     NewExpression
     NewTargetExpression
     ObjectExpression
-    SkippableArrowExpression
-    SkippableFunctionDeclaration
-    SkippableFunctionExpression
     StaticMemberExpression
     TemplateExpression
     ThisExpression
     UnaryExpression
     UpdateExpression
     YieldExpression
     YieldStarExpression
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseFunctionDeclarationOrClassDeclarationOrExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumFunctionDeclarationOrClassDeclarationOrExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumFunctionDeclarationOrClassDeclarationOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseFunctionDeclarationOrClassDeclarationOrExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumFunctionDeclarationOrClassDeclarationOrExpression(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumFunctionDeclarationOrClassDeclarationOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayExpression:
         MOZ_TRY_VAR(result, parseInterfaceArrayExpression(start, kind, fields));
         break;
+      case BinKind::ArrowExpression:
+        MOZ_TRY_VAR(result, parseInterfaceArrowExpression(start, kind, fields));
+        break;
       case BinKind::AssignmentExpression:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentExpression(start, kind, fields));
         break;
       case BinKind::AwaitExpression:
         MOZ_TRY_VAR(result, parseInterfaceAwaitExpression(start, kind, fields));
         break;
       case BinKind::BinaryExpression:
         MOZ_TRY_VAR(result, parseInterfaceBinaryExpression(start, kind, fields));
@@ -1242,24 +1229,21 @@ BinASTParser<Tok>::parseSumFunctionDecla
         MOZ_TRY_VAR(result, parseInterfaceCompoundAssignmentExpression(start, kind, fields));
         break;
       case BinKind::ComputedMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceComputedMemberExpression(start, kind, fields));
         break;
       case BinKind::ConditionalExpression:
         MOZ_TRY_VAR(result, parseInterfaceConditionalExpression(start, kind, fields));
         break;
-      case BinKind::EagerArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpression(start, kind, fields));
-        break;
-      case BinKind::EagerFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionDeclaration(start, kind, fields));
-        break;
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
+      case BinKind::FunctionDeclaration:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionDeclaration(start, kind, fields));
+        break;
+      case BinKind::FunctionExpression:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionExpression(start, kind, fields));
         break;
       case BinKind::IdentifierExpression:
         MOZ_TRY_VAR(result, parseInterfaceIdentifierExpression(start, kind, fields));
         break;
       case BinKind::LiteralBooleanExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
         break;
       case BinKind::LiteralInfinityExpression:
@@ -1281,25 +1265,16 @@ BinASTParser<Tok>::parseSumFunctionDecla
         MOZ_TRY_VAR(result, parseInterfaceNewExpression(start, kind, fields));
         break;
       case BinKind::NewTargetExpression:
         MOZ_TRY_VAR(result, parseInterfaceNewTargetExpression(start, kind, fields));
         break;
       case BinKind::ObjectExpression:
         MOZ_TRY_VAR(result, parseInterfaceObjectExpression(start, kind, fields));
         break;
-      case BinKind::SkippableArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableArrowExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionDeclaration(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionExpression(start, kind, fields));
-        break;
       case BinKind::StaticMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceStaticMemberExpression(start, kind, fields));
         break;
       case BinKind::TemplateExpression:
         MOZ_TRY_VAR(result, parseInterfaceTemplateExpression(start, kind, fields));
         break;
       case BinKind::ThisExpression:
         MOZ_TRY_VAR(result, parseInterfaceThisExpression(start, kind, fields));
@@ -1319,155 +1294,77 @@ BinASTParser<Tok>::parseSumFunctionDecla
       default:
         return raiseInvalidKind("FunctionDeclarationOrClassDeclarationOrExpression", kind);
     }
     return result;
 }
 
 /*
 FunctionDeclarationOrClassDeclarationOrVariableDeclaration ::= ClassDeclaration
-    EagerFunctionDeclaration
-    SkippableFunctionDeclaration
+    FunctionDeclaration
     VariableDeclaration
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseFunctionDeclarationOrClassDeclarationOrVariableDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumFunctionDeclarationOrClassDeclarationOrVariableDeclaration(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumFunctionDeclarationOrClassDeclarationOrVariableDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseFunctionDeclarationOrClassDeclarationOrVariableDeclaration()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumFunctionDeclarationOrClassDeclarationOrVariableDeclaration(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumFunctionDeclarationOrClassDeclarationOrVariableDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ClassDeclaration:
         MOZ_TRY_VAR(result, parseInterfaceClassDeclaration(start, kind, fields));
         break;
-      case BinKind::EagerFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionDeclaration(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionDeclaration(start, kind, fields));
+      case BinKind::FunctionDeclaration:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionDeclaration(start, kind, fields));
         break;
       case BinKind::VariableDeclaration:
         MOZ_TRY_VAR(result, parseInterfaceVariableDeclaration(start, kind, fields));
         break;
       default:
         return raiseInvalidKind("FunctionDeclarationOrClassDeclarationOrVariableDeclaration", kind);
     }
     return result;
 }
 
 /*
-FunctionExpression ::= EagerFunctionExpression
-    SkippableFunctionExpression
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseFunctionExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumFunctionExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumFunctionExpression(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch(kind) {
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionExpression(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("FunctionExpression", kind);
-    }
-    return result;
-}
-
-/*
-Getter ::= EagerGetter
-    SkippableGetter
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseGetter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumGetter(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumGetter(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch(kind) {
-      case BinKind::EagerGetter:
-        MOZ_TRY_VAR(result, parseInterfaceEagerGetter(start, kind, fields));
-        break;
-      case BinKind::SkippableGetter:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableGetter(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("Getter", kind);
-    }
-    return result;
-}
-
-/*
 ImportDeclaration ::= Import
     ImportNamespace
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseImportDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumImportDeclaration(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumImportDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseImportDeclaration()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumImportDeclaration(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumImportDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::Import:
         MOZ_TRY_VAR(result, parseInterfaceImport(start, kind, fields));
         break;
       case BinKind::ImportNamespace:
         MOZ_TRY_VAR(result, parseInterfaceImportNamespace(start, kind, fields));
@@ -1480,60 +1377,59 @@ BinASTParser<Tok>::parseSumImportDeclara
 
 /*
 ImportDeclarationOrExportDeclarationOrStatement ::= Block
     BreakStatement
     ClassDeclaration
     ContinueStatement
     DebuggerStatement
     DoWhileStatement
-    EagerFunctionDeclaration
     EmptyStatement
     Export
     ExportAllFrom
     ExportDefault
     ExportFrom
     ExportLocals
     ExpressionStatement
     ForInStatement
     ForOfStatement
     ForStatement
+    FunctionDeclaration
     IfStatement
     Import
     ImportNamespace
     LabelledStatement
     ReturnStatement
-    SkippableFunctionDeclaration
     SwitchStatement
     SwitchStatementWithDefault
     ThrowStatement
     TryCatchStatement
     TryFinallyStatement
     VariableDeclaration
     WhileStatement
     WithStatement
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseImportDeclarationOrExportDeclarationOrStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumImportDeclarationOrExportDeclarationOrStatement(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumImportDeclarationOrExportDeclarationOrStatement(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseImportDeclarationOrExportDeclarationOrStatement()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumImportDeclarationOrExportDeclarationOrStatement(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumImportDeclarationOrExportDeclarationOrStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::Block:
         MOZ_TRY_VAR(result, parseInterfaceBlock(start, kind, fields));
         break;
       case BinKind::BreakStatement:
         MOZ_TRY_VAR(result, parseInterfaceBreakStatement(start, kind, fields));
@@ -1545,19 +1441,16 @@ BinASTParser<Tok>::parseSumImportDeclara
         MOZ_TRY_VAR(result, parseInterfaceContinueStatement(start, kind, fields));
         break;
       case BinKind::DebuggerStatement:
         MOZ_TRY_VAR(result, parseInterfaceDebuggerStatement(start, kind, fields));
         break;
       case BinKind::DoWhileStatement:
         MOZ_TRY_VAR(result, parseInterfaceDoWhileStatement(start, kind, fields));
         break;
-      case BinKind::EagerFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionDeclaration(start, kind, fields));
-        break;
       case BinKind::EmptyStatement:
         MOZ_TRY_VAR(result, parseInterfaceEmptyStatement(start, kind, fields));
         break;
       case BinKind::Export:
         MOZ_TRY_VAR(result, parseInterfaceExport(start, kind, fields));
         break;
       case BinKind::ExportAllFrom:
         MOZ_TRY_VAR(result, parseInterfaceExportAllFrom(start, kind, fields));
@@ -1578,34 +1471,34 @@ BinASTParser<Tok>::parseSumImportDeclara
         MOZ_TRY_VAR(result, parseInterfaceForInStatement(start, kind, fields));
         break;
       case BinKind::ForOfStatement:
         MOZ_TRY_VAR(result, parseInterfaceForOfStatement(start, kind, fields));
         break;
       case BinKind::ForStatement:
         MOZ_TRY_VAR(result, parseInterfaceForStatement(start, kind, fields));
         break;
+      case BinKind::FunctionDeclaration:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionDeclaration(start, kind, fields));
+        break;
       case BinKind::IfStatement:
         MOZ_TRY_VAR(result, parseInterfaceIfStatement(start, kind, fields));
         break;
       case BinKind::Import:
         MOZ_TRY_VAR(result, parseInterfaceImport(start, kind, fields));
         break;
       case BinKind::ImportNamespace:
         MOZ_TRY_VAR(result, parseInterfaceImportNamespace(start, kind, fields));
         break;
       case BinKind::LabelledStatement:
         MOZ_TRY_VAR(result, parseInterfaceLabelledStatement(start, kind, fields));
         break;
       case BinKind::ReturnStatement:
         MOZ_TRY_VAR(result, parseInterfaceReturnStatement(start, kind, fields));
         break;
-      case BinKind::SkippableFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionDeclaration(start, kind, fields));
-        break;
       case BinKind::SwitchStatement:
         MOZ_TRY_VAR(result, parseInterfaceSwitchStatement(start, kind, fields));
         break;
       case BinKind::SwitchStatementWithDefault:
         MOZ_TRY_VAR(result, parseInterfaceSwitchStatementWithDefault(start, kind, fields));
         break;
       case BinKind::ThrowStatement:
         MOZ_TRY_VAR(result, parseInterfaceThrowStatement(start, kind, fields));
@@ -1633,34 +1526,34 @@ BinASTParser<Tok>::parseSumImportDeclara
 
 /*
 IterationStatement ::= DoWhileStatement
     ForInStatement
     ForOfStatement
     ForStatement
     WhileStatement
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseIterationStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumIterationStatement(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumIterationStatement(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseIterationStatement()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumIterationStatement(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumIterationStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::DoWhileStatement:
         MOZ_TRY_VAR(result, parseInterfaceDoWhileStatement(start, kind, fields));
         break;
       case BinKind::ForInStatement:
         MOZ_TRY_VAR(result, parseInterfaceForInStatement(start, kind, fields));
@@ -1682,34 +1575,34 @@ BinASTParser<Tok>::parseSumIterationStat
 
 /*
 Literal ::= LiteralBooleanExpression
     LiteralInfinityExpression
     LiteralNullExpression
     LiteralNumericExpression
     LiteralStringExpression
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseLiteral()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumLiteral(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumLiteral(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseLiteral()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumLiteral(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumLiteral(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::LiteralBooleanExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
         break;
       case BinKind::LiteralInfinityExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralInfinityExpression(start, kind, fields));
@@ -1725,190 +1618,129 @@ BinASTParser<Tok>::parseSumLiteral(const
         break;
       default:
         return raiseInvalidKind("Literal", kind);
     }
     return result;
 }
 
 /*
-Method ::= EagerMethod
-    SkippableMethod
+MethodDefinition ::= Getter
+    Method
+    Setter
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseMethod()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumMethod(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumMethod(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseMethodDefinition()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumMethodDefinition(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumMethodDefinition(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
-      case BinKind::EagerMethod:
-        MOZ_TRY_VAR(result, parseInterfaceEagerMethod(start, kind, fields));
-        break;
-      case BinKind::SkippableMethod:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableMethod(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("Method", kind);
-    }
-    return result;
-}
-
-/*
-MethodDefinition ::= EagerGetter
-    EagerMethod
-    EagerSetter
-    SkippableGetter
-    SkippableMethod
-    SkippableSetter
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseMethodDefinition()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumMethodDefinition(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumMethodDefinition(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch(kind) {
-      case BinKind::EagerGetter:
-        MOZ_TRY_VAR(result, parseInterfaceEagerGetter(start, kind, fields));
-        break;
-      case BinKind::EagerMethod:
-        MOZ_TRY_VAR(result, parseInterfaceEagerMethod(start, kind, fields));
-        break;
-      case BinKind::EagerSetter:
-        MOZ_TRY_VAR(result, parseInterfaceEagerSetter(start, kind, fields));
-        break;
-      case BinKind::SkippableGetter:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableGetter(start, kind, fields));
-        break;
-      case BinKind::SkippableMethod:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableMethod(start, kind, fields));
-        break;
-      case BinKind::SkippableSetter:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableSetter(start, kind, fields));
+      case BinKind::Getter:
+        MOZ_TRY_VAR(result, parseInterfaceGetter(start, kind, fields));
+        break;
+      case BinKind::Method:
+        MOZ_TRY_VAR(result, parseInterfaceMethod(start, kind, fields));
+        break;
+      case BinKind::Setter:
+        MOZ_TRY_VAR(result, parseInterfaceSetter(start, kind, fields));
         break;
       default:
         return raiseInvalidKind("MethodDefinition", kind);
     }
     return result;
 }
 
 /*
 ObjectProperty ::= DataProperty
-    EagerGetter
-    EagerMethod
-    EagerSetter
+    Getter
+    Method
+    Setter
     ShorthandProperty
-    SkippableGetter
-    SkippableMethod
-    SkippableSetter
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseObjectProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumObjectProperty(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumObjectProperty(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseObjectProperty()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumObjectProperty(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumObjectProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::DataProperty:
         MOZ_TRY_VAR(result, parseInterfaceDataProperty(start, kind, fields));
         break;
-      case BinKind::EagerGetter:
-        MOZ_TRY_VAR(result, parseInterfaceEagerGetter(start, kind, fields));
-        break;
-      case BinKind::EagerMethod:
-        MOZ_TRY_VAR(result, parseInterfaceEagerMethod(start, kind, fields));
-        break;
-      case BinKind::EagerSetter:
-        MOZ_TRY_VAR(result, parseInterfaceEagerSetter(start, kind, fields));
+      case BinKind::Getter:
+        MOZ_TRY_VAR(result, parseInterfaceGetter(start, kind, fields));
+        break;
+      case BinKind::Method:
+        MOZ_TRY_VAR(result, parseInterfaceMethod(start, kind, fields));
+        break;
+      case BinKind::Setter:
+        MOZ_TRY_VAR(result, parseInterfaceSetter(start, kind, fields));
         break;
       case BinKind::ShorthandProperty:
         MOZ_TRY_VAR(result, parseInterfaceShorthandProperty(start, kind, fields));
         break;
-      case BinKind::SkippableGetter:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableGetter(start, kind, fields));
-        break;
-      case BinKind::SkippableMethod:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableMethod(start, kind, fields));
-        break;
-      case BinKind::SkippableSetter:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableSetter(start, kind, fields));
-        break;
       default:
         return raiseInvalidKind("ObjectProperty", kind);
     }
     return result;
 }
 
 /*
 Parameter ::= ArrayBinding
     BindingIdentifier
     BindingWithInitializer
     ObjectBinding
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseParameter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumParameter(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumParameter(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseParameter()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumParameter(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumParameter(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayBinding:
         MOZ_TRY_VAR(result, parseInterfaceArrayBinding(start, kind, fields));
         break;
       case BinKind::BindingIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceBindingIdentifier(start, kind, fields));
@@ -1924,34 +1756,34 @@ BinASTParser<Tok>::parseSumParameter(con
     }
     return result;
 }
 
 /*
 Program ::= Module
     Script
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseProgram()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumProgram(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumProgram(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseProgram()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumProgram(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumProgram(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::Module:
         MOZ_TRY_VAR(result, parseInterfaceModule(start, kind, fields));
         break;
       case BinKind::Script:
         MOZ_TRY_VAR(result, parseInterfaceScript(start, kind, fields));
@@ -1961,109 +1793,72 @@ BinASTParser<Tok>::parseSumProgram(const
     }
     return result;
 }
 
 /*
 PropertyName ::= ComputedPropertyName
     LiteralPropertyName
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parsePropertyName()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumPropertyName(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumPropertyName(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parsePropertyName()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumPropertyName(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumPropertyName(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ComputedPropertyName:
         MOZ_TRY_VAR(result, parseInterfaceComputedPropertyName(start, kind, fields));
         break;
       case BinKind::LiteralPropertyName:
         MOZ_TRY_VAR(result, parseInterfaceLiteralPropertyName(start, kind, fields));
         break;
       default:
         return raiseInvalidKind("PropertyName", kind);
     }
     return result;
 }
 
 /*
-Setter ::= EagerSetter
-    SkippableSetter
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSetter()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumSetter(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumSetter(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    ParseNode* result;
-    switch(kind) {
-      case BinKind::EagerSetter:
-        MOZ_TRY_VAR(result, parseInterfaceEagerSetter(start, kind, fields));
-        break;
-      case BinKind::SkippableSetter:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableSetter(start, kind, fields));
-        break;
-      default:
-        return raiseInvalidKind("Setter", kind);
-    }
-    return result;
-}
-
-/*
 SimpleAssignmentTarget ::= AssignmentTargetIdentifier
     ComputedMemberAssignmentTarget
     StaticMemberAssignmentTarget
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSimpleAssignmentTarget()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumSimpleAssignmentTarget(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumSimpleAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseSimpleAssignmentTarget()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumSimpleAssignmentTarget(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumSimpleAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::AssignmentTargetIdentifier:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentTargetIdentifier(start, kind, fields));
         break;
       case BinKind::ComputedMemberAssignmentTarget:
         MOZ_TRY_VAR(result, parseInterfaceComputedMemberAssignmentTarget(start, kind, fields));
@@ -2074,71 +1869,72 @@ BinASTParser<Tok>::parseSumSimpleAssignm
       default:
         return raiseInvalidKind("SimpleAssignmentTarget", kind);
     }
     return result;
 }
 
 /*
 SpreadElementOrExpression ::= ArrayExpression
+    ArrowExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassExpression
     CompoundAssignmentExpression
     ComputedMemberExpression
     ConditionalExpression
-    EagerArrowExpression
-    EagerFunctionExpression
+    FunctionExpression
     IdentifierExpression
     LiteralBooleanExpression
     LiteralInfinityExpression
     LiteralNullExpression
     LiteralNumericExpression
     LiteralRegExpExpression
     LiteralStringExpression
     NewExpression
     NewTargetExpression
     ObjectExpression
-    SkippableArrowExpression
-    SkippableFunctionExpression
     SpreadElement
     StaticMemberExpression
     TemplateExpression
     ThisExpression
     UnaryExpression
     UpdateExpression
     YieldExpression
     YieldStarExpression
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSpreadElementOrExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumSpreadElementOrExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumSpreadElementOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseSpreadElementOrExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumSpreadElementOrExpression(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumSpreadElementOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayExpression:
         MOZ_TRY_VAR(result, parseInterfaceArrayExpression(start, kind, fields));
         break;
+      case BinKind::ArrowExpression:
+        MOZ_TRY_VAR(result, parseInterfaceArrowExpression(start, kind, fields));
+        break;
       case BinKind::AssignmentExpression:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentExpression(start, kind, fields));
         break;
       case BinKind::AwaitExpression:
         MOZ_TRY_VAR(result, parseInterfaceAwaitExpression(start, kind, fields));
         break;
       case BinKind::BinaryExpression:
         MOZ_TRY_VAR(result, parseInterfaceBinaryExpression(start, kind, fields));
@@ -2153,21 +1949,18 @@ BinASTParser<Tok>::parseSumSpreadElement
         MOZ_TRY_VAR(result, parseInterfaceCompoundAssignmentExpression(start, kind, fields));
         break;
       case BinKind::ComputedMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceComputedMemberExpression(start, kind, fields));
         break;
       case BinKind::ConditionalExpression:
         MOZ_TRY_VAR(result, parseInterfaceConditionalExpression(start, kind, fields));
         break;
-      case BinKind::EagerArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpression(start, kind, fields));
-        break;
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
+      case BinKind::FunctionExpression:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionExpression(start, kind, fields));
         break;
       case BinKind::IdentifierExpression:
         MOZ_TRY_VAR(result, parseInterfaceIdentifierExpression(start, kind, fields));
         break;
       case BinKind::LiteralBooleanExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
         break;
       case BinKind::LiteralInfinityExpression:
@@ -2189,22 +1982,16 @@ BinASTParser<Tok>::parseSumSpreadElement
         MOZ_TRY_VAR(result, parseInterfaceNewExpression(start, kind, fields));
         break;
       case BinKind::NewTargetExpression:
         MOZ_TRY_VAR(result, parseInterfaceNewTargetExpression(start, kind, fields));
         break;
       case BinKind::ObjectExpression:
         MOZ_TRY_VAR(result, parseInterfaceObjectExpression(start, kind, fields));
         break;
-      case BinKind::SkippableArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableArrowExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionExpression(start, kind, fields));
-        break;
       case BinKind::SpreadElement:
         MOZ_TRY_VAR(result, parseInterfaceSpreadElement(start, kind, fields));
         break;
       case BinKind::StaticMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceStaticMemberExpression(start, kind, fields));
         break;
       case BinKind::TemplateExpression:
         MOZ_TRY_VAR(result, parseInterfaceTemplateExpression(start, kind, fields));
@@ -2232,53 +2019,52 @@ BinASTParser<Tok>::parseSumSpreadElement
 
 /*
 Statement ::= Block
     BreakStatement
     ClassDeclaration
     ContinueStatement
     DebuggerStatement
     DoWhileStatement
-    EagerFunctionDeclaration
     EmptyStatement
     ExpressionStatement
     ForInStatement
     ForOfStatement
     ForStatement
+    FunctionDeclaration
     IfStatement
     LabelledStatement
     ReturnStatement
-    SkippableFunctionDeclaration
     SwitchStatement
     SwitchStatementWithDefault
     ThrowStatement
     TryCatchStatement
     TryFinallyStatement
     VariableDeclaration
     WhileStatement
     WithStatement
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumStatement(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumStatement(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseStatement()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumStatement(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::Block:
         MOZ_TRY_VAR(result, parseInterfaceBlock(start, kind, fields));
         break;
       case BinKind::BreakStatement:
         MOZ_TRY_VAR(result, parseInterfaceBreakStatement(start, kind, fields));
@@ -2290,46 +2076,43 @@ BinASTParser<Tok>::parseSumStatement(con
         MOZ_TRY_VAR(result, parseInterfaceContinueStatement(start, kind, fields));
         break;
       case BinKind::DebuggerStatement:
         MOZ_TRY_VAR(result, parseInterfaceDebuggerStatement(start, kind, fields));
         break;
       case BinKind::DoWhileStatement:
         MOZ_TRY_VAR(result, parseInterfaceDoWhileStatement(start, kind, fields));
         break;
-      case BinKind::EagerFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionDeclaration(start, kind, fields));
-        break;
       case BinKind::EmptyStatement:
         MOZ_TRY_VAR(result, parseInterfaceEmptyStatement(start, kind, fields));
         break;
       case BinKind::ExpressionStatement:
         MOZ_TRY_VAR(result, parseInterfaceExpressionStatement(start, kind, fields));
         break;
       case BinKind::ForInStatement:
         MOZ_TRY_VAR(result, parseInterfaceForInStatement(start, kind, fields));
         break;
       case BinKind::ForOfStatement:
         MOZ_TRY_VAR(result, parseInterfaceForOfStatement(start, kind, fields));
         break;
       case BinKind::ForStatement:
         MOZ_TRY_VAR(result, parseInterfaceForStatement(start, kind, fields));
         break;
+      case BinKind::FunctionDeclaration:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionDeclaration(start, kind, fields));
+        break;
       case BinKind::IfStatement:
         MOZ_TRY_VAR(result, parseInterfaceIfStatement(start, kind, fields));
         break;
       case BinKind::LabelledStatement:
         MOZ_TRY_VAR(result, parseInterfaceLabelledStatement(start, kind, fields));
         break;
       case BinKind::ReturnStatement:
         MOZ_TRY_VAR(result, parseInterfaceReturnStatement(start, kind, fields));
         break;
-      case BinKind::SkippableFunctionDeclaration:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionDeclaration(start, kind, fields));
-        break;
       case BinKind::SwitchStatement:
         MOZ_TRY_VAR(result, parseInterfaceSwitchStatement(start, kind, fields));
         break;
       case BinKind::SwitchStatementWithDefault:
         MOZ_TRY_VAR(result, parseInterfaceSwitchStatementWithDefault(start, kind, fields));
         break;
       case BinKind::ThrowStatement:
         MOZ_TRY_VAR(result, parseInterfaceThrowStatement(start, kind, fields));
@@ -2352,71 +2135,72 @@ BinASTParser<Tok>::parseSumStatement(con
       default:
         return raiseInvalidKind("Statement", kind);
     }
     return result;
 }
 
 /*
 VariableDeclarationOrExpression ::= ArrayExpression
+    ArrowExpression
     AssignmentExpression
     AwaitExpression
     BinaryExpression
     CallExpression
     ClassExpression
     CompoundAssignmentExpression
     ComputedMemberExpression
     ConditionalExpression
-    EagerArrowExpression
-    EagerFunctionExpression
+    FunctionExpression
     IdentifierExpression
     LiteralBooleanExpression
     LiteralInfinityExpression
     LiteralNullExpression
     LiteralNumericExpression
     LiteralRegExpExpression
     LiteralStringExpression
     NewExpression
     NewTargetExpression
     ObjectExpression
-    SkippableArrowExpression
-    SkippableFunctionExpression
     StaticMemberExpression
     TemplateExpression
     ThisExpression
     UnaryExpression
     UpdateExpression
     VariableDeclaration
     YieldExpression
     YieldStarExpression
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseVariableDeclarationOrExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-    const auto start = tokenizer_->offset();
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-
-    BINJS_MOZ_TRY_DECL(result, parseSumVariableDeclarationOrExpression(start, kind, fields));
-
-    MOZ_TRY(guard.done());
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseSumVariableDeclarationOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseVariableDeclarationOrExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+    const auto start = tokenizer_->offset();
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+
+    MOZ_TRY_DECL(result, parseSumVariableDeclarationOrExpression(start, kind, fields));
+
+    TRY(guard.done());
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseSumVariableDeclarationOrExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     ParseNode* result;
     switch(kind) {
       case BinKind::ArrayExpression:
         MOZ_TRY_VAR(result, parseInterfaceArrayExpression(start, kind, fields));
         break;
+      case BinKind::ArrowExpression:
+        MOZ_TRY_VAR(result, parseInterfaceArrowExpression(start, kind, fields));
+        break;
       case BinKind::AssignmentExpression:
         MOZ_TRY_VAR(result, parseInterfaceAssignmentExpression(start, kind, fields));
         break;
       case BinKind::AwaitExpression:
         MOZ_TRY_VAR(result, parseInterfaceAwaitExpression(start, kind, fields));
         break;
       case BinKind::BinaryExpression:
         MOZ_TRY_VAR(result, parseInterfaceBinaryExpression(start, kind, fields));
@@ -2431,21 +2215,18 @@ BinASTParser<Tok>::parseSumVariableDecla
         MOZ_TRY_VAR(result, parseInterfaceCompoundAssignmentExpression(start, kind, fields));
         break;
       case BinKind::ComputedMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceComputedMemberExpression(start, kind, fields));
         break;
       case BinKind::ConditionalExpression:
         MOZ_TRY_VAR(result, parseInterfaceConditionalExpression(start, kind, fields));
         break;
-      case BinKind::EagerArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerArrowExpression(start, kind, fields));
-        break;
-      case BinKind::EagerFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceEagerFunctionExpression(start, kind, fields));
+      case BinKind::FunctionExpression:
+        MOZ_TRY_VAR(result, parseInterfaceFunctionExpression(start, kind, fields));
         break;
       case BinKind::IdentifierExpression:
         MOZ_TRY_VAR(result, parseInterfaceIdentifierExpression(start, kind, fields));
         break;
       case BinKind::LiteralBooleanExpression:
         MOZ_TRY_VAR(result, parseInterfaceLiteralBooleanExpression(start, kind, fields));
         break;
       case BinKind::LiteralInfinityExpression:
@@ -2467,22 +2248,16 @@ BinASTParser<Tok>::parseSumVariableDecla
         MOZ_TRY_VAR(result, parseInterfaceNewExpression(start, kind, fields));
         break;
       case BinKind::NewTargetExpression:
         MOZ_TRY_VAR(result, parseInterfaceNewTargetExpression(start, kind, fields));
         break;
       case BinKind::ObjectExpression:
         MOZ_TRY_VAR(result, parseInterfaceObjectExpression(start, kind, fields));
         break;
-      case BinKind::SkippableArrowExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableArrowExpression(start, kind, fields));
-        break;
-      case BinKind::SkippableFunctionExpression:
-        MOZ_TRY_VAR(result, parseInterfaceSkippableFunctionExpression(start, kind, fields));
-        break;
       case BinKind::StaticMemberExpression:
         MOZ_TRY_VAR(result, parseInterfaceStaticMemberExpression(start, kind, fields));
         break;
       case BinKind::TemplateExpression:
         MOZ_TRY_VAR(result, parseInterfaceTemplateExpression(start, kind, fields));
         break;
       case BinKind::ThisExpression:
         MOZ_TRY_VAR(result, parseInterfaceThisExpression(start, kind, fields));
@@ -2509,539 +2284,538 @@ BinASTParser<Tok>::parseSumVariableDecla
 }
 
 
 
 // ----- Interfaces (autogenerated, by lexicographical order)
 // When fields have a non-trivial type, implementation is deanonymized and delegated to another parser.
 
 /*
- interface  : Node {
- }
-*/
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseNull()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceNull(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceNull(const size_t start, const BinKind kind, const BinFields& fields)
-{
-    return raiseError("FIXME: Not implemented yet (Null)");
-}
-
-
-/*
  interface ArrayAssignmentTarget : Node {
     FrozenArray<(AssignmentTarget or AssignmentTargetWithInitializer)> elements;
     AssignmentTarget? rest;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseArrayAssignmentTarget()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceArrayAssignmentTarget(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceArrayAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseArrayAssignmentTarget()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceArrayAssignmentTarget(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceArrayAssignmentTarget(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ArrayAssignmentTarget)");
 }
 
 
 /*
  interface ArrayBinding : Node {
     FrozenArray<(Binding or BindingWithInitializer)?> elements;
     Binding? rest;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseArrayBinding()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceArrayBinding(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceArrayBinding(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseArrayBinding()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceArrayBinding(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceArrayBinding(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ArrayBinding)");
 }
 
 
 /*
  interface ArrayExpression : Node {
     FrozenArray<(SpreadElement or Expression)?> elements;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseArrayExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceArrayExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceArrayExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseArrayExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceArrayExpression(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceArrayExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::ArrayExpression);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Elements }));
-
-
-
-    BINJS_MOZ_TRY_DECL(elements, parseListOfOptionalSpreadElementOrExpression());
-
-
-    auto result = elements;
-    return result;
+    MOZ_TRY(checkFields(kind, fields, { BinField::Elements }));
+
+
+
+    MOZ_TRY_DECL(elements, parseListOfOptionalSpreadElementOrExpression());
+
+
+    auto result = elements;return result;
+}
+
+
+/*
+ interface ArrowExpression : Node {
+    bool isAsync;
+    AssertedParameterScope? parameterScope;
+    AssertedVarScope? bodyScope;
+    FormalParameters params;
+    (FunctionBody or Expression) body;
+ }
+*/
+JS::Result<ParseNode*>
+BinASTParser::parseArrowExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceArrowExpression(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceArrowExpression(const size_t start, const BinKind kind, const BinFields& fields)
+{
+    return raiseError("FIXME: Not implemented yet (ArrowExpression)");
 }
 
 
 /*
  interface AssertedBlockScope : Node {
     FrozenArray<IdentifierName> lexicallyDeclaredNames;
     FrozenArray<IdentifierName> capturedNames;
     bool hasDirectEval;
  }
 */
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseAssertedBlockScope()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssertedBlockScope(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseInterfaceAssertedBlockScope(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<Ok>
+BinASTParser::parseAssertedBlockScope()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAssertedBlockScope(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<Ok>
+BinASTParser::parseInterfaceAssertedBlockScope(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::AssertedBlockScope);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::LexicallyDeclaredNames, BinField::CapturedNames, BinField::HasDirectEval }));
+    MOZ_TRY(checkFields(kind, fields, { BinField::LexicallyDeclaredNames, BinField::CapturedNames, BinField::HasDirectEval }));
     MOZ_TRY(parseAndUpdateScopeNames(*parseContext_->innermostScope(), DeclarationKind::Let));
     MOZ_TRY(parseAndUpdateCapturedNames());
 
 
 
-    BINJS_MOZ_TRY_DECL(hasDirectEval, tokenizer_->readBool());
+    MOZ_TRY_DECL(hasDirectEval, readBool());
     if (hasDirectEval) {
         parseContext_->sc()->setHasDirectEval();
         parseContext_->sc()->setBindingsAccessedDynamically();
     }
 
     if (hasDirectEval && parseContext_->isFunctionBox() && !parseContext_->sc()->strict()) {
         // In non-strict mode code, direct calls to eval can
         // add variables to the call object.
         parseContext_->functionBox()->setHasExtensibleScope();
     }
-    auto result = Ok();
-    return result;
+    auto result = Ok();return result;
 }
 
 
 /*
  interface AssertedParameterScope : Node {
     FrozenArray<IdentifierName> parameterNames;
     FrozenArray<IdentifierName> capturedNames;
     bool hasDirectEval;
  }
 */
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseAssertedParameterScope()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssertedParameterScope(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseInterfaceAssertedParameterScope(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<Ok>
+BinASTParser::parseAssertedParameterScope()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAssertedParameterScope(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<Ok>
+BinASTParser::parseInterfaceAssertedParameterScope(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::AssertedParameterScope);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::ParameterNames, BinField::CapturedNames, BinField::HasDirectEval }));
+    MOZ_TRY(checkFields(kind, fields, { BinField::ParameterNames, BinField::CapturedNames, BinField::HasDirectEval }));
     MOZ_TRY(parseAndUpdateScopeNames(parseContext_->functionScope(), DeclarationKind:: PositionalFormalParameter));
     MOZ_TRY(parseAndUpdateCapturedNames());
 
 
 
-    BINJS_MOZ_TRY_DECL(hasDirectEval, tokenizer_->readBool());
+    MOZ_TRY_DECL(hasDirectEval, readBool());
     if (hasDirectEval) {
         parseContext_->sc()->setHasDirectEval();
         parseContext_->sc()->setBindingsAccessedDynamically();
     }
 
     if (hasDirectEval && parseContext_->isFunctionBox() && !parseContext_->sc()->strict()) {
         // In non-strict mode code, direct calls to eval can
         // add variables to the call object.
         parseContext_->functionBox()->setHasExtensibleScope();
     }
-    auto result = Ok();
-    return result;
+    auto result = Ok();return result;
 }
 
 
 /*
  interface AssertedVarScope : Node {
     FrozenArray<IdentifierName> lexicallyDeclaredNames;
     FrozenArray<IdentifierName> varDeclaredNames;
     FrozenArray<IdentifierName> capturedNames;
     bool hasDirectEval;
  }
 */
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseAssertedVarScope()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssertedVarScope(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<Ok>
-BinASTParser<Tok>::parseInterfaceAssertedVarScope(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<Ok>
+BinASTParser::parseAssertedVarScope()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAssertedVarScope(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<Ok>
+BinASTParser::parseInterfaceAssertedVarScope(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::AssertedVarScope);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::LexicallyDeclaredNames, BinField::VarDeclaredNames, BinField::CapturedNames, BinField::HasDirectEval }));
+    MOZ_TRY(checkFields(kind, fields, { BinField::LexicallyDeclaredNames, BinField::VarDeclaredNames, BinField::CapturedNames, BinField::HasDirectEval }));
     MOZ_TRY(parseAndUpdateScopeNames(*parseContext_->innermostScope(), DeclarationKind::Let));
     MOZ_TRY(parseAndUpdateScopeNames(parseContext_->varScope(), DeclarationKind::Var));
     MOZ_TRY(parseAndUpdateCapturedNames());
 
 
 
-    BINJS_MOZ_TRY_DECL(hasDirectEval, tokenizer_->readBool());
+    MOZ_TRY_DECL(hasDirectEval, readBool());
     if (hasDirectEval) {
         parseContext_->sc()->setHasDirectEval();
         parseContext_->sc()->setBindingsAccessedDynamically();
     }
 
     if (hasDirectEval && parseContext_->isFunctionBox() && !parseContext_->sc()->strict()) {
         // In non-strict mode code, direct calls to eval can
         // add variables to the call object.
         parseContext_->functionBox()->setHasExtensibleScope();
     }
-    auto result = Ok();
-    return result;
+    auto result = Ok();return result;
 }
 
 
 /*
  interface AssignmentExpression : Node {
     AssignmentTarget binding;
     Expression expression;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceAssignmentExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAssignmentExpression(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceAssignmentExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::AssignmentExpression);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Binding, BinField::Expression }));
-
-
-
-    BINJS_MOZ_TRY_DECL(binding, parseAssignmentTarget());
-
-
-
-
-    BINJS_MOZ_TRY_DECL(expression, parseExpression());
-
-
-    BINJS_TRY_DECL(result, factory_.newAssignment(ParseNodeKind::Assign, binding, expression));
-    return result;
+    MOZ_TRY(checkFields(kind, fields, { BinField::Binding, BinField::Expression }));
+
+
+
+    MOZ_TRY_DECL(binding, parseAssignmentTarget());
+
+
+
+
+    MOZ_TRY_DECL(expression, parseExpression());
+
+
+    TRY_DECL(result, factory_.newAssignment(ParseNodeKind::Assign, binding, expression));return result;
 }
 
 
 /*
  interface AssignmentTargetIdentifier : Node {
     Identifier name;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetIdentifier()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetIdentifier(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceAssignmentTargetIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentTargetIdentifier()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetIdentifier(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceAssignmentTargetIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::AssignmentTargetIdentifier);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Name }));
+    MOZ_TRY(checkFields(kind, fields, { BinField::Name }));
 
 
     RootedAtom name(cx_);
-    MOZ_TRY_VAR(name, tokenizer_->readAtom());
+    MOZ_TRY(readString(&name));
 
 
     if (!IsIdentifier(name))
         return raiseError("Invalid identifier");
-    BINJS_TRY_DECL(result, factory_.newName(name->asPropertyName(), tokenizer_->pos(start), cx_));
-    return result;
+    TRY_DECL(result, factory_.newName(name->asPropertyName(), tokenizer_->pos(start), cx_));return result;
 }
 
 
 /*
  interface AssignmentTargetPropertyIdentifier : Node {
     AssignmentTargetIdentifier binding;
     Expression? init;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetPropertyIdentifier()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetPropertyIdentifier(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceAssignmentTargetPropertyIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentTargetPropertyIdentifier()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetPropertyIdentifier(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceAssignmentTargetPropertyIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (AssignmentTargetPropertyIdentifier)");
 }
 
 
 /*
  interface AssignmentTargetPropertyProperty : Node {
     PropertyName name;
     (AssignmentTarget or AssignmentTargetWithInitializer) binding;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetPropertyProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetPropertyProperty(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceAssignmentTargetPropertyProperty(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentTargetPropertyProperty()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetPropertyProperty(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceAssignmentTargetPropertyProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (AssignmentTargetPropertyProperty)");
 }
 
 
 /*
  interface AssignmentTargetWithInitializer : Node {
     AssignmentTarget binding;
     Expression init;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAssignmentTargetWithInitializer()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetWithInitializer(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceAssignmentTargetWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAssignmentTargetWithInitializer()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAssignmentTargetWithInitializer(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceAssignmentTargetWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (AssignmentTargetWithInitializer)");
 }
 
 
 /*
  interface AwaitExpression : Node {
     Expression expression;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseAwaitExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceAwaitExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceAwaitExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseAwaitExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceAwaitExpression(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceAwaitExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (AwaitExpression)");
 }
 
 
 /*
  interface BinaryExpression : Node {
     BinaryOperator operator;
     Expression left;
     Expression right;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBinaryExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBinaryExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceBinaryExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBinaryExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceBinaryExpression(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceBinaryExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::BinaryExpression);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Operator, BinField::Left, BinField::Right }));
-
-
-
-    BINJS_MOZ_TRY_DECL(operator_, parseBinaryOperator());
-
-
-
-
-    BINJS_MOZ_TRY_DECL(left, parseExpression());
-
-
-
-
-    BINJS_MOZ_TRY_DECL(right, parseExpression());
+    MOZ_TRY(checkFields(kind, fields, { BinField::Operator, BinField::Left, BinField::Right }));
+
+
+
+    MOZ_TRY_DECL(operator_, parseBinaryOperator());
+
+
+
+
+    MOZ_TRY_DECL(left, parseExpression());
+
+
+
+
+    MOZ_TRY_DECL(right, parseExpression());
 
 
     ParseNodeKind pnk;
     switch (operator_) {
       case BinaryOperator::Comma:
         pnk = ParseNodeKind::Comma;
         break;
       case BinaryOperator::LogicalOr:
@@ -3121,291 +2895,289 @@ BinASTParser<Tok>::parseInterfaceBinaryE
     ParseNode* result;
     if (left->isKind(pnk) &&
         pnk != ParseNodeKind::Pow /* ParseNodeKind::Pow is not left-associative */)
     {
         // Regroup left-associative operations into lists.
         left->appendWithoutOrderAssumption(right);
         result = left;
     } else {
-        BINJS_TRY_DECL(list, factory_.newList(pnk, tokenizer_->pos(start)));
+        TRY_DECL(list, factory_.newList(pnk, tokenizer_->pos(start)));
 
         list->appendWithoutOrderAssumption(left);
         list->appendWithoutOrderAssumption(right);
         result = list;
-    }
-    return result;
+    }return result;
 }
 
 
 /*
  interface BindingIdentifier : Node {
     Identifier name;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingIdentifier()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBindingIdentifier(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceBindingIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBindingIdentifier()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceBindingIdentifier(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceBindingIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::BindingIdentifier);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Name }));
+    MOZ_TRY(checkFields(kind, fields, { BinField::Name }));
 
 
     RootedAtom name(cx_);
-    MOZ_TRY_VAR(name, tokenizer_->readAtom());
+    MOZ_TRY(readString(&name));
 
 
     if (!IsIdentifier(name))
         return raiseError("Invalid identifier");
-    BINJS_TRY_DECL(result, factory_.newName(name->asPropertyName(), tokenizer_->pos(start), cx_));
-    return result;
+    TRY_DECL(result, factory_.newName(name->asPropertyName(), tokenizer_->pos(start), cx_));return result;
 }
 
 
 /*
  interface BindingPropertyIdentifier : Node {
     BindingIdentifier binding;
     Expression? init;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingPropertyIdentifier()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBindingPropertyIdentifier(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceBindingPropertyIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBindingPropertyIdentifier()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceBindingPropertyIdentifier(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceBindingPropertyIdentifier(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (BindingPropertyIdentifier)");
 }
 
 
 /*
  interface BindingPropertyProperty : Node {
     PropertyName name;
     (Binding or BindingWithInitializer) binding;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingPropertyProperty()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBindingPropertyProperty(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceBindingPropertyProperty(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBindingPropertyProperty()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceBindingPropertyProperty(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceBindingPropertyProperty(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (BindingPropertyProperty)");
 }
 
 
 /*
  interface BindingWithInitializer : Node {
     Binding binding;
     Expression init;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBindingWithInitializer()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBindingWithInitializer(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceBindingWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBindingWithInitializer()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceBindingWithInitializer(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceBindingWithInitializer(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (BindingWithInitializer)");
 }
 
 
 /*
  interface Block : Node {
     AssertedBlockScope? scope;
     FrozenArray<Statement> statements;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBlock()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBlock(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceBlock(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBlock()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceBlock(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceBlock(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::Block);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Scope, BinField::Statements }));
+    MOZ_TRY(checkFields(kind, fields, { BinField::Scope, BinField::Statements }));
+    fprintf(stderr, "Block: PUSH parse context\n");
     ParseContext::Statement stmt(parseContext_, StatementKind::Block);
     ParseContext::Scope currentScope(cx_, parseContext_, usedNames_);
-    BINJS_TRY(currentScope.init(parseContext_));
+    TRY(currentScope.init(parseContext_));
 
 
     MOZ_TRY(parseOptionalAssertedBlockScope());
 
 
 
 
-    BINJS_MOZ_TRY_DECL(statements, parseListOfStatement());
-
-
-    BINJS_TRY_DECL(bindings, NewLexicalScopeData(cx_, currentScope, alloc_, parseContext_));
-    BINJS_TRY_DECL(result, factory_.newLexicalScope(*bindings, statements));
-    return result;
+    MOZ_TRY_DECL(statements, parseListOfStatement());
+
+
+    TRY_DECL(bindings, NewLexicalScopeData(cx_, currentScope, alloc_, parseContext_));
+    TRY_DECL(result, factory_.newLexicalScope(*bindings, statements));
+    fprintf(stderr, "Block: POP parse context\n");return result;
 }
 
 
 /*
  interface BreakStatement : Node {
     Label? label;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseBreakStatement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceBreakStatement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceBreakStatement(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseBreakStatement()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceBreakStatement(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceBreakStatement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::BreakStatement);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Label }));
+    MOZ_TRY(checkFields(kind, fields, { BinField::Label }));
     RootedAtom label(cx_);
-    MOZ_TRY_VAR(label, tokenizer_->readMaybeAtom());
+    MOZ_TRY(readMaybeString(&label));
+
+    if (label && !IsIdentifier(label))
+        return raiseError("Invalid identifier");
 
     if (label) {
-        if (!IsIdentifier(label))
-            return raiseError("Invalid identifier");
-
         auto validity = parseContext_->checkBreakStatement(label->asPropertyName());
 
         if (validity.isErr()) {
             switch (validity.unwrapErr()) {
             case ParseContext::BreakStatementError::ToughBreak:
                 return raiseError(kind, "Not in a loop");
             case ParseContext::BreakStatementError::LabelNotFound:
                 return raiseError(kind, "Label not found");
             }
         }
     }
-    BINJS_TRY_DECL(result, factory_.newBreakStatement(label ? label->asPropertyName() : nullptr, tokenizer_->pos(start)));
-    return result;
+    TRY_DECL(result, factory_.newBreakStatement(label ? label->asPropertyName() : nullptr, tokenizer_->pos(start)));return result;
 }
 
 
 /*
  interface CallExpression : Node {
     (Expression or Super) callee;
     Arguments arguments;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseCallExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceCallExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceCallExpression(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseCallExpression()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceCallExpression(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceCallExpression(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::CallExpression);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Callee, BinField::Arguments }));
-
-
-
-    BINJS_MOZ_TRY_DECL(callee, parseExpressionOrSuper());
-
-
-
-
-    BINJS_MOZ_TRY_DECL(arguments, parseArguments());
+    MOZ_TRY(checkFields(kind, fields, { BinField::Callee, BinField::Arguments }));
+
+
+
+    MOZ_TRY_DECL(callee, parseExpressionOrSuper());
+
+
+
+
+    MOZ_TRY_DECL(arguments, parseArguments());
 
 
     auto op = JSOP_CALL;
     // Check for direct calls to `eval`.
     if (factory_.isEvalName(callee, cx_)) {
         if (!parseContext_->varScope().lookupDeclaredNameForAdd(callee->name())
          && !parseContext_->innermostScope()->lookupDeclaredNameForAdd(callee->name())) {
             // This is a direct call to `eval`.
@@ -3413,209 +3185,207 @@ BinASTParser<Tok>::parseInterfaceCallExp
                 return raiseMissingDirectEvalInAssertedScope();
 
             op = parseContext_->sc()->strict() ? JSOP_STRICTEVAL : JSOP_EVAL;
         }
     }
     auto result = arguments;
     result->setKind(ParseNodeKind::Call);
     result->prepend(callee);
-    result->setOp(op);
-    return result;
+    result->setOp(op);return result;
 }
 
 
 /*
  interface CatchClause : Node {
     Binding binding;
     Block body;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseCatchClause()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceCatchClause(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceCatchClause(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseCatchClause()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceCatchClause(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceCatchClause(const size_t start, const BinKind kind, const BinFields& fields)
 {
     MOZ_ASSERT(kind == BinKind::CatchClause);
     CheckRecursionLimit(cx_);
 
-    MOZ_TRY(tokenizer_->checkFields(kind, fields, { BinField::Binding, BinField::Body }));
+    MOZ_TRY(checkFields(kind, fields, { BinField::Binding, BinField::Body }));
     ParseContext::Statement stmt(parseContext_, StatementKind::Catch);
     ParseContext::Scope currentScope(cx_, parseContext_, usedNames_);
-    BINJS_TRY(currentScope.init(parseContext_));
-
-
-    BINJS_MOZ_TRY_DECL(binding, parseBinding());
-
-
-
-
-    BINJS_MOZ_TRY_DECL(body, parseBlock());
+    TRY(currentScope.init(parseContext_));
+
+
+    MOZ_TRY_DECL(binding, parseBinding());
+
+
+
+
+    MOZ_TRY_DECL(body, parseBlock());
 
 
     // Export implicit variables to the scope.
     // FIXME: Handle cases other than Name.
     MOZ_ASSERT(binding->isKind(ParseNodeKind::Name));
     auto ptr = currentScope.lookupDeclaredNameForAdd(binding->name());
-    BINJS_TRY(currentScope.addDeclaredName(parseContext_, ptr, binding->name(), DeclarationKind::Let, start));
-
-    BINJS_TRY_DECL(bindings, NewLexicalScopeData(cx_, currentScope, alloc_, parseContext_));
-    BINJS_TRY_DECL(result, factory_.newLexicalScope(*bindings, body));
-    BINJS_TRY(factory_.setupCatchScope(result, binding, body));
-    return result;
+    TRY(currentScope.addDeclaredName(parseContext_, ptr, binding->name(), DeclarationKind::Let, start));
+
+    TRY_DECL(bindings, NewLexicalScopeData(cx_, currentScope, alloc_, parseContext_));
+    TRY_DECL(result, factory_.newLexicalScope(*bindings, body));
+    TRY(factory_.setupCatchScope(result, binding, body));return result;
 }
 
 
 /*
  interface ClassDeclaration : Node {
     BindingIdentifier name;
     Expression? super;
     FrozenArray<ClassElement> elements;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseClassDeclaration()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceClassDeclaration(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceClassDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseClassDeclaration()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceClassDeclaration(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceClassDeclaration(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ClassDeclaration)");
 }
 
 
 /*
  interface ClassElement : Node {
     bool isStatic;
     MethodDefinition method;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseClassElement()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceClassElement(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceClassElement(const size_t start, const BinKind kind, const BinFields& fields)
+JS::Result<ParseNode*>
+BinASTParser::parseClassElement()
+{
+    BinKind kind;
+    BinFields fields(cx_);
+    AutoTaggedTuple guard(*tokenizer_);
+
+    TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
+    const auto start = tokenizer_->offset();
+
+    MOZ_TRY_DECL(result, parseInterfaceClassElement(start, kind, fields));
+    TRY(guard.done());
+
+    return result;
+}
+
+JS::Result<ParseNode*>
+BinASTParser::parseInterfaceClassElement(const size_t start, const BinKind kind, const BinFields& fields)
 {
     return raiseError("FIXME: Not implemented yet (ClassElement)");
 }
 
 
 /*
  interface ClassExpression : Node {
     BindingIdentifier? name;
     Expression? super;
     FrozenArray<ClassElement> elements;
  }
 */
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseClassExpression()
-{
-    BinKind kind;
-    BinFields fields(cx_);
-    AutoTaggedTuple guard(*tokenizer_);
-
-    MOZ_TRY(tokenizer_->enterTaggedTuple(kind, fields, guard));
-    const auto start = tokenizer_->offset();
-
-    BINJS_MOZ_TRY_DECL(result, parseInterfaceClassExpression(start, kind, fields));
-    MOZ_TRY(guard.done());
-
-    return result;
-}
-
-template<typename Tok> JS::Result<ParseNode*>
-BinASTParser<Tok>::parseInterfaceCla