// 以下の4つは实行时にいるかな、名前以外はエラー発生时に必要になるだけだろうけど。 /// <exception cref="Kirikiri.Tjs2.TJSException"></exception> /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> private void PushContextStack(string name, int type) { InterCodeGenerator ctx = new InterCodeGenerator(mInterCodeGenerator, name, this, type); if (mInterCodeGenerator == null) { if (mTopLevelGenerator != null) { throw new TJSException(Kirikiri.Tjs2.Error.InternalError); } mTopLevelGenerator = ctx; } mGeneratorStack.Push(ctx); mInterCodeGenerator = ctx; }
// create a member if not exists // ignore property invoking /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> /// <exception cref="Kirikiri.Tjs2.TJSException"></exception> private ScriptBlock GenerateInterCodeObjects() { // dumpClassStructure(); ScriptBlock block = new ScriptBlock(mOwner, mName, mLineOffset, mScript, mLineData ); mInterCodeObjectList.Clear(); // 1st. pass, まずはInterCodeObjectを作る int count = mInterCodeGeneratorList.Count; for (int i = 0; i < count; i++) { InterCodeGenerator gen = mInterCodeGeneratorList[i]; mInterCodeObjectList.AddItem(gen.CreteCodeObject(block)); } Variant val = new Variant(); // 2nd. pass, 次にInterCodeObject内のリンクを解决する for (int i_1 = 0; i_1 < count; i_1++) { InterCodeGenerator gen = mInterCodeGeneratorList[i_1]; InterCodeObject obj = mInterCodeObjectList[i_1]; gen.CreateSecond(obj); gen.DateReplace(this); // DaraArray の中の InterCodeGenerator を InterCodeObject に差し替える //obj.dateReplace( this ); // DaraArray の中の InterCodeGenerator を InterCodeObject に差し替える AList<InterCodeGenerator.Property> p = gen.GetProp(); if (p != null) { int pcount = p.Count; for (int j = 0; j < pcount; j++) { InterCodeGenerator.Property prop = p[j]; val.Set(GetCodeObject(GetCodeIndex(prop.Value))); obj.mParent.PropSet(MEMBERENSURE | IGNOREPROP, prop.Name, val, obj.mParent); } p.Clear(); } } mTopLevelObject = GetCodeObject(GetCodeIndex(mTopLevelGenerator)); block.SetObjects(mTopLevelObject, mInterCodeObjectList); // 解放してしまう mInterCodeGenerator = null; mTopLevelGenerator = null; mGeneratorStack = null; mInterCodeGeneratorList.Clear(); mInterCodeGeneratorList = null; mInterCodeObjectList.Clear(); mInterCodeObjectList = null; return block; }
/// <exception cref="Kirikiri.Tjs2.VariantException"></exception> /// <exception cref="Kirikiri.Tjs2.TJSException"></exception> private void PopContextStack() { mInterCodeGenerator.Commit(); mGeneratorStack.Pop(); if (mGeneratorStack.Count >= 1) { mInterCodeGenerator = mGeneratorStack.Peek(); } else { mInterCodeGenerator = null; } }
// for generat code /// <summary>位置を确定するために使う</summary> public virtual int GetCodeIndex(InterCodeGenerator gen) { return mInterCodeGeneratorList.IndexOf(gen); }
public virtual void Remove(InterCodeGenerator gen) { mInterCodeGeneratorList.Remove(gen); }
/// <exception cref="Kirikiri.Tjs2.VariantException"></exception> /// <exception cref="Kirikiri.Tjs2.CompileException"></exception> public virtual void CreateExtendsExprCode(ExprNode node, bool hold) { // process class extender IntWrapper fr = new IntWrapper(mFrameBase); int resaddr = GenNodeCode(fr, node, RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); int nodepos = (node != null ? node.GetPosition() : -1); if ((mCodeAreaPos + 6) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(nodepos); } //putCode(VM_CHGTHIS, nodepos); //putCode(resaddr, nodepos); //putCode(-1, nodepos); mCodeArea[mCodeAreaPos] = (short)(VM_CHGTHIS); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-1); mCodeAreaPos++; //putCode(VM_CALL, nodepos); //putCode(0, nodepos); //putCode(resaddr, nodepos); //putCode(0, nodepos); mCodeArea[mCodeAreaPos] = (short)(VM_CALL); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; if (hold) { mSuperClassExpr = node; } mFunctionRegisterCodePoint = mCodeAreaPos; // update FunctionRegisterCodePoint // create a Super Class Proxy context if (mSuperClassGetter == null) { mSuperClassGetter = new InterCodeGenerator(this, mName, mBlock, ContextType.SUPER_CLASS_GETTER ); } mSuperClassGetter.CreateExtendsExprProxyCode(node); }
public virtual void Add(InterCodeGenerator gen) { mInterCodeGeneratorList.AddItem(gen); }
public FixData(InterCodeGenerator.FixData fixdata) { //Code = null; Copy(fixdata); }
public virtual void Copy(InterCodeGenerator.FixData fixdata) { Code = null; StartIP = fixdata.StartIP; Size = fixdata.Size; NewSize = fixdata.NewSize; BeforeInsertion = fixdata.BeforeInsertion; short[] newbuff = new short[NewSize]; //ByteBuffer buff = ByteBuffer.allocate(NewSize*2); //buff.order( ByteOrder.nativeOrder() ); //ShortBuffer ibuff = buff.asShortBuffer(); ShortBuffer ibuff = ShortBuffer.Wrap(newbuff); ibuff.Clear(); ByteBuffer tmp = fixdata.Code.Duplicate(); tmp.Flip(); ibuff.Put(tmp); Code = ibuff; }
public Property(string name, InterCodeGenerator val) { Name = name; Value = val; }
public SubParam(InterCodeGenerator.SubParam param) { //private static final int INC_SIZE_BYTE = 1024; //private static final int INC_SIZE_BYTE = 512; //private static final int INC_SIZE_LONG_BYTE = 2048; //private LongBuffer mSourcePosArray; // 上位をcodePos, 下位をsourcePos とする // 上位をcodePos, 下位をsourcePos とする // Dataの中に function として、InterCodeGenerator が入っている可能性がある、后で差し替えること。 // Compiler に持たせた方がいいかな? //mSubType = 0; //mSubFlag = 0; //mSubAddress = 0; mSubType = param.mSubType; mSubFlag = param.mSubFlag; mSubAddress = param.mSubAddress; }
/// <exception cref="Kirikiri.Tjs2.VariantException"></exception> /// <exception cref="Kirikiri.Tjs2.CompileException"></exception> private int GenNodeCode(IntWrapper frame, ExprNode node, int restype, int reqresaddr , InterCodeGenerator.SubParam param) { if (node == null) { return 0; } int resaddr; int node_pos = (node != null ? node.GetPosition() : -1); switch (node.GetOpecode()) { case Token.T_CONSTVAL: { // constant value if (param.mSubType != stNone) { ErrorMsg(Error.CannotModifyLHS); } if ((restype & RT_NEEDED) == 0) { return 0; } int dp = PutData(node.GetValue()); //putCode( VM_CONST, node_pos ); //putCode( frame.value, node_pos ); //putCode( dp, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CONST); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; int ret = frame.value; frame.value++; return ret; } case Token.T_IF: { // 'if' if ((restype & RT_NEEDED) != 0) { ErrorMsg(Error.CannotGetResult); } int resaddr1 = GenNodeCode(frame, node.GetNode(1), RT_NEEDED | RT_CFLAG, 0, new InterCodeGenerator.SubParam ()); bool inv = false; if (!(resaddr1 == GNC_CFLAG || resaddr1 == GNC_CFLAG_I)) { //putCode( VM_TT, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_TT); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; } else { if (resaddr1 == GNC_CFLAG_I) { inv = true; } } int addr = mCodeAreaPos; //addJumpList(); mJumpList.Add(mCodeAreaPos); //putCode( inv ? VM_JF : VM_JNF, node_pos ); //putCode( 0, node_pos ); // * if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(inv ? VM_JF : VM_JNF); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; GenNodeCode(frame, node.GetNode(0), 0, 0, param); mCodeArea[addr + 1] = (short)(mCodeAreaPos - addr); // patch "*" return 0; } case Token.T_INCONTEXTOF: { // 'incontextof' if ((restype & RT_NEEDED) == 0) { return 0; } int resaddr1; int resaddr2; resaddr1 = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, param); resaddr2 = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); if (resaddr1 <= 0) { //putCode( VM_CP, node_pos ); //putCode( frame.value, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; resaddr1 = frame.value; frame.value++; } //putCode( VM_CHGTHIS, node_pos ); //putCode( resaddr1, node_pos ); //putCode( resaddr2, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CHGTHIS); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr2); mCodeAreaPos++; return resaddr1; } case Token.T_COMMA: { // ',' GenNodeCode(frame, node.GetNode(0), 0, 0, new InterCodeGenerator.SubParam()); return GenNodeCode(frame, node.GetNode(1), restype, reqresaddr, param); } case Token.T_SWAP: { // '<->' if ((restype & RT_NEEDED) != 0) { ErrorMsg(Error.CannotGetResult); } if (param.mSubType != 0) { ErrorMsg(Error.CannotModifyLHS); } int resaddr1 = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); if (resaddr1 <= 0) { //putCode( VM_CP, node_pos ); //putCode( frame.value, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; resaddr1 = frame.value; frame.value++; } int resaddr2 = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); InterCodeGenerator.SubParam param2 = new InterCodeGenerator.SubParam(); param2.mSubType = stEqual; param2.mSubAddress = resaddr2; GenNodeCode(frame, node.GetNode(0), 0, 0, param2); param2.mSubType = stEqual; param2.mSubAddress = resaddr1; GenNodeCode(frame, node.GetNode(1), 0, 0, param2); return 0; } case Token.T_EQUAL: { // '=' if (param.mSubType != 0) { ErrorMsg(Error.CannotModifyLHS); } if ((restype & RT_CFLAG) != 0) { OutputWarning(Error.SubstitutionInBooleanContext, node_pos); } resaddr = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, param); InterCodeGenerator.SubParam param2 = new InterCodeGenerator.SubParam(); param2.mSubType = stEqual; param2.mSubAddress = resaddr; GenNodeCode(frame, node.GetNode(0), 0, 0, param2); return resaddr; } case Token.T_AMPERSANDEQUAL: case Token.T_VERTLINEEQUAL: case Token.T_CHEVRONEQUAL: case Token.T_MINUSEQUAL: case Token.T_PLUSEQUAL: case Token.T_PERCENTEQUAL: case Token.T_SLASHEQUAL: case Token.T_BACKSLASHEQUAL: case Token.T_ASTERISKEQUAL: case Token.T_LOGICALOREQUAL: case Token.T_LOGICALANDEQUAL: case Token.T_RARITHSHIFTEQUAL: case Token.T_LARITHSHIFTEQUAL: case Token.T_RBITSHIFTEQUAL: { // '&=' operator // '|=' operator // '^=' operator // ^-=' operator // '+=' operator // '%=' operator // '/=' operator // '\=' operator // '*=' operator // '||=' operator // '&&=' operator // '>>=' operator // '<<=' operator // '>>>=' operator if (param.mSubType != 0) { ErrorMsg(Error.CannotModifyLHS); } resaddr = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); InterCodeGenerator.SubParam param2 = new InterCodeGenerator.SubParam(); switch (node.GetOpecode()) { case Token.T_AMPERSANDEQUAL: { // this may be sucking... param2.mSubType = stBitAND; break; } case Token.T_VERTLINEEQUAL: { param2.mSubType = stBitOR; break; } case Token.T_CHEVRONEQUAL: { param2.mSubType = stBitXOR; break; } case Token.T_MINUSEQUAL: { param2.mSubType = stSub; break; } case Token.T_PLUSEQUAL: { param2.mSubType = stAdd; break; } case Token.T_PERCENTEQUAL: { param2.mSubType = stMod; break; } case Token.T_SLASHEQUAL: { param2.mSubType = stDiv; break; } case Token.T_BACKSLASHEQUAL: { param2.mSubType = stIDiv; break; } case Token.T_ASTERISKEQUAL: { param2.mSubType = stMul; break; } case Token.T_LOGICALOREQUAL: { param2.mSubType = stLogOR; break; } case Token.T_LOGICALANDEQUAL: { param2.mSubType = stLogAND; break; } case Token.T_RARITHSHIFTEQUAL: { param2.mSubType = stSAR; break; } case Token.T_LARITHSHIFTEQUAL: { param2.mSubType = stSAL; break; } case Token.T_RBITSHIFTEQUAL: { param2.mSubType = stSR; break; } } param2.mSubAddress = resaddr; return GenNodeCode(frame, node.GetNode(0), restype, reqresaddr, param2); } case Token.T_QUESTION: { // '?' ':' operator // three-term operator ( ? : ) int resaddr1; int resaddr2; int frame1; int frame2; resaddr = GenNodeCode(frame, node.GetNode(0), RT_NEEDED | RT_CFLAG, 0, new InterCodeGenerator.SubParam ()); bool inv = false; if (!(resaddr == GNC_CFLAG || resaddr == GNC_CFLAG_I)) { //putCode( VM_TT, node_pos ); //putCode( resaddr, node_pos ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_TT); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; } else { if (resaddr == GNC_CFLAG_I) { inv = true; } } int cur_frame = frame.value; int addr1 = mCodeAreaPos; //addJumpList(); mJumpList.Add(mCodeAreaPos); //putCode( inv ? VM_JF : VM_JNF, node_pos ); //putCode( 0, node_pos ); // patch if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(inv ? VM_JF : VM_JNF); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; resaddr1 = GenNodeCode(frame, node.GetNode(1), restype, reqresaddr, param); if ((restype & RT_CFLAG) != 0) { if (!(resaddr1 == GNC_CFLAG || resaddr1 == GNC_CFLAG_I)) { //putCode( VM_TT, node_pos ); //putCode( resaddr1 ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_TT); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; } else { if (resaddr1 == GNC_CFLAG_I) { //putCode( VM_NF, node_pos ); // invert flag if ((mCodeAreaPos) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_NF); mCodeAreaPos++; } } } else { if ((restype & RT_NEEDED) != 0 && !(resaddr1 == GNC_CFLAG || resaddr1 == GNC_CFLAG_I ) && resaddr1 <= 0) { //putCode( VM_CP, node_pos ); //putCode( frame.value, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; resaddr1 = frame.value; frame.value++; } } frame1 = frame.value; int addr2 = mCodeAreaPos; //addJumpList(); mJumpList.Add(mCodeAreaPos); //putCode( VM_JMP, node_pos ); //putCode( 0, node_pos ); // patch if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_JMP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; mCodeArea[addr1 + 1] = (short)(mCodeAreaPos - addr1); // patch frame.value = cur_frame; resaddr2 = GenNodeCode(frame, node.GetNode(2), restype, reqresaddr, param); if ((restype & RT_CFLAG) != 0) { // condition flag required if (!(resaddr2 == GNC_CFLAG || resaddr2 == GNC_CFLAG_I)) { //putCode( VM_TT, node_pos ); //putCode( resaddr2 ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_TT); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr2); mCodeAreaPos++; } else { if (resaddr2 == GNC_CFLAG_I) { //putCode( VM_NF, node_pos ); // invert flag if ((mCodeAreaPos) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_NF); mCodeAreaPos++; } } } else { if ((restype & RT_NEEDED) != 0 && !(resaddr1 == GNC_CFLAG || resaddr1 == GNC_CFLAG_I ) && resaddr1 != resaddr2) { //putCode( VM_CP, node_pos ); //putCode( resaddr1, node_pos ); //putCode( resaddr2, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr2); mCodeAreaPos++; frame.value++; } } frame2 = frame.value; mCodeArea[addr2 + 1] = (short)(mCodeAreaPos - addr2); // patch frame.value = frame2 < frame1 ? frame1 : frame2; return (restype & RT_CFLAG) != 0 ? GNC_CFLAG : resaddr1; } case Token.T_LOGICALOR: case Token.T_LOGICALAND: { // '||' // '&&' // "logical or" and "locical and" // these process with th "shortcut" : // OR : does not evaluate right when left results true // AND : does not evaluate right when left results false if (param.mSubType != 0) { ErrorMsg(Error.CannotModifyLHS); } int resaddr1; int resaddr2; resaddr1 = GenNodeCode(frame, node.GetNode(0), RT_NEEDED | RT_CFLAG, 0, new InterCodeGenerator.SubParam ()); bool inv = false; if (!(resaddr1 == GNC_CFLAG || resaddr1 == GNC_CFLAG_I)) { //putCode( VM_TT, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_TT); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; } if (resaddr1 == GNC_CFLAG_I) { inv = true; } int addr1 = mCodeAreaPos; //addJumpList(); mJumpList.Add(mCodeAreaPos); //putCode( node.getOpecode() == Token.T_LOGICALOR ? (inv?VM_JNF:VM_JF) : (inv?VM_JF:VM_JNF), node_pos ); //putCode( 0, node_pos ); // *A if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(node.GetOpecode() == Token.T_LOGICALOR ? (inv ? VM_JNF : VM_JF) : (inv ? VM_JF : VM_JNF)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; resaddr2 = GenNodeCode(frame, node.GetNode(1), RT_NEEDED | RT_CFLAG, 0, new InterCodeGenerator.SubParam ()); if (!(resaddr2 == GNC_CFLAG || resaddr2 == GNC_CFLAG_I)) { //putCode( inv ? VM_TF : VM_TT, node_pos ); //putCode( resaddr2, node_pos ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(inv ? VM_TF : VM_TT); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr2); mCodeAreaPos++; } else { if ((inv != false) != (resaddr2 == GNC_CFLAG_I)) { //putCode( VM_NF, node_pos ); // invert flag if ((mCodeAreaPos) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_NF); mCodeAreaPos++; } } mCodeArea[addr1 + 1] = (short)(mCodeAreaPos - addr1); // patch if ((restype & RT_CFLAG) == 0) { // requested result type is not condition flag if ((resaddr1 == GNC_CFLAG || resaddr1 == GNC_CFLAG_I) || resaddr1 <= 0) { //putCode( inv ? VM_SETNF : VM_SETF, node_pos ); //putCode( frame.value, node_pos ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(inv ? VM_SETNF : VM_SETF); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; resaddr1 = frame.value; frame.value++; } else { //putCode( inv ? VM_SETNF : VM_SETF, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(inv ? VM_SETNF : VM_SETF); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; } } return (restype & RT_CFLAG) != 0 ? (inv ? GNC_CFLAG_I : GNC_CFLAG) : resaddr1; } case Token.T_INSTANCEOF: { // 'instanceof' operator // instanceof operator int resaddr1; int resaddr2; resaddr1 = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); if (resaddr1 <= 0) { //putCode( VM_CP, node_pos ); //putCode( frame.value, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; resaddr1 = frame.value; frame.value++; } resaddr2 = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); //putCode( VM_CHKINS, node_pos ); //putCode( resaddr1, node_pos ); //putCode( resaddr2, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CHKINS); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr2); mCodeAreaPos++; return resaddr1; } case Token.T_VERTLINE: case Token.T_CHEVRON: case Token.T_AMPERSAND: case Token.T_RARITHSHIFT: case Token.T_LARITHSHIFT: case Token.T_RBITSHIFT: case Token.T_PLUS: case Token.T_MINUS: case Token.T_PERCENT: case Token.T_SLASH: case Token.T_BACKSLASH: case Token.T_ASTERISK: { // '|' operator // '^' operator // binary '&' operator // '>>' operator // '<<' operator // '>>>' operator // binary '+' operator // '-' operator // '%' operator // '/' operator // '\' operator // binary '*' operator // general two-term operator int resaddr1; int resaddr2; if (param.mSubType != stNone) { ErrorMsg(Error.CannotModifyLHS); } resaddr1 = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); if (resaddr1 <= 0) { //putCode( VM_CP, node_pos ); //putCode( frame.value, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; resaddr1 = frame.value; frame.value++; } resaddr2 = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); int code = 0; switch (node.GetOpecode()) { case Token.T_VERTLINE: { // sucking... code = VM_BOR; break; } case Token.T_CHEVRON: { code = VM_BXOR; break; } case Token.T_AMPERSAND: { code = VM_BAND; break; } case Token.T_RARITHSHIFT: { code = VM_SAR; break; } case Token.T_LARITHSHIFT: { code = VM_SAL; break; } case Token.T_RBITSHIFT: { code = VM_SR; break; } case Token.T_PLUS: { code = VM_ADD; break; } case Token.T_MINUS: { code = VM_SUB; break; } case Token.T_PERCENT: { code = VM_MOD; break; } case Token.T_SLASH: { code = VM_DIV; break; } case Token.T_BACKSLASH: { code = VM_IDIV; break; } case Token.T_ASTERISK: { code = VM_MUL; break; } } //putCode( code, node_pos ); //putCode( resaddr1, node_pos ); //putCode( resaddr2, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(code); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr2); mCodeAreaPos++; return resaddr1; } case Token.T_NOTEQUAL: case Token.T_EQUALEQUAL: case Token.T_DISCNOTEQUAL: case Token.T_DISCEQUAL: case Token.T_LT: case Token.T_GT: case Token.T_LTOREQUAL: case Token.T_GTOREQUAL: { // '!=' operator // '==' operator // '!==' operator // '===' operator // '<' operator // '>' operator // '<=' operator // '>=' operator // comparison operators int resaddr1; int resaddr2; if (param.mSubType != stNone) { ErrorMsg(Error.CannotModifyLHS); } resaddr1 = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); if ((restype & RT_CFLAG) == 0) { if (resaddr1 <= 0) { //putCode( VM_CP, node_pos ); //putCode( frame.value, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; resaddr1 = frame.value; frame.value++; } } resaddr2 = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); int code1 = 0; int code2 = 0; switch (node.GetOpecode()) { case Token.T_NOTEQUAL: { code1 = VM_CEQ; code2 = VM_SETNF; break; } case Token.T_EQUALEQUAL: { code1 = VM_CEQ; code2 = VM_SETF; break; } case Token.T_DISCNOTEQUAL: { code1 = VM_CDEQ; code2 = VM_SETNF; break; } case Token.T_DISCEQUAL: { code1 = VM_CDEQ; code2 = VM_SETF; break; } case Token.T_LT: { code1 = VM_CLT; code2 = VM_SETF; break; } case Token.T_GT: { code1 = VM_CGT; code2 = VM_SETF; break; } case Token.T_LTOREQUAL: { code1 = VM_CGT; code2 = VM_SETNF; break; } case Token.T_GTOREQUAL: { code1 = VM_CLT; code2 = VM_SETNF; break; } } //putCode( code1, node_pos ); //putCode( resaddr1, node_pos ); //putCode( resaddr2, node_pos ); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(code1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr2); mCodeAreaPos++; if ((restype & RT_CFLAG) == 0) { //putCode( code2, node_pos ); //putCode( resaddr1, node_pos ); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } mCodeArea[mCodeAreaPos] = (short)(code2); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr1); mCodeAreaPos++; } return (restype & RT_CFLAG) != 0 ? (code2 == VM_SETNF ? GNC_CFLAG_I : GNC_CFLAG) : resaddr1; } case Token.T_EXCRAMATION: { // ここから一气に // pre-positioned '!' operator // logical not if ((param.mSubType != stNone)) { ErrorMsg(Error.CannotModifyLHS); } resaddr = GenNodeCode(frame, node.GetNode(0), restype, reqresaddr, new InterCodeGenerator.SubParam ()); if ((restype & RT_CFLAG) == 0) { // value as return value required if (!(resaddr > 0)) { //putCode(VM_CP, node_pos); //putCode( frame.value, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; resaddr = frame.value; frame.value++; } //putCode(VM_LNOT, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_LNOT); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; return resaddr; } else { // condifion flag required if (!(resaddr == GNC_CFLAG || resaddr == GNC_CFLAG_I)) { //putCode(VM_TF, node_pos); //putCode( resaddr); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_TF); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; return GNC_CFLAG; } return resaddr == GNC_CFLAG_I ? GNC_CFLAG : GNC_CFLAG_I; } goto case Token.T_TILDE; } case Token.T_TILDE: case Token.T_SHARP: case Token.T_DOLLAR: case Token.T_UPLUS: case Token.T_UMINUS: case Token.T_INVALIDATE: case Token.T_ISVALID: case Token.T_EVAL: case Token.T_INT: case Token.T_REAL: case Token.T_STRING: case Token.T_OCTET: { // invert flag // '~' operator // '#' operator // '$' operator // unary '+' operator // unary '-' operator // 'invalidate' operator // 'isvalid' operator // post-positioned '!' operator // 'int' operator // 'real' operator // 'string' operator // 'octet' operator // general unary operators if ((param.mSubType != stNone)) { ErrorMsg(Error.CannotModifyLHS); } resaddr = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); if (!(resaddr > 0)) { //putCode(VM_CP, node_pos); //putCode( frame.value, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; resaddr = frame.value; frame.value++; } int code = 0; switch (node.GetOpecode()) { case Token.T_TILDE: { code = VM_BNOT; break; } case Token.T_SHARP: { code = VM_ASC; break; } case Token.T_DOLLAR: { code = VM_CHR; break; } case Token.T_UPLUS: { code = VM_NUM; break; } case Token.T_UMINUS: { code = VM_CHS; break; } case Token.T_INVALIDATE: { code = VM_INV; break; } case Token.T_ISVALID: { code = VM_CHKINV; break; } case Token.T_TYPEOF: { code = VM_TYPEOF; break; } case Token.T_EVAL: { code = (restype & RT_NEEDED) != 0 ? VM_EVAL : VM_EEXP; // warn if T_EVAL is used in non-global position if (TJS.mWarnOnNonGlobalEvalOperator && mContextType != ContextType.TOP_LEVEL) { OutputWarning(Error.WarnEvalOperator); } break; } case Token.T_INT: { code = VM_INT; break; } case Token.T_REAL: { code = VM_REAL; break; } case Token.T_STRING: { code = VM_STR; break; } case Token.T_OCTET: { code = VM_OCTET; break; } } //putCode(code, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(code); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; return resaddr; } case Token.T_TYPEOF: { // 'typeof' operator // typeof if ((param.mSubType != stNone)) { ErrorMsg(Error.CannotModifyLHS); } bool haspropnode; ExprNode cnode = node.GetNode(0); if (cnode.GetOpecode() == Token.T_DOT || cnode.GetOpecode() == Token.T_LBRACKET || cnode.GetOpecode() == Token.T_WITHDOT) { haspropnode = true; } else { haspropnode = false; } if (haspropnode) { // has property access node InterCodeGenerator.SubParam param2 = new InterCodeGenerator.SubParam(); param2.mSubType = stTypeOf; return GenNodeCode(frame, cnode, RT_NEEDED, 0, param2); } else { // normal operation resaddr = GenNodeCode(frame, cnode, RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); if (!(resaddr > 0)) { //putCode(VM_CP, node_pos); //putCode( frame.value, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; resaddr = frame.value; frame.value++; } //putCode(VM_TYPEOF, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_TYPEOF); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; return resaddr; } goto case Token.T_DELETE; } case Token.T_DELETE: case Token.T_INCREMENT: case Token.T_DECREMENT: case Token.T_POSTINCREMENT: case Token.T_POSTDECREMENT: { // 'delete' operator // pre-positioned '++' operator // pre-positioned '--' operator // post-positioned '++' operator // post-positioned '--' operator // delete, typeof, increment and decrement if ((param.mSubType != stNone)) { ErrorMsg(Error.CannotModifyLHS); } InterCodeGenerator.SubParam param2 = new InterCodeGenerator.SubParam(); switch (node.GetOpecode()) { case Token.T_TYPEOF: { param2.mSubType = stTypeOf; break; } case Token.T_DELETE: { param2.mSubType = stDelete; break; } case Token.T_INCREMENT: { param2.mSubType = stPreInc; break; } case Token.T_DECREMENT: { param2.mSubType = stPreDec; break; } case Token.T_POSTINCREMENT: { param2.mSubType = stPostInc; break; } case Token.T_POSTDECREMENT: { param2.mSubType = stPostDec; break; } } return GenNodeCode(frame, node.GetNode(0), restype, reqresaddr, param2); } case Token.T_LPARENTHESIS: case Token.T_NEW: { // '( )' operator // 'new' operator // function call or create-new object // does (*node)[0] have a node that acceesses any properties ? bool haspropnode; bool hasnonlocalsymbol; ExprNode cnode = node.GetNode(0); if (node.GetOpecode() == Token.T_LPARENTHESIS && (cnode.GetOpecode() == Token.T_DOT || cnode.GetOpecode() == Token.T_LBRACKET)) { haspropnode = true; } else { haspropnode = false; } // does (*node)[0] have a node that accesses non-local functions ? if (node.GetOpecode() == Token.T_LPARENTHESIS && cnode.GetOpecode() == Token.T_SYMBOL) { if (mAsGlobalContextMode) { hasnonlocalsymbol = true; } else { string str = cnode.GetValue().AsString(); if (mNamespace.Find(str) == -1) { hasnonlocalsymbol = true; } else { hasnonlocalsymbol = false; } } } else { hasnonlocalsymbol = false; } // flag which indicates whether to do direct or indirect call access bool do_direct_access = haspropnode || hasnonlocalsymbol; // reserve frame if (!do_direct_access && (restype & RT_NEEDED) != 0) { frame.value++; } // reserve the frame for a result value // generate function call codes StartFuncArg(); int framestart = frame.value; int res; try { // arguments is if (node.GetNode(1).GetSize() == 1 && node.GetNode(1).GetNode(0) == null) { } else { // empty // exist GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); } // compilation of expression that represents the function InterCodeGenerator.SubParam param2 = new InterCodeGenerator.SubParam(); if (do_direct_access) { param2.mSubType = stFuncCall; // creates code with stFuncCall res = GenNodeCode(frame, node.GetNode(0), restype, reqresaddr, param2); } else { param2.mSubType = stNone; resaddr = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, param2); // code generatio of function calling if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(node.GetOpecode() == Token.T_NEW ? VM_NEW : VM_CALL ); mCodeAreaPos++; res = ((restype & RT_NEEDED) != 0 ? (framestart - 1) : 0); mCodeArea[mCodeAreaPos] = (short)(res); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; // generate argument code GenerateFuncCallArgCode(); // clears the frame ClearFrame(frame, framestart); } } finally { EndFuncArg(); } return res; } case Token.T_ARG: { // a function argument if (node.GetSize() >= 2) { if (node.GetNode(1) != null) { GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); } } if (node.GetNode(0) != null) { ExprNode n = node.GetNode(0); if (n.GetOpecode() == Token.T_EXPANDARG) { // expanding argument if (n.GetNode(0) != null) { AddFuncArg(GenNodeCode(frame, n.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()), fatExpand); } else { AddFuncArg(0, fatUnnamedExpand); } } else { AddFuncArg(GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()), fatNormal); } } else { AddFuncArg(0, fatNormal); } return 0; } case Token.T_OMIT: { // omitting of the function arguments AddOmitArg(); return 0; } case Token.T_DOT: case Token.T_LBRACKET: { // '.' operator // '[ ]' operator // member access ( direct or indirect ) bool direct = node.GetOpecode() == Token.T_DOT; int dp; InterCodeGenerator.SubParam param2 = new InterCodeGenerator.SubParam(); param2.mSubType = stNone; resaddr = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, param2); if (direct) { dp = PutData(node.GetNode(1).GetValue()); } else { dp = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); } switch (param.mSubType) { case stNone: case stIgnorePropGet: { if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } if (param.mSubType == stNone) { //putCode(direct ? VM_GPD : VM_GPI, node_pos); mCodeArea[mCodeAreaPos] = (short)(direct ? VM_GPD : VM_GPI); mCodeAreaPos++; } else { //putCode(direct ? VM_GPDS : VM_GPIS, node_pos); mCodeArea[mCodeAreaPos] = (short)(direct ? VM_GPDS : VM_GPIS); mCodeAreaPos++; } //putCode( frame.value, node_pos); //putCode( resaddr, node_pos); //putCode( dp, node_pos); mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; frame.value++; return frame.value - 1; } case stEqual: case stIgnorePropSet: { if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } if (param.mSubType == stEqual) { if (node.GetNode(0).GetOpecode() == Token.T_THIS_PROXY) { //putCode(direct ? VM_SPD : VM_SPI, node_pos); mCodeArea[mCodeAreaPos] = (short)(direct ? VM_SPD : VM_SPI); mCodeAreaPos++; } else { //putCode(direct ? VM_SPDE : VM_SPIE, node_pos); mCodeArea[mCodeAreaPos] = (short)(direct ? VM_SPDE : VM_SPIE); mCodeAreaPos++; } } else { //putCode(direct ? VM_SPDS : VM_SPIS, node_pos); mCodeArea[mCodeAreaPos] = (short)(direct ? VM_SPDS : VM_SPIS); mCodeAreaPos++; } //putCode( resaddr, node_pos); //putCode( dp, node_pos); //putCode( param.mSubAddress, node_pos); mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(param.mSubAddress); mCodeAreaPos++; return param.mSubAddress; } case stBitAND: case stBitOR: case stBitXOR: case stSub: case stAdd: case stMod: case stDiv: case stIDiv: case stMul: case stLogOR: case stLogAND: case stSAR: case stSAL: case stSR: { //putCode( param.mSubType + (direct?1:2), node_pos); // here adds 1 or 2 to the ope-code // ( see the ope-code's positioning order ) //putCode(( (restype & RT_NEEDED) != 0 ? frame.value : 0), node_pos); //putCode( resaddr, node_pos); //putCode( dp, node_pos); //putCode( param.mSubAddress, node_pos); if ((mCodeAreaPos + 4) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(param.mSubType + (direct ? 1 : 2)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(((restype & RT_NEEDED) != 0 ? frame.value : 0)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(param.mSubAddress); mCodeAreaPos++; if ((restype & RT_NEEDED) != 0) { frame.value++; } return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } case stPreInc: case stPreDec: { //putCode((param.mSubType == stPreInc ? VM_INC : VM_DEC) + (direct? 1:2), node_pos); //putCode(((restype & RT_NEEDED) != 0 ? frame.value : 0), node_pos); //putCode( resaddr, node_pos); //putCode( dp, node_pos); if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)((param.mSubType == stPreInc ? VM_INC : VM_DEC) + (direct ? 1 : 2)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(((restype & RT_NEEDED) != 0 ? frame.value : 0)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; if ((restype & RT_NEEDED) != 0) { frame.value++; } return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } case stPostInc: case stPostDec: { int retresaddr = 0; if ((restype & RT_NEEDED) != 0) { // need result ... //putCode(direct ? VM_GPD : VM_GPI, node_pos); //putCode( frame.value, node_pos); //putCode( resaddr, node_pos); //putCode( dp, node_pos); if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(direct ? VM_GPD : VM_GPI); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; retresaddr = frame.value; frame.value++; } //putCode( (param.mSubType == stPostInc ? VM_INC : VM_DEC) + (direct? 1:2), node_pos); //putCode( 0, node_pos ); //putCode( resaddr, node_pos ); //putCode( dp, node_pos ); if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)((param.mSubType == stPostInc ? VM_INC : VM_DEC) + (direct ? 1 : 2)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; return retresaddr; } case stTypeOf: { // typeof //putCode(direct? VM_TYPEOFD:VM_TYPEOFI, node_pos); //putCode(( (restype & RT_NEEDED) != 0 ? frame.value:0), node_pos); //putCode( resaddr, node_pos); //putCode( dp, node_pos); if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(direct ? VM_TYPEOFD : VM_TYPEOFI); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(((restype & RT_NEEDED) != 0 ? frame.value : 0)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; if ((restype & RT_NEEDED) != 0) { frame.value++; } return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } case stDelete: { // deletion //putCode(direct? VM_DELD:VM_DELI, node_pos); //putCode(( (restype & RT_NEEDED) != 0 ? frame.value:0), node_pos); //putCode( resaddr, node_pos); //putCode( dp, node_pos); if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(direct ? VM_DELD : VM_DELI); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(((restype & RT_NEEDED) != 0 ? frame.value : 0)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; if ((restype & RT_NEEDED) != 0) { frame.value++; } return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } case stFuncCall: { // function call //putCode(direct ? VM_CALLD:VM_CALLI, node_pos); //putCode(( (restype & RT_NEEDED) != 0 ? frame.value:0), node_pos); // result target //putCode( resaddr, node_pos); // the object //putCode( dp, node_pos); // function name if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(direct ? VM_CALLD : VM_CALLI); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(((restype & RT_NEEDED) != 0 ? frame.value : 0)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; // generate argument code GenerateFuncCallArgCode(); // extend frame and return if ((restype & RT_NEEDED) != 0) { frame.value++; } return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } default: { ErrorMsg(Error.CannotModifyLHS); return 0; break; } } goto case Token.T_SYMBOL; } case Token.T_SYMBOL: { // symbol // accessing to a variable int n; if (mAsGlobalContextMode) { n = -1; } else { // global mode cannot access local variables string str = node.GetValue().AsString(); n = mNamespace.Find(str); } if (n != -1) { bool isstnone = !(param.mSubType != stNone); if (!isstnone) { switch (param.mSubType) { case stEqual: { // substitution, or like it //putCode(VM_CP, node_pos); //putCode((-n-mVariableReserveCount-1), node_pos); //putCode( param.mSubAddress, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-n - mVariableReserveCount - 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(param.mSubAddress); mCodeAreaPos++; break; } case stBitAND: case stBitOR: case stBitXOR: case stSub: case stAdd: case stMod: case stDiv: case stIDiv: case stMul: case stLogOR: case stLogAND: case stSAR: case stSAL: case stSR: { //putCode(param.mSubType, node_pos); //putCode((-n-mVariableReserveCount-1), node_pos); //putCode( param.mSubAddress, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(param.mSubType); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-n - mVariableReserveCount - 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(param.mSubAddress); mCodeAreaPos++; return (restype & RT_NEEDED) != 0 ? -n - mVariableReserveCount - 1 : 0; } case stPreInc: { // pre-positioning //putCode(VM_INC, node_pos); //putCode((-n-mVariableReserveCount-1), node_pos); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_INC); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-n - mVariableReserveCount - 1); mCodeAreaPos++; return (restype & RT_NEEDED) != 0 ? -n - mVariableReserveCount - 1 : 0; } case stPreDec: { // pre- //putCode(VM_DEC, node_pos); //putCode((-n-mVariableReserveCount-1), node_pos); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_DEC); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-n - mVariableReserveCount - 1); mCodeAreaPos++; return (restype & RT_NEEDED) != 0 ? -n - mVariableReserveCount - 1 : 0; } case stPostInc: { // post- if ((restype & RT_NEEDED) != 0) { //putCode(VM_CP, node_pos); //putCode( frame.value, node_pos); //putCode((-n-mVariableReserveCount-1), node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-n - mVariableReserveCount - 1); mCodeAreaPos++; frame.value++; } //putCode(VM_INC, node_pos); //putCode((-n-mVariableReserveCount-1), node_pos); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_INC); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-n - mVariableReserveCount - 1); mCodeAreaPos++; return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } case stPostDec: { // post- if ((restype & RT_NEEDED) != 0) { //putCode(VM_CP, node_pos); //putCode( frame.value, node_pos); //putCode((-n-mVariableReserveCount-1), node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-n - mVariableReserveCount - 1); mCodeAreaPos++; frame.value++; } //putCode(VM_DEC, node_pos); //putCode((-n-mVariableReserveCount-1), node_pos); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_DEC); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(-n - mVariableReserveCount - 1); mCodeAreaPos++; return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } case stDelete: { // deletion string str = node.GetValue().AsString(); mNamespace.Remove(str); if ((restype & RT_NEEDED) != 0) { int dp = PutData(new Variant(1)); // true //putCode(VM_CONST, node_pos); //putCode( frame.value, node_pos); //putCode( dp, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_CONST); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dp); mCodeAreaPos++; return frame.value - 1; } return 0; } default: { ErrorMsg(Error.CannotModifyLHS); break; } } return 0; } else { // read string str = node.GetValue().AsString(); int n1 = mNamespace.Find(str); return -n1 - mVariableReserveCount - 1; } } else { // n==-1 ( indicates the variable is not found in the local ) // assume the variable is in "this". // make nodes that refer "this" and process it ExprNode nodep = new ExprNode(); nodep.SetOpecode(Token.T_DOT); nodep.SetPosition(node_pos); ExprNode node1 = new ExprNode(); mNodeToDeleteVector.AddItem(node1); nodep.Add(node1); node1.SetOpecode(mAsGlobalContextMode ? Token.T_GLOBAL : Token.T_THIS_PROXY); node1.SetPosition(node_pos); ExprNode node2 = new ExprNode(); mNodeToDeleteVector.AddItem(node2); nodep.Add(node2); node2.SetOpecode(Token.T_SYMBOL); node2.SetPosition(node_pos); node2.SetValue(node.GetValue()); return GenNodeCode(frame, nodep, restype, reqresaddr, param); } goto case Token.T_IGNOREPROP; } case Token.T_IGNOREPROP: case Token.T_PROPACCESS: { // unary '&' operator // unary '*' operator if (node.GetOpecode() == (TJS.mUnaryAsteriskIgnoresPropAccess ? Token.T_PROPACCESS : Token.T_IGNOREPROP)) { // unary '&' operator // substance accessing (ignores property operation) InterCodeGenerator.SubParam sp = new InterCodeGenerator.SubParam(param); if (sp.mSubType == stNone) { sp.mSubType = stIgnorePropGet; } else { if (sp.mSubType == stEqual) { sp.mSubType = stIgnorePropSet; } else { ErrorMsg(Error.CannotModifyLHS); } } return GenNodeCode(frame, node.GetNode(0), restype, reqresaddr, sp); } else { // unary '*' operator // force property access resaddr = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); switch (param.mSubType) { case stNone: { // read from property object //putCode(VM_GETP, node_pos); //putCode( frame.value, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_GETP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; frame.value++; return frame.value - 1; } case stEqual: { // write to property object //putCode(VM_SETP, node_pos); //putCode( resaddr, node_pos); //putCode( param.mSubAddress, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_SETP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(param.mSubAddress); mCodeAreaPos++; return param.mSubAddress; } case stBitAND: case stBitOR: case stBitXOR: case stSub: case stAdd: case stMod: case stDiv: case stIDiv: case stMul: case stLogOR: case stLogAND: case stSAR: case stSAL: case stSR: { //putCode(param.mSubType + 3, node_pos); // +3 : property access // ( see the ope-code's positioning order ) //putCode(((restype & RT_NEEDED) != 0 ? frame.value: 0), node_pos); //putCode( resaddr, node_pos); //putCode( param.mSubAddress, node_pos); if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(param.mSubType + 3); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(((restype & RT_NEEDED) != 0 ? frame.value : 0)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(param.mSubAddress); mCodeAreaPos++; if ((restype & RT_NEEDED) != 0) { frame.value++; } return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } case stPreInc: case stPreDec: { //putCode((param.mSubType == stPreInc ? VM_INC : VM_DEC) + 3, node_pos); //putCode(((restype & RT_NEEDED) != 0 ? frame.value : 0), node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)((param.mSubType == stPreInc ? VM_INC : VM_DEC) + 3); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(((restype & RT_NEEDED) != 0 ? frame.value : 0)); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; if ((restype & RT_NEEDED) != 0) { frame.value++; } return (restype & RT_NEEDED) != 0 ? frame.value - 1 : 0; } case stPostInc: case stPostDec: { int retresaddr = 0; if ((restype & RT_NEEDED) != 0) { // need result ... //putCode(VM_GETP, node_pos); //putCode( frame.value, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_GETP); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; retresaddr = frame.value; frame.value++; } //putCode((param.mSubType == stPostInc ? VM_INC : VM_DEC) + 3, node_pos); //putCode( 0, node_pos); //putCode( resaddr, node_pos); if ((mCodeAreaPos + 2) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)((param.mSubType == stPostInc ? VM_INC : VM_DEC) + 3); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; return retresaddr; } default: { ErrorMsg(Error.CannotModifyLHS); return 0; break; } } } goto case Token.T_SUPER; } case Token.T_SUPER: { // 'super' // refer super class //int dp; ExprNode node1; if (mParent != null && mParent.mContextType == ContextType.PROPERTY) { if ((node1 = mParent.mParent.mSuperClassExpr) == null) { ErrorMsg(Error.CannotGetSuper); return 0; } } else { if (mParent == null || (node1 = mParent.mSuperClassExpr) == null) { ErrorMsg(Error.CannotGetSuper); return 0; } } mAsGlobalContextMode = true; // the code must be generated in global context try { resaddr = GenNodeCode(frame, node1, restype, reqresaddr, param); } finally { mAsGlobalContextMode = false; } return resaddr; } case Token.T_THIS: { if (param.mSubType != 0) { ErrorMsg(Error.CannotModifyLHS); } return -1; } case Token.T_THIS_PROXY: { // this-proxy is a special register that points // both "objthis" and "global" // if refering member is not in "objthis", this-proxy // refers "global". return -mVariableReserveCount; } case Token.T_WITHDOT: { // unary '.' operator // dot operator omitting object name ExprNode nodep = new ExprNode(); nodep.SetOpecode(Token.T_DOT); nodep.SetPosition(node_pos); ExprNode node1 = new ExprNode(); mNodeToDeleteVector.AddItem(node1); nodep.Add(node1); node1.SetOpecode(Token.T_WITHDOT_PROXY); node1.SetPosition(node_pos); nodep.Add(node.GetNode(0)); return GenNodeCode(frame, nodep, restype, reqresaddr, param); } case Token.T_WITHDOT_PROXY: { // virtual left side of "." operator which omits object // search in NestVector int i = mNestVector.Count - 1; for (; i >= 0; i--) { InterCodeGenerator.NestData data = mNestVector[i]; if (data.Type == ntWith) { // found return data.RefRegister; } } goto case Token.T_GLOBAL; } case Token.T_GLOBAL: { // not found in NestVector ... // NO "break" HERE!!!!!! (pass thru to global) if (param.mSubType != 0) { ErrorMsg(Error.CannotModifyLHS); } if ((restype & RT_NEEDED) == 0) { return 0; } //putCode(VM_GLOBAL, node_pos); //putCode( frame.value, node_pos); if ((mCodeAreaPos + 1) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_GLOBAL); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; frame.value++; return frame.value - 1; } case Token.T_INLINEARRAY: { // inline array int arraydp = PutData(new Variant("Array")); // global %frame0 // gpd %frame1, %frame0 . #arraydp // #arraydp = Array int frame0 = frame.value; if ((mCodeAreaPos + 12) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } //putCode(VM_GLOBAL, node_pos); //putCode((frame.value+0), node_pos); mCodeArea[mCodeAreaPos] = (short)(VM_GLOBAL); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; //putCode(VM_GPD, node_pos); //putCode((frame.value+1), node_pos); //putCode((frame.value+0), node_pos); //putCode( arraydp, node_pos); mCodeArea[mCodeAreaPos] = (short)(VM_GPD); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(arraydp); mCodeAreaPos++; // new %frame0, %frame1() //putCode(VM_NEW, node_pos); //putCode((frame.value+0), node_pos); //putCode((frame.value+1), node_pos); //putCode(0); // argument count for "new Array" mCodeArea[mCodeAreaPos] = (short)(VM_NEW); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; // const %frame1, #zerodp int zerodp = PutData(new Variant(0)); //putCode(VM_CONST, node_pos); //putCode((frame.value+1), node_pos); //putCode( zerodp, node_pos); mCodeArea[mCodeAreaPos] = (short)(VM_CONST); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(zerodp); mCodeAreaPos++; frame.value += 2; mArrayArgStack.Push(new InterCodeGenerator.ArrayArg()); mArrayArgStack.Peek().Object = frame0; mArrayArgStack.Peek().Counter = frame0 + 1; int nodesize = node.GetSize(); if (node.GetSize() == 1 && node.GetNode(0).GetNode(0) == null) { } else { // the element is empty for (int i = 0; i < nodesize; i++) { GenNodeCode(frame, node.GetNode(i), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); } } // elements mArrayArgStack.Pop(); return (restype & RT_NEEDED) != 0 ? (frame0) : 0; } case Token.T_ARRAYARG: { // an element of inline array int framestart = frame.value; resaddr = node.GetNode(0) != null ? GenNodeCode(frame, node.GetNode(0), RT_NEEDED , 0, new InterCodeGenerator.SubParam()) : 0; // spis %object.%count, %resaddr //putCode(VM_SPIS, node_pos); //putCode((mArrayArgStack.peek().Object)); //putCode((mArrayArgStack.peek().Counter)); //putCode( resaddr); if ((mCodeAreaPos + 5) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_SPIS); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(mArrayArgStack.Peek().Object); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(mArrayArgStack.Peek().Counter); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(resaddr); mCodeAreaPos++; // inc %count //putCode(VM_INC); //putCode((mArrayArgStack.peek().Counter)); mCodeArea[mCodeAreaPos] = (short)(VM_INC); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(mArrayArgStack.Peek().Counter); mCodeAreaPos++; ClearFrame(frame, framestart); return 0; } case Token.T_INLINEDIC: { // inline dictionary int dicdp = PutData(new Variant("Dictionary")); // global %frame0 // gpd %frame1, %frame0 . #dicdp // #dicdp = Dictionary int frame0 = frame.value; if ((mCodeAreaPos + 9) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } //putCode(VM_GLOBAL, node_pos); //putCode((frame.value+0), node_pos); mCodeArea[mCodeAreaPos] = (short)(VM_GLOBAL); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; //putCode(VM_GPD, node_pos); //putCode((frame.value+1), node_pos); //putCode((frame.value+0), node_pos); //putCode( dicdp, node_pos); mCodeArea[mCodeAreaPos] = (short)(VM_GPD); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(dicdp); mCodeAreaPos++; // new %frame0, %frame1() //putCode(VM_NEW, node_pos); //putCode((frame.value+0), node_pos); //putCode((frame.value+1), node_pos); //putCode(0); // argument count for "Dictionary" class mCodeArea[mCodeAreaPos] = (short)(VM_NEW); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; frame.value += 2; ClearFrame(frame, frame0 + 1); // clear register at frame+1 mArrayArgStack.Push(new InterCodeGenerator.ArrayArg()); mArrayArgStack.Peek().Object = frame0; int nodesize = node.GetSize(); for (int i = 0; i < nodesize; i++) { GenNodeCode(frame, node.GetNode(i), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); } // element mArrayArgStack.Pop(); return (restype & RT_NEEDED) != 0 ? (frame0) : 0; } case Token.T_DICELM: { // an element of inline dictionary int framestart = frame.value; int name; int value; name = GenNodeCode(frame, node.GetNode(0), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); value = GenNodeCode(frame, node.GetNode(1), RT_NEEDED, 0, new InterCodeGenerator.SubParam ()); // spis %object.%name, %value //putCode(VM_SPIS, node_pos); //putCode((mArrayArgStack.peek().Object)); //putCode( name); //putCode( value); if ((mCodeAreaPos + 3) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } mCodeArea[mCodeAreaPos] = (short)(VM_SPIS); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(mArrayArgStack.Peek().Object); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(name); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(value); mCodeAreaPos++; ClearFrame(frame, framestart); return 0; } case Token.T_REGEXP: { // constant regular expression if ((restype & RT_NEEDED) == 0) { return 0; } int regexpdp = PutData(new Variant("RegExp")); int patdp = PutData(node.GetValue()); int compiledp = PutData(new Variant("_compile")); // global %frame0 // gpd %frame1, %frame0 . #regexpdp // #regexpdp = RegExp int frame0 = frame.value; if ((mCodeAreaPos + 18) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(node_pos); } //putCode(VM_GLOBAL, node_pos); //putCode( frame.value); mCodeArea[mCodeAreaPos] = (short)(VM_GLOBAL); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; //putCode(VM_GPD); //putCode((frame.value + 1)); //putCode( frame.value); //putCode( regexpdp); mCodeArea[mCodeAreaPos] = (short)(VM_GPD); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(regexpdp); mCodeAreaPos++; // const frame2, patdp; //putCode(VM_CONST); //putCode((frame.value + 2)); //putCode( patdp); mCodeArea[mCodeAreaPos] = (short)(VM_CONST); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 2); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(patdp); mCodeAreaPos++; // new frame0 , frame1(); //putCode(VM_NEW); //putCode( frame.value); //putCode((frame.value+1)); //putCode(0); mCodeArea[mCodeAreaPos] = (short)(VM_NEW); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; // calld 0, frame0 . #compiledp(frame2) //putCode(VM_CALLD); //putCode( 0); //putCode( frame0); //putCode( compiledp); //putCode(1); //putCode((frame.value+2)); mCodeArea[mCodeAreaPos] = (short)(VM_CALLD); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(0); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame0); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(compiledp); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(1); mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)(frame.value + 2); mCodeAreaPos++; frame.value += 3; ClearFrame(frame, frame0 + 1); return frame0; } case Token.T_VOID: { if (param.mSubType != 0) { ErrorMsg(Error.CannotModifyLHS); } if ((restype & RT_NEEDED) == 0) { return 0; } return 0; } } // 0 is always void return 0; }
private void DoContinuePatch(InterCodeGenerator.NestData nestdata) { // process the ContinuePatchList which must be in the top of NextVector IntVector vector = nestdata.ContinuePatchVector; int count = vector.Size(); int codeSize = mCodeAreaPos; for (int i = 0; i < count; i++) { int val = vector.Get(i); mCodeArea[val + 1] = (short)(codeSize - val); } }
private void AddProperty(string name, InterCodeGenerator val) { mProperties.AddItem(new InterCodeGenerator.Property(name, val)); }
// update FunctionRegisterCodePoint /// <exception cref="Kirikiri.Tjs2.VariantException"></exception> /// <exception cref="Kirikiri.Tjs2.TJSException"></exception> protected internal virtual void FinalizeObject() { if (mPropSetter != null) { mPropSetter = null; } if (mPropGetter != null) { mPropGetter = null; } if (mSuperClassGetter != null) { mSuperClassGetter = null; } if (mCodeArea != null) { mCodeArea = null; } if (mDataArea != null) { mDataArea.Clear(); mDataArea = null; } mBlock.Remove(this); if (mContextType != ContextType.TOP_LEVEL && mBlock != null) { mBlock = null; } mNamespace.Clear(); ClearNodesToDelete(); }
/// <exception cref="Kirikiri.Tjs2.VariantException"></exception> public InterCodeGenerator(InterCodeGenerator parent, string name, Compiler block, int type) { //super(getContextHashSize(type)); //super.mCallFinalize = false; mNodeToDeleteVector = new VectorWrap<ExprNode>(); mCurrentNodeVector = new VectorWrap<ExprNode>(); mJumpList = new IntVector(); mNestVector = new VectorWrap<InterCodeGenerator.NestData>(); mArrayArgStack = new Stack<InterCodeGenerator.ArrayArg>(); mFuncArgStack = new Stack<InterCodeGenerator.FuncArg>(); mNamespace = new LocalNamespace(); mFixList = new AList<InterCodeGenerator.FixData>(); mNonLocalFunctionDeclVector = new VectorWrap<InterCodeGenerator.NonLocalFunctionDecl >(); mSuperClassGetterPointer = new IntVector(); mParent = parent; mPropGetter = mPropSetter = mSuperClassGetter = null; mCodeArea = new short[INC_ARRAY_COUNT]; mDataArea = new AList<Variant>(); mInterCodeDataArea = new AList<Variant>(); mFrameBase = 1; //mSuperClassExpr = null; //mMaxFrameCount = 0; //mMaxVariableCount = 0; //mFuncDeclArgCount = 0; //mFuncDeclUnnamedArgArrayBase = 0; mFuncDeclCollapseBase = -1; //mFunctionRegisterCodePoint = 0; mPrevSourcePos = -1; //mSourcePosArraySorted = false; //mSourcePosArray = null; if (name != null && name.Length > 0) { mName = name; } //else { // mName = null; //} //mAsGlobalContextMode = false; mContextType = type; switch (mContextType) { case ContextType.TOP_LEVEL: { // decide variable reservation count with context type mVariableReserveCount = 2; break; } case ContextType.FUNCTION: { mVariableReserveCount = 2; break; } case ContextType.EXPR_FUNCTION: { mVariableReserveCount = 2; break; } case ContextType.PROPERTY: { mVariableReserveCount = 0; break; } case ContextType.PROPERTY_SETTER: { mVariableReserveCount = 2; break; } case ContextType.PROPERTY_GETTER: { mVariableReserveCount = 2; break; } case ContextType.CLASS: { mVariableReserveCount = 2; break; } case ContextType.SUPER_CLASS_GETTER: { mVariableReserveCount = 2; break; } } mBlock = block; mBlock.Add(this); if (mContextType == ContextType.CLASS) { // add class information to the class instance information if (mMaxFrameCount < 1) { mMaxFrameCount = 1; } int dp = PutData(new Variant(mName)); int lexPos = GetLexPos(); // const %1, name // addci %-1, %1 // cl %1 if ((mCodeAreaPos + 7) >= mCodeArea.Length) { ExpandCodeArea(); } if (CompileState.mEnableDebugCode) { PutSrcPos(lexPos); } mCodeArea[mCodeAreaPos] = (short)VM_CONST; mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)1; mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)dp; mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)VM_ADDCI; mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)-1; mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)1; mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)VM_CL; mCodeAreaPos++; mCodeArea[mCodeAreaPos] = (short)1; mCodeAreaPos++; // update FunctionRegisterCodePoint mFunctionRegisterCodePoint = mCodeAreaPos; } }