mirror of
https://github.com/godotengine/godot.git
synced 2025-10-28 20:24:41 +00:00
GDScript: Add faster operator for known types
It now uses the direct operator function pointer, which increases performance in evaluation.
This commit is contained in:
parent
c707d6fe71
commit
1ad5c926dc
5 changed files with 77 additions and 3 deletions
|
|
@ -158,6 +158,18 @@ GDScriptFunction *GDScriptByteCodeGenerator::write_end() {
|
|||
function->_default_arg_ptr = nullptr;
|
||||
}
|
||||
|
||||
if (operator_func_map.size()) {
|
||||
function->operator_funcs.resize(operator_func_map.size());
|
||||
function->_operator_funcs_count = function->operator_funcs.size();
|
||||
function->_operator_funcs_ptr = function->operator_funcs.ptr();
|
||||
for (const Map<Variant::ValidatedOperatorEvaluator, int>::Element *E = operator_func_map.front(); E; E = E->next()) {
|
||||
function->operator_funcs.write[E->get()] = E->key();
|
||||
}
|
||||
} else {
|
||||
function->_operator_funcs_count = 0;
|
||||
function->_operator_funcs_ptr = nullptr;
|
||||
}
|
||||
|
||||
if (debug_stack) {
|
||||
function->stack_debug = stack_debug;
|
||||
}
|
||||
|
|
@ -178,7 +190,23 @@ void GDScriptByteCodeGenerator::set_initial_line(int p_line) {
|
|||
function->_initial_line = p_line;
|
||||
}
|
||||
|
||||
#define HAS_BUILTIN_TYPE(m_var) \
|
||||
(m_var.type.has_type && m_var.type.kind == GDScriptDataType::BUILTIN)
|
||||
|
||||
void GDScriptByteCodeGenerator::write_operator(const Address &p_target, Variant::Operator p_operator, const Address &p_left_operand, const Address &p_right_operand) {
|
||||
if (HAS_BUILTIN_TYPE(p_left_operand) && HAS_BUILTIN_TYPE(p_right_operand)) {
|
||||
// Gather specific operator.
|
||||
Variant::ValidatedOperatorEvaluator op_func = Variant::get_validated_operator_evaluator(p_operator, p_left_operand.type.builtin_type, p_right_operand.type.builtin_type);
|
||||
|
||||
append(GDScriptFunction::OPCODE_OPERATOR_VALIDATED, 3);
|
||||
append(p_left_operand);
|
||||
append(p_right_operand);
|
||||
append(p_target);
|
||||
append(op_func);
|
||||
return;
|
||||
}
|
||||
|
||||
// No specific types, perform variant evaluation.
|
||||
append(GDScriptFunction::OPCODE_OPERATOR, 3);
|
||||
append(p_left_operand);
|
||||
append(p_right_operand);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue