0001
0002 #include <pscript.h>
0003 #include <psstdaux.h>
0004 #include <assert.h>
0005
0006 void psstd_printcallstack(HPSCRIPTVM v)
0007 {
0008 PSPRINTFUNCTION pf = ps_geterrorfunc(v);
0009 if(pf) {
0010 PSStackInfos si;
0011 PSInteger i;
0012 PSFloat f;
0013 const PSChar *s;
0014 PSInteger level=1;
0015 const PSChar *name=0;
0016 PSInteger seq=0;
0017 pf(v,_SC("\nCALLSTACK\n"));
0018 while(PS_SUCCEEDED(ps_stackinfos(v,level,&si)))
0019 {
0020 const PSChar *fn=_SC("unknown");
0021 const PSChar *src=_SC("unknown");
0022 if(si.funcname)fn=si.funcname;
0023 if(si.source)src=si.source;
0024 pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);
0025 level++;
0026 }
0027 level=0;
0028 pf(v,_SC("\nLOCALS\n"));
0029
0030 for(level=0;level<10;level++){
0031 seq=0;
0032 while((name = ps_getlocal(v,level,seq)))
0033 {
0034 seq++;
0035 switch(ps_gettype(v,-1))
0036 {
0037 case OT_NULL:
0038 pf(v,_SC("[%s] NULL\n"),name);
0039 break;
0040 case OT_INTEGER:
0041 ps_getinteger(v,-1,&i);
0042 pf(v,_SC("[%s] %d\n"),name,i);
0043 break;
0044 case OT_FLOAT:
0045 ps_getfloat(v,-1,&f);
0046 pf(v,_SC("[%s] %.14g\n"),name,f);
0047 break;
0048 case OT_USERPOINTER:
0049 pf(v,_SC("[%s] USERPOINTER\n"),name);
0050 break;
0051 case OT_STRING:
0052 ps_getstring(v,-1,&s);
0053 pf(v,_SC("[%s] \"%s\"\n"),name,s);
0054 break;
0055 case OT_TABLE:
0056 pf(v,_SC("[%s] TABLE\n"),name);
0057 break;
0058 case OT_ARRAY:
0059 pf(v,_SC("[%s] ARRAY\n"),name);
0060 break;
0061 case OT_CLOSURE:
0062 pf(v,_SC("[%s] CLOSURE\n"),name);
0063 break;
0064 case OT_NATIVECLOSURE:
0065 pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
0066 break;
0067 case OT_GENERATOR:
0068 pf(v,_SC("[%s] GENERATOR\n"),name);
0069 break;
0070 case OT_USERDATA:
0071 pf(v,_SC("[%s] USERDATA\n"),name);
0072 break;
0073 case OT_THREAD:
0074 pf(v,_SC("[%s] THREAD\n"),name);
0075 break;
0076 case OT_CLASS:
0077 pf(v,_SC("[%s] CLASS\n"),name);
0078 break;
0079 case OT_INSTANCE:
0080 pf(v,_SC("[%s] INSTANCE\n"),name);
0081 break;
0082 case OT_WEAKREF:
0083 pf(v,_SC("[%s] WEAKREF\n"),name);
0084 break;
0085 case OT_BOOL:{
0086 PSBool bval;
0087 ps_getbool(v,-1,&bval);
0088 pf(v,_SC("[%s] %s\n"),name,bval == PSTrue ? _SC("true"):_SC("false"));
0089 }
0090 break;
0091 default: assert(0); break;
0092 }
0093 ps_pop(v,1);
0094 }
0095 }
0096 }
0097 }
0098
0099 static PSInteger _psstd_aux_printerror(HPSCRIPTVM v)
0100 {
0101 PSPRINTFUNCTION pf = ps_geterrorfunc(v);
0102 if(pf) {
0103 const PSChar *sErr = 0;
0104 if(ps_gettop(v)>=1) {
0105 if(PS_SUCCEEDED(ps_getstring(v,2,&sErr))) {
0106 pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
0107 }
0108 else{
0109 pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
0110 }
0111 psstd_printcallstack(v);
0112 }
0113 }
0114 return 0;
0115 }
0116
0117 void _psstd_compiler_error(HPSCRIPTVM v,const PSChar *sErr,const PSChar *sSource,PSInteger line,PSInteger column)
0118 {
0119 PSPRINTFUNCTION pf = ps_geterrorfunc(v);
0120 if(pf) {
0121 pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);
0122 }
0123 }
0124
0125 void psstd_seterrorhandlers(HPSCRIPTVM v)
0126 {
0127 ps_setcompilererrorhandler(v,_psstd_compiler_error);
0128 ps_newclosure(v,_psstd_aux_printerror,0);
0129 ps_seterrorhandler(v);
0130 }