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

📄 global.java

📁 這是一個javascript 的 interpreter是了解 web browser的好材料
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino code, released * May 6, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1997-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): *   Patrick Beard *   Igor Bukanov *   Norris Boyd *   Rob Ginda *   Kurt Westerfeld *   Matthias Radestock * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */package org.mozilla.javascript.tools.shell;import java.io.*;import java.net.*;import java.lang.reflect.*;import org.mozilla.javascript.*;import org.mozilla.javascript.tools.ToolErrorReporter;import org.mozilla.javascript.serialize.*;/** * This class provides for sharing functions across multiple threads. * This is of particular interest to server applications. * * @author Norris Boyd */public class Global extends ImporterTopLevel{    static final long serialVersionUID = 4029130780977538005L;    NativeArray history;    private InputStream inStream;    private PrintStream outStream;    private PrintStream errStream;    private boolean sealedStdLib = false;    boolean initialized;    private QuitAction quitAction;    private String[] prompts = { "js> ", "  > " };    public Global()    {    }    public Global(Context cx)    {        init(cx);    }    public boolean isInitialized() {        return initialized;    }    /**     * Set the action to call from quit().     */    public void initQuitAction(QuitAction quitAction)    {        if (quitAction == null)            throw new IllegalArgumentException("quitAction is null");        if (this.quitAction != null)            throw new IllegalArgumentException("The method is once-call.");        this.quitAction = quitAction;    }    public void init(ContextFactory factory)    {        factory.call(new ContextAction() {                public Object run(Context cx)                {                    init(cx);                    return null;                }            });    }    public void init(Context cx)    {        // Define some global functions particular to the shell. Note        // that these functions are not part of ECMA.        initStandardObjects(cx, sealedStdLib);        String[] names = {            "defineClass",            "deserialize",            "gc",            "help",            "load",            "loadClass",            "print",            "quit",            "readFile",            "readUrl",            "runCommand",            "seal",            "serialize",            "spawn",            "sync",            "toint32",            "version",        };        defineFunctionProperties(names, Global.class,                                 ScriptableObject.DONTENUM);        // Set up "environment" in the global scope to provide access to the        // System environment variables.        Environment.defineClass(this);        Environment environment = new Environment(this);        defineProperty("environment", environment,                       ScriptableObject.DONTENUM);        history = (NativeArray) cx.newArray(this, 0);        defineProperty("history", history, ScriptableObject.DONTENUM);        initialized = true;    }    /**     * Print a help message.     *     * This method is defined as a JavaScript function.     */    public static void help(Context cx, Scriptable thisObj,                            Object[] args, Function funObj)    {        PrintStream out = getInstance(funObj).getOut();        out.println(ToolErrorReporter.getMessage("msg.help"));    }    public static void gc(Context cx, Scriptable thisObj,            Object[] args, Function funObj)    {        System.gc();    }    /**     * Print the string values of its arguments.     *     * This method is defined as a JavaScript function.     * Note that its arguments are of the "varargs" form, which     * allows it to handle an arbitrary number of arguments     * supplied to the JavaScript function.     *     */    public static Object print(Context cx, Scriptable thisObj,                               Object[] args, Function funObj)    {        PrintStream out = getInstance(funObj).getOut();        for (int i=0; i < args.length; i++) {            if (i > 0)                out.print(" ");            // Convert the arbitrary JavaScript value into a string form.            String s = Context.toString(args[i]);            out.print(s);        }        out.println();        return Context.getUndefinedValue();    }    /**     * Call embedding-specific quit action passing its argument as     * int32 exit code.     *     * This method is defined as a JavaScript function.     */    public static void quit(Context cx, Scriptable thisObj,                            Object[] args, Function funObj)    {        Global global = getInstance(funObj);        if (global.quitAction != null) {            int exitCode = (args.length == 0 ? 0                            : ScriptRuntime.toInt32(args[0]));            global.quitAction.quit(cx, exitCode);        }    }    /**     * Get and set the language version.     *     * This method is defined as a JavaScript function.     */    public static double version(Context cx, Scriptable thisObj,                                 Object[] args, Function funObj)    {        double result = cx.getLanguageVersion();        if (args.length > 0) {            double d = Context.toNumber(args[0]);            cx.setLanguageVersion((int) d);        }        return result;    }    /**     * Load and execute a set of JavaScript source files.     *     * This method is defined as a JavaScript function.     *     */    public static void load(Context cx, Scriptable thisObj,                            Object[] args, Function funObj)    {        for (int i = 0; i < args.length; i++) {            Main.processFile(cx, thisObj, Context.toString(args[i]));        }    }    /**     * Load a Java class that defines a JavaScript object using the     * conventions outlined in ScriptableObject.defineClass.     * <p>     * This method is defined as a JavaScript function.     * @exception IllegalAccessException if access is not available     *            to a reflected class member     * @exception InstantiationException if unable to instantiate     *            the named class     * @exception InvocationTargetException if an exception is thrown     *            during execution of methods of the named class     * @see org.mozilla.javascript.ScriptableObject#defineClass(Scriptable,Class)     */    public static void defineClass(Context cx, Scriptable thisObj,                                   Object[] args, Function funObj)        throws IllegalAccessException, InstantiationException,               InvocationTargetException    {        Class clazz = getClass(args);        ScriptableObject.defineClass(thisObj, clazz);    }    /**     * Load and execute a script compiled to a class file.     * <p>     * This method is defined as a JavaScript function.     * When called as a JavaScript function, a single argument is     * expected. This argument should be the name of a class that     * implements the Script interface, as will any script     * compiled by jsc.     *     * @exception IllegalAccessException if access is not available     *            to the class     * @exception InstantiationException if unable to instantiate     *            the named class     */    public static void loadClass(Context cx, Scriptable thisObj,                                 Object[] args, Function funObj)        throws IllegalAccessException, InstantiationException    {        Class clazz = getClass(args);        if (!Script.class.isAssignableFrom(clazz)) {            throw reportRuntimeError("msg.must.implement.Script");        }        Script script = (Script) clazz.newInstance();        script.exec(cx, thisObj);    }    private static Class getClass(Object[] args) {        if (args.length == 0) {            throw reportRuntimeError("msg.expected.string.arg");        }        Object arg0 = args[0];        if (arg0 instanceof Wrapper) {            Object wrapped = ((Wrapper)arg0).unwrap();            if (wrapped instanceof Class)                return (Class)wrapped;        }        String className = Context.toString(args[0]);        try {            return Class.forName(className);        }        catch (ClassNotFoundException cnfe) {            throw reportRuntimeError("msg.class.not.found", className);        }    }    public static void serialize(Context cx, Scriptable thisObj,                                 Object[] args, Function funObj)        throws IOException    {        if (args.length < 2) {            throw Context.reportRuntimeError(                "Expected an object to serialize and a filename to write " +                "the serialization to");        }        Object obj = args[0];        String filename = Context.toString(args[1]);        FileOutputStream fos = new FileOutputStream(filename);        Scriptable scope = ScriptableObject.getTopLevelScope(thisObj);        ScriptableOutputStream out = new ScriptableOutputStream(fos, scope);        out.writeObject(obj);        out.close();    }    public static Object deserialize(Context cx, Scriptable thisObj,                                     Object[] args, Function funObj)        throws IOException, ClassNotFoundException    {        if (args.length < 1) {            throw Context.reportRuntimeError(                "Expected a filename to read the serialization from");        }        String filename = Context.toString(args[0]);        FileInputStream fis = new FileInputStream(filename);        Scriptable scope = ScriptableObject.getTopLevelScope(thisObj);        ObjectInputStream in = new ScriptableInputStream(fis, scope);        Object deserialized = in.readObject();        in.close();        return Context.toObject(deserialized, scope);    }        public String[] getPrompts(Context cx) {        if (ScriptableObject.hasProperty(this, "prompts")) {            Object promptsJS = ScriptableObject.getProperty(this,                                                            "prompts");            if (promptsJS instanceof Scriptable) {                Scriptable s = (Scriptable) promptsJS;

⌨️ 快捷键说明

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