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

📄 interpreter.java

📁 這是一個javascript 的 interpreter是了解 web browser的好材料
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                    stackChange(-1);                }                visitExpression(child, 0);                addStringOp(Token.SETPROP, property);                stackChange(-1);            }            break;          case Token.SETELEM:          case Token.SETELEM_OP:            visitExpression(child, 0);            child = child.getNext();            visitExpression(child, 0);            child = child.getNext();            if (type == Token.SETELEM_OP) {                addIcode(Icode_DUP2);                stackChange(2);                addToken(Token.GETELEM);                stackChange(-1);                // Compensate for the following USE_STACK                stackChange(-1);            }            visitExpression(child, 0);            addToken(Token.SETELEM);            stackChange(-2);            break;          case Token.SET_REF:          case Token.SET_REF_OP:            visitExpression(child, 0);            child = child.getNext();            if (type == Token.SET_REF_OP) {                addIcode(Icode_DUP);                stackChange(1);                addToken(Token.GET_REF);                // Compensate for the following USE_STACK                stackChange(-1);            }            visitExpression(child, 0);            addToken(Token.SET_REF);            stackChange(-1);            break;          case Token.SETNAME:            {                String name = child.getString();                visitExpression(child, 0);                child = child.getNext();                visitExpression(child, 0);                addStringOp(Token.SETNAME, name);                stackChange(-1);            }            break;          case Token.SETCONST:            {                String name = child.getString();                visitExpression(child, 0);                child = child.getNext();                visitExpression(child, 0);                addStringOp(Icode_SETCONST, name);                stackChange(-1);            }            break;          case Token.TYPEOFNAME:            {                int index = -1;                // use typeofname if an activation frame exists                // since the vars all exist there instead of in jregs                if (itsInFunctionFlag && !itsData.itsNeedsActivation)                    index = scriptOrFn.getIndexForNameNode(node);                if (index == -1) {                    addStringOp(Icode_TYPEOFNAME, node.getString());                    stackChange(1);                } else {                    addVarOp(Token.GETVAR, index);                    stackChange(1);                    addToken(Token.TYPEOF);                }            }            break;          case Token.BINDNAME:          case Token.NAME:          case Token.STRING:            addStringOp(type, node.getString());            stackChange(1);            break;          case Token.INC:          case Token.DEC:            visitIncDec(node, child);            break;          case Token.NUMBER:            {                double num = node.getDouble();                int inum = (int)num;                if (inum == num) {                    if (inum == 0) {                        addIcode(Icode_ZERO);                        // Check for negative zero                        if (1.0 / num < 0.0) {                            addToken(Token.NEG);                        }                    } else if (inum == 1) {                        addIcode(Icode_ONE);                    } else if ((short)inum == inum) {                        addIcode(Icode_SHORTNUMBER);                        // write short as uin16 bit pattern                        addUint16(inum & 0xFFFF);                    } else {                        addIcode(Icode_INTNUMBER);                        addInt(inum);                    }                } else {                    int index = getDoubleIndex(num);                    addIndexOp(Token.NUMBER, index);                }                stackChange(1);            }            break;          case Token.GETVAR:            {                if (itsData.itsNeedsActivation) Kit.codeBug();                int index = scriptOrFn.getIndexForNameNode(node);                addVarOp(Token.GETVAR, index);                stackChange(1);            }            break;          case Token.SETVAR:            {                if (itsData.itsNeedsActivation) Kit.codeBug();                int index = scriptOrFn.getIndexForNameNode(child);                child = child.getNext();                visitExpression(child, 0);                addVarOp(Token.SETVAR, index);            }            break;          case Token.SETCONSTVAR:            {                if (itsData.itsNeedsActivation) Kit.codeBug();                int index = scriptOrFn.getIndexForNameNode(child);                child = child.getNext();                visitExpression(child, 0);                addVarOp(Token.SETCONSTVAR, index);            }            break;          case Token.NULL:          case Token.THIS:          case Token.THISFN:          case Token.FALSE:          case Token.TRUE:            addToken(type);            stackChange(1);            break;          case Token.ENUM_NEXT:          case Token.ENUM_ID:            addIndexOp(type, getLocalBlockRef(node));            stackChange(1);            break;          case Token.REGEXP:            {                int index = node.getExistingIntProp(Node.REGEXP_PROP);                addIndexOp(Token.REGEXP, index);                stackChange(1);            }            break;          case Token.ARRAYLIT:          case Token.OBJECTLIT:            visitLiteral(node, child);            break;          case Token.ARRAYCOMP:            visitArrayComprehension(node, child, child.getNext());            break;          case Token.REF_SPECIAL:            visitExpression(child, 0);            addStringOp(type, (String)node.getProp(Node.NAME_PROP));            break;          case Token.REF_MEMBER:          case Token.REF_NS_MEMBER:          case Token.REF_NAME:          case Token.REF_NS_NAME:            {                int memberTypeFlags = node.getIntProp(Node.MEMBER_TYPE_PROP, 0);                // generate possible target, possible namespace and member                int childCount = 0;                do {                    visitExpression(child, 0);                    ++childCount;                    child = child.getNext();                } while (child != null);                addIndexOp(type, memberTypeFlags);                stackChange(1 - childCount);            }            break;          case Token.DOTQUERY:            {                int queryPC;                updateLineNumber(node);                visitExpression(child, 0);                addIcode(Icode_ENTERDQ);                stackChange(-1);                queryPC = itsICodeTop;                visitExpression(child.getNext(), 0);                addBackwardGoto(Icode_LEAVEDQ, queryPC);            }            break;          case Token.DEFAULTNAMESPACE :          case Token.ESCXMLATTR :          case Token.ESCXMLTEXT :            visitExpression(child, 0);            addToken(type);            break;          case Token.YIELD:            if (child != null) {                visitExpression(child, 0);            } else {                addIcode(Icode_UNDEF);                stackChange(1);            }            addToken(Token.YIELD);            addUint16(node.getLineno() & 0xFFFF);            break;          case Token.WITHEXPR: {            Node enterWith = node.getFirstChild();            Node with = enterWith.getNext();            visitExpression(enterWith.getFirstChild(), 0);            addToken(Token.ENTERWITH);            stackChange(-1);            visitExpression(with.getFirstChild(), 0);            addToken(Token.LEAVEWITH);            break;          }          default:            throw badTree(node);        }        if (savedStackDepth + 1 != itsStackDepth) {            Kit.codeBug();        }    }    private void generateCallFunAndThis(Node left)    {        // Generate code to place on stack function and thisObj        int type = left.getType();        switch (type) {          case Token.NAME: {            String name = left.getString();            // stack: ... -> ... function thisObj            addStringOp(Icode_NAME_AND_THIS, name);            stackChange(2);            break;          }          case Token.GETPROP:          case Token.GETELEM: {            Node target = left.getFirstChild();            visitExpression(target, 0);            Node id = target.getNext();            if (type == Token.GETPROP) {                String property = id.getString();                // stack: ... target -> ... function thisObj                addStringOp(Icode_PROP_AND_THIS, property);                stackChange(1);            } else {                visitExpression(id, 0);                // stack: ... target id -> ... function thisObj                addIcode(Icode_ELEM_AND_THIS);            }            break;          }          default:            // Including Token.GETVAR            visitExpression(left, 0);            // stack: ... value -> ... function thisObj            addIcode(Icode_VALUE_AND_THIS);            stackChange(1);            break;        }    }    private void visitIncDec(Node node, Node child)    {        int incrDecrMask = node.getExistingIntProp(Node.INCRDECR_PROP);        int childType = child.getType();        switch (childType) {          case Token.GETVAR : {            if (itsData.itsNeedsActivation) Kit.codeBug();            int i = scriptOrFn.getIndexForNameNode(child);            addVarOp(Icode_VAR_INC_DEC, i);            addUint8(incrDecrMask);            stackChange(1);            break;          }          case Token.NAME : {            String name = child.getString();            addStringOp(Icode_NAME_INC_DEC, name);            addUint8(incrDecrMask);            stackChange(1);            break;          }          case Token.GETPROP : {            Node object = child.getFirstChild();            visitExpression(object, 0);            String property = object.getNext().getString();            addStringOp(Icode_PROP_INC_DEC, property);            addUint8(incrDecrMask);            break;          }          case Token.GETELEM : {            Node object = child.getFirstChild();            visitExpression(object, 0);            Node index = object.getNext();            visitExpression(index, 0);            addIcode(Icode_ELEM_INC_DEC);            addUint8(incrDecrMask);            stackChange(-1);            break;          }          case Token.GET_REF : {            Node ref = child.getFirstChild();            visitExpression(ref, 0);            addIcode(Icode_REF_INC_DEC);            addUint8(incrDecrMask);            break;          }          default : {            throw badTree(node);          }        }    }    private void visitLiteral(Node node, Node child)    {        int type = node.getType();        int count;        Object[] propertyIds = null;        if (type == Token.ARRAYLIT) {            count = 0;            for (Node n = child; n != null; n = n.getNext()) {                ++count;            }        } else if (type == Token.OBJECTLIT) {            propertyIds = (Object[])node.getProp(Node.OBJECT_IDS_PROP);            count = propertyIds.length;        } else {            throw badTree(node);        }        addIndexOp(Icode_LITERAL_NEW, count);        stackChange(2);        while (child != null) {            int childType = child.getType();            if (childType == Token.GET) {                visitExpression(child.getFirstChild(), 0);                addIcode(Icode_LITERAL_GETTER);            } else if (childType == Token.SET) {                visitExpression(child.getFirstChild(), 0);                addIcode(Icode_LITERAL_SETTER);            } else {                visitExpression(child, 0);                addIcode(Icode_LITERAL_SET);            }            stackChange(-1);            child = child.getNext();        }        if (type == Token.ARRAYLIT) {            int[] skipIndexes = (int[])node.getProp(Node.SKIP_INDEXES_PROP);

⌨️ 快捷键说明

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