Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Tue Jul 12 2022 21:35:49 by
1.7.2