Browse Source

Merge pull request #85770 from Repiteo/make-virtuals-refactor-and-fix

Refactor and fix `make_virtuals.py`
Yuri Sizov 1 năm trước cách đây
mục cha
commit
f16057522e
1 tập tin đã thay đổi với 118 bổ sung118 xóa
  1. 118 118
      core/object/make_virtuals.py

+ 118 - 118
core/object/make_virtuals.py

@@ -1,78 +1,74 @@
-proto = """
-#define GDVIRTUAL$VER($RET m_name $ARG) \\
-StringName _gdvirtual_##m_name##_sn = #m_name;\\
-mutable bool _gdvirtual_##m_name##_initialized = false;\\
-mutable void* _gdvirtual_##m_name = nullptr;\\
-template<bool required>\\
-_FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
-	ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\
-	if (_script_instance) {\\
-		Callable::CallError ce; \\
-		$CALLSIARGS\\
-		$CALLSIBEGIN_script_instance->callp(_gdvirtual_##m_name##_sn, $CALLSIARGPASS, ce);\\
-		if (ce.error == Callable::CallError::CALL_OK) {\\
-			$CALLSIRET\\
+proto = """#define GDVIRTUAL$VER($RET m_name $ARG)\\
+	StringName _gdvirtual_##m_name##_sn = #m_name;\\
+	mutable bool _gdvirtual_##m_name##_initialized = false;\\
+	mutable void *_gdvirtual_##m_name = nullptr;\\
+	template <bool required>\\
+	_FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST {\\
+		ScriptInstance *_script_instance = ((Object *)(this))->get_script_instance();\\
+		if (_script_instance) {\\
+			Callable::CallError ce;\\
+			$CALLSIARGS\\
+			$CALLSIBEGIN_script_instance->callp(_gdvirtual_##m_name##_sn, $CALLSIARGPASS, ce);\\
+			if (ce.error == Callable::CallError::CALL_OK) {\\
+				$CALLSIRET\\
+				return true;\\
+			}\\
+		}\\
+		if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
+			_gdvirtual_##m_name = nullptr;\\
+			if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
+				_gdvirtual_##m_name = _get_extension()->get_virtual_call_data(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
+			} else if (_get_extension()->get_virtual) {\\
+				_gdvirtual_##m_name = (void *)_get_extension()->get_virtual(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
+			}\\
+			GDVIRTUAL_TRACK(_gdvirtual_##m_name, _gdvirtual_##m_name##_initialized);\\
+			_gdvirtual_##m_name##_initialized = true;\\
+		}\\
+		if (_gdvirtual_##m_name) {\\
+			$CALLPTRARGS\\
+			$CALLPTRRETDEF\\
+			if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
+				_get_extension()->call_virtual_with_data(_get_extension_instance(), &_gdvirtual_##m_name##_sn, _gdvirtual_##m_name, $CALLPTRARGPASS, $CALLPTRRETPASS);\\
+				$CALLPTRRET\\
+			} else {\\
+				((GDExtensionClassCallVirtual)_gdvirtual_##m_name)(_get_extension_instance(), $CALLPTRARGPASS, $CALLPTRRETPASS);\\
+				$CALLPTRRET\\
+			}\\
 			return true;\\
-		}    \\
+		}\\
+		if (required) {\\
+			ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");\\
+			$RVOID\\
+		}\\
+		return false;\\
 	}\\
-    if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
-        _gdvirtual_##m_name = nullptr;\\
-        if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
-            _gdvirtual_##m_name = _get_extension()->get_virtual_call_data(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
-        } else if (_get_extension()->get_virtual) {\\
-            _gdvirtual_##m_name = (void *)_get_extension()->get_virtual(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
-        }\\
-        GDVIRTUAL_TRACK(_gdvirtual_##m_name, _gdvirtual_##m_name##_initialized); \\
-        _gdvirtual_##m_name##_initialized = true;\\
-    }\\
-	if (_gdvirtual_##m_name) {\\
-		$CALLPTRARGS\\
-		$CALLPTRRETDEF\\
-        if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
-            _get_extension()->call_virtual_with_data(_get_extension_instance(), &_gdvirtual_##m_name##_sn, _gdvirtual_##m_name, $CALLPTRARGPASS,$CALLPTRRETPASS);\\
-            $CALLPTRRET\\
-        } else {\\
-		    ((GDExtensionClassCallVirtual)_gdvirtual_##m_name)(_get_extension_instance(),$CALLPTRARGPASS,$CALLPTRRETPASS);\\
-            $CALLPTRRET\\
-        }\\
-		return true;\\
-	}\\
-	\\
-	if (required) {\\
-	        ERR_PRINT_ONCE("Required virtual method " + get_class() + "::" + #m_name + " must be overridden before calling.");\\
-	        $RVOID\\
-    }\\
-\\
-    return false;\\
-}\\
-_FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const { \\
-	ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\
-	if (_script_instance && _script_instance->has_method(_gdvirtual_##m_name##_sn)) {\\
-		return true;\\
-	}\\
-    if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
-         _gdvirtual_##m_name = nullptr;\\
-        if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
-             _gdvirtual_##m_name = _get_extension()->get_virtual_call_data(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
-        } else if (_get_extension()->get_virtual) {\\
-             _gdvirtual_##m_name = (void *)_get_extension()->get_virtual(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
-        }\\
-        GDVIRTUAL_TRACK(_gdvirtual_##m_name, _gdvirtual_##m_name##_initialized); \\
-        _gdvirtual_##m_name##_initialized = true;\\
-    }\\
-	if (_gdvirtual_##m_name) {\\
-	    return true;\\
+	_FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const {\\
+		ScriptInstance *_script_instance = ((Object *)(this))->get_script_instance();\\
+		if (_script_instance && _script_instance->has_method(_gdvirtual_##m_name##_sn)) {\\
+			return true;\\
+		}\\
+		if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
+			_gdvirtual_##m_name = nullptr;\\
+			if (_get_extension()->get_virtual_call_data && _get_extension()->call_virtual_with_data) {\\
+				_gdvirtual_##m_name = _get_extension()->get_virtual_call_data(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
+			} else if (_get_extension()->get_virtual) {\\
+				_gdvirtual_##m_name = (void *)_get_extension()->get_virtual(_get_extension()->class_userdata, &_gdvirtual_##m_name##_sn);\\
+			}\\
+			GDVIRTUAL_TRACK(_gdvirtual_##m_name, _gdvirtual_##m_name##_initialized);\\
+			_gdvirtual_##m_name##_initialized = true;\\
+		}\\
+		if (_gdvirtual_##m_name) {\\
+			return true;\\
+		}\\
+		return false;\\
 	}\\
-	return false;\\
-}\\
-\\
-_FORCE_INLINE_ static MethodInfo _gdvirtual_##m_name##_get_method_info() { \\
-    MethodInfo method_info;\\
-    method_info.name = #m_name;\\
-    method_info.flags = METHOD_FLAG_VIRTUAL;\\
-    $FILL_METHOD_INFO\\
-    return method_info;\\
-}
+	_FORCE_INLINE_ static MethodInfo _gdvirtual_##m_name##_get_method_info() {\\
+		MethodInfo method_info;\\
+		method_info.name = #m_name;\\
+		method_info.flags = $METHOD_FLAGS;\\
+		$FILL_METHOD_INFO\\
+		return method_info;\\
+	}
 
 """
 
@@ -83,22 +79,23 @@ def generate_version(argcount, const=False, returns=False):
     method_info = ""
     if returns:
         sproto += "R"
-        s = s.replace("$RET", "m_ret, ")
+        s = s.replace("$RET", "m_ret,")
         s = s.replace("$RVOID", "(void)r_ret;")  # If required, may lead to uninitialized errors
         s = s.replace("$CALLPTRRETDEF", "PtrToArg<m_ret>::EncodeT ret;")
-        method_info += "\tmethod_info.return_val = GetTypeInfo<m_ret>::get_class_info();\\\n"
-        method_info += "\tmethod_info.return_val_metadata = GetTypeInfo<m_ret>::METADATA;\\\n"
+        method_info += "method_info.return_val = GetTypeInfo<m_ret>::get_class_info();\\\n"
+        method_info += "\t\tmethod_info.return_val_metadata = GetTypeInfo<m_ret>::METADATA;"
     else:
-        s = s.replace("$RET", "")
-        s = s.replace("$RVOID", "")
-        s = s.replace("$CALLPTRRETDEF", "")
+        s = s.replace("$RET ", "")
+        s = s.replace("\t\t\t$RVOID\\\n", "")
+        s = s.replace("\t\t\t$CALLPTRRETDEF\\\n", "")
 
     if const:
         sproto += "C"
         s = s.replace("$CONST", "const")
-        method_info += "\tmethod_info.flags|=METHOD_FLAG_CONST;\\\n"
+        s = s.replace("$METHOD_FLAGS", "METHOD_FLAG_VIRTUAL | METHOD_FLAG_CONST")
     else:
-        s = s.replace("$CONST", "")
+        s = s.replace("$CONST ", "")
+        s = s.replace("$METHOD_FLAGS", "METHOD_FLAG_VIRTUAL")
 
     s = s.replace("$VER", sproto)
     argtext = ""
@@ -108,9 +105,9 @@ def generate_version(argcount, const=False, returns=False):
     callptrargsptr = ""
     if argcount > 0:
         argtext += ", "
-        callsiargs = "Variant vargs[" + str(argcount) + "]={"
-        callsiargptrs = "\t\tconst Variant *vargptrs[" + str(argcount) + "]={"
-        callptrargsptr = "\t\tGDExtensionConstTypePtr argptrs[" + str(argcount) + "]={"
+        callsiargs = f"Variant vargs[{argcount}] = {{ "
+        callsiargptrs = f"\t\t\tconst Variant *vargptrs[{argcount}] = {{ "
+        callptrargsptr = f"\t\t\tGDExtensionConstTypePtr argptrs[{argcount}] = {{ "
     callptrargs = ""
     for i in range(argcount):
         if i > 0:
@@ -118,52 +115,55 @@ def generate_version(argcount, const=False, returns=False):
             callargtext += ", "
             callsiargs += ", "
             callsiargptrs += ", "
-            callptrargs += "\t\t"
+            callptrargs += "\t\t\t"
             callptrargsptr += ", "
-        argtext += "m_type" + str(i + 1)
-        callargtext += "m_type" + str(i + 1) + " arg" + str(i + 1)
-        callsiargs += "Variant(arg" + str(i + 1) + ")"
-        callsiargptrs += "&vargs[" + str(i) + "]"
+        argtext += f"m_type{i + 1}"
+        callargtext += f"m_type{i + 1} arg{i + 1}"
+        callsiargs += f"Variant(arg{i + 1})"
+        callsiargptrs += f"&vargs[{i}]"
         callptrargs += (
-            "PtrToArg<m_type" + str(i + 1) + ">::EncodeT argval" + str(i + 1) + " = arg" + str(i + 1) + ";\\\n"
-        )
-        callptrargsptr += "&argval" + str(i + 1)
-        method_info += "\tmethod_info.arguments.push_back(GetTypeInfo<m_type" + str(i + 1) + ">::get_class_info());\\\n"
-        method_info += (
-            "\tmethod_info.arguments_metadata.push_back(GetTypeInfo<m_type" + str(i + 1) + ">::METADATA);\\\n"
+            f"PtrToArg<m_type{i + 1}>::EncodeT argval{i + 1} = (PtrToArg<m_type{i + 1}>::EncodeT)arg{i + 1};\\\n"
         )
+        callptrargsptr += f"&argval{i + 1}"
+        if method_info:
+            method_info += "\\\n\t\t"
+        method_info += f"method_info.arguments.push_back(GetTypeInfo<m_type{i + 1}>::get_class_info());\\\n"
+        method_info += f"\t\tmethod_info.arguments_metadata.push_back(GetTypeInfo<m_type{i + 1}>::METADATA);"
 
     if argcount:
-        callsiargs += "};\\\n"
-        callsiargptrs += "};\\\n"
+        callsiargs += " };\\\n"
+        callsiargptrs += " };"
         s = s.replace("$CALLSIARGS", callsiargs + callsiargptrs)
-        s = s.replace("$CALLSIARGPASS", "(const Variant **)vargptrs," + str(argcount))
-        callptrargsptr += "};\\\n"
+        s = s.replace("$CALLSIARGPASS", f"(const Variant **)vargptrs, {argcount}")
+        callptrargsptr += " };"
         s = s.replace("$CALLPTRARGS", callptrargs + callptrargsptr)
-        s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDExtensionConstTypePtr*>(argptrs)")
+        s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDExtensionConstTypePtr *>(argptrs)")
     else:
-        s = s.replace("$CALLSIARGS", "")
+        s = s.replace("\t\t\t$CALLSIARGS\\\n", "")
         s = s.replace("$CALLSIARGPASS", "nullptr, 0")
-        s = s.replace("$CALLPTRARGS", "")
+        s = s.replace("\t\t\t$CALLPTRARGS\\\n", "")
         s = s.replace("$CALLPTRARGPASS", "nullptr")
 
     if returns:
         if argcount > 0:
-            callargtext += ","
-        callargtext += " m_ret& r_ret"
+            callargtext += ", "
+        callargtext += "m_ret &r_ret"
         s = s.replace("$CALLSIBEGIN", "Variant ret = ")
         s = s.replace("$CALLSIRET", "r_ret = VariantCaster<m_ret>::cast(ret);")
         s = s.replace("$CALLPTRRETPASS", "&ret")
         s = s.replace("$CALLPTRRET", "r_ret = (m_ret)ret;")
     else:
         s = s.replace("$CALLSIBEGIN", "")
-        s = s.replace("$CALLSIRET", "")
+        s = s.replace("\t\t\t\t$CALLSIRET\\\n", "")
         s = s.replace("$CALLPTRRETPASS", "nullptr")
-        s = s.replace("$CALLPTRRET", "")
+        s = s.replace("\t\t\t\t$CALLPTRRET\\\n", "")
 
-    s = s.replace("$ARG", argtext)
+    s = s.replace(" $ARG", argtext)
     s = s.replace("$CALLARGS", callargtext)
-    s = s.replace("$FILL_METHOD_INFO", method_info)
+    if method_info:
+        s = s.replace("$FILL_METHOD_INFO", method_info)
+    else:
+        s = s.replace("\t\t$FILL_METHOD_INFO\\\n", method_info)
 
     return s
 
@@ -171,21 +171,21 @@ def generate_version(argcount, const=False, returns=False):
 def run(target, source, env):
     max_versions = 12
 
-    txt = """
+    txt = """/* THIS FILE IS GENERATED DO NOT EDIT */
 #ifndef GDVIRTUAL_GEN_H
 #define GDVIRTUAL_GEN_H
 
 #include "core/object/script_instance.h"
 
 #ifdef TOOLS_ENABLED
-#define GDVIRTUAL_TRACK(m_virtual, m_initialized) \\
-    if (_get_extension()->reloadable) {\\
-        VirtualMethodTracker *tracker = memnew(VirtualMethodTracker);\\
-        tracker->method = (void **)&m_virtual;\\
-        tracker->initialized = &m_initialized;\\
-        tracker->next = virtual_method_list;\\
-        virtual_method_list = tracker;\\
-    }
+#define GDVIRTUAL_TRACK(m_virtual, m_initialized)\\
+	if (_get_extension()->reloadable) {\\
+		VirtualMethodTracker *tracker = memnew(VirtualMethodTracker);\\
+		tracker->method = (void **)&m_virtual;\\
+		tracker->initialized = &m_initialized;\\
+		tracker->next = virtual_method_list;\\
+		virtual_method_list = tracker;\\
+	}
 #else
 #define GDVIRTUAL_TRACK(m_virtual, m_initialized)
 #endif
@@ -193,13 +193,13 @@ def run(target, source, env):
 """
 
     for i in range(max_versions + 1):
-        txt += "/* " + str(i) + " Arguments */\n\n"
+        txt += f"/* {i} Arguments */\n\n"
         txt += generate_version(i, False, False)
         txt += generate_version(i, False, True)
         txt += generate_version(i, True, False)
         txt += generate_version(i, True, True)
 
-    txt += "#endif"
+    txt += "#endif // GDVIRTUAL_GEN_H\n"
 
     with open(target[0], "w") as f:
         f.write(txt)