static int getInstanceVarInfo(StackHandler & sa,VarRefPtr & vr,SQUserPointer & data) { HSQOBJECT ho = sa.GetObjectHandle(1); SquirrelObject instance(ho); const SQChar * el = sa.GetString(2); ScriptStringVar256 varNameTag; getVarNameTag(varNameTag,sizeof(varNameTag),el); SQUserPointer ivrData=0; if (!instance.RawGetUserData(varNameTag,&ivrData)) { return sa.ThrowError(_SC("getInstanceVarInfo: Could not retrieve UserData")); // Results in variable not being found error. } vr = (VarRefPtr)ivrData; char * up; if (!(vr->m_access & (VAR_ACCESS_STATIC|VAR_ACCESS_CONSTANT))) { SQUserPointer typetag; instance.GetTypeTag(&typetag); #if defined(SQ_USE_CLASS_INHERITANCE) if (typetag != vr->instanceType) { SquirrelObject typeTable = instance.GetValue(SQ_CLASS_OBJECT_TABLE_NAME); up = (char *)typeTable.GetUserPointer(INT((size_t)vr->instanceType)); // <TODO> 64-bit compatible version. if (!up) { throw SquirrelError(_SC("Invalid Instance Type")); } } else { up = (char *)instance.GetInstanceUP(0); } // if #elif defined(SQ_USE_CLASS_INHERITANCE_SIMPLE) ClassTypeBase *ctb = (ClassTypeBase*)vr->instanceType; up = (char *)instance.GetInstanceUP(0); // Walk base classes until type tag match, adjust for inheritence offset while(ctb && typetag!=ctb) { up = (char*)up - ctb->m_offset; ctb = ctb->m_pbase; } if (!ctb) { throw SquirrelError(_SC("Invalid Instance Type")); } #else up = (char *)instance.GetInstanceUP(0); #endif #ifdef SQPLUS_SMARTPOINTER_OPT #define SQPLUS_SMARTPOINTER_INSTANCE_VARINFO #include "SqPlusSmartPointer.h" #endif up += (size_t)vr->offsetOrAddrOrConst; // Offset } else { up = (char *)vr->offsetOrAddrOrConst; // Address } // if data = up; return SQ_OK; } // getInstanceVarInfo
static int getInstanceVarInfo(StackHandler & sa,VarRefPtr & vr,SQUserPointer & data) { HSQOBJECT ho = sa.GetObjectHandle(1); SquirrelObject instance(ho); #ifdef _DEBUG SQObjectType type = (SQObjectType)sa.GetType(2); #endif const SQChar * el = sa.GetString(2); ScriptStringVar256 varNameTag; getVarNameTag(varNameTag,sizeof(varNameTag),el); SQUserPointer ivrData=0; if (!instance.RawGetUserData(varNameTag,&ivrData)) { // throw SquirrelError("getInstanceVarInfo: Could not retrieve UserData"); return sa.ThrowError(_T("getInstanceVarInfo: Could not retrieve UserData")); // Results in variable not being found error. } // if vr = (VarRefPtr)ivrData; unsigned char * up; if (!(vr->access & (VAR_ACCESS_STATIC|VAR_ACCESS_CONSTANT))) { #ifdef SQ_USE_CLASS_INHERITANCE SQUserPointer typetag; instance.GetTypeTag(&typetag); if (typetag != vr->instanceType) { SquirrelObject typeTable = instance.GetValue(SQ_CLASS_OBJECT_TABLE_NAME); up = (unsigned char *)typeTable.GetUserPointer(INT((size_t)vr->instanceType)); // <TODO> 64-bit compatible version. if (!up) { #if defined( MONASQ ) return sa.ThrowError(_T("Invalid Instance Type")); #else throw SquirrelError(_T("Invalid Instance Type")); #endif } // if } else { up = (unsigned char *)instance.GetInstanceUP(0); } // if #else up = (unsigned char *)instance.GetInstanceUP(0); #endif up += (size_t)vr->offsetOrAddrOrConst; // Offset } else { up = (unsigned char *)vr->offsetOrAddrOrConst; // Address } // if data = up; return SQ_OK; } // getInstanceVarInfo