Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - Refactor some class features #2513

Closed
wants to merge 3 commits into from
Closed

Conversation

raskad
Copy link
Member

@raskad raskad commented Jan 4, 2023

This Pull Request fixes various bugs related to classes.

The biggest changes are:

  • Changed private names to be unique across multiple classes.
  • Changed private name resolution to work via a visitor after a class is parsed. The way class early errors are defined makes it impossible to perform private name resolution while parsing.
  • Added function names to class methods.
  • Added class name binding to method function environments.
  • Separated opcodes for static and non-static class method definitions to make the above operations possible.

There are still some bugs and further issues with classes but this is already a lot.

@raskad raskad added bug Something isn't working parser Issues surrounding the parser execution Issues or PRs related to code execution ast Issue surrounding the abstract syntax tree labels Jan 4, 2023
@raskad raskad added this to the v0.17.0 milestone Jan 4, 2023
@github-actions
Copy link

github-actions bot commented Jan 4, 2023

Test262 conformance changes

Test result main count PR count difference
Total 94,205 94,205 0
Passed 70,348 70,613 +265
Ignored 18,622 18,622 0
Failed 5,235 4,970 -265
Panics 0 0 0
Conformance 74.68% 74.96% +0.28%
Fixed tests (265):
test/language/statements/class/scope-name-lex-open-no-heritage.js [strict mode] (previously Failed)
test/language/statements/class/scope-name-lex-open-no-heritage.js (previously Failed)
test/language/statements/class/gen-method-param-dflt-yield.js [strict mode] (previously Failed)
test/language/statements/class/gen-method-param-dflt-yield.js (previously Failed)
test/language/statements/class/scope-name-lex-close.js [strict mode] (previously Failed)
test/language/statements/class/scope-name-lex-close.js (previously Failed)
test/language/statements/class/static-init-scope-private.js [strict mode] (previously Failed)
test/language/statements/class/static-init-scope-private.js (previously Failed)
test/language/statements/class/static-gen-method-param-dflt-yield.js [strict mode] (previously Failed)
test/language/statements/class/static-gen-method-param-dflt-yield.js (previously Failed)
test/language/statements/class/static-init-scope-lex-derived.js [strict mode] (previously Failed)
test/language/statements/class/static-init-scope-lex-derived.js (previously Failed)
test/language/statements/class/syntax/class-body-method-definition-super-property.js [strict mode] (previously Failed)
test/language/statements/class/syntax/class-body-method-definition-super-property.js (previously Failed)
test/language/statements/class/elements/static-field-init-this-inside-arrow-function.js [strict mode] (previously Failed)
test/language/statements/class/elements/static-field-init-this-inside-arrow-function.js (previously Failed)
test/language/statements/class/elements/static-field-init-with-this.js [strict mode] (previously Failed)
test/language/statements/class/elements/static-field-init-with-this.js (previously Failed)
test/language/statements/class/elements/private-async-method-name.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-async-method-name.js (previously Failed)
test/language/statements/class/elements/private-static-field-shadowed-by-setter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-field-shadowed-by-setter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-getter-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-getter-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/statements/class/elements/fields-computed-name-static-computed-var-propname-prototype.js [strict mode] (previously Failed)
test/language/statements/class/elements/fields-computed-name-static-computed-var-propname-prototype.js (previously Failed)
test/language/statements/class/elements/private-method-double-initialisation-get-and-set.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-method-double-initialisation-get-and-set.js (previously Failed)
test/language/statements/class/elements/private-static-method-shadowed-by-method-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-method-shadowed-by-method-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-static-async-generator-method-name.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-async-generator-method-name.js (previously Failed)
test/language/statements/class/elements/set-access-of-missing-shadowed-private-setter.js [strict mode] (previously Failed)
test/language/statements/class/elements/set-access-of-missing-shadowed-private-setter.js (previously Failed)
test/language/statements/class/elements/private-method-double-initialisation-get.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-method-double-initialisation-get.js (previously Failed)
test/language/statements/class/elements/private-method-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-method-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/static-field-anonymous-function-name.js [strict mode] (previously Failed)
test/language/statements/class/elements/static-field-anonymous-function-name.js (previously Failed)
test/language/statements/class/elements/class-field-on-frozen-objects.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-setter-shadowed-by-method-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-setter-shadowed-by-method-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-static-method-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-method-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-method-double-initialisation-set.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-method-double-initialisation-set.js (previously Failed)
test/language/statements/class/elements/static-field-redeclaration.js [strict mode] (previously Failed)
test/language/statements/class/elements/static-field-redeclaration.js (previously Failed)
test/language/statements/class/elements/private-getter-brand-check-super-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-getter-brand-check-super-class.js (previously Failed)
test/language/statements/class/elements/private-getter-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-getter-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/nested-private-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/statements/class/elements/nested-private-direct-eval-err-contains-arguments.js (previously Failed)
test/language/statements/class/elements/private-method-brand-check-super-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-method-brand-check-super-class.js (previously Failed)
test/language/statements/class/elements/privatefieldadd-typeerror.js [strict mode] (previously Failed)
test/language/statements/class/elements/privatefieldadd-typeerror.js (previously Failed)
test/language/statements/class/elements/private-static-generator-method-name.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-generator-method-name.js (previously Failed)
test/language/statements/class/elements/fields-computed-name-static-propname-constructor.js [strict mode] (previously Failed)
test/language/statements/class/elements/fields-computed-name-static-propname-constructor.js (previously Failed)
test/language/statements/class/elements/private-static-method-name.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-method-name.js (previously Failed)
test/language/statements/class/elements/private-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-direct-eval-err-contains-arguments.js (previously Failed)
test/language/statements/class/elements/privatefieldget-typeerror-5.js [strict mode] (previously Failed)
test/language/statements/class/elements/privatefieldget-typeerror-5.js (previously Failed)
test/language/statements/class/elements/private-setter-brand-check-super-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-setter-brand-check-super-class.js (previously Failed)
test/language/statements/class/elements/get-access-of-missing-shadowed-private-getter.js [strict mode] (previously Failed)
test/language/statements/class/elements/get-access-of-missing-shadowed-private-getter.js (previously Failed)
test/language/statements/class/elements/private-getter-shadowed-by-setter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-getter-shadowed-by-setter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-setter-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-setter-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-setter-shadowed-by-setter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-setter-shadowed-by-setter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/fields-computed-name-static-propname-prototype.js [strict mode] (previously Failed)
test/language/statements/class/elements/fields-computed-name-static-propname-prototype.js (previously Failed)
test/language/statements/class/elements/privatefieldget-success-3.js [strict mode] (previously Failed)
test/language/statements/class/elements/privatefieldget-success-3.js (previously Failed)
test/language/statements/class/elements/private-setter-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-setter-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/arrow-body-private-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/statements/class/elements/arrow-body-private-direct-eval-err-contains-arguments.js (previously Failed)
test/language/statements/class/elements/super-access-from-arrow-func-on-field.js [strict mode] (previously Failed)
test/language/statements/class/elements/super-access-from-arrow-func-on-field.js (previously Failed)
test/language/statements/class/elements/private-static-field-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-field-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-generator-method-name.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-generator-method-name.js (previously Failed)
test/language/statements/class/elements/private-async-generator-method-name.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-async-generator-method-name.js (previously Failed)
test/language/statements/class/elements/direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/statements/class/elements/direct-eval-err-contains-arguments.js (previously Failed)
test/language/statements/class/elements/private-method-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-method-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/statements/class/elements/arrow-body-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/statements/class/elements/arrow-body-direct-eval-err-contains-arguments.js (previously Failed)
test/language/statements/class/elements/nested-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/statements/class/elements/nested-direct-eval-err-contains-arguments.js (previously Failed)
test/language/statements/class/elements/private-getter-shadowed-by-method-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-getter-shadowed-by-method-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-method-double-initialisation.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-method-double-initialisation.js (previously Failed)
test/language/statements/class/elements/private-static-async-method-name.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-async-method-name.js (previously Failed)
test/language/statements/class/elements/private-static-field-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-field-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-method-shadowed-by-setter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-method-shadowed-by-setter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-static-method-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-method-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/statements/class/elements/private-static-field-shadowed-by-method-on-nested-class.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-static-field-shadowed-by-method-on-nested-class.js (previously Failed)
test/language/statements/class/elements/privatefieldset-typeerror-5.js [strict mode] (previously Failed)
test/language/statements/class/elements/privatefieldset-typeerror-5.js (previously Failed)
test/language/statements/class/elements/private-methods/prod-private-generator.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-methods/prod-private-generator.js (previously Failed)
test/language/statements/class/elements/private-methods/prod-private-async-generator.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-methods/prod-private-async-generator.js (previously Failed)
test/language/statements/class/elements/private-methods/prod-private-async-method.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-methods/prod-private-async-method.js (previously Failed)
test/language/statements/class/elements/private-methods/prod-private-method.js [strict mode] (previously Failed)
test/language/statements/class/elements/private-methods/prod-private-method.js (previously Failed)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-accessor-meth-valid.js [strict mode] (previously Failed)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-accessor-meth-valid.js (previously Failed)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-async-meth-valid.js [strict mode] (previously Failed)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-async-meth-valid.js (previously Failed)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-async-gen-meth-valid.js [strict mode] (previously Failed)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-async-gen-meth-valid.js (previously Failed)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-gen-meth-valid.js [strict mode] (previously Failed)
test/language/statements/class/elements/syntax/valid/grammar-static-ctor-gen-meth-valid.js (previously Failed)
test/language/statements/class/definition/fn-name-accessor-get.js [strict mode] (previously Failed)
test/language/statements/class/definition/fn-name-accessor-get.js (previously Failed)
test/language/statements/class/definition/fn-name-gen-method.js [strict mode] (previously Failed)
test/language/statements/class/definition/fn-name-gen-method.js (previously Failed)
test/language/statements/class/definition/fn-name-method.js [strict mode] (previously Failed)
test/language/statements/class/definition/fn-name-method.js (previously Failed)
test/language/statements/class/definition/fn-name-accessor-set.js [strict mode] (previously Failed)
test/language/statements/class/definition/fn-name-accessor-set.js (previously Failed)
test/language/statements/class/name-binding/expression.js [strict mode] (previously Failed)
test/language/statements/class/name-binding/expression.js (previously Failed)
test/language/statements/class/name-binding/const.js [strict mode] (previously Failed)
test/language/statements/class/name-binding/const.js (previously Failed)
test/language/expressions/optional-chaining/member-expression.js [strict mode] (previously Failed)
test/language/expressions/optional-chaining/member-expression.js (previously Failed)
test/language/expressions/object/setter-super-prop.js [strict mode] (previously Failed)
test/language/expressions/object/setter-super-prop.js (previously Failed)
test/language/expressions/object/method-definition/generator-param-init-yield.js (previously Failed)
test/language/expressions/class/scope-name-lex-open-no-heritage.js [strict mode] (previously Failed)
test/language/expressions/class/scope-name-lex-open-no-heritage.js (previously Failed)
test/language/expressions/class/constructor-this-tdz-during-initializers.js [strict mode] (previously Failed)
test/language/expressions/class/constructor-this-tdz-during-initializers.js (previously Failed)
test/language/expressions/class/gen-method-param-dflt-yield.js [strict mode] (previously Failed)
test/language/expressions/class/gen-method-param-dflt-yield.js (previously Failed)
test/language/expressions/class/scope-name-lex-close.js [strict mode] (previously Failed)
test/language/expressions/class/scope-name-lex-close.js (previously Failed)
test/language/expressions/class/static-gen-method-param-dflt-yield.js [strict mode] (previously Failed)
test/language/expressions/class/static-gen-method-param-dflt-yield.js (previously Failed)
test/language/expressions/class/elements/static-field-init-this-inside-arrow-function.js [strict mode] (previously Failed)
test/language/expressions/class/elements/static-field-init-this-inside-arrow-function.js (previously Failed)
test/language/expressions/class/elements/static-field-init-with-this.js [strict mode] (previously Failed)
test/language/expressions/class/elements/static-field-init-with-this.js (previously Failed)
test/language/expressions/class/elements/private-async-method-name.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-async-method-name.js (previously Failed)
test/language/expressions/class/elements/private-static-field-shadowed-by-setter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-field-shadowed-by-setter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-getter-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-getter-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-static-method-shadowed-by-method-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-method-shadowed-by-method-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-static-async-generator-method-name.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-async-generator-method-name.js (previously Failed)
test/language/expressions/class/elements/private-method-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-method-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/static-field-anonymous-function-name.js [strict mode] (previously Failed)
test/language/expressions/class/elements/static-field-anonymous-function-name.js (previously Failed)
test/language/expressions/class/elements/private-setter-shadowed-by-method-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-setter-shadowed-by-method-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-static-method-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-method-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/static-field-redeclaration.js [strict mode] (previously Failed)
test/language/expressions/class/elements/static-field-redeclaration.js (previously Failed)
test/language/expressions/class/elements/private-getter-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-getter-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/nested-private-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/expressions/class/elements/nested-private-direct-eval-err-contains-arguments.js (previously Failed)
test/language/expressions/class/elements/class-name-static-initializer-decl.js [strict mode] (previously Failed)
test/language/expressions/class/elements/class-name-static-initializer-decl.js (previously Failed)
test/language/expressions/class/elements/private-static-generator-method-name.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-generator-method-name.js (previously Failed)
test/language/expressions/class/elements/private-static-method-name.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-method-name.js (previously Failed)
test/language/expressions/class/elements/private-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-direct-eval-err-contains-arguments.js (previously Failed)
test/language/expressions/class/elements/private-getter-shadowed-by-setter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-getter-shadowed-by-setter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-setter-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-setter-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/class-name-static-initializer-expr.js [strict mode] (previously Failed)
test/language/expressions/class/elements/class-name-static-initializer-expr.js (previously Failed)
test/language/expressions/class/elements/private-setter-shadowed-by-setter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-setter-shadowed-by-setter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/fields-computed-name-static-propname-prototype.js [strict mode] (previously Failed)
test/language/expressions/class/elements/fields-computed-name-static-propname-prototype.js (previously Failed)
test/language/expressions/class/elements/private-setter-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-setter-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/arrow-body-private-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/expressions/class/elements/arrow-body-private-direct-eval-err-contains-arguments.js (previously Failed)
test/language/expressions/class/elements/super-access-from-arrow-func-on-field.js [strict mode] (previously Failed)
test/language/expressions/class/elements/super-access-from-arrow-func-on-field.js (previously Failed)
test/language/expressions/class/elements/private-static-field-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-field-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-generator-method-name.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-generator-method-name.js (previously Failed)
test/language/expressions/class/elements/private-async-generator-method-name.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-async-generator-method-name.js (previously Failed)
test/language/expressions/class/elements/class-name-static-initializer-anonymous.js [strict mode] (previously Failed)
test/language/expressions/class/elements/class-name-static-initializer-anonymous.js (previously Failed)
test/language/expressions/class/elements/direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/expressions/class/elements/direct-eval-err-contains-arguments.js (previously Failed)
test/language/expressions/class/elements/private-method-shadowed-by-field-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-method-shadowed-by-field-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/arrow-body-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/expressions/class/elements/arrow-body-direct-eval-err-contains-arguments.js (previously Failed)
test/language/expressions/class/elements/fields-run-once-on-double-super.js [strict mode] (previously Failed)
test/language/expressions/class/elements/fields-run-once-on-double-super.js (previously Failed)
test/language/expressions/class/elements/nested-direct-eval-err-contains-arguments.js [strict mode] (previously Failed)
test/language/expressions/class/elements/nested-direct-eval-err-contains-arguments.js (previously Failed)
test/language/expressions/class/elements/private-getter-shadowed-by-method-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-getter-shadowed-by-method-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-static-async-method-name.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-async-method-name.js (previously Failed)
test/language/expressions/class/elements/private-static-field-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-field-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-method-shadowed-by-setter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-method-shadowed-by-setter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-static-method-shadowed-by-getter-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-method-shadowed-by-getter-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-static-field-shadowed-by-method-on-nested-class.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-static-field-shadowed-by-method-on-nested-class.js (previously Failed)
test/language/expressions/class/elements/private-methods/prod-private-generator.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-methods/prod-private-generator.js (previously Failed)
test/language/expressions/class/elements/private-methods/prod-private-async-generator.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-methods/prod-private-async-generator.js (previously Failed)
test/language/expressions/class/elements/private-methods/prod-private-async-method.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-methods/prod-private-async-method.js (previously Failed)
test/language/expressions/class/elements/private-methods/prod-private-method.js [strict mode] (previously Failed)
test/language/expressions/class/elements/private-methods/prod-private-method.js (previously Failed)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-accessor-meth-valid.js [strict mode] (previously Failed)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-accessor-meth-valid.js (previously Failed)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-async-meth-valid.js [strict mode] (previously Failed)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-async-meth-valid.js (previously Failed)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-async-gen-meth-valid.js [strict mode] (previously Failed)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-async-gen-meth-valid.js (previously Failed)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-gen-meth-valid.js [strict mode] (previously Failed)
test/language/expressions/class/elements/syntax/valid/grammar-static-ctor-gen-meth-valid.js (previously Failed)
test/language/expressions/super/prop-dot-cls-ref-strict.js [strict mode] (previously Failed)
test/language/expressions/super/prop-dot-cls-ref-strict.js (previously Failed)
test/language/expressions/super/prop-dot-obj-ref-non-strict.js (previously Failed)
test/language/expressions/super/prop-dot-obj-ref-strict.js [strict mode] (previously Failed)
test/built-ins/Symbol/prototype/toString/toString-default-attributes-strict.js [strict mode] (previously Failed)

@codecov
Copy link

codecov bot commented Jan 4, 2023

Codecov Report

Merging #2513 (85abc6e) into main (1bef214) will increase coverage by 0.59%.
The diff coverage is 21.95%.

@@            Coverage Diff             @@
##             main    #2513      +/-   ##
==========================================
+ Coverage   50.38%   50.98%   +0.59%     
==========================================
  Files         377      373       -4     
  Lines       36917    36812     -105     
==========================================
+ Hits        18600    18767     +167     
+ Misses      18317    18045     -272     
Impacted Files Coverage Δ
boa_ast/src/expression/access.rs 59.03% <0.00%> (+10.84%) ⬆️
boa_ast/src/expression/optional.rs 28.78% <0.00%> (ø)
boa_ast/src/function/mod.rs 100.00% <ø> (+12.90%) ⬆️
boa_ast/src/position.rs 51.72% <ø> (-41.38%) ⬇️
boa_ast/src/property.rs 52.23% <ø> (+8.95%) ⬆️
boa_ast/src/visitor.rs 12.79% <0.00%> (+2.20%) ⬆️
boa_engine/src/builtins/eval/mod.rs 4.25% <0.00%> (-0.19%) ⬇️
boa_engine/src/bytecompiler/class.rs 0.00% <0.00%> (ø)
boa_engine/src/object/jsobject.rs 65.48% <ø> (ø)
boa_engine/src/vm/flowgraph/mod.rs 0.00% <ø> (ø)
... and 61 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

Copy link
Member

@jedel1043 jedel1043 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really impressive work! I have some questions about our spec compliance though.

@@ -1773,58 +1772,119 @@ impl Object {
self.properties.remove(key)
}

/// Check if a private name exists.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm seeing this resembles the PrivateElementFind operation and friends. Could this be moved to boa_engine/src/object/operations.rs and adapted to somewhat resemble the spec operations? Probably also initialize_instance_elements.

I say this because there's a host hook HostEnsureCanAddPrivateElement that needs to be called on the PrivateFieldAdd and PrivateMethodOrAccessorAdd operations to restrict the addition of new private fields for an object.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call. I've refactored those methods and they are mostly equivalent to the spec now.

description: Sym,

/// The indices of the private name are included to ensure that private names are unique.
pub(crate) indices: (usize, usize),
Copy link
Member

@jedel1043 jedel1043 Jan 12, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was reading the spec about private names and it specifies that PrivateNames should be globally unique, but indices are only unique in the context of a single Context, right? I was thinking that the global uniqueness property is probably to restrict the access of private names from objects that share the same indices but don't belong to the same Context, but to me it seems like this doesn't prevent that? I ask this because I don't know if you've already considered that.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is still some uniqueness missing with this implementation. We indeed have to add some runtime unique identifier to separate PrivateName of multiple objects that are created from the same class. I think this will probably be some kind of Context wide index. As far as different Contexts go, I think that would need some further work as our Context is currently also a Realm. If we have figured out how we can separate those, the Context should be the outermost api to the engine and imo should the the uniqueness-border.

I left the runtime uniqueness out of the PR to limit the scope somewhat.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's okay! Can you add a TODO describing this then? It would be good to track this for when we implement proper Realms.

Copy link
Member

@jedel1043 jedel1043 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything looks good! Just some small nitpicks.
Also, thanks for adding the host_ensure_can_add_private_element! It'll make it easier to replace when the hooks API merges.

boa_engine/src/object/operations.rs Outdated Show resolved Hide resolved
boa_engine/src/object/operations.rs Outdated Show resolved Hide resolved
Copy link
Member

@jedel1043 jedel1043 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice job!

Copy link
Member

@nekevss nekevss left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

@jedel1043
Copy link
Member

bors r+

bors bot pushed a commit that referenced this pull request Jan 15, 2023
This Pull Request fixes various bugs related to classes.

The biggest changes are:

- Changed private names to be unique across multiple classes.
- Changed private name resolution to work via a visitor after a class is parsed. The way class early errors are defined makes it impossible to perform private name resolution while parsing.
- Added function names to class methods.
- Added class name binding to method function environments.
- Separated opcodes for `static` and non-`static` class method definitions to make the above operations possible.

There are still some bugs and further issues with classes but this is already a lot.
@bors
Copy link

bors bot commented Jan 15, 2023

Pull request successfully merged into main.

Build succeeded:

@bors bors bot changed the title Refactor some class features [Merged by Bors] - Refactor some class features Jan 15, 2023
@bors bors bot closed this Jan 15, 2023
@bors bors bot deleted the fix-class-bugs branch January 15, 2023 02:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ast Issue surrounding the abstract syntax tree bug Something isn't working execution Issues or PRs related to code execution parser Issues surrounding the parser
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants