mirror of
https://github.com/godotengine/godot.git
synced 2025-10-20 00:13:30 +00:00
GDScript: Add faster call instructions for native methods
This commit is contained in:
parent
5aeb390cd7
commit
d8b22097f2
7 changed files with 733 additions and 61 deletions
|
@ -466,6 +466,112 @@ void GDScriptFunction::disassemble(const Vector<String> &p_code_lines) const {
|
|||
|
||||
incr = 5 + argc;
|
||||
} break;
|
||||
case OPCODE_CALL_METHOD_BIND:
|
||||
case OPCODE_CALL_METHOD_BIND_RET: {
|
||||
bool ret = (_code_ptr[ip] & INSTR_MASK) == OPCODE_CALL_METHOD_BIND_RET;
|
||||
|
||||
if (ret) {
|
||||
text += "call-method_bind-ret ";
|
||||
} else {
|
||||
text += "call-method_bind ";
|
||||
}
|
||||
|
||||
MethodBind *method = _methods_ptr[_code_ptr[ip + 2 + instr_var_args]];
|
||||
|
||||
int argc = _code_ptr[ip + 1 + instr_var_args];
|
||||
if (ret) {
|
||||
text += DADDR(2 + argc) + " = ";
|
||||
}
|
||||
|
||||
text += DADDR(1 + argc) + ".";
|
||||
text += method->get_name();
|
||||
text += "(";
|
||||
|
||||
for (int i = 0; i < argc; i++) {
|
||||
if (i > 0)
|
||||
text += ", ";
|
||||
text += DADDR(1 + i);
|
||||
}
|
||||
text += ")";
|
||||
|
||||
incr = 5 + argc;
|
||||
} break;
|
||||
case OPCODE_CALL_PTRCALL_NO_RETURN: {
|
||||
text += "call-ptrcall (no return) ";
|
||||
|
||||
MethodBind *method = _methods_ptr[_code_ptr[ip + 2 + instr_var_args]];
|
||||
|
||||
int argc = _code_ptr[ip + 1 + instr_var_args];
|
||||
|
||||
text += DADDR(1 + argc) + ".";
|
||||
text += method->get_name();
|
||||
text += "(";
|
||||
|
||||
for (int i = 0; i < argc; i++) {
|
||||
if (i > 0)
|
||||
text += ", ";
|
||||
text += DADDR(1 + i);
|
||||
}
|
||||
text += ")";
|
||||
|
||||
incr = 5 + argc;
|
||||
} break;
|
||||
|
||||
#define DISASSEMBLE_PTRCALL(m_type) \
|
||||
case OPCODE_CALL_PTRCALL_##m_type: { \
|
||||
text += "call-ptrcall (return "; \
|
||||
text += #m_type; \
|
||||
text += ") "; \
|
||||
MethodBind *method = _methods_ptr[_code_ptr[ip + 2 + instr_var_args]]; \
|
||||
int argc = _code_ptr[ip + 1 + instr_var_args]; \
|
||||
text += DADDR(2 + argc) + " = "; \
|
||||
text += DADDR(1 + argc) + "."; \
|
||||
text += method->get_name(); \
|
||||
text += "("; \
|
||||
for (int i = 0; i < argc; i++) { \
|
||||
if (i > 0) \
|
||||
text += ", "; \
|
||||
text += DADDR(1 + i); \
|
||||
} \
|
||||
text += ")"; \
|
||||
incr = 5 + argc; \
|
||||
} break
|
||||
|
||||
DISASSEMBLE_PTRCALL(BOOL);
|
||||
DISASSEMBLE_PTRCALL(INT);
|
||||
DISASSEMBLE_PTRCALL(FLOAT);
|
||||
DISASSEMBLE_PTRCALL(STRING);
|
||||
DISASSEMBLE_PTRCALL(VECTOR2);
|
||||
DISASSEMBLE_PTRCALL(VECTOR2I);
|
||||
DISASSEMBLE_PTRCALL(RECT2);
|
||||
DISASSEMBLE_PTRCALL(RECT2I);
|
||||
DISASSEMBLE_PTRCALL(VECTOR3);
|
||||
DISASSEMBLE_PTRCALL(VECTOR3I);
|
||||
DISASSEMBLE_PTRCALL(TRANSFORM2D);
|
||||
DISASSEMBLE_PTRCALL(PLANE);
|
||||
DISASSEMBLE_PTRCALL(AABB);
|
||||
DISASSEMBLE_PTRCALL(BASIS);
|
||||
DISASSEMBLE_PTRCALL(TRANSFORM);
|
||||
DISASSEMBLE_PTRCALL(COLOR);
|
||||
DISASSEMBLE_PTRCALL(STRING_NAME);
|
||||
DISASSEMBLE_PTRCALL(NODE_PATH);
|
||||
DISASSEMBLE_PTRCALL(RID);
|
||||
DISASSEMBLE_PTRCALL(QUAT);
|
||||
DISASSEMBLE_PTRCALL(OBJECT);
|
||||
DISASSEMBLE_PTRCALL(CALLABLE);
|
||||
DISASSEMBLE_PTRCALL(SIGNAL);
|
||||
DISASSEMBLE_PTRCALL(DICTIONARY);
|
||||
DISASSEMBLE_PTRCALL(ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_BYTE_ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_INT32_ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_INT64_ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_FLOAT32_ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_FLOAT64_ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_STRING_ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_VECTOR2_ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_VECTOR3_ARRAY);
|
||||
DISASSEMBLE_PTRCALL(PACKED_COLOR_ARRAY);
|
||||
|
||||
case OPCODE_CALL_BUILT_IN: {
|
||||
text += "call-built-in ";
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue