Back to home page

Enduro/X

 
 

    


0001 /* see copyright notice in pscript.h */
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; //1 is to skip this function that is level 0
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 }