Allow free()
to be used as Callable
This method is registered in a special way so ClassDB doesn't naturally know about its existence. Here it is hardcoded if any other option fail to check if it is about the `free()` method and, if so, say it exists and return a Callable.
This commit is contained in:
parent
107f2961cc
commit
b4e08eb752
4 changed files with 22 additions and 1 deletions
|
@ -31,6 +31,7 @@
|
||||||
#include "class_db.h"
|
#include "class_db.h"
|
||||||
|
|
||||||
#include "core/config/engine.h"
|
#include "core/config/engine.h"
|
||||||
|
#include "core/core_string_names.h"
|
||||||
#include "core/io/resource_loader.h"
|
#include "core/io/resource_loader.h"
|
||||||
#include "core/object/script_language.h"
|
#include "core/object/script_language.h"
|
||||||
#include "core/os/mutex.h"
|
#include "core/os/mutex.h"
|
||||||
|
@ -1299,6 +1300,12 @@ bool ClassDB::get_property(Object *p_object, const StringName &p_property, Varia
|
||||||
check = check->inherits_ptr;
|
check = check->inherits_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The "free()" method is special, so we assume it exists and return a Callable.
|
||||||
|
if (p_property == CoreStringNames::get_singleton()->_free) {
|
||||||
|
r_value = Callable(p_object, p_property);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
#include "core/config/engine.h"
|
#include "core/config/engine.h"
|
||||||
#include "core/config/project_settings.h"
|
#include "core/config/project_settings.h"
|
||||||
|
#include "core/core_string_names.h"
|
||||||
|
|
||||||
bool GDScriptCompiler::_is_class_member_property(CodeGen &codegen, const StringName &p_name) {
|
bool GDScriptCompiler::_is_class_member_property(CodeGen &codegen, const StringName &p_name) {
|
||||||
if (codegen.function_node && codegen.function_node->is_static) {
|
if (codegen.function_node && codegen.function_node->is_static) {
|
||||||
|
@ -345,7 +346,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||||
scr = scr->_base;
|
scr = scr->_base;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nc && (ClassDB::has_signal(nc->get_name(), identifier) || ClassDB::has_method(nc->get_name(), identifier))) {
|
if (nc && (identifier == CoreStringNames::get_singleton()->_free || ClassDB::has_signal(nc->get_name(), identifier) || ClassDB::has_method(nc->get_name(), identifier))) {
|
||||||
// Get like it was a property.
|
// Get like it was a property.
|
||||||
GDScriptCodeGenerator::Address temp = codegen.add_temporary(); // TODO: Get type here.
|
GDScriptCodeGenerator::Address temp = codegen.add_temporary(); // TODO: Get type here.
|
||||||
GDScriptCodeGenerator::Address self(GDScriptCodeGenerator::Address::SELF);
|
GDScriptCodeGenerator::Address self(GDScriptCodeGenerator::Address::SELF);
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
func test():
|
||||||
|
var node := Node.new()
|
||||||
|
var callable: Callable = node.free
|
||||||
|
callable.call()
|
||||||
|
print(node)
|
||||||
|
|
||||||
|
node = Node.new()
|
||||||
|
callable = node["free"]
|
||||||
|
callable.call()
|
||||||
|
print(node)
|
|
@ -0,0 +1,3 @@
|
||||||
|
GDTEST_OK
|
||||||
|
<Freed Object>
|
||||||
|
<Freed Object>
|
Loading…
Reference in a new issue