### Godot version

4.2 247c354

### System information

Windows 10.0.19045 - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 1060 (NVIDIA; 30.0.15.1403) - Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz (8 Threads)

### Issue description

#75778 exposed `_validate_property()` to scripting. It's implemented in GDScript and C#, but not GDExtension (depends on #78634).
https://github.com/godotengine/godot/blob/247c3548d810136ffe9c1694cd76db3236efaa90/core/object/script_language_extension.h#L685-L687

Relevant discussion: https://github.com/godotengine/godot/pull/75778#discussion_r1307294940

### Steps to reproduce

1. Add GDExtension script
2. Use `_validate_property()`

### Minimal reproduction project

N/A
oc> class_doc;
		for (int i = 0; i < doc.size(); i++) {
			class_doc.append(DocData::ClassDoc::from_dict(doc[i]));
		}
		return class_doc;
	}
	virtual String get_class_icon_path() const override {
		String ret;
		GDVIRTUAL_CALL(_get_class_icon_path, ret);
		return ret;
	}
#endif 
	EXBIND1RC(bool, has_method, const StringName &)
	GDVIRTUAL1RC(Dictionary, _get_method_info, const StringName &)
	virtual MethodInfo get_method_info(const StringName &p_method) const override {
		Dictionary mi;
		GDVIRTUAL_REQUIRED_CALL(_get_method_info, p_method, mi);
		return MethodInfo::from_dict(mi);
	}
	EXBIND0RC(bool, is_tool)
	EXBIND0RC(bool, is_valid)
	EXBIND0RC(ScriptLanguage *, get_language)
	EXBIND1RC(bool, has_script_signal, const StringName &)
	GDVIRTUAL0RC(TypedArray<Dictionary>, _get_script_signal_list)
	virtual void get_script_signal_list(List<MethodInfo> *r_signals) const override {
		TypedArray<Dictionary> sl;
		GDVIRTUAL_REQUIRED_CALL(_get_script_signal_list, sl);
		for (int i = 0; i < sl.size(); i++) {
			r_signals->push_back(MethodInfo::from_dict(sl[i]));
		}
	}
	GDVIRTUAL1RC(bool, _has_property_default_value, const StringName &)
	GDVIRTUAL1RC(Variant, _get_property_default_value, const StringName &)
	virtual bool get_property_default_value(const StringName &p_property, Variant &r_value) const override {
		bool has_dv = false;
		if (!GDVIRTUAL_REQUIRED_CALL(_has_property_default_value, p_property, has_dv) || !has_dv) {
			return false;
		}
		Variant ret;
		GDVIRTUAL_REQUIRED_CALL(_get_property_default_value, p_property, ret);
		r_value = ret;
		return true;
	}
	EXBIND0(update_exports)
	GDVIRTUAL0RC(TypedArray<Dictionary>, _get_script_method_list)
	virtual void get_script_method_list(List<MethodInfo> *r_methods) const override {
		TypedArray<Dictionary> sl;
		GDVIRTUAL_REQUIRED_CALL(_get_script_method_list, sl);
		for (int i = 0; i < sl.size(); i++) {
			r_methods->push_back(MethodInfo::from_dict(sl[i]));
		}
	}
	GDVIRTUAL0RC(TypedArray<Dictionary>, _get_script_property_