Garbage collection and String fixes

This commit is contained in:
Joshua Granick
2018-06-08 16:04:28 -07:00
parent ebda41a737
commit 5ef8a23839
5 changed files with 55 additions and 38 deletions

View File

@@ -334,7 +334,7 @@ class NativeCFFI {
@:cffi private static function lime_window_set_maximized (handle:Dynamic, maximized:Bool):Bool; @:cffi private static function lime_window_set_maximized (handle:Dynamic, maximized:Bool):Bool;
@:cffi private static function lime_window_set_minimized (handle:Dynamic, minimized:Bool):Bool; @:cffi private static function lime_window_set_minimized (handle:Dynamic, minimized:Bool):Bool;
@:cffi private static function lime_window_set_resizable (handle:Dynamic, resizable:Bool):Bool; @:cffi private static function lime_window_set_resizable (handle:Dynamic, resizable:Bool):Bool;
@:cffi private static function lime_window_set_title (handle:Dynamic, title:String):Dynamic; @:hlNative("lime", "lime_window_set_title") private static function lime_window_set_title (handle:CFFIPointer, title:String):String { return null; }
@:hlNative("lime", "lime_window_event_manager_register") private static function lime_window_event_manager_register (callback:Void->Void, eventObject:WindowEventInfo):Void {} @:hlNative("lime", "lime_window_event_manager_register") private static function lime_window_event_manager_register (callback:Void->Void, eventObject:WindowEventInfo):Void {}
@:cffi private static function lime_zlib_compress (data:Dynamic, bytes:Dynamic):Dynamic; @:cffi private static function lime_zlib_compress (data:Dynamic, bytes:Dynamic):Dynamic;
@:cffi private static function lime_zlib_decompress (data:Dynamic, bytes:Dynamic):Dynamic; @:cffi private static function lime_zlib_decompress (data:Dynamic, bytes:Dynamic):Dynamic;

View File

@@ -60,7 +60,7 @@ class CFFI {
*/ */
public static function load (library:String, method:String, args:Int = 0, lazy:Bool = false):Dynamic { public static function load (library:String, method:String, args:Int = 0, lazy:Bool = false):Dynamic {
#if (disable_cffi || macro) #if (disable_cffi || macro || hl)
var enabled = false; var enabled = false;
#end #end
@@ -200,7 +200,7 @@ class CFFI {
public static macro function loadPrime (library:String, method:String, signature:String, lazy:Bool = false):Dynamic { public static macro function loadPrime (library:String, method:String, signature:String, lazy:Bool = false):Dynamic {
#if (!display && !macro) #if (!display && !macro && cpp)
return cpp.Prime.load (library, method, signature, lazy); return cpp.Prime.load (library, method, signature, lazy);
#else #else
var args = signature.length - 1; var args = signature.length - 1;

View File

@@ -69,8 +69,9 @@ namespace lime {
} }
void hl_gc_application (Application* application) { void hl_gc_application (HL_CFFIPointer* handle) {
Application* application = (Application*)handle->ptr;
delete application; delete application;
} }
@@ -86,9 +87,10 @@ namespace lime {
} }
void hl_gc_file_watcher (FileWatcher* watcher) { void hl_gc_file_watcher (HL_CFFIPointer* handle) {
#ifdef LIME_EFSW #ifdef LIME_EFSW
FileWatcher* watcher = (FileWatcher*)handle->ptr;
delete watcher; delete watcher;
#endif #endif
@@ -105,9 +107,10 @@ namespace lime {
} }
void hl_gc_font (Font* font) { void hl_gc_font (HL_CFFIPointer* handle) {
#ifdef LIME_FREETYPE #ifdef LIME_FREETYPE
Font* font = (Font*)handle->ptr;
delete font; delete font;
#endif #endif
@@ -122,8 +125,9 @@ namespace lime {
} }
void hl_gc_renderer (Renderer* renderer) { void hl_gc_renderer (HL_CFFIPointer* handle) {
Renderer* renderer = (Renderer*)handle->ptr;
delete renderer; delete renderer;
} }
@@ -139,9 +143,10 @@ namespace lime {
} }
void hl_gc_text_layout (TextLayout* text) { void hl_gc_text_layout (HL_CFFIPointer* handle) {
#ifdef LIME_HARFBUZZ #ifdef LIME_HARFBUZZ
TextLayout* text = (TextLayout*)handle->ptr;
delete text; delete text;
#endif #endif
@@ -156,8 +161,9 @@ namespace lime {
} }
void hl_gc_window (Window* window) { void hl_gc_window (HL_CFFIPointer* handle) {
Window* window = (Window*)handle->ptr;
delete window; delete window;
} }
@@ -3537,7 +3543,7 @@ namespace lime {
HL_PRIM HL_CFFIPointer* hl_lime_window_create (HL_CFFIPointer* application, int width, int height, int flags, HL_String* title) { HL_PRIM HL_CFFIPointer* hl_lime_window_create (HL_CFFIPointer* application, int width, int height, int flags, HL_String* title) {
Window* window = CreateWindow ((Application*)application->ptr, width, height, flags, (const char*)title->bytes); Window* window = CreateWindow ((Application*)application->ptr, width, height, flags, (const char*)hl_to_utf8 ((const uchar*)title->bytes));
return HLCFFIPointer (window, (hl_finalizer)hl_gc_window); return HLCFFIPointer (window, (hl_finalizer)hl_gc_window);
} }
@@ -3903,10 +3909,10 @@ namespace lime {
} }
HL_PRIM vbyte* hl_lime_window_set_title (HL_CFFIPointer* window, vbyte* title) { HL_PRIM HL_String* hl_lime_window_set_title (HL_CFFIPointer* window, HL_String* title) {
Window* targetWindow = (Window*)window->ptr; Window* targetWindow = (Window*)window->ptr;
const char* result = targetWindow->SetTitle ((char*)title); const char* result = targetWindow->SetTitle ((char*)hl_to_utf8 ((const uchar*)title->bytes));
if (result) { if (result) {
@@ -3919,7 +3925,8 @@ namespace lime {
// } // }
// return _result; // return _result;
return (vbyte*)result; //return (vbyte*)result;
return title;
} else { } else {
@@ -4323,7 +4330,7 @@ namespace lime {
// DEFINE_PRIME2 (lime_window_set_maximized); // DEFINE_PRIME2 (lime_window_set_maximized);
// DEFINE_PRIME2 (lime_window_set_minimized); // DEFINE_PRIME2 (lime_window_set_minimized);
// DEFINE_PRIME2 (lime_window_set_resizable); // DEFINE_PRIME2 (lime_window_set_resizable);
// DEFINE_PRIME2 (lime_window_set_title); DEFINE_HL_PRIM (_STRING, lime_window_set_title, _TCFFIPOINTER _STRING);
// DEFINE_PRIME2 (lime_zlib_compress); // DEFINE_PRIME2 (lime_zlib_compress);
// DEFINE_PRIME2 (lime_zlib_decompress); // DEFINE_PRIME2 (lime_zlib_decompress);

View File

@@ -191,6 +191,7 @@ namespace lime {
} }
void* SDLRenderer::Lock (bool useCFFIValue) { void* SDLRenderer::Lock (bool useCFFIValue) {
if (sdlRenderer) { if (sdlRenderer) {
@@ -232,14 +233,19 @@ namespace lime {
} else { } else {
const int id_width = hl_hash_utf8 ("width");
const int id_height = hl_hash_utf8 ("height");
const int id_pixels = hl_hash_utf8 ("pixels");
const int id_pitch = hl_hash_utf8 ("pitch");
vdynamic* result = (vdynamic*)hl_alloc_dynobj (); vdynamic* result = (vdynamic*)hl_alloc_dynobj ();
if (SDL_LockTexture (sdlTexture, NULL, &pixels, &pitch) == 0) { if (SDL_LockTexture (sdlTexture, NULL, &pixels, &pitch) == 0) {
hl_dyn_seti (result, hl_hash_utf8 ("width"), &hlt_i32, width); hl_dyn_seti (result, id_width, &hlt_i32, width);
hl_dyn_seti (result, hl_hash_utf8 ("height"), &hlt_i32, height); hl_dyn_seti (result, id_height, &hlt_i32, height);
hl_dyn_setd (result, hl_hash_utf8 ("pixels"), (uintptr_t)pixels); hl_dyn_setd (result, id_pixels, (uintptr_t)pixels);
hl_dyn_seti (result, hl_hash_utf8 ("pitch"), &hlt_i32, pitch); hl_dyn_seti (result, id_pitch, &hlt_i32, pitch);
} }

View File

@@ -20,7 +20,7 @@ namespace lime {
static int id_y; static int id_y;
static bool init = false; static bool init = false;
cairo_user_data_key_t userData; cairo_user_data_key_t userData;
std::map<void*, value> cairoObjects; std::map<void*, void*> cairoObjects;
Mutex cairoObjects_Mutex; Mutex cairoObjects_Mutex;
@@ -39,11 +39,13 @@ namespace lime {
} }
void hl_gc_cairo (cairo_t* cairo) { void hl_gc_cairo (HL_CFFIPointer* handle) {
// cairoObjects_Mutex.Lock (); cairo_t* cairo = (cairo_t*)handle->ptr;
// cairoObjects.erase (cairo);
// cairoObjects_Mutex.Unlock (); cairoObjects_Mutex.Lock ();
cairoObjects.erase (cairo);
cairoObjects_Mutex.Unlock ();
cairo_destroy (cairo); cairo_destroy (cairo);
} }
@@ -106,11 +108,13 @@ namespace lime {
} }
void hl_gc_cairo_surface (cairo_surface_t* surface) { void hl_gc_cairo_surface (HL_CFFIPointer* handle) {
// cairoObjects_Mutex.Lock (); cairo_surface_t* surface = (cairo_surface_t*)handle->ptr;
// cairoObjects.erase (surface);
// cairoObjects_Mutex.Unlock (); cairoObjects_Mutex.Lock ();
cairoObjects.erase (surface);
cairoObjects_Mutex.Unlock ();
cairo_surface_destroy (surface); cairo_surface_destroy (surface);
} }
@@ -191,9 +195,9 @@ namespace lime {
cairo_t* cairo = cairo_create ((cairo_surface_t*)surface->ptr); cairo_t* cairo = cairo_create ((cairo_surface_t*)surface->ptr);
HL_CFFIPointer* object = HLCFFIPointer (cairo, (hl_finalizer)hl_gc_cairo); HL_CFFIPointer* object = HLCFFIPointer (cairo, (hl_finalizer)hl_gc_cairo);
// cairoObjects_Mutex.Lock (); cairoObjects_Mutex.Lock ();
// cairoObjects[cairo] = object; cairoObjects[cairo] = object;
// cairoObjects_Mutex.Unlock (); cairoObjects_Mutex.Unlock ();
return object; return object;
} }
@@ -379,7 +383,7 @@ namespace lime {
if (cairoObjects.find (face) != cairoObjects.end ()) { if (cairoObjects.find (face) != cairoObjects.end ()) {
return cairoObjects[face]; return (value)cairoObjects[face];
} else { } else {
@@ -411,7 +415,7 @@ namespace lime {
if (cairoObjects.find (surface) != cairoObjects.end ()) { if (cairoObjects.find (surface) != cairoObjects.end ()) {
return cairoObjects[surface]; return (value)cairoObjects[surface];
} else { } else {
@@ -479,7 +483,7 @@ namespace lime {
if (cairoObjects.find (pattern) != cairoObjects.end ()) { if (cairoObjects.find (pattern) != cairoObjects.end ()) {
return cairoObjects[pattern]; return (value)cairoObjects[pattern];
} else { } else {
@@ -502,7 +506,7 @@ namespace lime {
if (cairoObjects.find (surface) != cairoObjects.end ()) { if (cairoObjects.find (surface) != cairoObjects.end ()) {
return cairoObjects[surface]; return (value)cairoObjects[surface];
} else { } else {
@@ -571,9 +575,9 @@ namespace lime {
cairo_surface_t* surface = cairo_image_surface_create_for_data ((unsigned char*)(uintptr_t)data, (cairo_format_t)format, width, height, stride); cairo_surface_t* surface = cairo_image_surface_create_for_data ((unsigned char*)(uintptr_t)data, (cairo_format_t)format, width, height, stride);
HL_CFFIPointer* object = HLCFFIPointer (surface, (hl_finalizer)hl_gc_cairo_surface); HL_CFFIPointer* object = HLCFFIPointer (surface, (hl_finalizer)hl_gc_cairo_surface);
// cairoObjects_Mutex.Lock (); cairoObjects_Mutex.Lock ();
// cairoObjects[surface] = object; cairoObjects[surface] = object;
// cairoObjects_Mutex.Unlock (); cairoObjects_Mutex.Unlock ();
return object; return object;
} }
@@ -835,7 +839,7 @@ namespace lime {
if (cairoObjects.find (pattern) != cairoObjects.end ()) { if (cairoObjects.find (pattern) != cairoObjects.end ()) {
return cairoObjects[pattern]; return (value)cairoObjects[pattern];
} else { } else {