1 /* see copyright notice in squirrel.h */
5 void sqstd_printcallstack(HSQUIRRELVM v)
7 SQPRINTFUNCTION pf = sq_getprintfunc(v);
13 int level=1; //1 is to skip this function that is level 0
16 pf(v,_SC("\nCALLSTACK\n"));
17 while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
19 const SQChar *fn=_SC("unknown");
20 const SQChar *src=_SC("unknown");
21 if(si.funcname)fn=si.funcname;
22 if(si.source)src=si.source;
23 pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);
27 pf(v,_SC("\nLOCALS\n"));
29 for(level=0;level<10;level++){
31 while( (name=sq_getlocal(v,level,seq)) )
34 switch(sq_gettype(v,-1))
37 pf(v,_SC("[%s] NULL\n"),name);
40 sq_getinteger(v,-1,&i);
41 pf(v,_SC("[%s] %d\n"),name,i);
45 pf(v,_SC("[%s] %.14g\n"),name,f);
48 pf(v,_SC("[%s] USERPOINTER\n"),name);
51 sq_getstring(v,-1,&s);
52 pf(v,_SC("[%s] \"%s\"\n"),name,s);
55 pf(v,_SC("[%s] TABLE\n"),name);
58 pf(v,_SC("[%s] ARRAY\n"),name);
61 pf(v,_SC("[%s] CLOSURE\n"),name);
63 case OT_NATIVECLOSURE:
64 pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
67 pf(v,_SC("[%s] USERDATA\n"),name);
70 pf(v,_SC("[%s] THREAD\n"),name);
73 pf(v,_SC("[%s] CLASS\n"),name);
76 pf(v,_SC("[%s] INSTANCE\n"),name);
87 static int _sqstd_aux_printerror(HSQUIRRELVM v)
89 SQPRINTFUNCTION pf = sq_getprintfunc(v);
91 const SQChar *sErr = 0;
93 if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
94 pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
97 pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
99 sqstd_printcallstack(v);
105 void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSource,int line,int column)
107 SQPRINTFUNCTION pf = sq_getprintfunc(v);
109 pf(v,_SC("ERROR %s line=(%d) column=(%d) [%s]\n"),sErr,line,column,sSource);
113 void sqstd_seterrorhandlers(HSQUIRRELVM v)
115 sq_setcompilererrorhandler(v,_sqstd_compiler_error);
116 sq_newclosure(v,_sqstd_aux_printerror,0);
117 sq_seterrorhandler(v);