You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
GDScript: Implement lambdas compilation and runtime
This commit is contained in:
@@ -93,6 +93,7 @@ class GDScriptByteCodeGenerator : public GDScriptCodeGenerator {
|
||||
Map<Variant::ValidatedUtilityFunction, int> utilities_map;
|
||||
Map<GDScriptUtilityFunctions::FunctionPtr, int> gds_utilities_map;
|
||||
Map<MethodBind *, int> method_bind_map;
|
||||
Map<GDScriptFunction *, int> lambdas_map;
|
||||
|
||||
// Lists since these can be nested.
|
||||
List<int> if_jmp_addrs;
|
||||
@@ -293,6 +294,15 @@ class GDScriptByteCodeGenerator : public GDScriptCodeGenerator {
|
||||
return pos;
|
||||
}
|
||||
|
||||
int get_lambda_function_pos(GDScriptFunction *p_lambda_function) {
|
||||
if (lambdas_map.has(p_lambda_function)) {
|
||||
return lambdas_map[p_lambda_function];
|
||||
}
|
||||
int pos = lambdas_map.size();
|
||||
lambdas_map[p_lambda_function] = pos;
|
||||
return pos;
|
||||
}
|
||||
|
||||
void alloc_ptrcall(int p_params) {
|
||||
if (p_params >= ptrcall_max) {
|
||||
ptrcall_max = p_params;
|
||||
@@ -386,6 +396,10 @@ class GDScriptByteCodeGenerator : public GDScriptCodeGenerator {
|
||||
opcodes.push_back(get_method_bind_pos(p_method));
|
||||
}
|
||||
|
||||
void append(GDScriptFunction *p_lambda_function) {
|
||||
opcodes.push_back(get_lambda_function_pos(p_lambda_function));
|
||||
}
|
||||
|
||||
void patch_jump(int p_address) {
|
||||
opcodes.write[p_address] = opcodes.size();
|
||||
}
|
||||
@@ -452,6 +466,7 @@ public:
|
||||
virtual void write_call_self(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
|
||||
virtual void write_call_self_async(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
|
||||
virtual void write_call_script_function(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
|
||||
virtual void write_lambda(const Address &p_target, GDScriptFunction *p_function, const Vector<Address> &p_captures) override;
|
||||
virtual void write_construct(const Address &p_target, Variant::Type p_type, const Vector<Address> &p_arguments) override;
|
||||
virtual void write_construct_array(const Address &p_target, const Vector<Address> &p_arguments) override;
|
||||
virtual void write_construct_typed_array(const Address &p_target, const GDScriptDataType &p_element_type, const Vector<Address> &p_arguments) override;
|
||||
|
||||
Reference in New Issue
Block a user