⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 context.java

📁 這是一個javascript 的 interpreter是了解 web browser的好材料
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     * ContextFactory instance.     * @deprecated use {@link ContextFactory#enter()} or      * {@link ContextFactory#call(ContextAction)} instead as this method relies     * on usage of a static singleton "global" ContextFactory.     * @return a Context associated with the current thread     * @see #getCurrentContext()     * @see #exit()     * @see #call(ContextAction)     */    public static Context enter()    {        return enter(null);    }    /**     * Get a Context associated with the current thread, using     * the given Context if need be.     * <p>     * The same as <code>enter()</code> except that <code>cx</code>     * is associated with the current thread and returned if     * the current thread has no associated context and <code>cx</code>     * is not associated with any other thread.     * @param cx a Context to associate with the thread if possible     * @return a Context associated with the current thread     * @deprecated use {@link ContextFactory#enterContext(Context)} instead as      * this method relies on usage of a static singleton "global" ContextFactory.     * @see ContextFactory#enterContext(Context)     * @see ContextFactory#call(ContextAction)     */    public static Context enter(Context cx)    {        return enter(cx, ContextFactory.getGlobal());    }        static final Context enter(Context cx, ContextFactory factory)    {        Object helper = VMBridge.instance.getThreadContextHelper();        Context old = VMBridge.instance.getContext(helper);        if (old != null) {            cx = old;        } else {            if (cx == null) {                cx = factory.makeContext();                if (cx.enterCount != 0) {                    throw new IllegalStateException("factory.makeContext() returned Context instance already associated with some thread");                }                factory.onContextCreated(cx);                if (factory.isSealed() && !cx.isSealed()) {                    cx.seal(null);                }            } else {                if (cx.enterCount != 0) {                    throw new IllegalStateException("can not use Context instance already associated with some thread");                }            }            VMBridge.instance.setContext(helper, cx);        }        ++cx.enterCount;        return cx;     }    /**     * Exit a block of code requiring a Context.     *     * Calling <code>exit()</code> will remove the association between     * the current thread and a Context if the prior call to     * {@link ContextFactory#enterContext()} on this thread newly associated a      * Context with this thread. Once the current thread no longer has an      * associated Context, it cannot be used to execute JavaScript until it is      * again associated with a Context.     * @see ContextFactory#enterContext()     */    public static void exit()    {        Object helper = VMBridge.instance.getThreadContextHelper();        Context cx = VMBridge.instance.getContext(helper);        if (cx == null) {            throw new IllegalStateException(                "Calling Context.exit without previous Context.enter");        }        if (cx.enterCount < 1) Kit.codeBug();        if (--cx.enterCount == 0) {            VMBridge.instance.setContext(helper, null);            cx.factory.onContextReleased(cx);        }    }        /**     * Call {@link ContextAction#run(Context cx)}     * using the Context instance associated with the current thread.     * If no Context is associated with the thread, then     * <tt>ContextFactory.getGlobal().makeContext()</tt> will be called to     * construct new Context instance. The instance will be temporary     * associated with the thread during call to     * {@link ContextAction#run(Context)}.     * @deprecated use {@link ContextFactory#call(ContextAction)} instead as      * this method relies on usage of a static singleton "global"      * ContextFactory.     * @return The result of {@link ContextAction#run(Context)}.     */    public static Object call(ContextAction action)    {        return call(ContextFactory.getGlobal(), action);    }    /**     * Call {@link     * Callable#call(Context cx, Scriptable scope, Scriptable thisObj,     *               Object[] args)}     * using the Context instance associated with the current thread.     * If no Context is associated with the thread, then     * {@link ContextFactory#makeContext()} will be called to construct     * new Context instance. The instance will be temporary associated     * with the thread during call to {@link ContextAction#run(Context)}.     * <p>     * It is allowed but not advisable to use null for <tt>factory</tt>      * argument in which case the global static singleton ContextFactory      * instance will be used to create new context instances.     * @see ContextFactory#call(ContextAction)     */    public static Object call(ContextFactory factory, final Callable callable,                              final Scriptable scope, final Scriptable thisObj,                              final Object[] args)    {        if(factory == null) {            factory = ContextFactory.getGlobal();        }        return call(factory, new ContextAction() {            public Object run(Context cx) {                return callable.call(cx, scope, thisObj, args);            }        });    }        /**     * The method implements {@links ContextFactory#call(ContextAction)} logic.     */    static Object call(ContextFactory factory, ContextAction action) {        Context cx = enter(null, factory);        try {            return action.run(cx);        }        finally {            exit();        }    }    /**     * @deprecated     * @see ContextFactory#addListener(ContextFactory.Listener)     * @see ContextFactory#getGlobal()     */    public static void addContextListener(ContextListener listener)    {        // Special workaround for the debugger        String DBG = "org.mozilla.javascript.tools.debugger.Main";        if (DBG.equals(listener.getClass().getName())) {            Class cl = listener.getClass();            Class factoryClass = Kit.classOrNull(                "org.mozilla.javascript.ContextFactory");            Class[] sig = { factoryClass };            Object[] args = { ContextFactory.getGlobal() };            try {                Method m = cl.getMethod("attachTo", sig);                m.invoke(listener, args);            } catch (Exception ex) {                RuntimeException rex = new RuntimeException();                Kit.initCause(rex, ex);                throw rex;            }            return;        }        ContextFactory.getGlobal().addListener(listener);    }    /**     * @deprecated     * @see ContextFactory#removeListener(ContextFactory.Listener)     * @see ContextFactory#getGlobal()     */    public static void removeContextListener(ContextListener listener)    {        ContextFactory.getGlobal().addListener(listener);    }    /**     * Return {@link ContextFactory} instance used to create this Context.     */    public final ContextFactory getFactory()    {        return factory;    }    /**     * Checks if this is a sealed Context. A sealed Context instance does not     * allow to modify any of its properties and will throw an exception     * on any such attempt.     * @see #seal(Object sealKey)     */    public final boolean isSealed()    {        return sealed;    }    /**     * Seal this Context object so any attempt to modify any of its properties     * including calling {@link #enter()} and {@link #exit()} methods will     * throw an exception.     * <p>     * If <tt>sealKey</tt> is not null, calling     * {@link #unseal(Object sealKey)} with the same key unseals     * the object. If <tt>sealKey</tt> is null, unsealing is no longer possible.     *     * @see #isSealed()     * @see #unseal(Object)     */    public final void seal(Object sealKey)    {        if (sealed) onSealedMutation();        sealed = true;        this.sealKey = sealKey;    }    /**     * Unseal previously sealed Context object.     * The <tt>sealKey</tt> argument should not be null and should match     * <tt>sealKey</tt> suplied with the last call to     * {@link #seal(Object)} or an exception will be thrown.     *     * @see #isSealed()     * @see #seal(Object sealKey)     */    public final void unseal(Object sealKey)    {        if (sealKey == null) throw new IllegalArgumentException();        if (this.sealKey != sealKey) throw new IllegalArgumentException();        if (!sealed) throw new IllegalStateException();        sealed = false;        this.sealKey = null;    }    static void onSealedMutation()    {        throw new IllegalStateException();    }    /**     * Get the current language version.     * <p>     * The language version number affects JavaScript semantics as detailed     * in the overview documentation.     *     * @return an integer that is one of VERSION_1_0, VERSION_1_1, etc.     */    public final int getLanguageVersion()    {       return version;    }    /**     * Set the language version.     *     * <p>     * Setting the language version will affect functions and scripts compiled     * subsequently. See the overview documentation for version-specific     * behavior.     *     * @param version the version as specified by VERSION_1_0, VERSION_1_1, etc.     */    public void setLanguageVersion(int version)    {        if (sealed) onSealedMutation();        checkLanguageVersion(version);        Object listeners = propertyListeners;        if (listeners != null && version != this.version) {            firePropertyChangeImpl(listeners, languageVersionProperty,                               new Integer(this.version),                               new Integer(version));        }        this.version = version;    }    public static boolean isValidLanguageVersion(int version)    {        switch (version) {            case VERSION_DEFAULT:            case VERSION_1_0:            case VERSION_1_1:            case VERSION_1_2:            case VERSION_1_3:            case VERSION_1_4:            case VERSION_1_5:            case VERSION_1_6:            case VERSION_1_7:                return true;        }        return false;    }    public static void checkLanguageVersion(int version)    {        if (isValidLanguageVersion(version)) {            return;        }        throw new IllegalArgumentException("Bad language version: "+version);    }    /**     * Get the implementation version.     *     * <p>     * The implementation version is of the form     * <pre>     *    "<i>name langVer</i> <code>release</code> <i>relNum date</i>"     * </pre>     * where <i>name</i> is the name of the product, <i>langVer</i> is     * the language version, <i>relNum</i> is the release number, and     * <i>date</i> is the release date for that specific     * release in the form "yyyy mm dd".     *     * @return a string that encodes the product, language version, release     *         number, and date.     */    public final String getImplementationVersion()    {        // XXX Probably it would be better to embed this directly into source        // with special build preprocessing but that would require some ant        // tweaking and then replacing token in resource files was simpler        if (implementationVersion == null) {            implementationVersion                = ScriptRuntime.getMessage0("implementation.version");        }        return implementationVersion;    }    /**     * Get the current error reporter.     *     * @see org.mozilla.javascript.ErrorReporter     */    public final ErrorReporter getErrorReporter()    {        if (errorReporter == null) {            return DefaultErrorReporter.instance;        }        return errorReporter;    }    /**     * Change the current error reporter.     *     * @return the previous error reporter     * @see org.mozilla.javascript.ErrorReporter     */    public final ErrorReporter setErrorReporter(ErrorReporter reporter)    {        if (sealed) onSealedMutation();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -