5 #include "wrapper_util.hpp"
7 static void register_function(HSQUIRRELVM v, SQFUNCTION func, const char* name)
9 sq_pushstring(v, name, -1);
10 sq_newclosure(v, func, 0); //create a new function
11 if(sq_createslot(v, -3) < 0) {
12 std::stringstream msg;
13 msg << "Couldn't register function '" << name << "'";
14 throw SquirrelError(v, msg.str());
18 static void _register_functions(HSQUIRRELVM v, WrappedFunction* functions)
20 for(WrappedFunction* func = functions; func->name != 0; ++func) {
21 register_function(v, func->f, func->name);
25 static void register_class(HSQUIRRELVM v, WrappedClass* wclass)
27 sq_pushstring(v, wclass->name, -1);
28 sq_newclass(v, false);
29 _register_functions(v, wclass->functions);
30 _register_constants(v, wclass->int_consts);
31 _register_constants(v, wclass->float_consts);
32 _register_constants(v, wclass->string_consts);
34 if(sq_createslot(v, -3) < 0) {
35 std::stringstream msg;
36 msg << "Couldn't register function '" << wclass->name << "'";
37 throw SquirrelError(v, msg.str());
41 void register_functions(HSQUIRRELVM v, WrappedFunction* functions)
44 _register_functions(v, functions);
48 void register_classes(HSQUIRRELVM v, WrappedClass* classes)
51 for(WrappedClass* wclass = classes; wclass->name != 0; ++wclass) {
52 register_class(v, wclass);
58 void print_squirrel_stack(HSQUIRRELVM v)
60 printf("--------------------------------------------------------------\n");
61 int count = sq_gettop(v);
62 for(int i = 1; i <= count; ++i) {
64 switch(sq_gettype(v, i))
71 sq_getinteger(v, i, &val);
72 printf("integer (%d)", val);
77 sq_getfloat(v, i, &val);
78 printf("float (%f)", val);
83 sq_getstring(v, i, &val);
84 printf("string (%s)", val);
97 printf("closure(function)");
99 case OT_NATIVECLOSURE:
100 printf("native closure(C function)");
106 printf("userpointer");
118 printf("unknown?!?");
123 printf("--------------------------------------------------------------\n");
126 //----------------------------------------------------------------------------
128 SquirrelError::SquirrelError(HSQUIRRELVM v, const std::string& message) throw()
130 std::ostringstream msg;
131 msg << "SQuirrel error: " << message << " (";
134 if(sq_gettype(v, -1) != OT_STRING) {
135 lasterr = "no error info";
137 sq_getstring(v, -1, &lasterr);
140 msg << lasterr << ")";
141 this->message = msg.str();
144 SquirrelError::~SquirrelError() throw()
148 SquirrelError::what() const throw()
150 return message.c_str();