3
SquirrelObject::SquirrelObject(void)
8
SquirrelObject::~SquirrelObject()
11
sq_release(SquirrelVM::_VM,&_o);
14
SquirrelObject::SquirrelObject(const SquirrelObject &o)
17
sq_addref(SquirrelVM::_VM,&_o);
20
SquirrelObject::SquirrelObject(HSQOBJECT o)
23
sq_addref(SquirrelVM::_VM,&_o);
26
void SquirrelObject::Reset(void) {
28
sq_release(SquirrelVM::_VM,&_o);
30
} // SquirrelObject::Reset
32
SquirrelObject SquirrelObject::Clone()
35
if(GetType() == OT_TABLE || GetType() == OT_ARRAY)
37
sq_pushobject(SquirrelVM::_VM,_o);
38
sq_clone(SquirrelVM::_VM,-1);
39
ret.AttachToStackObject(-1);
40
sq_pop(SquirrelVM::_VM,2);
46
SquirrelObject & SquirrelObject::operator =(const SquirrelObject &o)
50
sq_addref(SquirrelVM::_VM,&t);
51
sq_release(SquirrelVM::_VM,&_o);
56
SquirrelObject & SquirrelObject::operator =(SQInteger n)
58
sq_pushinteger(SquirrelVM::_VM,n);
59
AttachToStackObject(-1);
60
sq_pop(SquirrelVM::_VM,1);
64
void SquirrelObject::ArrayAppend(const SquirrelObject &o)
67
sq_pushobject(SquirrelVM::_VM,_o);
68
sq_pushobject(SquirrelVM::_VM,o._o);
69
sq_arrayappend(SquirrelVM::_VM,-2);
70
sq_pop(SquirrelVM::_VM,1);
74
void SquirrelObject::AttachToStackObject(SQInteger idx)
77
sq_getstackobj(SquirrelVM::_VM,idx,&t);
78
sq_addref(SquirrelVM::_VM,&t);
79
sq_release(SquirrelVM::_VM,&_o);
83
BOOL_T SquirrelObject::SetDelegate(SquirrelObject &obj)
85
if(obj.GetType() == OT_TABLE ||
86
obj.GetType() == OT_NULL) {
90
sq_pushobject(SquirrelVM::_VM,_o);
91
sq_pushobject(SquirrelVM::_VM,obj._o);
92
if(SQ_SUCCEEDED(sq_setdelegate(SquirrelVM::_VM,-2)))
95
// C::B patch: Handle all switch cases
102
SquirrelObject SquirrelObject::GetDelegate()
105
if(_o._type == OT_TABLE || _o._type == OT_USERDATA)
107
SQInteger top = sq_gettop(SquirrelVM::_VM);
108
sq_pushobject(SquirrelVM::_VM,_o);
109
sq_getdelegate(SquirrelVM::_VM,-1);
110
ret.AttachToStackObject(-1);
111
sq_settop(SquirrelVM::_VM,top);
112
// sq_pop(SquirrelVM::_VM,2);
117
BOOL_T SquirrelObject::IsNull() const
119
return sq_isnull(_o);
122
BOOL_T SquirrelObject::IsNumeric() const
124
return sq_isnumeric(_o);
127
SQInteger SquirrelObject::Len() const
130
if(sq_isarray(_o) || sq_istable(_o) || sq_isstring(_o)) {
131
sq_pushobject(SquirrelVM::_VM,_o);
132
ret = sq_getsize(SquirrelVM::_VM,-1);
133
sq_pop(SquirrelVM::_VM,1);
138
#define _SETVALUE_INT_BEGIN \
139
BOOL_T ret = FALSE; \
140
SQInteger top = sq_gettop(SquirrelVM::_VM); \
141
sq_pushobject(SquirrelVM::_VM,_o); \
142
sq_pushinteger(SquirrelVM::_VM,key);
144
#define _SETVALUE_INT_END \
145
if(SQ_SUCCEEDED(sq_rawset(SquirrelVM::_VM,-3))) { \
148
sq_settop(SquirrelVM::_VM,top); \
151
BOOL_T SquirrelObject::SetValue(INT_T key,const SquirrelObject &val)
154
sq_pushobject(SquirrelVM::_VM,val._o);
158
BOOL_T SquirrelObject::SetValue(INT_T key,INT_T n)
161
sq_pushinteger(SquirrelVM::_VM,n);
165
BOOL_T SquirrelObject::SetValue(INT_T key,FLOAT_T f)
168
sq_pushfloat(SquirrelVM::_VM,f);
172
BOOL_T SquirrelObject::SetValue(INT_T key,const SQChar *s)
175
sq_pushstring(SquirrelVM::_VM,s,-1);
179
BOOL_T SquirrelObject::SetValue(INT_T key,bool b)
182
sq_pushbool(SquirrelVM::_VM,b);
186
BOOL_T SquirrelObject::SetValue(const SquirrelObject &key,const SquirrelObject &val)
189
SQInteger top = sq_gettop(SquirrelVM::_VM);
190
sq_pushobject(SquirrelVM::_VM,_o);
191
sq_pushobject(SquirrelVM::_VM,key._o);
192
sq_pushobject(SquirrelVM::_VM,val._o);
193
if(SQ_SUCCEEDED(sq_rawset(SquirrelVM::_VM,-3))) {
196
sq_settop(SquirrelVM::_VM,top);
200
#define _SETVALUE_STR_BEGIN \
201
BOOL_T ret = FALSE; \
202
SQInteger top = sq_gettop(SquirrelVM::_VM); \
203
sq_pushobject(SquirrelVM::_VM,_o); \
204
sq_pushstring(SquirrelVM::_VM,key,-1);
206
#define _SETVALUE_STR_END \
207
if(SQ_SUCCEEDED(sq_rawset(SquirrelVM::_VM,-3))) { \
210
sq_settop(SquirrelVM::_VM,top); \
213
BOOL_T SquirrelObject::SetValue(const SQChar *key,const SquirrelObject &val)
216
sq_pushobject(SquirrelVM::_VM,val._o);
220
BOOL_T SquirrelObject::SetValue(const SQChar *key,INT_T n)
223
sq_pushinteger(SquirrelVM::_VM,n);
227
BOOL_T SquirrelObject::SetValue(const SQChar *key,FLOAT_T f)
230
sq_pushfloat(SquirrelVM::_VM,f);
234
BOOL_T SquirrelObject::SetValue(const SQChar *key,const SQChar *s)
237
sq_pushstring(SquirrelVM::_VM,s,-1);
241
BOOL_T SquirrelObject::SetValue(const SQChar *key,bool b)
244
sq_pushbool(SquirrelVM::_VM,b);
248
// === BEGIN User Pointer, User Data ===
250
BOOL_T SquirrelObject::SetUserPointer(const SQChar * key,SQUserPointer up) {
252
sq_pushuserpointer(SquirrelVM::_VM,up);
254
} // SquirrelObject::SetUserPointer
256
SQUserPointer SquirrelObject::GetUserPointer(const SQChar * key) {
257
SQUserPointer ret = NULL;
259
sq_getuserpointer(SquirrelVM::_VM,-1,&ret);
260
sq_pop(SquirrelVM::_VM,1);
262
sq_pop(SquirrelVM::_VM,1);
264
} // SquirrelObject::GetUserPointer
266
BOOL_T SquirrelObject::SetUserPointer(INT_T key,SQUserPointer up) {
268
sq_pushuserpointer(SquirrelVM::_VM,up);
270
} // SquirrelObject::SetUserPointer
272
SQUserPointer SquirrelObject::GetUserPointer(INT_T key) {
273
SQUserPointer ret = NULL;
275
sq_getuserpointer(SquirrelVM::_VM,-1,&ret);
276
sq_pop(SquirrelVM::_VM,1);
278
sq_pop(SquirrelVM::_VM,1);
280
} // SquirrelObject::GetUserPointer
284
BOOL_T SquirrelObject::NewUserData(const SQChar * key,INT_T size,SQUserPointer * typetag) {
286
sq_newuserdata(SquirrelVM::_VM,size);
288
sq_settypetag(SquirrelVM::_VM,-1,typetag);
291
} // SquirrelObject::NewUserData
293
BOOL_T SquirrelObject::GetUserData(const SQChar * key,SQUserPointer * data,SQUserPointer * typetag) {
296
sq_getuserdata(SquirrelVM::_VM,-1,data,typetag);
297
sq_pop(SquirrelVM::_VM,1);
300
sq_pop(SquirrelVM::_VM,1);
302
} // SquirrelObject::GetUserData
304
BOOL_T SquirrelObject::RawGetUserData(const SQChar * key,SQUserPointer * data,SQUserPointer * typetag) {
306
if (RawGetSlot(key)) {
307
sq_getuserdata(SquirrelVM::_VM,-1,data,typetag);
308
sq_pop(SquirrelVM::_VM,1);
311
sq_pop(SquirrelVM::_VM,1);
313
} // SquirrelObject::RawGetUserData
315
// === END User Pointer ===
317
// === BEGIN Arrays ===
319
BOOL_T SquirrelObject::ArrayResize(INT_T newSize) {
320
// SQInteger top = sq_gettop(SquirrelVM::_VM);
321
sq_pushobject(SquirrelVM::_VM,GetObjectHandle());
322
BOOL_T res = sq_arrayresize(SquirrelVM::_VM,-1,newSize) == SQ_OK;
323
sq_pop(SquirrelVM::_VM,1);
324
// sq_settop(SquirrelVM::_VM,top);
326
} // SquirrelObject::ArrayResize
328
BOOL_T SquirrelObject::ArrayExtend(INT_T amount) {
329
SQInteger newLen = Len()+amount;
330
return ArrayResize(newLen);
331
} // SquirrelObject::ArrayExtend
333
BOOL_T SquirrelObject::ArrayReverse(void) {
334
sq_pushobject(SquirrelVM::_VM,GetObjectHandle());
335
BOOL_T res = sq_arrayreverse(SquirrelVM::_VM,-1) == SQ_OK;
336
sq_pop(SquirrelVM::_VM,1);
338
} // SquirrelObject::ArrayReverse
340
SquirrelObject SquirrelObject::ArrayPop(SQBool returnPoppedVal) {
342
SQInteger top = sq_gettop(SquirrelVM::_VM);
343
sq_pushobject(SquirrelVM::_VM,GetObjectHandle());
344
if (sq_arraypop(SquirrelVM::_VM,-1,returnPoppedVal) == SQ_OK) {
345
if (returnPoppedVal) {
346
ret.AttachToStackObject(-1);
349
sq_settop(SquirrelVM::_VM,top);
351
} // SquirrelObject::ArrayPop
353
// === END Arrays ===
355
SQObjectType SquirrelObject::GetType()
360
BOOL_T SquirrelObject::GetSlot(INT_T key) const
362
sq_pushobject(SquirrelVM::_VM,_o);
363
sq_pushinteger(SquirrelVM::_VM,key);
364
if(SQ_SUCCEEDED(sq_get(SquirrelVM::_VM,-2))) {
372
SquirrelObject SquirrelObject::GetValue(INT_T key)const
376
ret.AttachToStackObject(-1);
377
sq_pop(SquirrelVM::_VM,1);
379
sq_pop(SquirrelVM::_VM,1);
383
FLOAT_T SquirrelObject::GetFloat(INT_T key) const
387
sq_getfloat(SquirrelVM::_VM,-1,&ret);
388
sq_pop(SquirrelVM::_VM,1);
390
sq_pop(SquirrelVM::_VM,1);
394
INT_T SquirrelObject::GetInt(INT_T key) const
398
sq_getinteger(SquirrelVM::_VM,-1,&ret);
399
sq_pop(SquirrelVM::_VM,1);
401
sq_pop(SquirrelVM::_VM,1);
405
const SQChar *SquirrelObject::GetString(INT_T key) const
407
const SQChar *ret = NULL;
409
sq_getstring(SquirrelVM::_VM,-1,&ret);
410
sq_pop(SquirrelVM::_VM,1);
412
sq_pop(SquirrelVM::_VM,1);
416
bool SquirrelObject::GetBool(INT_T key) const
420
sq_getbool(SquirrelVM::_VM,-1,&ret);
421
sq_pop(SquirrelVM::_VM,1);
423
sq_pop(SquirrelVM::_VM,1);
424
return ret?true:false;
427
BOOL_T SquirrelObject::Exists(const SQChar *key) const
433
sq_pop(SquirrelVM::_VM,1);
436
////////////////////////////////////////////////////////////////////////////////
437
///////////////////////////////////////////////////////////////////////////////
439
BOOL_T SquirrelObject::GetSlot(const SQChar *name) const
441
sq_pushobject(SquirrelVM::_VM,_o);
442
sq_pushstring(SquirrelVM::_VM,name,-1);
443
if(SQ_SUCCEEDED(sq_get(SquirrelVM::_VM,-2))) {
450
BOOL_T SquirrelObject::RawGetSlot(const SQChar *name) const {
451
sq_pushobject(SquirrelVM::_VM,_o);
452
sq_pushstring(SquirrelVM::_VM,name,-1);
453
if(SQ_SUCCEEDED(sq_rawget(SquirrelVM::_VM,-2))) {
457
} // SquirrelObject::RawGetSlot
459
SquirrelObject SquirrelObject::GetValue(const SQChar *key)const
463
ret.AttachToStackObject(-1);
464
sq_pop(SquirrelVM::_VM,1);
466
sq_pop(SquirrelVM::_VM,1);
470
FLOAT_T SquirrelObject::GetFloat(const SQChar *key) const
474
sq_getfloat(SquirrelVM::_VM,-1,&ret);
475
sq_pop(SquirrelVM::_VM,1);
477
sq_pop(SquirrelVM::_VM,1);
481
INT_T SquirrelObject::GetInt(const SQChar *key) const
485
sq_getinteger(SquirrelVM::_VM,-1,&ret);
486
sq_pop(SquirrelVM::_VM,1);
488
sq_pop(SquirrelVM::_VM,1);
492
const SQChar *SquirrelObject::GetString(const SQChar *key) const
494
const SQChar *ret = NULL;
496
sq_getstring(SquirrelVM::_VM,-1,&ret);
497
sq_pop(SquirrelVM::_VM,1);
499
sq_pop(SquirrelVM::_VM,1);
503
bool SquirrelObject::GetBool(const SQChar *key) const
507
sq_getbool(SquirrelVM::_VM,-1,&ret);
508
sq_pop(SquirrelVM::_VM,1);
510
sq_pop(SquirrelVM::_VM,1);
511
return ret?true:false;
514
SQUserPointer SquirrelObject::GetInstanceUP(SQUserPointer tag) const
517
sq_pushobject(SquirrelVM::_VM,_o);
518
if (SQ_FAILED(sq_getinstanceup(SquirrelVM::_VM,-1,(SQUserPointer*)&up,tag))) {
519
sq_reseterror(SquirrelVM::_VM);
522
sq_pop(SquirrelVM::_VM,1);
526
BOOL_T SquirrelObject::SetInstanceUP(SQUserPointer up)
528
if(!sq_isinstance(_o)) return FALSE;
529
sq_pushobject(SquirrelVM::_VM,_o);
530
sq_setinstanceup(SquirrelVM::_VM,-1,up);
531
sq_pop(SquirrelVM::_VM,1);
535
SquirrelObject SquirrelObject::GetAttributes(const SQChar *key)
538
SQInteger top = sq_gettop(SquirrelVM::_VM);
539
sq_pushobject(SquirrelVM::_VM,_o);
541
sq_pushstring(SquirrelVM::_VM,key,-1);
543
sq_pushnull(SquirrelVM::_VM);
544
if(SQ_SUCCEEDED(sq_getattributes(SquirrelVM::_VM,-2))) {
545
ret.AttachToStackObject(-1);
547
sq_settop(SquirrelVM::_VM,top);
551
BOOL_T SquirrelObject::BeginIteration()
553
if(!sq_istable(_o) && !sq_isarray(_o) && !sq_isclass(_o))
555
sq_pushobject(SquirrelVM::_VM,_o);
556
sq_pushnull(SquirrelVM::_VM);
560
BOOL_T SquirrelObject::Next(SquirrelObject &key,SquirrelObject &val)
562
if(SQ_SUCCEEDED(sq_next(SquirrelVM::_VM,-2))) {
563
key.AttachToStackObject(-2);
564
val.AttachToStackObject(-1);
565
sq_pop(SquirrelVM::_VM,2);
571
BOOL_T SquirrelObject::GetTypeTag(SQUserPointer * typeTag) {
572
if (SQ_SUCCEEDED(sq_getobjtypetag(&_o,typeTag))) {
576
} // SquirrelObject::GetTypeTag
578
const SQChar * SquirrelObject::GetTypeName(const SQChar * key) {
580
// This version will work even if SQ_SUPPORT_INSTANCE_TYPE_INFO is not enabled.
581
SqPlus::ScriptStringVar256 varNameTag;
582
SqPlus::getVarNameTag(varNameTag,sizeof(varNameTag),key);
583
SQUserPointer data=0;
584
if (!RawGetUserData(varNameTag,&data)) {
587
SqPlus::VarRefPtr vr = (SqPlus::VarRefPtr)data;
589
#else // This version will only work if SQ_SUPPORT_INSTANCE_TYPE_INFO is enabled.
590
SquirrelObject so = GetValue(key);
591
if (so.IsNull()) return NULL;
592
return so.GetTypeName();
594
} // SquirrelObject::GetTypeName
596
const SQChar * SquirrelObject::GetTypeName(INT_T key) {
597
SquirrelObject so = GetValue(key);
598
if (so.IsNull()) return NULL;
599
return so.GetTypeName();
600
} // SquirrelObject::GetTypeName
602
const SQChar * SquirrelObject::GetTypeName(void) {
603
SQUserPointer typeTag=NULL;
604
if (SQ_SUCCEEDED(sq_getobjtypetag(&_o,&typeTag))) {
605
SquirrelObject typeTable = SquirrelVM::GetRootTable().GetValue(SQ_PLUS_TYPE_TABLE);
606
if (typeTable.IsNull()) {
607
return NULL; // Not compiled with SQ_SUPPORT_INSTANCE_TYPE_INFO enabled.
609
return typeTable.GetString(INT_T((size_t)typeTag));
612
} // SquirrelObject::GetTypeName
614
const SQChar* SquirrelObject::ToString()
616
return sq_objtostring(&_o);
619
SQInteger SquirrelObject::ToInteger()
621
return sq_objtointeger(&_o);
624
SQFloat SquirrelObject::ToFloat()
626
return sq_objtofloat(&_o);
629
bool SquirrelObject::ToBool()
632
return _o._unVal.nInteger?true:false;
635
void SquirrelObject::EndIteration()
637
sq_pop(SquirrelVM::_VM,2);