sqfuncstate.h
00001
00002 #ifndef _SQFUNCSTATE_H_
00003 #define _SQFUNCSTATE_H_
00005 #include "squtils.h"
00006
00007 struct SQFuncState
00008 {
00009 SQFuncState(SQSharedState *ss,SQFuncState *parent,CompilerErrorFunc efunc,void *ed);
00010 ~SQFuncState();
00011 #ifdef _DEBUG_DUMP
00012 void Dump(SQFunctionProto *func);
00013 #endif
00014 void Error(const SQChar *err);
00015 SQFuncState *PushChildState(SQSharedState *ss);
00016 void PopChildState();
00017 void AddInstruction(SQOpcode _op,SQInteger arg0=0,SQInteger arg1=0,SQInteger arg2=0,SQInteger arg3=0){SQInstruction i(_op,arg0,arg1,arg2,arg3);AddInstruction(i);}
00018 void AddInstruction(SQInstruction &i);
00019 void SetIntructionParams(SQInteger pos,SQInteger arg0,SQInteger arg1,SQInteger arg2=0,SQInteger arg3=0);
00020 void SetIntructionParam(SQInteger pos,SQInteger arg,SQInteger val);
00021 SQInstruction &GetInstruction(SQInteger pos){return _instructions[pos];}
00022 void PopInstructions(SQInteger size){for(SQInteger i=0;i<size;i++)_instructions.pop_back();}
00023 void SetStackSize(SQInteger n);
00024 void SnoozeOpt(){_optimization=false;}
00025 void AddDefaultParam(SQInteger trg) { _defaultparams.push_back(trg); }
00026 SQInteger GetDefaultParamCount() { return _defaultparams.size(); }
00027 SQInteger GetCurrentPos(){return _instructions.size()-1;}
00028 SQInteger GetNumericConstant(const SQInteger cons);
00029 SQInteger GetNumericConstant(const SQFloat cons);
00030 SQInteger PushLocalVariable(const SQObject &name);
00031 void AddParameter(const SQObject &name);
00032 void AddOuterValue(const SQObject &name);
00033 SQInteger GetLocalVariable(const SQObject &name);
00034 SQInteger GetOuterVariable(const SQObject &name);
00035 SQInteger GenerateCode();
00036 SQInteger GetStackSize();
00037 SQInteger CalcStackFrameSize();
00038 void AddLineInfos(SQInteger line,bool lineop,bool force=false);
00039 SQFunctionProto *BuildProto();
00040 SQInteger AllocStackPos();
00041 SQInteger PushTarget(SQInteger n=-1);
00042 SQInteger PopTarget();
00043 SQInteger TopTarget();
00044 SQInteger GetUpTarget(SQInteger n);
00045 bool IsLocal(SQUnsignedInteger stkpos);
00046 SQObject CreateString(const SQChar *s,SQInteger len = -1);
00047 SQObject CreateTable();
00048 bool IsConstant(const SQObject &name,SQObject &e);
00049 SQInteger _returnexp;
00050 SQLocalVarInfoVec _vlocals;
00051 SQIntVec _targetstack;
00052 SQInteger _stacksize;
00053 bool _varparams;
00054 bool _bgenerator;
00055 SQIntVec _unresolvedbreaks;
00056 SQIntVec _unresolvedcontinues;
00057 SQObjectPtrVec _functions;
00058 SQObjectPtrVec _parameters;
00059 SQOuterVarVec _outervalues;
00060 SQInstructionVec _instructions;
00061 SQLocalVarInfoVec _localvarinfos;
00062 SQObjectPtr _literals;
00063 SQObjectPtr _strings;
00064 SQObjectPtr _name;
00065 SQObjectPtr _sourcename;
00066 SQInteger _nliterals;
00067 SQLineInfoVec _lineinfos;
00068 SQFuncState *_parent;
00069 SQIntVec _breaktargets;
00070 SQIntVec _continuetargets;
00071 SQIntVec _defaultparams;
00072 SQInteger _lastline;
00073 SQInteger _traps;
00074 bool _optimization;
00075 SQSharedState *_sharedstate;
00076 sqvector<SQFuncState*> _childstates;
00077 SQInteger GetConstant(const SQObject &cons);
00078 private:
00079 CompilerErrorFunc _errfunc;
00080 void *_errtarget;
00081 };
00082
00083
00084 #endif //_SQFUNCSTATE_H_
00085