@@ -49,14 +49,16 @@ namespace OverEngine
4949
5050 // This wont register superclasses fields.
5151 wrenpp::VM ::reportClassFn = [this ](ClassInfo* classInfo) {
52- this ->m_FieldNames [classInfo->name ->value ] = Vector<String>();
53- auto & fieldNames = this ->m_FieldNames [classInfo->name ->value ];
52+ this ->m_FieldNames [classInfo->name ->value ] = std::make_pair ( false , Vector<String>() );
53+ auto & fieldNames = this ->m_FieldNames [classInfo->name ->value ]. second ;
5454
5555 SymbolTable* syms = &classInfo->fields ;
5656 for (ObjString** current = syms->data ; current < syms->data + syms->count ; current++)
5757 fieldNames.push_back ((*current)->value );
5858 };
5959
60+ m_FieldNames[" Object" ] = std::make_pair (true , Vector<String>());
61+
6062 wrenpp::VM ::loadModuleFn = [](const char * mod) -> char * {
6163 #define WREN_MOD (m ) if (strcmp(mod, #m) == 0 ) return const_cast <char *>(WrenSources::m##ModuleSource);
6264
@@ -111,7 +113,7 @@ namespace OverEngine
111113 wrenReleaseHandle (m_VM, m_OnCollisionEnterMethod);
112114 wrenReleaseHandle (m_VM, m_OnCollisionExitMethod);
113115
114- for (auto [_, handle] : m_CallHandles)
116+ for (auto & [_, handle] : m_CallHandles)
115117 wrenReleaseHandle (m_VM, handle);
116118 }
117119
@@ -144,6 +146,26 @@ namespace OverEngine
144146 return ToString (&handle);
145147 }
146148
149+ const Vector<String>& Wren::GetFields (ObjClass* klass) const
150+ {
151+ auto & [hasSuperClassFields, fields] = m_FieldNames.at (klass->name ->value );
152+
153+ if (!hasSuperClassFields)
154+ AddSuperClassFields (klass);
155+
156+ return fields;
157+ }
158+
159+ void Wren::AddSuperClassFields (ObjClass* klass) const
160+ {
161+ auto & [hasSuperClassFields, fields] = m_FieldNames[klass->name ->value ];
162+
163+ auto & superClassFields = GetFields (klass->superclass );
164+ fields.insert (fields.begin (), superClassFields.begin (), superClassFields.end ());
165+
166+ hasSuperClassFields = true ;
167+ }
168+
147169 WrenScriptClass::WrenScriptClass (const Ref<Wren>& vm, const char * moduleName, const char * className)
148170 : m_VM(vm)
149171 {
@@ -180,16 +202,16 @@ namespace OverEngine
180202 wrenReleaseHandle (m_VM->GetRaw (), m_InstanceHandle);
181203 }
182204
183- #define IMPL_METHOD_CALL_NO_PARAM (methode ) \
184- WrenInterpretResult WrenScriptInstance::methode () const \
185- { \
186- return Call (m_VM->Get ##methode ##Method ()); \
205+ #define IMPL_METHOD_CALL_NO_PARAM (method ) \
206+ WrenInterpretResult WrenScriptInstance::method () const \
207+ { \
208+ return Call (m_VM->Get ##method ##Method ()); \
187209 }
188210
189- #define IMPL_METHOD_CALL_WITH_PARAM (methode , params, wrenParams ) \
190- WrenInterpretResult WrenScriptInstance::methode (params) const \
191- { \
192- return Call (m_VM->Get ##methode ##Method (), wrenParams); \
211+ #define IMPL_METHOD_CALL_WITH_PARAM (method , params, wrenParams ) \
212+ WrenInterpretResult WrenScriptInstance::method (params) const \
213+ { \
214+ return Call (m_VM->Get ##method ##Method (), wrenParams); \
193215 }
194216
195217 IMPL_METHOD_CALL_NO_PARAM (OnCreate)
@@ -204,12 +226,11 @@ namespace OverEngine
204226 ObjClass* klass = wrenGetClass (m_VM->GetRaw (), m_InstanceHandle->value );
205227 ObjInstance* instance = AS_INSTANCE (m_InstanceHandle->value );
206228
207- auto & fields = m_VM->GetFields (klass-> name -> value );
229+ auto & fields = m_VM->GetFields (klass);
208230
209231 for (int i = 0 ; i < klass->numFields ; i++)
210232 {
211- // FIXME: Climb the inheritance chain to access superclass fields.
212- ImGui::TextUnformatted (i == 0 ? " _entity" : fields[i - 1 ].c_str ());
233+ ImGui::TextUnformatted (fields[i].c_str ());
213234 ImGui::SameLine ();
214235 ImGui::TextUnformatted (m_VM->ToString (instance->fields [i]).c_str ());
215236 }
0 commit comments