7 #define NULL (null_entity)
13 /** Location entity was spawned from in source */
14 .string sourceLocFile;
17 entity __spawn(string _classname, string _sourceFile, int _sourceLine) {
18 entity this = _spawn();
19 this.classname = _classname;
20 this.sourceLocFile = _sourceFile;
21 this.sourceLocLine = _sourceLine;
25 #define entityclass(...) OVERLOAD(entityclass, __VA_ARGS__)
26 #define entityclass_1(name) entityclass_2(name, Object)
27 #ifndef QCC_SUPPORT_ENTITYCLASS
28 #define entityclass_2(name, base) typedef entity name
30 #define new(class) __spawn(#class, __FILE__, __LINE__)
32 #define entityclass_2(name, base) entityclass name : base {}
33 #define class(name) [[class(name)]]
34 #define new(class) ((class) __spawn(#class, __FILE__, __LINE__))
37 // Classes have a `spawn##cname(entity)` constructor
38 // The parameter is used across [[accumulate]] functions
40 // Macro to hide this implementation detail
41 #define NEW(cname) (spawn##cname(new(cname)))
46 #define VTBL(cname, base) \
47 entity cname##_vtbl; \
48 STATIC_INIT(cname##_vtbl) { \
49 entity e = NEW(cname); \
50 e.vtblname = #cname; \
51 e.classname = "vtbl"; \
52 /* Top level objects refer to themselves */ \
53 e.vtblbase = base ? base : e; \
57 #define INIT_STATIC(cname) [[accumulate]] entity spawn##cname(entity this)
58 #define INIT(cname) [[accumulate]] void spawn##cname##_init(entity this)
60 #define CLASS(cname, base) \
61 entityclass(cname, base); \
62 class(cname) .bool instanceOf##cname; \
65 VTBL(cname, base##_vtbl) \
66 INIT_STATIC(cname) { \
68 copyentity(cname##_vtbl, this); \
69 spawn##cname##_init(this); \
73 this.instanceOf##cname = true; \
76 #define METHOD(cname, name, prototype) \
77 class(cname) .prototype name; \
78 prototype cname##_##name; \
79 INIT_STATIC(cname) { this.name = cname##_##name; }
81 #define ATTRIB(cname, name, type, val) \
82 class(cname) .type name; \
83 INIT(cname) { this.name = val; }
85 #define ATTRIBARRAY(cname, name, type, cnt) \
86 class(cname) .type name[cnt];
88 #define ENDCLASS(cname) \
89 [[last]] INIT_STATIC(cname) { return this; }
91 #define SUPER(cname) (cname##_vtbl.vtblbase)
94 #define NULL_vtbl NULL