mirror of
https://github.com/bendtherules/ask262.git
synced 2026-08-18 13:21:55 +00:00
42 lines
1.4 KiB
TypeScript
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);
|
|
}
|
|
}
|