Custom allocators support

Yuri Iozzelli edited this page Jul 25, 2017 · 3 revisions

One common issue when porting code to Cheerp is the lack of support for custom allocators that return void pointers.

Let's take this code for example:

void* myalloc(size_t s)
{
    return malloc(s);
}

Cheerp will emit a compile time error:

Cheerp: Legacy C memory allocation must be immediately casted to the actual type. Any other use of the return value is invalid

The problem is that allocations in cheerp are translated to the creation of a JS object with the right set of properties. This code:

class Foo {
    int var1;
    int var2;
};
...
Foo foo* = (Foo*)malloc(sizeof(Foo));

translates to the following JS code:

tmp0={i0:0, i1:0};

As you can see, the type information provided by the cast operator is needed to provide the right object layout. An equivalent (and better) solution is to use the C++ new operator whenever possible.

If for some reason you really need the custom allocator function, consider using a template:

template<class T>
T* myalloc(size_t size)
{
        return (T*)malloc(size);
}
...
Foo* foo = myalloc<Foo>(sizeof(Foo));
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.