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

📄 main.java

📁 javascript语言的解释器源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            if (filename == null) {                // print implementation version                ps.println(cx.getImplementationVersion());            }            // Use the interpreter for interactive input            cx.setOptimizationLevel(-1);            BufferedReader in = new BufferedReader                (new InputStreamReader(global.getIn()));            int lineno = 1;            boolean hitEOF = false;            while (!hitEOF) {                int startline = lineno;                if (filename == null)                    ps.print("js> ");                ps.flush();                String source = "";                // Collect lines of source to compile.                while (true) {                    String newline;                    try {                        newline = in.readLine();                    }                    catch (IOException ioe) {                        ps.println(ioe.toString());                        break;                    }                    if (newline == null) {                        hitEOF = true;                        break;                    }                    source = source + newline + "\n";                    lineno++;                    if (cx.stringIsCompilableUnit(source))                        break;                }                Script script = loadScriptFromSource(cx, source, "<stdin>",                                                     lineno, null);                if (script != null) {                    Object result = evaluateScript(script, cx, global);                    if (result != Context.getUndefinedValue()) {                        try {                            ps.println(Context.toString(result));                        } catch (RhinoException rex) {                            ToolErrorReporter.reportException(                                cx.getErrorReporter(), rex);                        }                    }                    NativeArray h = global.history;                    h.put((int)h.getLength(), h, source);                }            }            ps.println();        } else {            processFile(cx, global, filename);        }        System.gc();    }    public static void processFile(Context cx, Scriptable scope,                                   String filename)    {        if (securityImpl == null) {            processFileSecure(cx, scope, filename, null);        } else {            securityImpl.callProcessFileSecure(cx, scope, filename);        }    }    static void processFileSecure(Context cx, Scriptable scope,                                  String path, Object securityDomain)    {        Script script;        if (path.endsWith(".class")) {            script = loadCompiledScript(cx, path, securityDomain);        } else {            String source = (String)readFileOrUrl(path, true);            if (source == null) {                exitCode = EXITCODE_FILE_NOT_FOUND;                return;            }            // Support the executable script #! syntax:  If            // the first line begins with a '#', treat the whole            // line as a comment.            if (source.length() > 0 && source.charAt(0) == '#') {                for (int i = 1; i != source.length(); ++i) {                    int c = source.charAt(i);                    if (c == '\n' || c == '\r') {                        source = source.substring(i);                        break;                    }                }            }            script = loadScriptFromSource(cx, source, path, 1, securityDomain);        }        if (script != null) {            evaluateScript(script, cx, scope);        }    }    public static Script loadScriptFromSource(Context cx, String scriptSource,                                              String path, int lineno,                                              Object securityDomain)    {        try {            return cx.compileString(scriptSource, path, lineno,                                    securityDomain);        } catch (EvaluatorException ee) {            // Already printed message.            exitCode = EXITCODE_RUNTIME_ERROR;        } catch (RhinoException rex) {            ToolErrorReporter.reportException(                cx.getErrorReporter(), rex);            exitCode = EXITCODE_RUNTIME_ERROR;        } catch (VirtualMachineError ex) {            // Treat StackOverflow and OutOfMemory as runtime errors            ex.printStackTrace();            String msg = ToolErrorReporter.getMessage(                "msg.uncaughtJSException", ex.toString());            exitCode = EXITCODE_RUNTIME_ERROR;            Context.reportError(msg);        }        return null;    }    private static Script loadCompiledScript(Context cx, String path,                                             Object securityDomain)    {        byte[] data = (byte[])readFileOrUrl(path, false);        if (data == null) {            exitCode = EXITCODE_FILE_NOT_FOUND;            return null;        }        // XXX: For now extract class name of compiled Script from path        // instead of parsing class bytes        int nameStart = path.lastIndexOf('/');        if (nameStart < 0) {            nameStart = 0;        } else {            ++nameStart;        }        int nameEnd = path.lastIndexOf('.');        if (nameEnd < nameStart) {            // '.' does not exist in path (nameEnd < 0)            // or it comes before nameStart            nameEnd = path.length();        }        String name = path.substring(nameStart, nameEnd);        try {            GeneratedClassLoader loader = SecurityController.createLoader(cx.getApplicationClassLoader(), securityDomain);            Class clazz = loader.defineClass(name, data);            loader.linkClass(clazz);            if (!Script.class.isAssignableFrom(clazz)) {                throw Context.reportRuntimeError("msg.must.implement.Script");            }            return (Script) clazz.newInstance();         } catch (RhinoException rex) {            ToolErrorReporter.reportException(                cx.getErrorReporter(), rex);            exitCode = EXITCODE_RUNTIME_ERROR;        } catch (IllegalAccessException iaex) {            exitCode = EXITCODE_RUNTIME_ERROR;            Context.reportError(iaex.toString());        } catch (InstantiationException inex) {            exitCode = EXITCODE_RUNTIME_ERROR;            Context.reportError(inex.toString());        }        return null;    }    public static Object evaluateScript(Script script, Context cx,                                        Scriptable scope)    {        try {            return script.exec(cx, scope);        } catch (RhinoException rex) {            ToolErrorReporter.reportException(                cx.getErrorReporter(), rex);            exitCode = EXITCODE_RUNTIME_ERROR;        } catch (VirtualMachineError ex) {            // Treat StackOverflow and OutOfMemory as runtime errors            ex.printStackTrace();            String msg = ToolErrorReporter.getMessage(                "msg.uncaughtJSException", ex.toString());            exitCode = EXITCODE_RUNTIME_ERROR;            Context.reportError(msg);        }        return Context.getUndefinedValue();    }    public static InputStream getIn() {        return getGlobal().getIn();    }    public static void setIn(InputStream in) {        getGlobal().setIn(in);    }    public static PrintStream getOut() {        return getGlobal().getOut();    }    public static void setOut(PrintStream out) {        getGlobal().setOut(out);    }    public static PrintStream getErr() {        return getGlobal().getErr();    }    public static void setErr(PrintStream err) {        getGlobal().setErr(err);    }    /**     * Read file or url specified by <tt>path</tt>.     * @return file or url content as <tt>byte[]</tt> or as <tt>String</tt> if     * <tt>convertToString</tt> is true.     */    private static Object readFileOrUrl(String path, boolean convertToString)    {        URL url = null;        // Assume path is URL if it contains dot and there are at least        // 2 characters in the protocol part. The later allows under Windows        // to interpret paths with driver letter as file, not URL.        if (path.indexOf(':') >= 2) {            try {                url = new URL(path);            } catch (MalformedURLException ex) {            }        }        InputStream is = null;        int capacityHint = 0;        if (url == null) {            File file = new File(path);            capacityHint = (int)file.length();            try {                is = new FileInputStream(file);            } catch (IOException ex) {                Context.reportError(ToolErrorReporter.getMessage(                    "msg.couldnt.open", path));                return null;            }        } else {            try {                URLConnection uc = url.openConnection();                is = uc.getInputStream();                capacityHint = uc.getContentLength();                // Ignore insane values for Content-Length                if (capacityHint > (1 << 20)) {                    capacityHint = -1;                }            } catch (IOException ex) {                Context.reportError(ToolErrorReporter.getMessage(                    "msg.couldnt.open.url", url.toString(), ex.toString()));                return null;            }        }        if (capacityHint <= 0) {            capacityHint = 4096;        }        byte[] data;        try {            try {                data = Kit.readStream(is, capacityHint);            } finally {                is.close();            }        } catch (IOException ex) {            Context.reportError(ex.toString());            return null;        }        Object result;        if (!convertToString) {            result = data;        } else {            // Convert to String using the default encoding            // XXX: Use 'charset=' argument of Content-Type if URL?            result = new String(data);        }        return result;    }    static protected final Global global = new Global();    static protected ToolErrorReporter errorReporter;    static protected int exitCode = 0;    static private final int EXITCODE_RUNTIME_ERROR = 3;    static private final int EXITCODE_FILE_NOT_FOUND = 4;    static boolean processStdin = true;    static Vector fileList = new Vector(5);    private static SecurityProxy securityImpl;}

⌨️ 快捷键说明

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