From 4cfc29611e21811065d024a6de1685418e60111e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Thu, 16 Nov 2017 18:38:18 +0100 Subject: GDScript: Refactor "GD" class prefix to "GDScript" --- modules/gdscript/gdscript.cpp | 1911 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1911 insertions(+) create mode 100644 modules/gdscript/gdscript.cpp (limited to 'modules/gdscript/gdscript.cpp') diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp new file mode 100644 index 0000000000..55ea8a5f24 --- /dev/null +++ b/modules/gdscript/gdscript.cpp @@ -0,0 +1,1911 @@ +/*************************************************************************/ +/* gdscript.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "gdscript.h" + +#include "engine.h" +#include "gdscript_compiler.h" +#include "global_constants.h" +#include "io/file_access_encrypted.h" +#include "os/file_access.h" +#include "os/os.h" +#include "project_settings.h" + +/////////////////////////// + +GDScriptNativeClass::GDScriptNativeClass(const StringName &p_name) { + + name = p_name; +} + +bool GDScriptNativeClass::_get(const StringName &p_name, Variant &r_ret) const { + + bool ok; + int v = ClassDB::get_integer_constant(name, p_name, &ok); + + if (ok) { + r_ret = v; + return true; + } else { + return false; + } +} + +void GDScriptNativeClass::_bind_methods() { + + ClassDB::bind_method(D_METHOD("new"), &GDScriptNativeClass::_new); +} + +Variant GDScriptNativeClass::_new() { + + Object *o = instance(); + if (!o) { + ERR_EXPLAIN("Class type: '" + String(name) + "' is not instantiable."); + ERR_FAIL_COND_V(!o, Variant()); + } + + Reference *ref = Object::cast_to(o); + if (ref) { + return REF(ref); + } else { + return o; + } +} + +Object *GDScriptNativeClass::instance() { + + return ClassDB::instance(name); +} + +GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_isref, Variant::CallError &r_error) { + + /* STEP 1, CREATE */ + + GDScriptInstance *instance = memnew(GDScriptInstance); + instance->base_ref = p_isref; + instance->members.resize(member_indices.size()); + instance->script = Ref(this); + instance->owner = p_owner; +#ifdef DEBUG_ENABLED + //needed for hot reloading + for (Map::Element *E = member_indices.front(); E; E = E->next()) { + instance->member_indices_cache[E->key()] = E->get().index; + } +#endif + instance->owner->set_script_instance(instance); + +/* STEP 2, INITIALIZE AND CONSRTUCT */ + +#ifndef NO_THREADS + GDScriptLanguage::singleton->lock->lock(); +#endif + + instances.insert(instance->owner); + +#ifndef NO_THREADS + GDScriptLanguage::singleton->lock->unlock(); +#endif + + initializer->call(instance, p_args, p_argcount, r_error); + + if (r_error.error != Variant::CallError::CALL_OK) { + instance->script = Ref(); + instance->owner->set_script_instance(NULL); +#ifndef NO_THREADS + GDScriptLanguage::singleton->lock->lock(); +#endif + instances.erase(p_owner); +#ifndef NO_THREADS + GDScriptLanguage::singleton->lock->unlock(); +#endif + + ERR_FAIL_COND_V(r_error.error != Variant::CallError::CALL_OK, NULL); //error constructing + } + + //@TODO make thread safe + return instance; +} + +Variant GDScript::_new(const Variant **p_args, int p_argcount, Variant::CallError &r_error) { + + /* STEP 1, CREATE */ + + if (!valid) { + r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; + return Variant(); + } + + r_error.error = Variant::CallError::CALL_OK; + REF ref; + Object *owner = NULL; + + GDScript *_baseptr = this; + while (_baseptr->_base) { + _baseptr = _baseptr->_base; + } + + ERR_FAIL_COND_V(_baseptr->native.is_null(), Variant()); + + if (_baseptr->native.ptr()) { + owner = _baseptr->native->instance(); + } else { + owner = memnew(Reference); //by default, no base means use reference + } + + Reference *r = Object::cast_to(owner); + if (r) { + ref = REF(r); + } + + GDScriptInstance *instance = _create_instance(p_args, p_argcount, owner, r != NULL, r_error); + if (!instance) { + if (ref.is_null()) { + memdelete(owner); //no owner, sorry + } + return Variant(); + } + + if (ref.is_valid()) { + return ref; + } else { + return owner; + } +} + +bool GDScript::can_instance() const { + + return valid || (!tool && !ScriptServer::is_scripting_enabled()); +} + +Ref