Esempio n. 1
0
void make_instance(lua_State* L, P p)
{
    std::pair<class_id, void*> dynamic = get_dynamic_class(L, get_pointer(p));

    class_rep* cls = get_pointee_class(L, p, dynamic.first);

    if (!cls)
    {
        throw std::runtime_error("Trying to use unregistered class");
    }

    object_rep* instance = push_new_instance(L, cls);

    typedef pointer_holder<P> holder_type;

    void* storage = instance->allocate(sizeof(holder_type));

    try
    {
        new (storage) holder_type(p, dynamic.first, dynamic.second);
    }
    catch (...)
    {
        instance->deallocate(storage);
        lua_pop(L, 1);
        throw;
    }

    instance->set_instance(static_cast<holder_type*>(storage));
}
class_rep* get_pointee_class(lua_State* L, P const& p, class_id dynamic_id)
{
    lua_pushliteral(L, "__luabind_class_map");
    lua_rawget(L, LUA_REGISTRYINDEX);

	
    //class_map const& classes = *static_cast<class_map*>(
        //lua_touserdata(L, -1));

	void *pclasses = lua_touserdata(L, -1);
	lua_pop(L, 1);
	if(!pclasses)
	{
		return 0;
	}

	class_map const& classes = *static_cast<class_map*>(pclasses);

    //lua_pop(L, 1);

    class_rep* cls = classes.get(dynamic_id);

    if (!cls)
        cls = get_pointee_class(classes, get_pointer(p));

    return cls;
}