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

📄 irfactory.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
                pn.addChildToBack(rethrow);            }            pn.addChildToBack(endCatch);        }        if (hasFinally) {            Node finallyTarget = Node.newTarget();            pn.setFinally(finallyTarget);            // add jsr finally to the try block            pn.addChildToBack(makeJump(Token.JSR, finallyTarget));            // jump around finally code            Node finallyEnd = Node.newTarget();            pn.addChildToBack(makeJump(Token.GOTO, finallyEnd));            pn.addChildToBack(finallyTarget);            Node fBlock = new Node(Token.FINALLY, finallyBlock);            fBlock.putProp(Node.LOCAL_BLOCK_PROP, handlerBlock);            pn.addChildToBack(fBlock);            pn.addChildToBack(finallyEnd);        }        handlerBlock.addChildToBack(pn);        return handlerBlock;    }    /**     * Throw, Return, Label, Break and Continue are defined in ASTFactory.     */    /**     * With     */    Node createWith(Node obj, Node body, int lineno)    {        setRequiresActivation();        Node result = new Node(Token.BLOCK, lineno);        result.addChildToBack(new Node(Token.ENTERWITH, obj));        Node bodyNode = new Node(Token.WITH, body, lineno);        result.addChildrenToBack(bodyNode);        result.addChildToBack(new Node(Token.LEAVEWITH));        return result;    }    /**     * DOTQUERY     */    public Node createDotQuery (Node obj, Node body, int lineno)    {        setRequiresActivation();        Node result = new Node(Token.DOTQUERY, obj, body, lineno);        return result;    }    Node createArrayLiteral(ObjArray elems, int skipCount)    {        int length = elems.size();        int[] skipIndexes = null;        if (skipCount != 0) {            skipIndexes = new int[skipCount];        }        Node array = new Node(Token.ARRAYLIT);        for (int i = 0, j = 0; i != length; ++i) {            Node elem = (Node)elems.get(i);            if (elem != null) {                array.addChildToBack(elem);            } else {                skipIndexes[j] = i;                ++j;            }        }        if (skipCount != 0) {            array.putProp(Node.SKIP_INDEXES_PROP, skipIndexes);        }        return array;    }    /**     * Object Literals     * <BR> createObjectLiteral rewrites its argument as object     * creation plus object property entries, so later compiler     * stages don't need to know about object literals.     */    Node createObjectLiteral(ObjArray elems)    {        int size = elems.size() / 2;        Node object = new Node(Token.OBJECTLIT);        Object[] properties;        if (size == 0) {            properties = ScriptRuntime.emptyArgs;        } else {            properties = new Object[size];            for (int i = 0; i != size; ++i) {                properties[i] = elems.get(2 * i);                Node value = (Node)elems.get(2 * i + 1);                object.addChildToBack(value);            }        }        object.putProp(Node.OBJECT_IDS_PROP, properties);        return object;    }    /**     * Regular expressions     */    Node createRegExp(int regexpIndex)    {        Node n = new Node(Token.REGEXP);        n.putIntProp(Node.REGEXP_PROP, regexpIndex);        return n;    }    /**     * If statement     */    Node createIf(Node cond, Node ifTrue, Node ifFalse, int lineno)    {        int condStatus = isAlwaysDefinedBoolean(cond);        if (condStatus == ALWAYS_TRUE_BOOLEAN) {            return ifTrue;        } else if (condStatus == ALWAYS_FALSE_BOOLEAN) {            if (ifFalse != null) {                return ifFalse;            }            // Replace if (false) xxx by empty block            return new Node(Token.BLOCK, lineno);        }        Node result = new Node(Token.BLOCK, lineno);        Node ifNotTarget = Node.newTarget();        Node.Jump IFNE = new Node.Jump(Token.IFNE, cond);        IFNE.target = ifNotTarget;        result.addChildToBack(IFNE);        result.addChildrenToBack(ifTrue);        if (ifFalse != null) {            Node endTarget = Node.newTarget();            result.addChildToBack(makeJump(Token.GOTO, endTarget));            result.addChildToBack(ifNotTarget);            result.addChildrenToBack(ifFalse);            result.addChildToBack(endTarget);        } else {            result.addChildToBack(ifNotTarget);        }        return result;    }    Node createCondExpr(Node cond, Node ifTrue, Node ifFalse)    {        int condStatus = isAlwaysDefinedBoolean(cond);        if (condStatus == ALWAYS_TRUE_BOOLEAN) {            return ifTrue;        } else if (condStatus == ALWAYS_FALSE_BOOLEAN) {            return ifFalse;        }        return new Node(Token.HOOK, cond, ifTrue, ifFalse);    }    /**     * Unary     */    Node createUnary(int nodeType, Node child)    {        int childType = child.getType();        switch (nodeType) {          case Token.DELPROP: {            Node n;            if (childType == Token.NAME) {                // Transform Delete(Name "a")                //  to Delete(Bind("a"), String("a"))                child.setType(Token.BINDNAME);                Node left = child;                Node right = Node.newString(child.getString());                n = new Node(nodeType, left, right);            } else if (childType == Token.GETPROP ||                       childType == Token.GETELEM)            {                Node left = child.getFirstChild();                Node right = child.getLastChild();                child.removeChild(left);                child.removeChild(right);                n = new Node(nodeType, left, right);            } else if (childType == Token.GET_REF) {                Node ref = child.getFirstChild();                child.removeChild(ref);                n = new Node(Token.DEL_REF, ref);            } else {                n = new Node(Token.TRUE);            }            return n;          }          case Token.TYPEOF:            if (childType == Token.NAME) {                child.setType(Token.TYPEOFNAME);                return child;            }            break;          case Token.BITNOT:            if (childType == Token.NUMBER) {                int value = ScriptRuntime.toInt32(child.getDouble());                child.setDouble(~value);                return child;            }            break;          case Token.NEG:            if (childType == Token.NUMBER) {                child.setDouble(-child.getDouble());                return child;            }            break;          case Token.NOT: {            int status = isAlwaysDefinedBoolean(child);            if (status != 0) {                int type;                if (status == ALWAYS_TRUE_BOOLEAN) {                    type = Token.FALSE;                } else {                    type = Token.TRUE;                }                if (childType == Token.TRUE || childType == Token.FALSE) {                    child.setType(type);                    return child;                }                return new Node(type);            }            break;          }        }        return new Node(nodeType, child);    }    Node createCallOrNew(int nodeType, Node child)    {        int type = Node.NON_SPECIALCALL;        if (child.getType() == Token.NAME) {            String name = child.getString();            if (name.equals("eval")) {                type = Node.SPECIALCALL_EVAL;            } else if (name.equals("With")) {                type = Node.SPECIALCALL_WITH;            }        } else if (child.getType() == Token.GETPROP) {            String name = child.getLastChild().getString();            if (name.equals("eval")) {                type = Node.SPECIALCALL_EVAL;            }        }        Node node = new Node(nodeType, child);        if (type != Node.NON_SPECIALCALL) {            // Calls to these functions require activation objects.            setRequiresActivation();            node.putIntProp(Node.SPECIALCALL_PROP, type);        }        return node;    }    Node createIncDec(int nodeType, boolean post, Node child)    {        child = makeReference(child);        if (child == null) {            String msg;            if (nodeType == Token.DEC) {                msg = "msg.bad.decr";            } else {                msg = "msg.bad.incr";            }            parser.reportError(msg);            return null;        }        int childType = child.getType();        switch (childType) {          case Token.NAME:          case Token.GETPROP:          case Token.GETELEM:          case Token.GET_REF: {            Node n = new Node(nodeType, child);            int incrDecrMask = 0;            if (nodeType == Token.DEC) {                incrDecrMask |= Node.DECR_FLAG;            }            if (post) {                incrDecrMask |= Node.POST_FLAG;            }            n.putIntProp(Node.INCRDECR_PROP, incrDecrMask);            return n;          }        }        throw Kit.codeBug();    }    Node createPropertyGet(Node target, String namespace, String name,                           int memberTypeFlags)    {        if (namespace == null && memberTypeFlags == 0) {            if (target == null) {                return createName(name);            }            checkActivationName(name, Token.GETPROP);            if (ScriptRuntime.isSpecialProperty(name)) {                Node ref = new Node(Token.REF_SPECIAL, target);                ref.putProp(Node.NAME_PROP, name);                return new Node(Token.GET_REF, ref);            }            return new Node(Token.GETPROP, target, createString(name));        }        Node elem = createString(name);        memberTypeFlags |= Node.PROPERTY_FLAG;        return createMemberRefGet(target, namespace, elem, memberTypeFlags);    }    Node createElementGet(Node target, String namespace, Node elem,                          int memberTypeFlags)    {        // OPT: could optimize to createPropertyGet        // iff elem is string that can not be number        if (namespace == null && memberTypeFlags == 0) {            // stand-alone [aaa] as primary expression is array literal            // declaration and should not come here!            if (target == null) throw Kit.codeBug();            return new Node(Token.GETELEM, target, elem);        }        return createMemberRefGet(target, namespace, elem, memberTypeFlags);    }    private Node createMemberRefGet(Node target, String namespace, Node elem,                                    int memberTypeFlags)    {        Node nsNode = null;        if (namespace != null) {            // See 11.1.2 in ECMA 357            if (namespace.equals("*")) {                nsNode = new Node(Token.NULL);            } else {                nsNode = createName(namespace);            }        }        Node ref;        if (target == null) {            if (namespace == null) {                ref = new Node(Token.REF_NAME, elem);            } else {                ref = new Node(Token.REF_NS_NAME, nsNode, elem);            }        } else {            if (namespace == null) {                ref = new Node(Token.REF_MEMBER, target, elem);            } else {                ref = new Node(Token.REF_NS_MEMBER, target, nsNode, elem);            }        }        if (memberTypeFlags != 0) {            ref.putIntProp(Node.MEMBER_TYPE_PROP, memberTypeFlags);

⌨️ 快捷键说明

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