#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);
}
}
}