parent
3e2176a824
commit
f50bc6cf33
@ -0,0 +1,85 @@
|
|||||||
|
#include <locale.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "Test.h"
|
||||||
|
#include "objc/hooks.h"
|
||||||
|
#include "objc/capabilities.h"
|
||||||
|
|
||||||
|
|
||||||
|
int count;
|
||||||
|
static const int loops = 50000;
|
||||||
|
static const int depth = 42;
|
||||||
|
static const int calls = loops * (depth+1);
|
||||||
|
static int d = depth;
|
||||||
|
Class TestCls;
|
||||||
|
int tracecount;
|
||||||
|
|
||||||
|
@implementation Test (Nothing)
|
||||||
|
+ nothing
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
if (d > 0)
|
||||||
|
{
|
||||||
|
d--;
|
||||||
|
[self nothing];
|
||||||
|
d++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
__thread IMP real;
|
||||||
|
|
||||||
|
static int interposecount;
|
||||||
|
id interpose(id self, SEL _cmd) {
|
||||||
|
interposecount++;
|
||||||
|
return real(self, _cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
//IMP hook(id object, SEL selector, IMP method, int isReturn, void *wordReturn) { tracecount++; return (IMP)logExit; }
|
||||||
|
IMP hook(id object, SEL selector, IMP method, int isReturn, void *wordReturn) { tracecount++; real = method; return (IMP)0; }
|
||||||
|
IMP hook0(id object, SEL selector, IMP method, int isReturn, void *wordReturn) { tracecount++; real = method; return (IMP)1; }
|
||||||
|
IMP hook1(id object, SEL selector, IMP method, int isReturn, void *wordReturn) { tracecount++; real = method; return (IMP)interpose; }
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
if (!objc_test_capability(OBJC_CAP_TRACING))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Tracing support not compiled into runtime\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
TestCls = objc_getClass("Test");
|
||||||
|
objc_registerTracingHook(@selector(nothing), hook);
|
||||||
|
interposecount = 0;
|
||||||
|
count = 0;
|
||||||
|
tracecount = 0;
|
||||||
|
for (int i=0 ; i<loops ; i++)
|
||||||
|
{
|
||||||
|
[TestCls nothing];
|
||||||
|
}
|
||||||
|
assert(count == calls);
|
||||||
|
assert(tracecount == calls);
|
||||||
|
assert(interposecount == 0);
|
||||||
|
objc_registerTracingHook(@selector(nothing), hook0);
|
||||||
|
interposecount = 0;
|
||||||
|
count = 0;
|
||||||
|
tracecount = 0;
|
||||||
|
for (int i=0 ; i<loops ; i++)
|
||||||
|
{
|
||||||
|
[TestCls nothing];
|
||||||
|
}
|
||||||
|
assert(count == calls);
|
||||||
|
assert(tracecount == calls * 2);
|
||||||
|
assert(interposecount == 0);
|
||||||
|
objc_registerTracingHook(@selector(nothing), hook1);
|
||||||
|
interposecount = 0;
|
||||||
|
count = 0;
|
||||||
|
tracecount = 0;
|
||||||
|
for (int i=0 ; i<loops ; i++)
|
||||||
|
{
|
||||||
|
[TestCls nothing];
|
||||||
|
}
|
||||||
|
assert(count == calls);
|
||||||
|
assert(tracecount == calls);
|
||||||
|
assert(interposecount == calls);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@ -1,3 +1,4 @@
|
|||||||
#include "objc/runtime.h"
|
#include "objc/runtime.h"
|
||||||
#define OBJC_HOOK
|
#define OBJC_HOOK
|
||||||
#include "objc/hooks.h"
|
#include "objc/hooks.h"
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue