1 module as.obj; 2 import as.def; 3 import as.engine; 4 import std..string; 5 6 enum TypeFlags : asEObjTypeFlags { 7 Ref = asEObjTypeFlags.asOBJ_REF, 8 Value = asEObjTypeFlags.asOBJ_VALUE, 9 GC = asEObjTypeFlags.asOBJ_GC, 10 POD = asEObjTypeFlags.asOBJ_POD, 11 NoHandle = asEObjTypeFlags.asOBJ_NOHANDLE, 12 Scoped = asEObjTypeFlags.asOBJ_SCOPED, 13 Template = asEObjTypeFlags.asOBJ_TEMPLATE, 14 ASHandle = asEObjTypeFlags.asOBJ_ASHANDLE, 15 Class = asEObjTypeFlags.asOBJ_APP_CLASS, 16 ClassConstruct = asEObjTypeFlags.asOBJ_APP_CLASS_CONSTRUCTOR, 17 ClassDestruct = asEObjTypeFlags.asOBJ_APP_CLASS_DESTRUCTOR, 18 ClassAssign = asEObjTypeFlags.asOBJ_APP_CLASS_ASSIGNMENT, 19 ClassCopyConstruct = asEObjTypeFlags.asOBJ_APP_CLASS_COPY_CONSTRUCTOR, 20 C = asEObjTypeFlags.asOBJ_APP_CLASS_C, 21 CD = asEObjTypeFlags.asOBJ_APP_CLASS_CD, 22 CA = asEObjTypeFlags.asOBJ_APP_CLASS_CA, 23 CK = asEObjTypeFlags.asOBJ_APP_CLASS_CK, 24 CDA = asEObjTypeFlags.asOBJ_APP_CLASS_CDA, 25 CDK = asEObjTypeFlags.asOBJ_APP_CLASS_CDK, 26 CAK = asEObjTypeFlags.asOBJ_APP_CLASS_CAK, 27 CDAK = asEObjTypeFlags.asOBJ_APP_CLASS_CDAK, 28 D = asEObjTypeFlags.asOBJ_APP_CLASS_D, 29 DA = asEObjTypeFlags.asOBJ_APP_CLASS_DA, 30 DK = asEObjTypeFlags.asOBJ_APP_CLASS_DK, 31 DAK = asEObjTypeFlags.asOBJ_APP_CLASS_DAK, 32 A = asEObjTypeFlags.asOBJ_APP_CLASS_A, 33 AK = asEObjTypeFlags.asOBJ_APP_CLASS_AK, 34 K = asEObjTypeFlags.asOBJ_APP_CLASS_K, 35 Primitive = asEObjTypeFlags.asOBJ_APP_PRIMITIVE, 36 Float = asEObjTypeFlags.asOBJ_APP_FLOAT, 37 Array = asEObjTypeFlags.asOBJ_APP_ARRAY, 38 AllInts = asEObjTypeFlags.asOBJ_APP_CLASS_ALLINTS, 39 AllFloats = asEObjTypeFlags.asOBJ_APP_CLASS_ALLFLOATS, 40 NoCount = asEObjTypeFlags.asOBJ_NOCOUNT, 41 Align8 = asEObjTypeFlags.asOBJ_APP_CLASS_ALIGN8, 42 ImplicitHandle = asEObjTypeFlags.asOBJ_IMPLICIT_HANDLE, 43 ValidFlagsMask = asEObjTypeFlags.asOBJ_MASK_VALID_FLAGS, 44 45 // Internal flags 46 ScriptObject = asEObjTypeFlags.asOBJ_SCRIPT_OBJECT, 47 Shared = asEObjTypeFlags.asOBJ_SHARED, 48 NoInherit = asEObjTypeFlags.asOBJ_NOINHERIT, 49 FuncDef = asEObjTypeFlags.asOBJ_FUNCDEF, 50 ListPattern = asEObjTypeFlags.asOBJ_LIST_PATTERN, 51 Enum = asEObjTypeFlags.asOBJ_ENUM, 52 TemplateSubtype = asEObjTypeFlags.asOBJ_TEMPLATE_SUBTYPE, 53 TypeDef = asEObjTypeFlags.asOBJ_TYPEDEF, 54 Abstract = asEObjTypeFlags.asOBJ_ABSTRACT, 55 Align16 = asEObjTypeFlags.asOBJ_APP_ALIGN16 56 } 57 58 enum Behaviours : asEBehaviours { 59 // Value object memory management 60 Construct = asEBehaviours.asBEHAVE_CONSTRUCT, 61 ListConstruct = asEBehaviours.asBEHAVE_LIST_CONSTRUCT, 62 Destruct = asEBehaviours.asBEHAVE_DESTRUCT, 63 64 // Reference object memory management 65 Factory = asEBehaviours.asBEHAVE_FACTORY, 66 ListFactory = asEBehaviours.asBEHAVE_LIST_FACTORY, 67 AddRef = asEBehaviours.asBEHAVE_ADDREF, 68 Release = asEBehaviours.asBEHAVE_RELEASE, 69 GetWeakrefFlag = asEBehaviours.asBEHAVE_GET_WEAKREF_FLAG, 70 71 // Object operators 72 TemplateCallback = asEBehaviours.asBEHAVE_TEMPLATE_CALLBACK, 73 74 // Garbage collection behaviours 75 FirstGC = asEBehaviours.asBEHAVE_FIRST_GC, 76 GetRefCount = asEBehaviours.asBEHAVE_GETREFCOUNT, 77 SetGCFlag = asEBehaviours.asBEHAVE_SETGCFLAG, 78 GetGCFlag = asEBehaviours.asBEHAVE_GETGCFLAG, 79 EnumRefs = asEBehaviours.asBEHAVE_ENUMREFS, 80 ReleaseRefs = asEBehaviours.asBEHAVE_RELEASEREFS, 81 LastGC = asEBehaviours.asBEHAVE_LAST_GC, 82 83 BehaveMax = asEBehaviours.asBEHAVE_MAX 84 } 85 86 class ScriptObject { 87 private: 88 ScriptEngine engine; 89 90 ~this() { 91 this.engine = null; 92 } 93 94 package(as): 95 asIScriptObject* obj; 96 97 this(ScriptEngine engine, asIScriptObject* obj) { 98 this.engine = engine; 99 this.obj = obj; 100 } 101 102 public: 103 104 /** 105 Gets the engine this object belongs to 106 */ 107 ScriptEngine getEngine() { 108 return engine; 109 } 110 111 /** 112 Adds a reference to this object 113 */ 114 int addRef() { 115 return asObject_AddRef(obj); 116 } 117 118 /** 119 Releases a reference to this object 120 */ 121 int release() { 122 return asObject_Release(obj); 123 } 124 125 /** 126 Get the count of properties in this object 127 */ 128 asUINT getPropertyCount() { 129 return asObject_GetPropertyCount(obj); 130 } 131 132 /** 133 Get the type ID of a property 134 */ 135 int getPropertyTypeId(asUINT prop) { 136 int err = asObject_GetPropertyTypeId(obj, prop); 137 assert(err != asERetCodes.asINVALID_ARG, "prop is too large"); 138 return err; 139 } 140 141 /** 142 Get the name of a property 143 */ 144 string getPropertyName(asUINT prop) { 145 return cast(string) asObject_GetPropertyName(obj, prop).fromStringz; 146 } 147 148 /** 149 Get the address of a property 150 */ 151 void* getPropertyAddress(asUINT prop) { 152 return asObject_GetAddressOfProperty(obj, prop); 153 } 154 155 /** 156 Copy content from an other object of the same type 157 */ 158 void copyFrom(ScriptObject other) { 159 int err = asObject_CopyFrom(obj, other.obj); 160 assert(err != asERetCodes.asINVALID_ARG, "Argument is null"); 161 assert(err != asERetCodes.asINVALID_TYPE, "Types of objects didn't match"); 162 } 163 164 /** 165 Sets the user data associated with this object 166 */ 167 void* setUserData(void* data, asPWORD type) { 168 return asObject_SetUserData(obj, data, type); 169 } 170 171 /** 172 Gets the user data associated with this object 173 */ 174 void* getUserData(asPWORD type) { 175 return asObject_GetUserData(obj, type); 176 } 177 178 }