Back to home page

Enduro/X

 
 

    


0001 /*  see copyright notice in pscript.h */
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         //I compact the whole class and members in a single memory allocation

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         //_CONSTRUCT_VECTOR(PSLineInfo,f->_nlineinfos,f->_lineinfos); //not required are 2 integers

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         //_DESTRUCT_VECTOR(PSLineInfo,_nlineinfos,_lineinfos); //not required are 2 integers

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 //_PSFUNCTION_H_