mirror of
https://github.com/bendtherules/ask262.git
synced 2026-08-19 00:31:06 +00:00
Merge commit '6e92d2345e8231a44556ce7d416451f5f3e6c398' as 'engine262'
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import { surroundingAgent } from '../host-defined/engine.mts';
|
||||
import { Value } from '../value.mts';
|
||||
import { StringValue } from '../static-semantics/all.mts';
|
||||
import { Q, NormalCompletion } from '../completion.mts';
|
||||
import type { ParseNode } from '../parser/ParseNode.mts';
|
||||
import type { PlainEvaluator, ValueEvaluator } from '../evaluator.mts';
|
||||
import {
|
||||
InitializeBoundName, ClassDefinitionEvaluation, type DecoratorDefinitionRecord, DecoratorListEvaluation,
|
||||
} from './all.mts';
|
||||
|
||||
/** https://tc39.es/ecma262/#sec-runtime-semantics-bindingclassdeclarationevaluation */
|
||||
// ClassDeclaration :
|
||||
// `class` BindingIdentifier ClassTail
|
||||
// `class` ClassTail
|
||||
export function* BindingClassDeclarationEvaluation(ClassDeclaration: ParseNode.ClassDeclaration, decorators: readonly DecoratorDefinitionRecord[]): ValueEvaluator {
|
||||
const { BindingIdentifier, ClassTail } = ClassDeclaration;
|
||||
const sourceText = ClassDeclaration.sourceText;
|
||||
if (!BindingIdentifier) {
|
||||
return Q(yield* ClassDefinitionEvaluation(ClassTail, Value.undefined, Value('default'), sourceText, decorators));
|
||||
}
|
||||
// 1. Let className be StringValue of BindingIdentifier.
|
||||
const className = StringValue(BindingIdentifier);
|
||||
// 2. Let value be ? ClassDefinitionEvaluation of ClassTail with arguments className, className, decorators.
|
||||
const value = Q(yield* ClassDefinitionEvaluation(ClassTail, className, className, sourceText, decorators));
|
||||
// 4. Let env be the running execution context's LexicalEnvironment.
|
||||
const env = surroundingAgent.runningExecutionContext.LexicalEnvironment;
|
||||
// 5. Perform ? InitializeBoundName(className, value, env).
|
||||
Q(yield* InitializeBoundName(className, value, env));
|
||||
// 6. Return value.
|
||||
return value;
|
||||
}
|
||||
|
||||
/** https://tc39.es/ecma262/#sec-class-definitions-runtime-semantics-evaluation */
|
||||
// ClassDeclaration : `class` BindingIdentifier ClassTAil
|
||||
export function* Evaluate_ClassDeclaration(ClassDeclaration: ParseNode.ClassDeclaration): PlainEvaluator {
|
||||
const decorators = ClassDeclaration.Decorators ? Q(yield* DecoratorListEvaluation(ClassDeclaration.Decorators)) : [];
|
||||
// 1. Perform ? BindingClassDeclarationEvaluation of this ClassDeclaration.
|
||||
Q(yield* BindingClassDeclarationEvaluation(ClassDeclaration, decorators));
|
||||
// 2. Return NormalCompletion(empty).
|
||||
return NormalCompletion(undefined);
|
||||
}
|
||||
Reference in New Issue
Block a user