I've been working on a PHP extension, binding RayLib. One issue I am
running into is that objects are being freed, which is triggering things I
don't want trigger until completely dereferenced.

So I have the following lines of PHP code:

$font = Font::fromCustom(__DIR__ . "/resources/KAISG.ttf", 96, 0, 0);
$font->texture->genMipmaps();

Font is a struct from RayLib that I am trying to mirror into a PHP class
with properties. Here is the RayLib C Struct:

typedef struct Font {
    int baseSize;           // Base size (default chars height)
    int charsCount;         // Number of characters
    Texture2D texture;      // Characters texture atlas
    Rectangle *recs;        // Characters rectangles in texture
    CharInfo *chars;        // Characters info data
} Font;

The issue is every time I call $font->texture and the result $texture
object is not store, then its deference and the Texture object free
function is called, which unloads the texture, even though the Font struct
is still needing it. This is my fault as every time $font->texture is
called, I create a brand new texture object:

static zval * php_raylib_font_texture(php_raylib_font_object *obj) /* {{{ */
{
    zval *texture = malloc(sizeof(zval));
    object_init_ex(texture, php_raylib_texture_ce);

    php_raylib_texture_object *result = Z_TEXTURE_OBJ_P(texture);
    result->texture = obj->font.texture;

    return texture;
}
/* }}} */

So after this line:
$font->texture->genMipmaps();

A Texture object is created, and right dereferenced thus calling my free
logic

void php_raylib_texture_free_storage(zend_object *object TSRMLS_DC)
{
    php_raylib_texture_object *intern =
php_raylib_texture_fetch_object(object);

    zend_object_std_dtor(&intern->std);

    UnloadTexture(intern->texture);
}

So I assume I need to start storing the texture object, on my Font object.
Currently, it's defined like this:

typedef struct _php_raylib_font_object {
    Font font;
    HashTable *prop_handler;
    zend_object std;
} php_raylib_font_object;

Am I to add another zend_object, zval or the struct def for Texture? I.E

typedef struct _php_raylib_font_object {
    Font font;
    HashTable *prop_handler;
    zend_object texture; // Do I use zend_object?
    zval texture; // Do I use zval?
    php_raylib_texture_object texture; //Do I use the struct defined for
texture?
    zend_object std;
} php_raylib_font_object;

For reference here is the Texture header:
https://github.com/joseph-montanez/raylib-php/blob/master/raylib-texture.h

Thanks,
Joseph Montanez

Reply via email to