| 157 | } |
| 158 | |
| 159 | GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_is_ref_counted, Callable::CallError &r_error) { |
| 160 | /* STEP 1, CREATE */ |
| 161 | |
| 162 | GDScriptInstance *instance = memnew(GDScriptInstance); |
| 163 | instance->base_ref_counted = p_is_ref_counted; |
| 164 | instance->members.resize(member_indices.size()); |
| 165 | instance->script = Ref<GDScript>(this); |
| 166 | instance->owner = p_owner; |
| 167 | instance->owner_id = p_owner->get_instance_id(); |
| 168 | #ifdef DEBUG_ENABLED |
| 169 | //needed for hot reloading |
| 170 | for (const KeyValue<StringName, MemberInfo> &E : member_indices) { |
| 171 | instance->member_indices_cache[E.key] = E.value.index; |
| 172 | } |
| 173 | #endif |
| 174 | instance->owner->set_script_instance(instance); |
| 175 | |
| 176 | /* STEP 2, INITIALIZE AND CONSTRUCT */ |
| 177 | { |
| 178 | MutexLock lock(GDScriptLanguage::singleton->mutex); |
| 179 | instances.insert(instance->owner); |
| 180 | } |
| 181 | |
| 182 | _super_implicit_constructor(this, instance, r_error); |
| 183 | if (r_error.error != Callable::CallError::CALL_OK) { |
| 184 | String error_text = Variant::get_call_error_text(instance->owner, "@implicit_new", nullptr, 0, r_error); |
| 185 | instance->script = Ref<GDScript>(); |
| 186 | instance->owner->set_script_instance(nullptr); |
| 187 | { |
| 188 | MutexLock lock(GDScriptLanguage::singleton->mutex); |
| 189 | instances.erase(p_owner); |
| 190 | } |
| 191 | ERR_FAIL_V_MSG(nullptr, "Error constructing a GDScriptInstance: " + error_text); |
| 192 | } |
| 193 | |
| 194 | if (p_argcount < 0) { |
| 195 | return instance; |
| 196 | } |
| 197 | |
| 198 | GDScriptFunction *applicable_initializer = _super_constructor(this); |
| 199 | if (applicable_initializer != nullptr) { |
| 200 | applicable_initializer->call(instance, p_args, p_argcount, r_error); |
| 201 | if (r_error.error != Callable::CallError::CALL_OK) { |
| 202 | String error_text = Variant::get_call_error_text(instance->owner, "_init", p_args, p_argcount, r_error); |
| 203 | instance->script = Ref<GDScript>(); |
| 204 | instance->owner->set_script_instance(nullptr); |
| 205 | { |
| 206 | MutexLock lock(GDScriptLanguage::singleton->mutex); |
| 207 | instances.erase(p_owner); |
| 208 | } |
| 209 | ERR_FAIL_V_MSG(nullptr, "Error constructing a GDScriptInstance: " + error_text); |
| 210 | } |
| 211 | } |
| 212 | /// @todo Make thread safe |
| 213 | return instance; |
| 214 | } |
| 215 | |
| 216 | Variant GDScript::_new(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { |
nothing calls this directly
no test coverage detected