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 }