mirror of
https://github.com/godotengine/godot.git
synced 2026-01-03 18:11:19 +03:00
Replace BIND_VMETHOD by new GDVIRTUAL syntax
* New syntax is type safe. * New syntax allows for type safe virtuals in native extensions. * New syntax permits extremely fast calling. Note: Everything was replaced where possible except for `_gui_input` `_input` and `_unhandled_input`. These will require API rework on a separate PR as they work different than the rest of the functions. Added a new method flag METHOD_FLAG_OBJECT_CORE, used internally. Allows to not dump the core virtuals like `_notification` to the json API, since each language will implement those as it is best fits.
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
proto = """
|
||||
#define GDVIRTUAL$VER($RET m_name $ARG) \\
|
||||
StringName _gdvirtual_##m_name##_sn = #m_name;\\
|
||||
GDNativeExtensionClassCallVirtual _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, #m_name) : (GDNativeExtensionClassCallVirtual) nullptr;\\
|
||||
bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
|
||||
GDNativeExtensionClassCallVirtual _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, #m_name) : (GDNativeExtensionClassCallVirtual) nullptr;\\
|
||||
ScriptInstance *script_instance = ((Object*)(this))->get_script_instance();\\
|
||||
if (script_instance) {\\
|
||||
Callable::CallError ce; \\
|
||||
@@ -23,6 +23,16 @@ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
|
||||
\\
|
||||
return false;\\
|
||||
}\\
|
||||
bool _gdvirtual_##m_name##_overriden() const { \\
|
||||
ScriptInstance *script_instance = ((Object*)(this))->get_script_instance();\\
|
||||
if (script_instance) {\\
|
||||
return script_instance->has_method(_gdvirtual_##m_name##_sn);\\
|
||||
}\\
|
||||
if (_gdvirtual_##m_name) {\\
|
||||
return true;\\
|
||||
}\\
|
||||
return false;\\
|
||||
}\\
|
||||
\\
|
||||
_FORCE_INLINE_ static MethodInfo _gdvirtual_##m_name##_get_method_info() { \\
|
||||
MethodInfo method_info;\\
|
||||
@@ -77,7 +87,7 @@ def generate_version(argcount, const=False, returns=False):
|
||||
callptrargs += "\t\t"
|
||||
callptrargsptr += ", "
|
||||
argtext += "m_type" + str(i + 1)
|
||||
callargtext += "const m_type" + str(i + 1) + "& arg" + str(i + 1)
|
||||
callargtext += "m_type" + str(i + 1) + " arg" + str(i + 1)
|
||||
callsiargs += "Variant(arg" + str(i + 1) + ")"
|
||||
callsiargptrs += "&vargs[" + str(i) + "]"
|
||||
callptrargs += (
|
||||
@@ -103,7 +113,7 @@ def generate_version(argcount, const=False, returns=False):
|
||||
if returns:
|
||||
if argcount > 0:
|
||||
callargtext += ","
|
||||
callargtext += " m_ret& r_ret"
|
||||
callargtext += " m_ret& r_ret"
|
||||
s = s.replace("$CALLSIBEGIN", "Variant ret = ")
|
||||
s = s.replace("$CALLSIRET", "r_ret = ret;")
|
||||
s = s.replace("$CALLPTRRETPASS", "&ret")
|
||||
|
||||
Reference in New Issue
Block a user