1 /* see copyright notice in squirrel.h */
6 void sqstd_printcallstack(HSQUIRRELVM v)
8 SQPRINTFUNCTION pf = sq_getprintfunc(v);
14 SQInteger level=1; //1 is to skip this function that is level 0
17 pf(v,_SC("\nCALLSTACK\n"));
18 while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
20 const SQChar *fn=_SC("unknown");
21 const SQChar *src=_SC("unknown");
22 if(si.funcname)fn=si.funcname;
23 if(si.source)src=si.source;
24 pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);
28 pf(v,_SC("\nLOCALS\n"));
30 for(level=0;level<10;level++){
32 while((name = sq_getlocal(v,level,seq)))
35 switch(sq_gettype(v,-1))
38 pf(v,_SC("[%s] NULL\n"),name);
41 sq_getinteger(v,-1,&i);
42 pf(v,_SC("[%s] %d\n"),name,i);
46 pf(v,_SC("[%s] %.14g\n"),name,f);
49 pf(v,_SC("[%s] USERPOINTER\n"),name);
52 sq_getstring(v,-1,&s);
53 pf(v,_SC("[%s] \"%s\"\n"),name,s);
56 pf(v,_SC("[%s] TABLE\n"),name);
59 pf(v,_SC("[%s] ARRAY\n"),name);
62 pf(v,_SC("[%s] CLOSURE\n"),name);
64 case OT_NATIVECLOSURE:
65 pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
68 pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
71 pf(v,_SC("[%s] USERDATA\n"),name);
74 pf(v,_SC("[%s] THREAD\n"),name);
77 pf(v,_SC("[%s] CLASS\n"),name);
80 pf(v,_SC("[%s] INSTANCE\n"),name);
83 pf(v,_SC("[%s] INSTANCE\n"),name);
86 sq_getinteger(v,-1,&i);
87 pf(v,_SC("[%s] %s\n"),name,i?_SC("true"):_SC("false"));
90 default: assert(0); break;
98 static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)
100 SQPRINTFUNCTION pf = sq_getprintfunc(v);
102 const SQChar *sErr = 0;
103 if(sq_gettop(v)>=1) {
104 if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
105 pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
108 pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
110 sqstd_printcallstack(v);
116 void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSource,SQInteger line,SQInteger column)
118 SQPRINTFUNCTION pf = sq_getprintfunc(v);
120 pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);
124 void sqstd_seterrorhandlers(HSQUIRRELVM v)
126 sq_setcompilererrorhandler(v,_sqstd_compiler_error);
127 sq_newclosure(v,_sqstd_aux_printerror,0);
128 sq_seterrorhandler(v);