1 /* see copyright notice in squirrel.h */
\r
2 #include <squirrel.h>
\r
3 #include <sqstdaux.h>
\r
6 void sqstd_printcallstack(HSQUIRRELVM v)
\r
8 SQPRINTFUNCTION pf = sq_getprintfunc(v);
\r
15 SQInteger level=1; //1 is to skip this function that is level 0
\r
16 const SQChar *name=0;
\r
18 pf(v,_SC("\nCALLSTACK\n"));
\r
19 while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
\r
21 const SQChar *fn=_SC("unknown");
\r
22 const SQChar *src=_SC("unknown");
\r
23 if(si.funcname)fn=si.funcname;
\r
24 if(si.source)src=si.source;
\r
25 pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);
\r
29 pf(v,_SC("\nLOCALS\n"));
\r
31 for(level=0;level<10;level++){
\r
33 while((name = sq_getlocal(v,level,seq)))
\r
36 switch(sq_gettype(v,-1))
\r
39 pf(v,_SC("[%s] NULL\n"),name);
\r
42 sq_getinteger(v,-1,&i);
\r
43 pf(v,_SC("[%s] %d\n"),name,i);
\r
46 sq_getfloat(v,-1,&f);
\r
47 pf(v,_SC("[%s] %.14g\n"),name,f);
\r
49 case OT_USERPOINTER:
\r
50 pf(v,_SC("[%s] USERPOINTER\n"),name);
\r
53 sq_getstring(v,-1,&s);
\r
54 pf(v,_SC("[%s] \"%s\"\n"),name,s);
\r
57 pf(v,_SC("[%s] TABLE\n"),name);
\r
60 pf(v,_SC("[%s] ARRAY\n"),name);
\r
63 pf(v,_SC("[%s] CLOSURE\n"),name);
\r
65 case OT_NATIVECLOSURE:
\r
66 pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
\r
69 pf(v,_SC("[%s] GENERATOR\n"),name);
\r
72 pf(v,_SC("[%s] USERDATA\n"),name);
\r
75 pf(v,_SC("[%s] THREAD\n"),name);
\r
78 pf(v,_SC("[%s] CLASS\n"),name);
\r
81 pf(v,_SC("[%s] INSTANCE\n"),name);
\r
84 pf(v,_SC("[%s] WEAKREF\n"),name);
\r
87 sq_getbool(v,-1,&b);
\r
88 pf(v,_SC("[%s] %s\n"),name,b?_SC("true"):_SC("false"));
\r
91 default: assert(0); break;
\r
99 static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)
\r
101 SQPRINTFUNCTION pf = sq_getprintfunc(v);
\r
103 const SQChar *sErr = 0;
\r
104 if(sq_gettop(v)>=1) {
\r
105 if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
\r
106 pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
\r
109 pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
\r
111 sqstd_printcallstack(v);
\r
117 void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSource,SQInteger line,SQInteger column)
\r
119 SQPRINTFUNCTION pf = sq_getprintfunc(v);
\r
121 pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);
\r
125 void sqstd_seterrorhandlers(HSQUIRRELVM v)
\r
127 sq_setcompilererrorhandler(v,_sqstd_compiler_error);
\r
128 sq_newclosure(v,_sqstd_aux_printerror,0);
\r
129 sq_seterrorhandler(v);
\r