Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions include/hx/Scriptable.h
Original file line number Diff line number Diff line change
Expand Up @@ -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, bool inIsOverride=false, StackExecute superExecute=0)
: 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;
};

Expand Down
7 changes: 7 additions & 0 deletions src/hx/cppia/Cppia.h
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,9 @@ struct CppiaVar



#if (HXCPP_API_LEVEL >= 500)
# define NATIVE_CLASS_OVERRIDES_MARKED
#endif

class HaxeNativeClass
{
Expand All @@ -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<std::string> &outVtable, hx::UnorderedSet<std::string> &outMethodsSet);
#endif
};

class HaxeNativeInterface
Expand Down
22 changes: 21 additions & 1 deletion src/hx/cppia/HaxeNative.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,36 @@ HaxeNativeClass::HaxeNativeClass(const std::string &inName, int inDataOffset, Sc
haxeSuper = 0;
}

#ifdef NATIVE_CLASS_OVERRIDES_MARKED
void HaxeNativeClass::addVtableEntries( std::vector<std::string> &outVtable)
{
if (haxeSuper)
haxeSuper->addVtableEntries(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<std::string>& outVtable) {
hx::UnorderedSet<std::string> methodsSet;
addVtableEntries(outVtable, methodsSet);
}

void HaxeNativeClass::addVtableEntries( std::vector<std::string> &outVtable, hx::UnorderedSet<std::string>& 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()
{
Expand Down
Loading