public object GetResult(int ret_tid) { if (ret_tid == (int)asETypeIdFlags.asTYPEID_VOID) { return(null); // ? } if (ret_tid == (int)asETypeIdFlags.asTYPEID_BOOL) { return(GetReturnByte() != 0); } if (ret_tid == (int)asETypeIdFlags.asTYPEID_INT8 || ret_tid == (int)asETypeIdFlags.asTYPEID_UINT8) { return(GetReturnByte()); } if (ret_tid == (int)asETypeIdFlags.asTYPEID_INT16 || ret_tid == (int)asETypeIdFlags.asTYPEID_UINT16) { return(GetReturnWord()); } if (ret_tid == (int)asETypeIdFlags.asTYPEID_INT32 || ret_tid == (int)asETypeIdFlags.asTYPEID_UINT32) { return(GetReturnDWord()); } if (ret_tid == (int)asETypeIdFlags.asTYPEID_INT64 || ret_tid == (int)asETypeIdFlags.asTYPEID_UINT64) { return(GetReturnQWord()); } if (ret_tid == (int)asETypeIdFlags.asTYPEID_FLOAT) { return(GetReturnFloat()); } if (ret_tid == (int)asETypeIdFlags.asTYPEID_DOUBLE) { return(GetReturnDouble()); } // try some predefined types we can handle using our 'static' counterparts IntPtr ptr; if ((ret_tid & (int)asETypeIdFlags.asTYPEID_OBJHANDLE) != 0) { ptr = GetReturnObject(); } else { ptr = GetReturnAddress(); } if (ptr == IntPtr.Zero) { return(null); } try { var obj = ScriptObjectType.Instantiate(ptr, ret_tid); if (obj != null) { return(obj); } else { // just handle it dynamically return(new ScriptObject(ptr, ScriptEngine.GetObjectTypeById(ret_tid))); } } finally { if ((ret_tid & (int)asETypeIdFlags.asTYPEID_OBJHANDLE) != 0) { // decrease refcounter, we want only newly created wrapper to hold reference ScriptEngine.ReleaseScriptObject(ptr, ret_tid); } // otherwise, it's reference } }
public void Release() { ScriptEngine.ReleaseScriptObject(this, objectType.TypeId); }