sqstdaux.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /* see copyright notice in squirrel.h */
  2. #include <squirrel.h>
  3. #include <sqstdaux.h>
  4. #include <assert.h>
  5. void sqstd_printcallstack(HSQUIRRELVM v)
  6. {
  7. SQPRINTFUNCTION pf = sq_geterrorfunc(v);
  8. if(pf) {
  9. SQStackInfos si;
  10. SQInteger i;
  11. SQFloat f;
  12. const SQChar *s;
  13. SQInteger level=1; //1 is to skip this function that is level 0
  14. const SQChar *name=0;
  15. SQInteger seq=0;
  16. SQInteger max_str_size = 10 * 1024; //to not print long strings in stack trace
  17. sq_pushliteral(v, _SC("__max_print_stack_str_size")); //can be overwritten at runtime
  18. if(sq_getonroottable(v) == SQ_OK)
  19. {
  20. sq_getinteger(v, -1, &max_str_size);
  21. sq_poptop(v); //remove the result
  22. }
  23. pf(v,_SC("\nCALLSTACK\n"));
  24. while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
  25. {
  26. const SQChar *fn=_SC("unknown");
  27. const SQChar *src=_SC("unknown");
  28. if(si.funcname)fn=si.funcname;
  29. if(si.source)src=si.source;
  30. pf(v,_SC("%s:%d:0 *FUNCTION [%s()]\n"),src,si.line,fn);
  31. level++;
  32. }
  33. //level=0;
  34. pf(v,_SC("\nLOCALS\n"));
  35. for(level=0;level<10;level++){
  36. seq=0;
  37. while((name = sq_getlocal(v,level,seq)))
  38. {
  39. seq++;
  40. switch(sq_gettype(v,-1))
  41. {
  42. case OT_NULL:
  43. pf(v,_SC("[%s] NULL\n"),name);
  44. break;
  45. case OT_INTEGER:
  46. sq_getinteger(v,-1,&i);
  47. pf(v,_SC("[%s] %d\n"),name,i);
  48. break;
  49. case OT_FLOAT:
  50. sq_getfloat(v,-1,&f);
  51. pf(v,_SC("[%s] %.14g\n"),name,f);
  52. break;
  53. case OT_USERPOINTER:
  54. pf(v,_SC("[%s] USERPOINTER\n"),name);
  55. break;
  56. case OT_STRING:
  57. sq_getstring(v,-1,&s);
  58. if(sq_getsize(v, -1) > max_str_size)
  59. {
  60. pf(v,_SC("[%s] (%d max dump) \"%.*s\"\n"), name, max_str_size, max_str_size, s);
  61. }
  62. else
  63. {
  64. pf(v,_SC("[%s] \"%s\"\n"), name, s);
  65. }
  66. break;
  67. case OT_TABLE:
  68. pf(v,_SC("[%s] TABLE\n"),name);
  69. break;
  70. case OT_ARRAY:
  71. pf(v,_SC("[%s] ARRAY\n"),name);
  72. break;
  73. case OT_CLOSURE:
  74. pf(v,_SC("[%s] CLOSURE\n"),name);
  75. break;
  76. case OT_NATIVECLOSURE:
  77. pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
  78. break;
  79. case OT_GENERATOR:
  80. pf(v,_SC("[%s] GENERATOR\n"),name);
  81. break;
  82. case OT_USERDATA:
  83. pf(v,_SC("[%s] USERDATA\n"),name);
  84. break;
  85. case OT_THREAD:
  86. pf(v,_SC("[%s] THREAD\n"),name);
  87. break;
  88. case OT_CLASS:
  89. pf(v,_SC("[%s] CLASS\n"),name);
  90. break;
  91. case OT_INSTANCE:
  92. pf(v,_SC("[%s] INSTANCE\n"),name);
  93. break;
  94. case OT_WEAKREF:
  95. pf(v,_SC("[%s] WEAKREF\n"),name);
  96. break;
  97. case OT_BOOL:{
  98. SQBool bval;
  99. sq_getbool(v,-1,&bval);
  100. pf(v,_SC("[%s] %s\n"),name, bval == SQTrue ? _SC("true") : _SC("false"));
  101. }
  102. break;
  103. default: assert(0); break;
  104. }
  105. sq_pop(v,1);
  106. }
  107. }
  108. }
  109. }
  110. static SQRESULT _sqstd_aux_printerror(HSQUIRRELVM v)
  111. {
  112. SQPRINTFUNCTION pf = sq_geterrorfunc(v);
  113. if(pf) {
  114. const SQChar *sErr = 0;
  115. if(sq_gettop(v)>=1) {
  116. if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
  117. pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
  118. }
  119. else{
  120. pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
  121. }
  122. sqstd_printcallstack(v);
  123. }
  124. }
  125. return 0;
  126. }
  127. void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSource,SQInteger line,SQInteger column)
  128. {
  129. SQPRINTFUNCTION pf = sq_geterrorfunc(v);
  130. if(pf) {
  131. //pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);
  132. pf(v,_SC("%s:%d:%d : error %s\n"),sSource,line,column,sErr);
  133. }
  134. }
  135. void sqstd_seterrorhandlers(HSQUIRRELVM v)
  136. {
  137. sq_setcompilererrorhandler(v,_sqstd_compiler_error);
  138. sq_newclosure(v,_sqstd_aux_printerror,0);
  139. sq_seterrorhandler(v);
  140. }