using Jint.Native.Global; using Jint.Native.Object; using Jint.Runtime.Environments; namespace Jint.Runtime { public class Host { protected Engine Engine { get; private set; } /// /// Initializes the host. /// public void Initialize(Engine engine) { Engine = engine; InitializeHostDefinedRealm(); PostInitialize(); } protected virtual void PostInitialize() { } /// /// https://tc39.es/ecma262/#sec-initializehostdefinedrealm /// protected virtual void InitializeHostDefinedRealm() { var realm = CreateRealm(); var newContext = new ExecutionContext( lexicalEnvironment: realm.GlobalEnv, variableEnvironment: realm.GlobalEnv, privateEnvironment: null, realm: realm, function: null); Engine.EnterExecutionContext(newContext); } protected virtual GlobalEnvironmentRecord CreateGlobalEnvironment(ObjectInstance globalObject) { return JintEnvironment.NewGlobalEnvironment(Engine, globalObject, globalObject); } protected virtual ObjectInstance CreateGlobalObject(Realm realm) { var globalObject = new GlobalObject(Engine, realm); // Because the properties might need some of the built-in object // their configuration is delayed to a later step // trigger initialization globalObject.EnsureInitialized(); return globalObject; } /// /// https://tc39.es/ecma262/#sec-createrealm /// protected internal virtual Realm CreateRealm() { var realmRec = new Realm(); Engine._realmInConstruction = realmRec; CreateIntrinsics(realmRec); var globalObject = CreateGlobalObject(realmRec); var globalEnv = CreateGlobalEnvironment(globalObject); realmRec.GlobalEnv = globalEnv; realmRec.GlobalObject = globalObject; Engine._realmInConstruction = null; return realmRec; } /// /// https://tc39.es/ecma262/#sec-createintrinsics /// protected virtual void CreateIntrinsics(Realm realmRec) { var intrinsics = new Intrinsics(Engine, realmRec); realmRec.Intrinsics = intrinsics; } /// /// https://tc39.es/ecma262/#sec-hostensurecancompilestrings /// /// /// public virtual void EnsureCanCompileStrings(Realm callerRealm, Realm evalRealm) { } } }