#nullable enable using Jint.Native; using Jint.Native.Function; using Jint.Native.Object; namespace Jint.Runtime.Environments { internal static class JintEnvironment { internal static bool TryGetIdentifierEnvironmentWithBindingValue( Engine engine, EnvironmentRecord? lex, in EnvironmentRecord.BindingName name, bool strict, out EnvironmentRecord? record, out JsValue? value) { record = default; value = default; if (ReferenceEquals(lex, engine.Realm.GlobalEnv) && lex.TryGetBinding(name, strict, out _, out value)) { record = lex; return true; } while (!ReferenceEquals(lex, null)) { if (lex.TryGetBinding( name, strict, out _, out value)) { record = lex; return true; } lex = lex._outerEnv; } return false; } /// /// https://tc39.es/ecma262/#sec-newdeclarativeenvironment /// internal static DeclarativeEnvironmentRecord NewDeclarativeEnvironment(Engine engine, EnvironmentRecord outer, bool catchEnvironment = false) { return new DeclarativeEnvironmentRecord(engine, catchEnvironment) { _outerEnv = outer }; } /// /// https://tc39.es/ecma262/#sec-newfunctionenvironment /// internal static FunctionEnvironmentRecord NewFunctionEnvironment(Engine engine, FunctionInstance f, JsValue newTarget) { return new FunctionEnvironmentRecord(engine, f, newTarget) { _outerEnv = f._environment }; } /// /// https://tc39.es/ecma262/#sec-newglobalenvironment /// internal static GlobalEnvironmentRecord NewGlobalEnvironment(Engine engine, ObjectInstance objectInstance, JsValue thisValue) { return new GlobalEnvironmentRecord(engine, objectInstance) { _outerEnv = null }; } /// /// https://tc39.es/ecma262/#sec-newobjectenvironment /// internal static ObjectEnvironmentRecord NewObjectEnvironment(Engine engine, ObjectInstance objectInstance, EnvironmentRecord outer, bool provideThis, bool withEnvironment = false) { return new ObjectEnvironmentRecord(engine, objectInstance, provideThis, withEnvironment) { _outerEnv = outer }; } /// /// https://tc39.es/ecma262/#sec-newprivateenvironment /// internal static PrivateEnvironmentRecord NewPrivateEnvironment(Engine engine, PrivateEnvironmentRecord outerPriv) { return new PrivateEnvironmentRecord(outerPriv); } } }