sqdebug.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. see copyright notice in squirrel.h
  3. */
  4. #include "sqpcheader.h"
  5. #include <stdarg.h>
  6. #include "sqvm.h"
  7. #include "sqfuncproto.h"
  8. #include "sqclosure.h"
  9. #include "sqstring.h"
  10. SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi)
  11. {
  12. SQInteger cssize = v->_callsstacksize;
  13. if (cssize > level) {
  14. SQVM::CallInfo &ci = v->_callsstack[cssize-level-1];
  15. if(sq_isclosure(ci._closure)) {
  16. SQClosure *c = _closure(ci._closure);
  17. SQFunctionProto *proto = c->_function;
  18. fi->funcid = proto;
  19. fi->name = type(proto->_name) == OT_STRING?_stringval(proto->_name):_SC("unknown");
  20. fi->source = type(proto->_name) == OT_STRING?_stringval(proto->_sourcename):_SC("unknown");
  21. return SQ_OK;
  22. }
  23. }
  24. return sq_throwerror(v,_SC("the object is not a closure"));
  25. }
  26. SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si)
  27. {
  28. SQInteger cssize = v->_callsstacksize;
  29. if (cssize > level) {
  30. memset(si, 0, sizeof(SQStackInfos));
  31. SQVM::CallInfo &ci = v->_callsstack[cssize-level-1];
  32. switch (type(ci._closure)) {
  33. case OT_CLOSURE:{
  34. SQFunctionProto *func = _closure(ci._closure)->_function;
  35. if (type(func->_name) == OT_STRING)
  36. si->funcname = _stringval(func->_name);
  37. if (type(func->_sourcename) == OT_STRING)
  38. si->source = _stringval(func->_sourcename);
  39. si->line = func->GetLine(ci._ip);
  40. }
  41. break;
  42. case OT_NATIVECLOSURE:
  43. si->source = _SC("NATIVE");
  44. si->funcname = _SC("unknown");
  45. if(type(_nativeclosure(ci._closure)->_name) == OT_STRING)
  46. si->funcname = _stringval(_nativeclosure(ci._closure)->_name);
  47. si->line = -1;
  48. break;
  49. default: break; //shutup compiler
  50. }
  51. return SQ_OK;
  52. }
  53. return SQ_ERROR;
  54. }
  55. void SQVM::Raise_Error(const SQChar *s, ...)
  56. {
  57. va_list vl;
  58. va_start(vl, s);
  59. scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl);
  60. va_end(vl);
  61. _lasterror = SQString::Create(_ss(this),_spval,-1);
  62. }
  63. void SQVM::Raise_Error(const SQObjectPtr &desc)
  64. {
  65. _lasterror = desc;
  66. }
  67. SQString *SQVM::PrintObjVal(const SQObjectPtr &o)
  68. {
  69. switch(type(o)) {
  70. case OT_STRING: return _string(o);
  71. case OT_INTEGER:
  72. scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _PRINT_INT_FMT, _integer(o));
  73. return SQString::Create(_ss(this), _spval);
  74. break;
  75. case OT_FLOAT:
  76. scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%.14g"), _float(o));
  77. return SQString::Create(_ss(this), _spval);
  78. break;
  79. default:
  80. return SQString::Create(_ss(this), GetTypeName(o));
  81. }
  82. }
  83. void SQVM::Raise_IdxError(const SQObjectPtr &o)
  84. {
  85. SQObjectPtr oval = PrintObjVal(o);
  86. Raise_Error(_SC("the index '%.50s' does not exist"), _stringval(oval));
  87. }
  88. void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2)
  89. {
  90. SQObjectPtr oval1 = PrintObjVal(o1), oval2 = PrintObjVal(o2);
  91. Raise_Error(_SC("comparison between '%.50s' and '%.50s'"), _stringval(oval1), _stringval(oval2));
  92. }
  93. void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type)
  94. {
  95. SQObjectPtr exptypes = SQString::Create(_ss(this), _SC(""), -1);
  96. SQInteger found = 0;
  97. for(SQInteger i=0; i<16; i++)
  98. {
  99. SQInteger mask = 0x00000001 << i;
  100. if(typemask & (mask)) {
  101. if(found>0) StringCat(exptypes,SQString::Create(_ss(this), _SC("|"), -1), exptypes);
  102. found ++;
  103. StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes);
  104. }
  105. }
  106. Raise_Error(_SC("parameter %d has an invalid type '%s' ; expected: '%s'"), nparam, IdType2Name((SQObjectType)type), _stringval(exptypes));
  107. }