sqfuncproto.h 4.9 KB

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