diff --git a/include/hx/Scriptable.h b/include/hx/Scriptable.h index db66f25dd..d3bd89e8f 100644 --- a/include/hx/Scriptable.h +++ b/include/hx/Scriptable.h @@ -19,11 +19,19 @@ struct ScriptNamedFunction : public ScriptFunction { ScriptNamedFunction(const ScriptFunction &s) : ScriptFunction(s), name(0), isStatic(false), superExecute(0) { } +#if (HXCPP_API_LEVEL >= 500) + ScriptNamedFunction(const char *inName=0,StackExecute inExe=0,const char *inSig=0, bool inIsStatic=false, StackExecute superExecute=0, bool inIsOverride=false) + : ScriptFunction(inExe, inSig), name(inName), isStatic(inIsStatic), isOverride(inIsOverride), superExecute(superExecute) { } +#else ScriptNamedFunction(const char *inName=0,StackExecute inExe=0,const char *inSig=0, bool inIsStatic=false, StackExecute superExecute=0) : ScriptFunction(inExe, inSig), name(inName), isStatic(inIsStatic), superExecute(superExecute) { } +#endif const char *name; bool isStatic; +#if (HXCPP_API_LEVEL >= 500) + bool isOverride; +#endif StackExecute superExecute; }; diff --git a/src/hx/cppia/Cppia.h b/src/hx/cppia/Cppia.h index 0137f2937..fa7d99109 100644 --- a/src/hx/cppia/Cppia.h +++ b/src/hx/cppia/Cppia.h @@ -575,6 +575,9 @@ struct CppiaVar +#if (HXCPP_API_LEVEL >= 500) +# define NATIVE_CLASS_OVERRIDES_MARKED +#endif class HaxeNativeClass { @@ -596,6 +599,10 @@ class HaxeNativeClass static HaxeNativeClass *findClass(const std::string &inName); static HaxeNativeClass *hxObject(); static void link(); +#ifndef NATIVE_CLASS_OVERRIDES_MARKED +private: + void addVtableEntries( std::vector &outVtable, hx::UnorderedSet &outMethodsSet); +#endif }; class HaxeNativeInterface diff --git a/src/hx/cppia/HaxeNative.cpp b/src/hx/cppia/HaxeNative.cpp index 1b6102025..6575493d4 100644 --- a/src/hx/cppia/HaxeNative.cpp +++ b/src/hx/cppia/HaxeNative.cpp @@ -30,6 +30,7 @@ HaxeNativeClass::HaxeNativeClass(const std::string &inName, int inDataOffset, Sc haxeSuper = 0; } +#ifdef NATIVE_CLASS_OVERRIDES_MARKED void HaxeNativeClass::addVtableEntries( std::vector &outVtable) { if (haxeSuper) @@ -37,9 +38,28 @@ void HaxeNativeClass::addVtableEntries( std::vector &outVtable) if (functions) for(ScriptNamedFunction *func = functions; func->name; func++) - if (!func->isStatic) + if (!func->isStatic && !func->isOverride) outVtable.push_back( func->name ); } +#else +void HaxeNativeClass::addVtableEntries(std::vector& outVtable) { + hx::UnorderedSet methodsSet; + addVtableEntries(outVtable, methodsSet); +} + +void HaxeNativeClass::addVtableEntries( std::vector &outVtable, hx::UnorderedSet& outMethodsSet) +{ + if (haxeSuper) + haxeSuper->addVtableEntries(outVtable, outMethodsSet); + + if (functions) + for (ScriptNamedFunction* func = functions; func->name; func++) + if (!func->isStatic && outMethodsSet.find(func->name) == outMethodsSet.end()) { + outVtable.push_back(func->name); + outMethodsSet.emplace(func->name); + } +} +#endif void HaxeNativeClass::dump() {