You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-11 13:10:58 +00:00
Reduce unnecessary COW on Vector by make writing explicit
This commit makes operator[] on Vector const and adds a write proxy to it. From now on writes to Vectors need to happen through the .write proxy. So for instance: Vector<int> vec; vec.push_back(10); std::cout << vec[0] << std::endl; vec.write[0] = 20; Failing to use the .write proxy will cause a compilation error. In addition COWable datatypes can now embed a CowData pointer to their data. This means that String, CharString, and VMap no longer use or derive from Vector. _ALWAYS_INLINE_ and _FORCE_INLINE_ are now equivalent for debug and non-debug builds. This is a lot faster for Vector in the editor and while running tests. The reason why this difference used to exist is because force-inlined methods used to give a bad debugging experience. After extensive testing with modern compilers this is no longer the case.
This commit is contained in:
@@ -277,7 +277,7 @@ void GDNative::set_library(Ref<GDNativeLibrary> p_library) {
|
||||
library = p_library;
|
||||
}
|
||||
|
||||
Ref<GDNativeLibrary> GDNative::get_library() {
|
||||
Ref<GDNativeLibrary> GDNative::get_library() const {
|
||||
return library;
|
||||
}
|
||||
|
||||
@@ -373,7 +373,7 @@ bool GDNative::initialize() {
|
||||
if (library->should_load_once() && !GDNativeLibrary::loaded_libraries->has(lib_path)) {
|
||||
Vector<Ref<GDNative> > gdnatives;
|
||||
gdnatives.resize(1);
|
||||
gdnatives[0] = Ref<GDNative>(this);
|
||||
gdnatives.write[0] = Ref<GDNative>(this);
|
||||
GDNativeLibrary::loaded_libraries->insert(lib_path, gdnatives);
|
||||
}
|
||||
|
||||
@@ -428,7 +428,7 @@ bool GDNative::terminate() {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GDNative::is_initialized() {
|
||||
bool GDNative::is_initialized() const {
|
||||
return initialized;
|
||||
}
|
||||
|
||||
@@ -442,7 +442,7 @@ Vector<StringName> GDNativeCallRegistry::get_native_call_types() {
|
||||
|
||||
size_t idx = 0;
|
||||
for (Map<StringName, native_call_cb>::Element *E = native_calls.front(); E; E = E->next(), idx++) {
|
||||
call_types[idx] = E->key();
|
||||
call_types.write[idx] = E->key();
|
||||
}
|
||||
|
||||
return call_types;
|
||||
@@ -474,7 +474,7 @@ Variant GDNative::call_native(StringName p_native_call_type, StringName p_proced
|
||||
return res;
|
||||
}
|
||||
|
||||
Error GDNative::get_symbol(StringName p_procedure_name, void *&r_handle, bool p_optional) {
|
||||
Error GDNative::get_symbol(StringName p_procedure_name, void *&r_handle, bool p_optional) const {
|
||||
|
||||
if (!initialized) {
|
||||
ERR_PRINT("No valid library handle, can't get symbol from GDNative object");
|
||||
|
||||
Reference in New Issue
Block a user