sqfuncproto.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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. struct SQLocalVarInfo
  29. {
  30. SQLocalVarInfo():_start_op(0),_end_op(0),_pos(0){}
  31. SQLocalVarInfo(const SQLocalVarInfo &lvi)
  32. {
  33. _name=lvi._name;
  34. _start_op=lvi._start_op;
  35. _end_op=lvi._end_op;
  36. _pos=lvi._pos;
  37. }
  38. SQObjectPtr _name;
  39. SQUnsignedInteger _start_op;
  40. SQUnsignedInteger _end_op;
  41. SQUnsignedInteger _pos;
  42. };
  43. struct SQLineInfo { SQInteger _line;SQInteger _op; };
  44. typedef sqvector<SQOuterVar> SQOuterVarVec;
  45. typedef sqvector<SQLocalVarInfo> SQLocalVarInfoVec;
  46. typedef sqvector<SQLineInfo> SQLineInfoVec;
  47. #define _FUNC_SIZE(ni,nl,nparams,nfuncs,nouters,nlineinf,localinf,defparams) (sizeof(SQFunctionProto) \
  48. +((ni-1)*sizeof(SQInstruction))+(nl*sizeof(SQObjectPtr)) \
  49. +(nparams*sizeof(SQObjectPtr))+(nfuncs*sizeof(SQObjectPtr)) \
  50. +(nouters*sizeof(SQOuterVar))+(nlineinf*sizeof(SQLineInfo)) \
  51. +(localinf*sizeof(SQLocalVarInfo))+(defparams*sizeof(SQInteger)))
  52. struct SQFunctionProto : public CHAINABLE_OBJ
  53. {
  54. private:
  55. SQFunctionProto(SQSharedState *ss);
  56. ~SQFunctionProto();
  57. public:
  58. static SQFunctionProto *Create(SQSharedState *ss,SQInteger ninstructions,
  59. SQInteger nliterals,SQInteger nparameters,
  60. SQInteger nfunctions,SQInteger noutervalues,
  61. SQInteger nlineinfos,SQInteger nlocalvarinfos,SQInteger ndefaultparams)
  62. {
  63. SQFunctionProto *f;
  64. //I compact the whole class and members in a single memory allocation
  65. f = (SQFunctionProto *)sq_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams));
  66. new (f) SQFunctionProto(ss);
  67. f->_ninstructions = ninstructions;
  68. f->_literals = (SQObjectPtr*)&f->_instructions[ninstructions];
  69. f->_nliterals = nliterals;
  70. f->_parameters = (SQObjectPtr*)&f->_literals[nliterals];
  71. f->_nparameters = nparameters;
  72. f->_functions = (SQObjectPtr*)&f->_parameters[nparameters];
  73. f->_nfunctions = nfunctions;
  74. f->_outervalues = (SQOuterVar*)&f->_functions[nfunctions];
  75. f->_noutervalues = noutervalues;
  76. f->_lineinfos = (SQLineInfo *)&f->_outervalues[noutervalues];
  77. f->_nlineinfos = nlineinfos;
  78. f->_localvarinfos = (SQLocalVarInfo *)&f->_lineinfos[nlineinfos];
  79. f->_nlocalvarinfos = nlocalvarinfos;
  80. f->_defaultparams = (SQInteger *)&f->_localvarinfos[nlocalvarinfos];
  81. f->_ndefaultparams = ndefaultparams;
  82. _CONSTRUCT_VECTOR(SQObjectPtr,f->_nliterals,f->_literals);
  83. _CONSTRUCT_VECTOR(SQObjectPtr,f->_nparameters,f->_parameters);
  84. _CONSTRUCT_VECTOR(SQObjectPtr,f->_nfunctions,f->_functions);
  85. _CONSTRUCT_VECTOR(SQOuterVar,f->_noutervalues,f->_outervalues);
  86. //_CONSTRUCT_VECTOR(SQLineInfo,f->_nlineinfos,f->_lineinfos); //not required are 2 integers
  87. _CONSTRUCT_VECTOR(SQLocalVarInfo,f->_nlocalvarinfos,f->_localvarinfos);
  88. return f;
  89. }
  90. void Release(){
  91. _DESTRUCT_VECTOR(SQObjectPtr,_nliterals,_literals);
  92. _DESTRUCT_VECTOR(SQObjectPtr,_nparameters,_parameters);
  93. _DESTRUCT_VECTOR(SQObjectPtr,_nfunctions,_functions);
  94. _DESTRUCT_VECTOR(SQOuterVar,_noutervalues,_outervalues);
  95. //_DESTRUCT_VECTOR(SQLineInfo,_nlineinfos,_lineinfos); //not required are 2 integers
  96. _DESTRUCT_VECTOR(SQLocalVarInfo,_nlocalvarinfos,_localvarinfos);
  97. SQInteger size = _FUNC_SIZE(_ninstructions,_nliterals,_nparameters,_nfunctions,_noutervalues,_nlineinfos,_nlocalvarinfos,_ndefaultparams);
  98. this->~SQFunctionProto();
  99. sq_vm_free(this,size);
  100. }
  101. const SQChar* GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop);
  102. SQInteger GetLine(SQInstruction *curr);
  103. bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
  104. static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret);
  105. #ifndef NO_GARBAGE_COLLECTOR
  106. void Mark(SQCollectable **chain);
  107. void Finalize(){ _NULL_SQOBJECT_VECTOR(_literals,_nliterals); }
  108. SQObjectType GetType() {return OT_FUNCPROTO;}
  109. #endif
  110. SQObjectPtr _sourcename;
  111. SQObjectPtr _name;
  112. SQInteger _stacksize;
  113. bool _bgenerator;
  114. SQInteger _varparams;
  115. SQInteger _nlocalvarinfos;
  116. SQLocalVarInfo *_localvarinfos;
  117. SQInteger _nlineinfos;
  118. SQLineInfo *_lineinfos;
  119. SQInteger _nliterals;
  120. SQObjectPtr *_literals;
  121. SQInteger _nparameters;
  122. SQObjectPtr *_parameters;
  123. SQInteger _nfunctions;
  124. SQObjectPtr *_functions;
  125. SQInteger _noutervalues;
  126. SQOuterVar *_outervalues;
  127. SQInteger _ndefaultparams;
  128. SQInteger *_defaultparams;
  129. SQInteger _ninstructions;
  130. SQInstruction _instructions[1];
  131. };
  132. #endif //_SQFUNCTION_H_