Cleaned out complain()s in the OS X backend. Affects everything *except* drawtext.m, which will need its own migration.

This commit is contained in:
Pietro Gagliardi 2016-05-13 20:14:46 -04:00
parent 1fede348ef
commit d52c92d2f8
13 changed files with 82 additions and 46 deletions

View File

@ -12,10 +12,12 @@ extern void *uiAlloc(size_t, const char *);
extern void *uiRealloc(void *, size_t, const char *);
extern void uiFree(void *);
#define _ns2(s) #s
#define _ns(s) _ns2(s)
extern void _implbug(const char *file, const char *line, const char *func, const char *format, ...);
#define implbug(...) _implbug(__FILE__, #__LINE__, __func__, __VA_ARGS__)
#define implbug(...) _implbug(__FILE__, _ns(__LINE__), __func__, __VA_ARGS__)
extern void _userbug(const char *file, const char *line, const char *func, const char *format, ...);
#define userbug(...) _implbug(__FILE__, #__LINE__, __func__, __VA_ARGS__)
#define userbug(...) _implbug(__FILE__, _ns(__LINE__), __func__, __VA_ARGS__)
// control.c
extern uiControl *newControl(size_t size, uint32_t OSsig, uint32_t typesig, const char *typenamestr);

View File

@ -13,6 +13,7 @@ MFILES += \
darwin/datetimepicker.m \
darwin/draw.m \
darwin/drawtext.m \
darwin/debug.m \
darwin/entry.m \
darwin/fontbutton.m \
darwin/group.m \

View File

@ -22,7 +22,9 @@ void initAlloc(void)
void uninitAlloc(void)
{
NSMutableString *str;
NSUInteger i;
NSValue *v;
// delegates might have mapTables allocated
// TODO verify they are empty
@ -33,16 +35,14 @@ void uninitAlloc(void)
[allocations release];
return;
}
fprintf(stderr, "[libui] leaked allocations:\n");
[allocations enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) {
NSValue *v;
str = [NSMutableString new];
for (v in allocations) {
void *ptr;
v = (NSValue *) obj;
ptr = [v pointerValue];
fprintf(stderr, "[libui] %p %s\n", ptr, *TYPE(ptr));
}];
complain("either you left something around or there's a bug in libui");
[str appendString:[NSString stringWithFormat:@"%p %s\n", ptr, *TYPE(ptr)]];
}
userbug("Some data was leaked; either you left a uiControl lying around or there's a bug in libui itself. Leaked data:\n%s", [str UTF8String]);
}
void *uiAlloc(size_t size, const char *type)
@ -86,7 +86,7 @@ void *uiRealloc(void *p, size_t new, const char *type)
void uiFree(void *p)
{
if (p == NULL)
complain("attempt to uiFree(NULL); there's a bug somewhere");
implbug("attempt to uiFree(NULL)");
p = BASE(p);
free(p);
[allocations removeObject:[NSValue valueWithPointer:p]];

View File

@ -335,7 +335,7 @@ int sendAreaEvents(NSEvent *e)
void uiAreaSetSize(uiArea *a, intmax_t width, intmax_t height)
{
if (!a->scrolling)
complain("attempt to call uiAreaSetSize() on a non-scrolling uiArea");
userbug("You cannot call uiAreaSetSize() on a non-scrolling uiArea. (uiArea: %p)", a);
[a->area setFrameSize:NSMakeSize(width, height)];
}
@ -347,7 +347,7 @@ void uiAreaQueueRedrawAll(uiArea *a)
void uiAreaScrollTo(uiArea *a, double x, double y, double width, double height)
{
if (!a->scrolling)
complain("attempt to call uiAreaScrollTo() on a non-scrolling uiArea");
userbug("You cannot call uiAreaScrollTo() on a non-scrolling uiArea. (uiArea: %p)", a);
[a->area scrollRectToVisible:NSMakeRect(x, y, width, height)];
// don't worry about the return value; it just says whether scrolling was needed
}

37
darwin/debug.m Normal file
View File

@ -0,0 +1,37 @@
// 13 may 2016
#import "uipriv_darwin.h"
// TODO don't halt on release builds
static void bug(const char *file, const char *line, const char *func, const char *prefix, const char *format, va_list ap)
{
NSMutableString *str;
NSString *formatted;
str = [NSMutableString new];
[str appendString:[NSString stringWithFormat:@"[libui] %s:%s:%s %s", file, line, func, prefix]];
formatted = [[NSString alloc] initWithFormat:[NSString stringWithUTF8String:format] arguments:ap];
[str appendString:formatted];
[formatted release];
NSLog(@"%@", str);
[str release];
__builtin_trap();
}
void _implbug(const char *file, const char *line, const char *func, const char *format, ...)
{
va_list ap;
va_start(ap, format);
bug(file, line, func, "POSSIBLE IMPLEMENTATION BUG; CONTACT ANDLABS:\n", format, ap);
va_end(ap);
}
void _userbug(const char *file, const char *line, const char *func, const char *format, ...)
{
va_list ap;
va_start(ap, format);
bug(file, line, func, "You have a bug: ", format, ap);
va_end(ap);
}

View File

@ -26,7 +26,7 @@ void uiDrawFreePath(uiDrawPath *p)
void uiDrawPathNewFigure(uiDrawPath *p, double x, double y)
{
if (p->ended)
complain("attempt to add figure to ended path in uiDrawPathNewFigure()");
userbug("You cannot call uiDrawPathNewFigure() on a uiDrawPath that has already been ended. (path; %p)", p);
CGPathMoveToPoint(p->path, NULL, x, y);
}
@ -36,7 +36,7 @@ void uiDrawPathNewFigureWithArc(uiDrawPath *p, double xCenter, double yCenter, d
double startx, starty;
if (p->ended)
complain("attempt to add figure to ended path in uiDrawPathNewFigureWithArc()");
userbug("You cannot call uiDrawPathNewFigureWithArc() on a uiDrawPath that has already been ended. (path; %p)", p);
sinStart = sin(startAngle);
cosStart = cos(startAngle);
startx = xCenter + radius * cosStart;
@ -47,8 +47,9 @@ void uiDrawPathNewFigureWithArc(uiDrawPath *p, double xCenter, double yCenter, d
void uiDrawPathLineTo(uiDrawPath *p, double x, double y)
{
// TODO refine this to require being in a path
if (p->ended)
complain("attempt to add line to ended path in uiDrawPathLineTo()");
implbug("attempt to add line to ended path in uiDrawPathLineTo()");
CGPathAddLineToPoint(p->path, NULL, x, y);
}
@ -56,8 +57,9 @@ void uiDrawPathArcTo(uiDrawPath *p, double xCenter, double yCenter, double radiu
{
bool cw;
// TODO likewise
if (p->ended)
complain("attempt to add arc to ended path in uiDrawPathArcTo()");
implbug("attempt to add arc to ended path in uiDrawPathArcTo()");
if (sweep > 2 * M_PI)
sweep = 2 * M_PI;
cw = false;
@ -72,8 +74,9 @@ void uiDrawPathArcTo(uiDrawPath *p, double xCenter, double yCenter, double radiu
void uiDrawPathBezierTo(uiDrawPath *p, double c1x, double c1y, double c2x, double c2y, double endX, double endY)
{
// TODO likewise
if (p->ended)
complain("attempt to add bezier to ended path in uiDrawPathBezierTo()");
implbug("attempt to add bezier to ended path in uiDrawPathBezierTo()");
CGPathAddCurveToPoint(p->path, NULL,
c1x, c1y,
c2x, c2y,
@ -82,15 +85,16 @@ void uiDrawPathBezierTo(uiDrawPath *p, double c1x, double c1y, double c2x, doubl
void uiDrawPathCloseFigure(uiDrawPath *p)
{
// TODO likewise
if (p->ended)
complain("attempt to close figure of ended path in uiDrawPathCloseFigure()");
implbug("attempt to close figure of ended path in uiDrawPathCloseFigure()");
CGPathCloseSubpath(p->path);
}
void uiDrawPathAddRectangle(uiDrawPath *p, double x, double y, double width, double height)
{
if (p->ended)
complain("attempt to add rectangle to ended path in uiDrawPathAddRectangle()");
userbug("You cannot call uiDrawPathAddRectangle() on a uiDrawPath that has already been ended. (path; %p)", p);
CGPathAddRect(p->path, NULL, CGRectMake(x, y, width, height));
}
@ -132,7 +136,7 @@ void uiDrawStroke(uiDrawContext *c, uiDrawPath *path, uiDrawBrush *b, uiDrawStro
uiDrawPath p2;
if (!path->ended)
complain("path not ended in uiDrawStroke()");
userbug("You cannot call uiDrawStroke() on a uiDrawPath that has not been ended. (path: %p)", path);
switch (p->Cap) {
case uiDrawLineCapFlat:
@ -275,7 +279,7 @@ static void fillGradient(CGContextRef ctxt, uiDrawPath *p, uiDrawBrush *b)
void uiDrawFill(uiDrawContext *c, uiDrawPath *path, uiDrawBrush *b)
{
if (!path->ended)
complain("path not ended in uiDrawFill()");
userbug("You cannot call uiDrawStroke() on a uiDrawPath that has not been ended. (path: %p)", path);
CGContextAddPath(c->c, (CGPathRef) (path->path));
switch (b->Type) {
case uiDrawBrushTypeSolid:
@ -289,7 +293,7 @@ void uiDrawFill(uiDrawContext *c, uiDrawPath *path, uiDrawBrush *b)
// TODO
return;
}
complain("unknown brush type %d in uiDrawFill()", b->Type);
userbug("Unknown brush type %d passed to uiDrawFill().", b->Type);
}
static void m2c(uiDrawMatrix *m, CGAffineTransform *c)
@ -421,7 +425,7 @@ void uiDrawTransform(uiDrawContext *c, uiDrawMatrix *m)
void uiDrawClip(uiDrawContext *c, uiDrawPath *path)
{
if (!path->ended)
complain("path not ended in uiDrawClip()");
userbug("You cannot call uiDrawCilp() on a uiDrawPath that has not been ended. (path: %p)", path);
CGContextAddPath(c->c, (CGPathRef) (path->path));
switch (path->fillMode) {
case uiDrawFillModeWinding:

View File

@ -1,6 +1,9 @@
// 6 september 2015
#import "uipriv_darwin.h"
// TODO
#define complain(...) implbug(__VA_ARGS__)
// TODO for all relevant routines, make sure we are freeing memory correctly
// TODO make sure allocation failures throw exceptions?
struct uiDrawFontFamilies {
@ -15,7 +18,7 @@ uiDrawFontFamilies *uiDrawListFontFamilies(void)
// TODO is there a way to get an error reason?
ff->fonts = CTFontManagerCopyAvailableFontFamilyNames();
if (ff->fonts == NULL)
complain("error getting available font names (no reason specified)");
implbug("error getting available font names (no reason specified) (TODO)");
return ff;
}

View File

@ -48,7 +48,7 @@ static BOOL canQuit = NO;
NSEvent *e;
if (!canQuit)
complain("call to [NSApp terminate:] when not ready to terminate");
implbug("call to [NSApp terminate:] when not ready to terminate; definitely contact andlabs");
[realNSApp() stop:realNSApp()];
// stop: won't register until another event has passed; let's synthesize one

View File

@ -22,7 +22,7 @@ struct mapTable *newMap(void)
void mapDestroy(struct mapTable *m)
{
if ([m->m count] != 0)
complain("attempt to destroy map with items inside; did you forget to deallocate something?");
implbug("attempt to destroy map with items inside");
[m->m release];
uiFree(m);
}

View File

@ -69,17 +69,17 @@ enum {
switch (smi->type) {
case typeQuit:
if (self->hasQuit)
complain("attempt to add multiple Quit menu items");
userbug("You can't have multiple Quit menu items in one program.");
self->hasQuit = YES;
break;
case typePreferences:
if (self->hasPreferences)
complain("attempt to add multiple Preferences menu items");
userbug("You can't have multiple Preferences menu items in one program.");
self->hasPreferences = YES;
break;
case typeAbout:
if (self->hasAbout)
complain("attempt to add multiple About menu items");
userbug("You can't have multiple About menu items in one program.");
self->hasAbout = YES;
break;
}
@ -200,7 +200,7 @@ void uiMenuItemDisable(uiMenuItem *item)
void uiMenuItemOnClicked(uiMenuItem *item, void (*f)(uiMenuItem *, uiWindow *, void *), void *data)
{
if (item->type == typeQuit)
complain("attempt to call uiMenuItemOnClicked() on a Quit item; use uiOnShouldQuit() instead");
userbug("You can't call uiMenuItemOnClicked() on a Quit item; use uiOnShouldQuit() instead.");
item->onClicked = f;
item->onClickedData = data;
}
@ -225,7 +225,7 @@ static uiMenuItem *newItem(uiMenu *m, int type, const char *name)
uiMenuItem *item;
if (menusFinalized)
complain("attempt to create a new menu item after menus have been finalized");
userbug("You can't create a new menu item after menus have been finalized.");
item = uiNew(uiMenuItem);
@ -297,7 +297,7 @@ uiMenu *uiNewMenu(const char *name)
uiMenu *m;
if (menusFinalized)
complain("attempt to create a new menu after menus have been finalized");
userbug("You can't create a new menu after menus have been finalized.");
if (menus == nil)
menus = [NSMutableArray new];

View File

@ -11,7 +11,7 @@ uiDarwinControlAllDefaults(uiProgressBar, pi)
void uiProgressBarSetValue(uiProgressBar *p, int value)
{
if (value < 0 || value > 100)
complain("value %d out of range in progressbarSetValue()", value);
userbug("Value %d out of range for a uiProgressBar.", value);
// on 10.8 there's an animation when the progress bar increases, just like with Aero
if (value == 100) {
[p->pi setMaxValue:101];

View File

@ -183,8 +183,9 @@ uiSpinbox *uiNewSpinbox(intmax_t min, intmax_t max)
{
uiSpinbox *s;
// TODO implicitly swap instead?
if (min >= max)
complain("error: min >= max in uiNewSpinbox()");
userbug("min >= max is invalid for a uiSpinbox.");
uiDarwinNewControl(uiSpinbox, s);

View File

@ -13,15 +13,3 @@ void disableAutocorrect(NSTextView *tv)
[tv setAutomaticLinkDetectionEnabled:NO];
[tv setSmartInsertDeleteEnabled:NO];
}
void complain(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "[libui] ");
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
va_end(ap);
abort();
}