Skip to content

Commit

Permalink
6.0.3rc3 (#985)
Browse files Browse the repository at this point in the history
Fix bugs in rc2
  • Loading branch information
tmolitor-stud-tu authored Dec 28, 2023
2 parents 5390fd3 + 5e9e15e commit beda3fe
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 3 deletions.
4 changes: 2 additions & 2 deletions Monal/Classes/MLHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ MLHandler* h = $newHandlerWithInvalidation(ClassName, myHandlerName, myInvalidat
//declare handler, the order of provided arguments does not matter because we use named arguments
#define $$class_handler(name, ...) +(void) MLHandler_##name##_withArguments:(NSDictionary*) _callerArgs andBoundArguments:(NSDictionary*) _boundArgs { metamacro_if_eq(0, metamacro_argcount(__VA_ARGS__))( )( metamacro_foreach(_expand_import, ;, __VA_ARGS__) );
#define $$instance_handler(name, instance, ...) +(void) MLHandler_##name##_withArguments:(NSDictionary*) _callerArgs andBoundArguments:(NSDictionary*) _boundArgs { metamacro_if_eq(0, metamacro_argcount(__VA_ARGS__))( )( metamacro_foreach(_expand_import, ;, __VA_ARGS__) ); [instance MLInstanceHandler_##name##_withArguments:_callerArgs andBoundArguments:_boundArgs]; } -(void) MLInstanceHandler_##name##_withArguments:(NSDictionary*) _callerArgs andBoundArguments:(NSDictionary*) _boundArgs { metamacro_if_eq(0, metamacro_argcount(__VA_ARGS__))( )( metamacro_foreach(_expand_import, ;, __VA_ARGS__) );
#define $_ID(type, var) (STRIP_PARENTHESES(type) var __unused = _callerArgs[@#var] ? _callerArgs[@#var] : _boundArgs[@#var]; if(var != nil && ![var isKindOfClass:NSClassFromString(type_to_classname(@metamacro_foreach(_foreach_stringify, ",", STRIP_PARENTHESES(type))))]) [MLHandler throwDynamicExceptionForType:@"!"#type andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__];)
#define $$ID(type, var) (STRIP_PARENTHESES(type) var __unused = _callerArgs[@#var] ? _callerArgs[@#var] : _boundArgs[@#var]; if(var == nil) [MLHandler throwDynamicExceptionForType:@"$$"#type andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__]; if(![var isKindOfClass:NSClassFromString(type_to_classname(@metamacro_foreach(_foreach_stringify, ",", STRIP_PARENTHESES(type))))]) [MLHandler throwDynamicExceptionForType:@"!"#type andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__];)
#define $_ID(type, var) (STRIP_PARENTHESES(type) var __unused = _callerArgs[@#var] ? _callerArgs[@#var] : _boundArgs[@#var]; if(var != nil && NSClassFromString(type_to_classname(@metamacro_foreach(_foreach_stringify, ",", STRIP_PARENTHESES(type)))) != nil && ![var isKindOfClass:NSClassFromString(type_to_classname(@metamacro_foreach(_foreach_stringify, ",", STRIP_PARENTHESES(type))))]) [MLHandler throwDynamicExceptionForType:@"!"#type andVar:@#var andUserData:(@{@"actualType": NSStringFromClass([var class]), @"expectedType": @#type, @"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__];)
#define $$ID(type, var) (STRIP_PARENTHESES(type) var __unused = _callerArgs[@#var] ? _callerArgs[@#var] : _boundArgs[@#var]; if(var == nil) [MLHandler throwDynamicExceptionForType:@"$$"#type andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__]; else if(NSClassFromString(type_to_classname(@metamacro_foreach(_foreach_stringify, ",", STRIP_PARENTHESES(type)))) != nil && ![var isKindOfClass:NSClassFromString(type_to_classname(@metamacro_foreach(_foreach_stringify, ",", STRIP_PARENTHESES(type))))]) [MLHandler throwDynamicExceptionForType:@"!"#type andVar:@#var andUserData:(@{@"actualType": NSStringFromClass([var class]), @"expectedType": @#type, @"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__];)
#define $_HANDLER(var) (MLHandler* var __unused = _callerArgs[@#var] ? _callerArgs[@#var] : _boundArgs[@#var]; if(var != nil &&![var isKindOfClass:[MLHandler class]]) [MLHandler throwDynamicExceptionForType:@"!MLHandler" andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__])
#define $$HANDLER(var) (MLHandler* var __unused = _callerArgs[@#var] ? _callerArgs[@#var] : _boundArgs[@#var]; if(var == nil) [MLHandler throwDynamicExceptionForType:@"$$MLHandler" andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__]; if(![var isKindOfClass:[MLHandler class]]) [MLHandler throwDynamicExceptionForType:@"!MLHandler" andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__])
#define $$BOOL(var) (if(_callerArgs[@#var]==nil && _boundArgs[@#var]==nil) [MLHandler throwDynamicExceptionForType:@"$$BOOL" andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__]; if(![(_callerArgs[@#var] ? _callerArgs[@#var] : _boundArgs[@#var]) isKindOfClass:[NSNumber class]]) [MLHandler throwDynamicExceptionForType:@"!NSNumber(BOOL)" andVar:@#var andUserData:(@{@"_boundArgs": _boundArgs, @"_callerArgs": _callerArgs}) andFile:(char*)__FILE__ andLine:__LINE__ andFunc:(char*)__func__]; BOOL var __unused = _callerArgs[@#var] ? [_callerArgs[@#var] boolValue] : [_boundArgs[@#var] boolValue])
Expand Down
23 changes: 23 additions & 0 deletions Monal/Classes/MonalAppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,28 @@ -(void) runSDPTests
a=max-message-size:262144\n" withInitiator:YES]);
}

$$class_handler(handlerTest01, $$ID(NSObject*, dummyObj))
DDLogError(@"HandlerTest01 completed");
$$

$$class_handler(handlerTest02, $$ID(monal_void_block_t, dummyCallback))
DDLogError(@"HandlerTest02 completed");
$$

-(void) runHandlerTests
{
DDLogError(@"NSClassFromString: '%@'", NSClassFromString(@"monal_void_block_t"));

if([^{} isKindOfClass:[NSObject class]])
DDLogError(@"isKindOfClass");

MLHandler* handler01 = $newHandler([self class], handlerTest01);
$call(handler01, $ID(dummyObj, [NSString new]));

MLHandler* handler02 = $newHandler([self class], handlerTest02);
$call(handler02, $ID(dummyCallback, ^{}));
}

-(id) init
{
//someone (suspect: AppKit) resets our exception handler between the call to [MonalAppDelegate initialize] and [MonalAppDelegate init]
Expand All @@ -302,6 +324,7 @@ -(id) init
//[self runParserTests];
//[self runSDPTests];
//[HelperTools flushLogsWithTimeout:0.250];
//[self runHandlerTests];
return self;
}

Expand Down
6 changes: 5 additions & 1 deletion Monal/Classes/xmpp.m
Original file line number Diff line number Diff line change
Expand Up @@ -5000,6 +5000,7 @@ -(void) updateIqHandlerTimeouts
BOOL stateUpdated = NO;
@synchronized(_iqHandlers) {
//we are NOT mutating on iteration here, because we use dispatchAsyncOnReceiveQueue to handle timeouts
NSMutableArray* idsToRemove = [NSMutableArray new];
for(NSString* iqid in _iqHandlers)
{
//decrement handler timeout every second and check if it landed below zero --> trigger a fake iq error to handle timeout
Expand Down Expand Up @@ -5029,7 +5030,7 @@ -(void) updateIqHandlerTimeouts
//make sure our fake error iq is handled inside the receiveQueue
//extract this from _iqHandlers to make sure we only handle iqs that didn't get handled in the meantime
NSMutableDictionary* iqHandler = self->_iqHandlers[iqid];
[self->_iqHandlers removeObjectForKey:iqid];
[idsToRemove addObject:iqid];
if(iqHandler)
{
[self dispatchAsyncOnReceiveQueue:^{
Expand All @@ -5044,6 +5045,9 @@ -(void) updateIqHandlerTimeouts
DDLogWarn(@"iq handler for '%@' vanished while switching to receive queue", iqid);
}
}
//now delete iqs marked for deletion
for(NSString* iqid in idsToRemove)
[_iqHandlers removeObjectForKey:iqid];
}

//make sure all state is persisted as soon as possible (we could have called handlers and we don't want to execute them twice!)
Expand Down

0 comments on commit beda3fe

Please sign in to comment.