0001
0002 #ifndef _PSFUNCTION_H_
0003 #define _PSFUNCTION_H_
0004
0005 #include "psopcodes.h"
0006
0007 enum PSOuterType {
0008 otLOCAL = 0,
0009 otOUTER = 1
0010 };
0011
0012 struct PSOuterVar
0013 {
0014
0015 PSOuterVar(){}
0016 PSOuterVar(const PSObjectPtr &name,const PSObjectPtr &src,PSOuterType t)
0017 {
0018 _name = name;
0019 _src=src;
0020 _type=t;
0021 }
0022 PSOuterVar(const PSOuterVar &ov)
0023 {
0024 _type=ov._type;
0025 _src=ov._src;
0026 _name=ov._name;
0027 }
0028 PSOuterType _type;
0029 PSObjectPtr _name;
0030 PSObjectPtr _src;
0031 };
0032
0033 struct PSLocalVarInfo
0034 {
0035 PSLocalVarInfo():_start_op(0),_end_op(0),_pos(0){}
0036 PSLocalVarInfo(const PSLocalVarInfo &lvi)
0037 {
0038 _name=lvi._name;
0039 _start_op=lvi._start_op;
0040 _end_op=lvi._end_op;
0041 _pos=lvi._pos;
0042 }
0043 PSObjectPtr _name;
0044 PSUnsignedInteger _start_op;
0045 PSUnsignedInteger _end_op;
0046 PSUnsignedInteger _pos;
0047 };
0048
0049 struct PSLineInfo { PSInteger _line;PSInteger _op; };
0050
0051 typedef psvector<PSOuterVar> PSOuterVarVec;
0052 typedef psvector<PSLocalVarInfo> PSLocalVarInfoVec;
0053 typedef psvector<PSLineInfo> PSLineInfoVec;
0054
0055 #define _FUNC_SIZE(ni,nl,nparams,nfuncs,nouters,nlineinf,localinf,defparams) (sizeof(PSFunctionProto) \
0056 +((ni-1)*sizeof(PSInstruction))+(nl*sizeof(PSObjectPtr)) \
0057 +(nparams*sizeof(PSObjectPtr))+(nfuncs*sizeof(PSObjectPtr)) \
0058 +(nouters*sizeof(PSOuterVar))+(nlineinf*sizeof(PSLineInfo)) \
0059 +(localinf*sizeof(PSLocalVarInfo))+(defparams*sizeof(PSInteger)))
0060
0061
0062 struct PSFunctionProto : public CHAINABLE_OBJ
0063 {
0064 private:
0065 PSFunctionProto(PSSharedState *ss);
0066 ~PSFunctionProto();
0067
0068 public:
0069 static PSFunctionProto *Create(PSSharedState *ss,PSInteger ninstructions,
0070 PSInteger nliterals,PSInteger nparameters,
0071 PSInteger nfunctions,PSInteger noutervalues,
0072 PSInteger nlineinfos,PSInteger nlocalvarinfos,PSInteger ndefaultparams)
0073 {
0074 PSFunctionProto *f;
0075
0076 f = (PSFunctionProto *)ps_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams));
0077 new (f) PSFunctionProto(ss);
0078 f->_ninstructions = ninstructions;
0079 f->_literals = (PSObjectPtr*)&f->_instructions[ninstructions];
0080 f->_nliterals = nliterals;
0081 f->_parameters = (PSObjectPtr*)&f->_literals[nliterals];
0082 f->_nparameters = nparameters;
0083 f->_functions = (PSObjectPtr*)&f->_parameters[nparameters];
0084 f->_nfunctions = nfunctions;
0085 f->_outervalues = (PSOuterVar*)&f->_functions[nfunctions];
0086 f->_noutervalues = noutervalues;
0087 f->_lineinfos = (PSLineInfo *)&f->_outervalues[noutervalues];
0088 f->_nlineinfos = nlineinfos;
0089 f->_localvarinfos = (PSLocalVarInfo *)&f->_lineinfos[nlineinfos];
0090 f->_nlocalvarinfos = nlocalvarinfos;
0091 f->_defaultparams = (PSInteger *)&f->_localvarinfos[nlocalvarinfos];
0092 f->_ndefaultparams = ndefaultparams;
0093
0094 _CONSTRUCT_VECTOR(PSObjectPtr,f->_nliterals,f->_literals);
0095 _CONSTRUCT_VECTOR(PSObjectPtr,f->_nparameters,f->_parameters);
0096 _CONSTRUCT_VECTOR(PSObjectPtr,f->_nfunctions,f->_functions);
0097 _CONSTRUCT_VECTOR(PSOuterVar,f->_noutervalues,f->_outervalues);
0098
0099 _CONSTRUCT_VECTOR(PSLocalVarInfo,f->_nlocalvarinfos,f->_localvarinfos);
0100 return f;
0101 }
0102 void Release(){
0103 _DESTRUCT_VECTOR(PSObjectPtr,_nliterals,_literals);
0104 _DESTRUCT_VECTOR(PSObjectPtr,_nparameters,_parameters);
0105 _DESTRUCT_VECTOR(PSObjectPtr,_nfunctions,_functions);
0106 _DESTRUCT_VECTOR(PSOuterVar,_noutervalues,_outervalues);
0107
0108 _DESTRUCT_VECTOR(PSLocalVarInfo,_nlocalvarinfos,_localvarinfos);
0109 PSInteger size = _FUNC_SIZE(_ninstructions,_nliterals,_nparameters,_nfunctions,_noutervalues,_nlineinfos,_nlocalvarinfos,_ndefaultparams);
0110 this->~PSFunctionProto();
0111 ps_vm_free(this,size);
0112 }
0113
0114 const PSChar* GetLocal(PSVM *v,PSUnsignedInteger stackbase,PSUnsignedInteger nseq,PSUnsignedInteger nop);
0115 PSInteger GetLine(PSInstruction *curr);
0116 bool Save(PSVM *v,PSUserPointer up,PSWRITEFUNC write);
0117 static bool Load(PSVM *v,PSUserPointer up,PSREADFUNC read,PSObjectPtr &ret);
0118 #ifndef NO_GARBAGE_COLLECTOR
0119 void Mark(PSCollectable **chain);
0120 void Finalize(){ _NULL_PSOBJECT_VECTOR(_literals,_nliterals); }
0121 PSObjectType GetType() {return OT_FUNCPROTO;}
0122 #endif
0123 PSObjectPtr _sourcename;
0124 PSObjectPtr _name;
0125 PSInteger _stacksize;
0126 bool _bgenerator;
0127 PSInteger _varparams;
0128
0129 PSInteger _nlocalvarinfos;
0130 PSLocalVarInfo *_localvarinfos;
0131
0132 PSInteger _nlineinfos;
0133 PSLineInfo *_lineinfos;
0134
0135 PSInteger _nliterals;
0136 PSObjectPtr *_literals;
0137
0138 PSInteger _nparameters;
0139 PSObjectPtr *_parameters;
0140
0141 PSInteger _nfunctions;
0142 PSObjectPtr *_functions;
0143
0144 PSInteger _noutervalues;
0145 PSOuterVar *_outervalues;
0146
0147 PSInteger _ndefaultparams;
0148 PSInteger *_defaultparams;
0149
0150 PSInteger _ninstructions;
0151 PSInstruction _instructions[1];
0152 };
0153
0154 #endif