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; }