Files
ask262/engine262/src/execution-context/PrivateEnvironment.mts
T

42 lines
1.4 KiB
TypeScript

import {
type PrivateName, type GCMarker, Assert, JSStringValue, NullValue,
} from '#self';
/** https://tc39.es/ecma262/#sec-privateenvironment-records */
export class PrivateEnvironmentRecord {
readonly OuterPrivateEnvironment: PrivateEnvironmentRecord | NullValue;
readonly Names: PrivateName[] = [];
/** https://tc39.es/ecma262/#sec-newprivateenvironment */
constructor(outerEnv: PrivateEnvironmentRecord | NullValue) {
this.OuterPrivateEnvironment = outerEnv;
}
mark(m: GCMarker) {
this.Names.forEach((name) => {
m(name);
});
}
}
/** https://tc39.es/ecma262/#sec-resolve-private-identifier */
export function ResolvePrivateIdentifier(privEnv: PrivateEnvironmentRecord, identifier: JSStringValue) {
// 1. Let names be privEnv.[[Names]].
const names = privEnv.Names;
// 2. If names contains a Private Name whose [[Description]] is identifier, then
const name = names.find((n) => n.Description.stringValue() === identifier.stringValue());
if (name) {
// a. Let name be that Private Name.
// b. Return name.
return name;
} else { // 3. Else,
// a. Let outerPrivEnv be privEnv.[[OuterPrivateEnvironment]].
const outerPrivEnv = privEnv.OuterPrivateEnvironment;
// b. Assert: outerPrivEnv is not null.
Assert(!(outerPrivEnv instanceof NullValue));
// c. Return ResolvePrivateIdentifier(outerPrivEnv, identifier).
return ResolvePrivateIdentifier(outerPrivEnv, identifier);
}
}