### 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
items = -1, int p_max_depth = -1) override {
		Dictionary ret;
		GDVIRTUAL_REQUIRED_CALL(_debug_get_globals, p_max_subitems, p_max_depth, ret);
		if (ret.size() == 0) {
			return;
		}
		if (p_globals != nullptr && ret.has("globals")) {
			PackedStringArray strings = ret["globals"];
			for (int i = 0; i < strings.size(); i++) {
				p_globals->push_back(strings[i]);
			}
		}
		if (p_values != nullptr && ret.has("values")) {
			Array values = ret["values"];
			for (int i = 0; i < values.size(); i++) {
				p_values->push_back(values[i]);
			}
		}
	}
	EXBIND4R(String, debug_parse_stack_level_expression, int, const String &, int, int)
	GDVIRTUAL0R(TypedArray<Dictionary>, _debug_get_current_stack_info)
	virtual Vector<StackInfo> debug_get_current_stack_info() override {
		TypedArray<Dictionary> ret;
		GDVIRTUAL_REQUIRED_CALL(_debug_get_current_stack_info, ret);
		Vector<StackInfo> sret;
		for (int i = 0; i < ret.size(); i++) {
			StackInfo si;
			Dictionary d = ret[i];
			ERR_CONTINUE(!d.has("file"));
			ERR_CONTINUE(!d.has("func"));
			ERR_CONTINUE(!d.has("line"));
			si.file = d["file"];
			si.func = d["func"];
			si.line = d["line"];
			sret.push_back(si);
		}
		return sret;
	}
	EXBIND0(reload_all_scripts)
	EXBIND2(reload_tool_script, const Ref<Script> &, bool)
	
	GDVIRTUAL0RC(PackedStringArray, _get_recognized_extensions)
	virtual void get_recognized_extensions(List<String> *p_extensions) const override {
		PackedStringArray ret;
		GDVIRTUAL_REQUIRED_CALL(_get_recognized_extensions, ret);
		for (int i = 0; i < ret.size(); i++) {
			p_extensions->push_back(ret[i]);
		}
	}
	GDVIRTUAL0RC(TypedArray<Dictionary>, _get_public_functions)
	virtual void get_public_functions(List<MethodInfo> *p_functions) const override {
		TypedArray<Dictionary> ret;
		GDVIRTUAL_REQUIRED_CALL(_get_public_functions, ret);
		for (int i = 0; i < ret.size(); i++) {
			MethodInfo mi = MethodInfo::from_dict(ret[i]);
			p_functions->push_back(mi);
		}
	}
	GDVIRTUAL0RC(Dictionary, _get_public_constants