Johan Wikman / SQUIRREL3

Dependents:   Squirrel

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sqdebug.cpp Source File

sqdebug.cpp

00001 /*
00002     see copyright notice in squirrel.h
00003 */
00004 #include "sqpcheader.h"
00005 #include <stdarg.h>
00006 #include "sqvm.h"
00007 #include "sqfuncproto.h"
00008 #include "sqclosure.h"
00009 #include "sqstring.h"
00010 
00011 SQRESULT sq_getfunctioninfo(HSQUIRRELVM v,SQInteger level,SQFunctionInfo *fi)
00012 {
00013     SQInteger cssize = v->_callsstacksize;
00014     if (cssize > level) {
00015         SQVM::CallInfo &ci = v->_callsstack[cssize-level-1];
00016         if(sq_isclosure(ci._closure)) {
00017             SQClosure *c = _closure(ci._closure);
00018             SQFunctionProto *proto = c->_function;
00019             fi->funcid = proto;
00020             fi->name = type(proto->_name) == OT_STRING?_stringval(proto->_name):_SC("unknown");
00021             fi->source = type(proto->_name) == OT_STRING?_stringval(proto->_sourcename):_SC("unknown");
00022             return SQ_OK;
00023         }
00024     }
00025     return sq_throwerror(v,_SC("the object is not a closure"));
00026 }
00027 
00028 SQRESULT sq_stackinfos(HSQUIRRELVM v, SQInteger level, SQStackInfos *si)
00029 {
00030     SQInteger cssize = v->_callsstacksize;
00031     if (cssize > level) {
00032         memset(si, 0, sizeof(SQStackInfos));
00033         SQVM::CallInfo &ci = v->_callsstack[cssize-level-1];
00034         switch (type(ci._closure)) {
00035         case OT_CLOSURE:{
00036             SQFunctionProto *func = _closure(ci._closure)->_function;
00037             if (type(func->_name) == OT_STRING)
00038                 si->funcname = _stringval(func->_name);
00039             if (type(func->_sourcename) == OT_STRING)
00040                 si->source = _stringval(func->_sourcename);
00041             si->line = func->GetLine(ci._ip);
00042                         }
00043             break;
00044         case OT_NATIVECLOSURE:
00045             si->source = _SC("NATIVE");
00046             si->funcname = _SC("unknown");
00047             if(type(_nativeclosure(ci._closure)->_name) == OT_STRING)
00048                 si->funcname = _stringval(_nativeclosure(ci._closure)->_name);
00049             si->line = -1;
00050             break;
00051         default: break; //shutup compiler
00052         }
00053         return SQ_OK;
00054     }
00055     return SQ_ERROR;
00056 }
00057 
00058 void SQVM::Raise_Error(const SQChar *s, ...)
00059 {
00060     va_list vl;
00061     va_start(vl, s);
00062     scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl);
00063     va_end(vl);
00064     _lasterror = SQString::Create(_ss(this),_spval,-1);
00065 }
00066 
00067 void SQVM::Raise_Error(const SQObjectPtr &desc)
00068 {
00069     _lasterror = desc;
00070 }
00071 
00072 SQString *SQVM::PrintObjVal(const SQObjectPtr &o)
00073 {
00074     switch(type(o)) {
00075     case OT_STRING: return _string(o);
00076     case OT_INTEGER:
00077         scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _PRINT_INT_FMT, _integer(o));
00078         return SQString::Create(_ss(this), _spval);
00079         break;
00080     case OT_FLOAT:
00081         scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%.14g"), _float(o));
00082         return SQString::Create(_ss(this), _spval);
00083         break;
00084     default:
00085         return SQString::Create(_ss(this), GetTypeName(o));
00086     }
00087 }
00088 
00089 void SQVM::Raise_IdxError(const SQObjectPtr &o)
00090 {
00091     SQObjectPtr oval = PrintObjVal(o);
00092     Raise_Error(_SC("the index '%.50s' does not exist"), _stringval(oval));
00093 }
00094 
00095 void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2)
00096 {
00097     SQObjectPtr oval1 = PrintObjVal(o1), oval2 = PrintObjVal(o2);
00098     Raise_Error(_SC("comparison between '%.50s' and '%.50s'"), _stringval(oval1), _stringval(oval2));
00099 }
00100 
00101 
00102 void SQVM::Raise_ParamTypeError(SQInteger nparam,SQInteger typemask,SQInteger type)
00103 {
00104     SQObjectPtr exptypes = SQString::Create(_ss(this), _SC(""), -1);
00105     SQInteger found = 0;    
00106     for(SQInteger i=0; i<16; i++)
00107     {
00108         SQInteger mask = 0x00000001 << i;
00109         if(typemask & (mask)) {
00110             if(found>0) StringCat(exptypes,SQString::Create(_ss(this), _SC("|"), -1), exptypes);
00111             found ++;
00112             StringCat(exptypes,SQString::Create(_ss(this), IdType2Name((SQObjectType)mask), -1), exptypes);
00113         }
00114     }
00115     Raise_Error(_SC("parameter %d has an invalid type '%s' ; expected: '%s'"), nparam, IdType2Name((SQObjectType)type), _stringval(exptypes));
00116 }