From 9f33134c93ecbadda70e8eefc50563e29b2eb7f2 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sat, 5 Apr 2014 12:39:30 -0300 Subject: [PATCH] =?UTF-8?q?-Support=20for=20changing=20fonts=20-Detect=20w?= =?UTF-8?q?hen=20free()=20might=20crash=20the=20project=20and=20throw=20er?= =?UTF-8?q?ror=20-fixed=202D=20Bounce=20in=20physics=20(3d=20still=20broke?= =?UTF-8?q?n)=20-renamed=20=E2=80=9Con=5Ftop=E2=80=9D=20property=20to=20?= =?UTF-8?q?=E2=80=9Cbehind=5Fparent=E2=80=9D,=20which=20makes=20more=20sen?= =?UTF-8?q?se,=20old=20on=5Ftop=20remains=20there=20for=20compatibility=20?= =?UTF-8?q?but=20is=20invisible.=20-large=20amount=20of=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/bind/core_bind.cpp | 7 + core/bind/core_bind.h | 2 + core/io/resource_format_binary.cpp | 1 + core/message_queue.cpp | 3 +- core/object.cpp | 54 ++++- core/object.h | 8 +- core/os/os.cpp | 5 + core/os/os.h | 1 + demos/2d/platformer/player.xml | 176 +++++++-------- demos/2d/platformer/stage.xml | 42 ++-- drivers/unix/os_unix.cpp | 6 + drivers/unix/os_unix.h | 1 + modules/SCsub | 1 - modules/gdscript/gd_functions.cpp | 2 +- modules/gdscript/gd_script.cpp | 13 ++ platform/android/AndroidManifest.xml.template | 2 +- platform/android/java/ant.properties | 5 - .../java/src/com/android/godot/Godot.java | 3 +- .../src/com/android/godot/GodotPaymentV3.java | 83 +++++++ .../android/godot/payments/ConsumeTask.java | 71 ++++++ .../godot/payments/HandlePurchaseTask.java | 79 +++++++ .../android/godot/payments/PaymentsCache.java | 42 ++++ .../godot/payments/PaymentsManager.java | 151 +++++++++++++ .../android/godot/payments/PurchaseTask.java | 121 ++++++++++ .../android/godot/payments/ValidateTask.java | 97 +++++++++ .../src/com/android/godot/utils/Crypt.java | 39 ++++ .../godot/utils/CustomSSLSocketFactory.java | 54 +++++ .../android/godot/utils/HttpRequester.java | 206 ++++++++++++++++++ .../android/godot/utils/RequestParams.java | 58 +++++ .../vending/billing/IInAppBillingService.aidl | 144 ++++++++++++ platform/android/java_glue.cpp | 9 +- platform/iphone/app_delegate.mm | 11 +- platform/iphone/detect.py | 1 - platform/iphone/gl_view.mm | 25 ++- platform/iphone/in_app_store.mm | 25 +++ platform/isim/detect.py | 1 - scene/2d/canvas_item.cpp | 25 ++- scene/2d/canvas_item.h | 9 +- scene/gui/control.cpp | 2 + scene/main/node.h | 2 + servers/physics_2d/body_pair_2d_sw.cpp | 15 +- servers/physics_2d/body_pair_2d_sw.h | 2 + tools/editor/code_editor.cpp | 18 +- tools/editor/code_editor.h | 4 +- tools/editor/editor_node.cpp | 8 + tools/editor/editor_settings.cpp | 10 +- tools/editor/property_editor.cpp | 9 +- 47 files changed, 1492 insertions(+), 161 deletions(-) create mode 100644 platform/android/java/src/com/android/godot/GodotPaymentV3.java create mode 100644 platform/android/java/src/com/android/godot/payments/ConsumeTask.java create mode 100644 platform/android/java/src/com/android/godot/payments/HandlePurchaseTask.java create mode 100644 platform/android/java/src/com/android/godot/payments/PaymentsCache.java create mode 100644 platform/android/java/src/com/android/godot/payments/PaymentsManager.java create mode 100644 platform/android/java/src/com/android/godot/payments/PurchaseTask.java create mode 100644 platform/android/java/src/com/android/godot/payments/ValidateTask.java create mode 100644 platform/android/java/src/com/android/godot/utils/Crypt.java create mode 100644 platform/android/java/src/com/android/godot/utils/CustomSSLSocketFactory.java create mode 100644 platform/android/java/src/com/android/godot/utils/HttpRequester.java create mode 100644 platform/android/java/src/com/android/godot/utils/RequestParams.java create mode 100644 platform/android/java/src/com/android/vending/billing/IInAppBillingService.aidl diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index 1b4ca8151b7a..e3360a23d20b 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -246,6 +246,12 @@ Error _OS::kill(int p_pid) { return OS::get_singleton()->kill(p_pid); } +int _OS::get_process_ID() const { + + return OS::get_singleton()->get_process_ID(); +}; + + bool _OS::has_environment(const String& p_var) const { return OS::get_singleton()->has_environment(p_var); @@ -561,6 +567,7 @@ void _OS::_bind_methods() { ObjectTypeDB::bind_method(_MD("execute","path","arguments","blocking"),&_OS::execute); ObjectTypeDB::bind_method(_MD("kill","pid"),&_OS::kill); ObjectTypeDB::bind_method(_MD("shell_open","uri"),&_OS::shell_open); + ObjectTypeDB::bind_method(_MD("get_process_ID"),&_OS::get_process_ID); ObjectTypeDB::bind_method(_MD("get_environment","environment"),&_OS::get_environment); ObjectTypeDB::bind_method(_MD("has_environment","environment"),&_OS::has_environment); diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 3d03247c07d0..0084726547de 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -117,6 +117,8 @@ class _OS : public Object { Error kill(int p_pid); Error shell_open(String p_uri); + int get_process_ID() const; + bool has_environment(const String& p_var) const; String get_environment(const String& p_var) const; diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index 47f278596bda..33f4cafeddf2 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -949,6 +949,7 @@ String ResourceInteractiveLoaderBinary::recognize(FileAccess *p_f) { } else if (header[0]!='R' || header[1]!='S' || header[2]!='R' || header[3]!='C') { //not normal + error=ERR_FILE_UNRECOGNIZED; return ""; } diff --git a/core/message_queue.cpp b/core/message_queue.cpp index a9c49fbef2f4..dbf6217dc2d3 100644 --- a/core/message_queue.cpp +++ b/core/message_queue.cpp @@ -378,11 +378,12 @@ void MessageQueue::flush() { } } - message->~Message(); read_pos+=sizeof(Message); if (message->type!=TYPE_NOTIFICATION) read_pos+=sizeof(Variant)*message->args; + message->~Message(); + _THREAD_SAFE_UNLOCK_ } diff --git a/core/object.cpp b/core/object.cpp index 692010b1b706..b40f4ec1512a 100644 --- a/core/object.cpp +++ b/core/object.cpp @@ -33,6 +33,30 @@ #include "message_queue.h" #include "core_string_names.h" #include "translation.h" + +#ifdef DEBUG_ENABLED + +struct _ObjectDebugLock { + + Object *obj; + + _ObjectDebugLock(Object *p_obj) { + obj=p_obj; + obj->_lock_index.ref(); + } + ~_ObjectDebugLock() { + obj->_lock_index.unref(); + } +}; + +#define OBJ_DEBUG_LOCK _ObjectDebugLock _debug_lock(this); + +#else + +#define OBJ_DEBUG_LOCK + +#endif + Array convert_property_list(const List * p_list) { Array va; @@ -562,13 +586,22 @@ void Object::call_multilevel(const StringName& p_method,const Variant** p_args,i ERR_FAIL(); return; } + + + if (_lock_index.get()>1) { + ERR_EXPLAIN("Object is locked and can't be freed."); + ERR_FAIL(); + return; + } #endif + //must be here, must be before everything, memdelete(this); return; } //Variant ret; + OBJ_DEBUG_LOCK Variant::CallError error; @@ -594,6 +627,7 @@ void Object::call_multilevel_reversed(const StringName& p_method,const Variant** MethodBind *method=ObjectTypeDB::get_method(get_type_name(),p_method); Variant::CallError error; + OBJ_DEBUG_LOCK if (method) { @@ -813,6 +847,15 @@ Variant Object::call(const StringName& p_method,const Variant** p_args,int p_arg ERR_EXPLAIN("Can't 'free' a reference."); ERR_FAIL_V(Variant()); } + + if (_lock_index.get()>1) { + r_error.argument=0; + r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; + ERR_EXPLAIN("Object is locked and can't be freed."); + ERR_FAIL_V(Variant()); + + } + #endif //must be here, must be before everything, memdelete(this); @@ -821,7 +864,7 @@ Variant Object::call(const StringName& p_method,const Variant** p_args,int p_arg } Variant ret; - + OBJ_DEBUG_LOCK if (script_instance) { ret = script_instance->call(p_method,p_args,p_argcount,r_error); //force jumptable @@ -902,7 +945,7 @@ void Object::set_script(const RefPtr& p_script) { Ref