Browse Source

Merge pull request #9720 from endragor/stack-bottom

Add a way to retrieve stack bottom of the main thread
Thomas Herzog 8 years ago
parent
commit
9caf9fa76f
4 changed files with 25 additions and 0 deletions
  1. 7 0
      core/os/os.cpp
  2. 9 0
      core/os/os.h
  3. 5 0
      modules/gdnative/godot/gdnative.cpp
  4. 4 0
      modules/gdnative/godot/gdnative.h

+ 7 - 0
core/os/os.cpp

@@ -512,7 +512,13 @@ bool OS::check_feature_support(const String &p_feature) {
 	return false;
 }
 
+void *OS::get_stack_bottom() const {
+	return _stack_bottom;
+}
+
 OS::OS() {
+	void *volatile stack_bottom;
+
 	last_error = NULL;
 	singleton = this;
 	_keep_screen_on = true; // set default value to true, because this had been true before godot 2.0.
@@ -525,6 +531,7 @@ OS::OS() {
 	_render_thread_mode = RENDER_THREAD_SAFE;
 
 	_allow_hidpi = true;
+	_stack_bottom = (void *)(&stack_bottom);
 }
 
 OS::~OS() {

+ 9 - 0
core/os/os.h

@@ -60,6 +60,8 @@ class OS {
 
 	char *last_error;
 
+	void *_stack_bottom;
+
 public:
 	enum RenderThreadMode {
 
@@ -411,6 +413,13 @@ public:
 
 	bool check_feature_support(const String &p_feature);
 
+	/**
+	 * Returns the stack bottom of the main thread of the application.
+	 * This may be of use when integrating languages with garbage collectors that
+	 * need to check whether a pointer is on the stack.
+	 */
+	virtual void *get_stack_bottom() const;
+
 	bool is_hidpi_allowed() const { return _allow_hidpi; }
 	OS();
 	virtual ~OS();

+ 5 - 0
modules/gdnative/godot/gdnative.cpp

@@ -33,6 +33,7 @@
 #include "error_macros.h"
 #include "gdnative.h"
 #include "global_constants.h"
+#include "os/os.h"
 #include "project_settings.h"
 #include "variant.h"
 
@@ -89,6 +90,10 @@ godot_object GDAPI *godot_global_get_singleton(char *p_name) {
 	return (godot_object *)ProjectSettings::get_singleton()->get_singleton_object(String(p_name));
 } // result shouldn't be freed
 
+void GDAPI *godot_get_stack_bottom() {
+	return OS::get_singleton()->get_stack_bottom();
+}
+
 // MethodBind API
 
 godot_method_bind GDAPI *godot_method_bind_get_method(const char *p_classname, const char *p_methodname) {

+ 4 - 0
modules/gdnative/godot/gdnative.h

@@ -245,6 +245,10 @@ void GDAPI godot_object_destroy(godot_object *p_o);
 
 godot_object GDAPI *godot_global_get_singleton(char *p_name); // result shouldn't be freed
 
+////// OS API
+
+void GDAPI *godot_get_stack_bottom(); //  returns stack bottom of the main thread
+
 ////// MethodBind API
 
 typedef struct {