1 /*	see copyright notice in squirrel.h */
2 #ifndef _SQFUNCSTATE_H_
3 #define _SQFUNCSTATE_H_
4 ///////////////////////////////////
5 #include "squtils.h"
6 
7 struct SQFuncState
8 {
9 	SQFuncState(SQSharedState *ss,SQFuncState *parent,CompilerErrorFunc efunc,void *ed);
10 	~SQFuncState();
11 #ifdef _DEBUG_DUMP
12 	void Dump(SQFunctionProto *func);
13 #endif
14 	void Error(const SQChar *err);
15 	SQFuncState *PushChildState(SQSharedState *ss);
16 	void PopChildState();
17 	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);}
18 	void AddInstruction(SQInstruction &i);
19 	void SetIntructionParams(SQInteger pos,SQInteger arg0,SQInteger arg1,SQInteger arg2=0,SQInteger arg3=0);
20 	void SetIntructionParam(SQInteger pos,SQInteger arg,SQInteger val);
GetInstructionSQFuncState21 	SQInstruction &GetInstruction(SQInteger pos){return _instructions[pos];}
PopInstructionsSQFuncState22 	void PopInstructions(SQInteger size){for(SQInteger i=0;i<size;i++)_instructions.pop_back();}
23 	void SetStackSize(SQInteger n);
SnoozeOptSQFuncState24 	void SnoozeOpt(){_optimization=false;}
AddDefaultParamSQFuncState25 	void AddDefaultParam(SQInteger trg) { _defaultparams.push_back(trg); }
GetDefaultParamCountSQFuncState26 	SQInteger GetDefaultParamCount() { return _defaultparams.size(); }
GetCurrentPosSQFuncState27 	SQInteger GetCurrentPos(){return _instructions.size()-1;}
28 	SQInteger GetNumericConstant(const SQInteger cons);
29 	SQInteger GetNumericConstant(const SQFloat cons);
30 	SQInteger PushLocalVariable(const SQObject &name);
31 	void AddParameter(const SQObject &name);
32 	void AddOuterValue(const SQObject &name);
33 	SQInteger GetLocalVariable(const SQObject &name);
34 	SQInteger GetOuterVariable(const SQObject &name);
35 	SQInteger GenerateCode();
36 	SQInteger GetStackSize();
37 	SQInteger CalcStackFrameSize();
38 	void AddLineInfos(SQInteger line,bool lineop,bool force=false);
39 	SQFunctionProto *BuildProto();
40 	SQInteger AllocStackPos();
41 	SQInteger PushTarget(SQInteger n=-1);
42 	SQInteger PopTarget();
43 	SQInteger TopTarget();
44 	SQInteger GetUpTarget(SQInteger n);
45 	bool IsLocal(SQUnsignedInteger stkpos);
46 	SQObject CreateString(const SQChar *s,SQInteger len = -1);
47 	SQObject CreateTable();
48 	bool IsConstant(const SQObject &name,SQObject &e);
49 	SQInteger _returnexp;
50 	SQLocalVarInfoVec _vlocals;
51 	SQIntVec _targetstack;
52 	SQInteger _stacksize;
53 	bool _varparams;
54 	bool _bgenerator;
55 	SQIntVec _unresolvedbreaks;
56 	SQIntVec _unresolvedcontinues;
57 	SQObjectPtrVec _functions;
58 	SQObjectPtrVec _parameters;
59 	SQOuterVarVec _outervalues;
60 	SQInstructionVec _instructions;
61 	SQLocalVarInfoVec _localvarinfos;
62 	SQObjectPtr _literals;
63 	SQObjectPtr _strings;
64 	SQObjectPtr _name;
65 	SQObjectPtr _sourcename;
66 	SQInteger _nliterals;
67 	SQLineInfoVec _lineinfos;
68 	SQFuncState *_parent;
69 	SQIntVec _breaktargets;
70 	SQIntVec _continuetargets;
71 	SQIntVec _defaultparams;
72 	SQInteger _lastline;
73 	SQInteger _traps; //contains number of nested exception traps
74 	bool _optimization;
75 	SQSharedState *_sharedstate;
76 	sqvector<SQFuncState*> _childstates;
77 	SQInteger GetConstant(const SQObject &cons);
78 private:
79 	CompilerErrorFunc _errfunc;
80 	void *_errtarget;
81 };
82 
83 
84 #endif //_SQFUNCSTATE_H_
85 
86