ft_object_new( FT_Class clazz, FT_Pointer init_data ) { FT_Memory memory; FT_Object obj; FT_ASSERT_IS_CLASS(clazz); memory = FT_CLASS__MEMORY(clazz); obj = ft_mem_alloc( clazz->obj_size, memory ); obj->clazz = clazz; obj->ref_count = 1; if ( clazz->obj_init ) { FT_CleanupStack stack = FT_MEMORY__CLEANUP(memory); ft_cleanup_push( stack, obj, (FT_CleanupFunc) ft_object_cleanup, NULL ); clazz->obj_init( obj, init_data ); ft_cleanup_pop( stack, obj, 0 ); } return obj; }
ft_xhandler_exit( FT_XHandler xhandler ) { FT_CleanupStack stack = FT_MEMORY__CLEANUP(memory); stack->xhandler = xhandler->previous; xhandler->previous = NULL; xhandler->error = error; xhandler->cleanup = NULL; }
ft_xhandler_enter( FT_XHandler xhandler, FT_Memory memory ) { FT_CleanupStack stack = FT_MEMORY__CLEANUP(memory); xhandler->previous = stack->xhandler; xhandler->cleanup = stack->top; xhandler->error = 0; stack->xhandler = xhandler; }