sqfuncproto.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /* see copyright notice in squirrel.h */
  2. #ifndef _SQFUNCTION_H_
  3. #define _SQFUNCTION_H_
  4. #include "sqopcodes.h"
  5. enum SQOuterType {
  6. otLOCAL = 0,
  7. otOUTER = 1
  8. };
  9. struct SQOuterVar
  10. {
  11. SQOuterVar(){}
  12. SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t)
  13. {
  14. _name = name;
  15. _src=src;
  16. _type=t;
  17. }
  18. SQOuterVar(const SQOuterVar &ov)
  19. {
  20. _type=ov._type;
  21. _src=ov._src;
  22. _name=ov._name;
  23. }
  24. SQOuterType _type;
  25. SQObjectPtr _name;
  26. SQObjectPtr _src;
  27. };
  28. #define _VAR_ANY 0x00000001
  29. #define _VAR_INTEGER 0x00000002
  30. #define _VAR_FLOAT 0x00000004
  31. #define _VAR_BOOL 0x00000008
  32. #define _VAR_STRING 0x00000010
  33. #define _VAR_TABLE 0x00000020
  34. #define _VAR_ARRAY 0x00000040
  35. #define _VAR_CLOSURE 0x00000080
  36. #define _VAR_CLASS 0x00000100
  37. #define _VAR_REFERENCE 0x00000200
  38. #define _VAR_CONST 0x00000400
  39. #define _VAR_POINTER 0x00001000
  40. struct SQLocalVarInfo
  41. {
  42. SQLocalVarInfo():_start_op(0),_end_op(0),_pos(0),
  43. _type(_VAR_ANY),_scope(0) {}
  44. SQLocalVarInfo(const SQLocalVarInfo &lvi):
  45. _name(lvi._name),_type_name(lvi._type_name),
  46. _start_op(lvi._start_op),_end_op(lvi._end_op),
  47. _pos(lvi._pos),_type(lvi._type),_scope(lvi._scope)
  48. {}
  49. SQObjectPtr _name;
  50. SQObjectPtr _type_name;
  51. SQUnsignedInteger _start_op;
  52. SQUnsignedInteger _end_op;
  53. SQUnsignedInteger _pos;
  54. unsigned short _type;
  55. unsigned short _scope;
  56. };
  57. struct SQLineInfo { SQInteger _line;SQInteger _op; };
  58. struct SQGotoLabelsInfo { SQObjectPtr name; SQInt32 pos; SQInt16 line; SQInt16 traps; SQInt16 nested;};
  59. typedef sqvector<SQOuterVar> SQOuterVarVec;
  60. typedef sqvector<SQLocalVarInfo> SQLocalVarInfoVec;
  61. typedef sqvector<SQLineInfo> SQLineInfoVec;
  62. typedef sqvector<SQGotoLabelsInfo> SQGotoLabelsInfoVec;
  63. #define _FUNC_SIZE(ni,nl,nparams,nfuncs,nouters,nlineinf,localinf,defparams) \
  64. (sizeof(SQFunctionProto) \
  65. +((ni-1)*sizeof(SQInstruction)) \
  66. +(nl*sizeof(SQObjectPtr)) \
  67. +(nparams*sizeof(SQObjectPtr)) \
  68. +(/*param_types*/nparams*sizeof(SQObjectPtr)) \
  69. +(nfuncs*sizeof(SQObjectPtr)) \
  70. +(nouters*sizeof(SQOuterVar)) \
  71. +(nlineinf*sizeof(SQLineInfo)) \
  72. +(localinf*sizeof(SQLocalVarInfo)) \
  73. +(defparams*sizeof(SQInteger)))
  74. struct SQFunctionProto : public CHAINABLE_OBJ
  75. {
  76. private:
  77. SQFunctionProto(SQSharedState *ss);
  78. ~SQFunctionProto();
  79. public:
  80. static SQFunctionProto *Create(SQSharedState *ss,SQInteger ninstructions,
  81. SQInteger nliterals,SQInteger nparameters,
  82. SQInteger nfunctions,SQInteger noutervalues,
  83. SQInteger nlineinfos,SQInteger nlocalvarinfos,SQInteger ndefaultparams)
  84. {
  85. SQFunctionProto *f;
  86. //I compact the whole class and members in a single memory allocation
  87. f = (SQFunctionProto *)sq_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams));
  88. new (f) SQFunctionProto(ss);
  89. f->_ninstructions = ninstructions;
  90. //literals start at then end of _instructions
  91. f->_literals = (SQObjectPtr*)&f->_instructions[ninstructions];
  92. f->_nliterals = nliterals;
  93. //parameters start at then end of _literals
  94. f->_parameters = (SQObjectPtr*)&f->_literals[nliterals];
  95. f->_nparameters = nparameters;
  96. //the same as above repeat till the end
  97. f->_parameters_type = (SQObjectPtr*)&f->_parameters[nparameters];
  98. f->_functions = (SQObjectPtr*)&f->_parameters_type[nparameters];
  99. f->_nfunctions = nfunctions;
  100. f->_outervalues = (SQOuterVar*)&f->_functions[nfunctions];
  101. f->_noutervalues = noutervalues;
  102. f->_lineinfos = (SQLineInfo *)&f->_outervalues[noutervalues];
  103. f->_nlineinfos = nlineinfos;
  104. f->_localvarinfos = (SQLocalVarInfo *)&f->_lineinfos[nlineinfos];
  105. f->_nlocalvarinfos = nlocalvarinfos;
  106. f->_defaultparams = (SQInteger *)&f->_localvarinfos[nlocalvarinfos];
  107. f->_ndefaultparams = ndefaultparams;
  108. _CONSTRUCT_VECTOR(SQObjectPtr,f->_nliterals,f->_literals);
  109. _CONSTRUCT_VECTOR(SQObjectPtr,f->_nparameters,f->_parameters);
  110. _CONSTRUCT_VECTOR(SQObjectPtr,f->_nparameters,f->_parameters_type);
  111. _CONSTRUCT_VECTOR(SQObjectPtr,f->_nfunctions,f->_functions);
  112. _CONSTRUCT_VECTOR(SQOuterVar,f->_noutervalues,f->_outervalues);
  113. //_CONSTRUCT_VECTOR(SQLineInfo,f->_nlineinfos,f->_lineinfos); //not required are 2 integers
  114. _CONSTRUCT_VECTOR(SQLocalVarInfo,f->_nlocalvarinfos,f->_localvarinfos);
  115. return f;
  116. }
  117. void Release(){
  118. _DESTRUCT_VECTOR(SQObjectPtr,_nliterals,_literals);
  119. _DESTRUCT_VECTOR(SQObjectPtr,_nparameters,_parameters);
  120. _DESTRUCT_VECTOR(SQObjectPtr,_nparameters,_parameters_type);
  121. _DESTRUCT_VECTOR(SQObjectPtr,_nfunctions,_functions);
  122. _DESTRUCT_VECTOR(SQOuterVar,_noutervalues,_outervalues);
  123. //_DESTRUCT_VECTOR(SQLineInfo,_nlineinfos,_lineinfos); //not required are 2 integers
  124. _DESTRUCT_VECTOR(SQLocalVarInfo,_nlocalvarinfos,_localvarinfos);
  125. SQInteger size = _FUNC_SIZE(_ninstructions,_nliterals,_nparameters,_nfunctions,_noutervalues,_nlineinfos,_nlocalvarinfos,_ndefaultparams);
  126. this->~SQFunctionProto();
  127. sq_vm_free(this,size);
  128. }
  129. const SQChar* GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop);
  130. SQInteger GetLine(SQInstruction *curr);
  131. bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
  132. bool SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
  133. static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret);
  134. #ifdef SQ_JIT_LLVM
  135. void JitCompile();
  136. #endif
  137. #ifndef NO_GARBAGE_COLLECTOR
  138. void Mark(SQCollectable **chain);
  139. void Finalize(){ _NULL_SQOBJECT_VECTOR(_literals,_nliterals); }
  140. SQObjectType GetType() {return OT_FUNCPROTO;}
  141. #endif
  142. SQObjectPtr _sourcename;
  143. SQObjectPtr _name;
  144. SQObjectPtr _return_type;
  145. SQInteger _stacksize;
  146. bool _bgenerator;
  147. SQInteger _varparams;
  148. #ifdef SQ_JIT_LLVM
  149. llvm::Function* _jitfunction;
  150. #endif
  151. SQInteger _nlocalvarinfos;
  152. SQLocalVarInfo *_localvarinfos;
  153. SQInteger _nlineinfos;
  154. SQLineInfo *_lineinfos;
  155. SQInteger _nliterals;
  156. SQObjectPtr *_literals;
  157. SQInteger _nparameters;
  158. SQObjectPtr *_parameters;
  159. SQObjectPtr *_parameters_type;
  160. SQInteger _nfunctions;
  161. SQObjectPtr *_functions;
  162. SQInteger _noutervalues;
  163. SQOuterVar *_outervalues;
  164. SQInteger _ndefaultparams;
  165. SQInteger *_defaultparams;
  166. SQInteger _ninstructions;
  167. SQInstruction _instructions[1];
  168. };
  169. #endif //_SQFUNCTION_H_