From 8d8c9adcb32da060bf316c4def7fcd8475197d05 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 25 Jul 2014 16:29:19 -0400 Subject: [PATCH] clean up allocated memory properly when raising Ruby exceptions upon object creation --- src/GLProgram.cc | 9 +++++---- src/GLShader.cc | 10 ++++++---- src/Window.cc | 21 ++++++++++++--------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/GLProgram.cc b/src/GLProgram.cc index 328cb6e..53c498e 100644 --- a/src/GLProgram.cc +++ b/src/GLProgram.cc @@ -24,14 +24,15 @@ static void GLProgram_free(void * ptr) static VALUE GLProgram_new(int argc, VALUE * argv, VALUE klass) { - GLProgram * glprogram = new GLProgram(); - - glprogram->id = glCreateProgram(); - if (glprogram->id == 0u) + GLuint id = glCreateProgram(); + if (id == 0u) { rb_raise(rb_eRuntimeError, "Error allocating GL program object"); } + GLProgram * glprogram = new GLProgram(); + glprogram->id = id; + VALUE rv = Data_Wrap_Struct(klass, NULL, GLProgram_free, glprogram); rb_obj_call_init(rv, argc, argv); diff --git a/src/GLShader.cc b/src/GLShader.cc index 8b7371c..26e42d8 100644 --- a/src/GLShader.cc +++ b/src/GLShader.cc @@ -79,7 +79,6 @@ static void GLShader_free(void * ptr) static VALUE GLShader_new(VALUE klass, VALUE type, VALUE source) { - GLShader * glshader = new GLShader(); GLenum shader_type; if (type == ID2SYM(rb_intern("vertex"))) @@ -99,9 +98,12 @@ static VALUE GLShader_new(VALUE klass, VALUE type, VALUE source) type_cstr); } - glshader->id = create_shader(shader_type, - RSTRING_PTR(source), - RSTRING_LEN(source)); + GLuint id = create_shader(shader_type, + RSTRING_PTR(source), + RSTRING_LEN(source)); + + GLShader * glshader = new GLShader(); + glshader->id = id; return Data_Wrap_Struct(klass, NULL, GLShader_free, glshader); } diff --git a/src/Window.cc b/src/Window.cc index 2af842c..9900f95 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -72,19 +72,22 @@ static VALUE Window_new(VALUE klass) } Init_SDL(); - Window * window = new Window(); - window->sdl_window = SDL_CreateWindow("jes", - SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, - WIDTH, - HEIGHT, - SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); - if (window->sdl_window == NULL) + + SDL_Window * sdl_window = + SDL_CreateWindow("jes", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + WIDTH, + HEIGHT, + SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); + if (sdl_window == NULL) { - free(window); rb_raise(rb_eRuntimeError, "Failed to create SDL window"); } + Window * window = new Window(); + window->sdl_window = sdl_window; + (void)SDL_GL_CreateContext(window->sdl_window); Init_OpenGL();