]> git.saurik.com Git - apple/dyld.git/blobdiff - testing/test-cases/operator-new.dtest/main.cxx
dyld-625.13.tar.gz
[apple/dyld.git] / testing / test-cases / operator-new.dtest / main.cxx
index d985e8ffefe9d69ea0fe7b1c247724db17ce1584..1773a03486de1593476477bb9313f3e8f2ac8065 100644 (file)
 // will turn around and call operator new in this main exectuable
 //
 
-static void* ptr;
+static void* myLastNewAllocation;
+static void* myLastDelete;
 
+// Note: this is not weak.  That is specifically suppported
 void* operator new(size_t s) throw (std::bad_alloc)
 {
-  ptr = malloc(s);
-  return ptr;
+  myLastNewAllocation = malloc(s);
+  return myLastNewAllocation;
+}
+
+struct Foo {
+    int  bytes[10];
+};
+
+// Note: this is weak and because it is in main executable should override OS
+__attribute__((weak))
+void operator delete(void* p) throw()
+{
+    myLastDelete = p;
+    ::free(p);
 }
 
 int main()
 {
        printf("[BEGIN] operator-new\n");
 
+    // test that OS's operator new[] redirects to my operator new
+    myLastNewAllocation = NULL;
     char* stuff = new char[24];
-    if ( (void*)stuff == ptr )
-        printf("[PASS] operator-new\n");
-    else
-        printf("[FAIL] operator-new\n");
+    if ( (void*)stuff != myLastNewAllocation ) {
+        printf("[FAIL] operator-new system array allocator not redirected through my operator new\n");
+        return 0;
+    }
+
+    // test that program uses my operator new
+    myLastNewAllocation = NULL;
+    Foo* foo = new Foo();
+    if ( (void*)foo != myLastNewAllocation ) {
+        printf("[FAIL] operator-new allocation not redirected though my operator new\n");
+        return 0;
+    }
+
+    //
+    delete foo;
+    if ( (void*)foo != myLastDelete ) {
+        printf("[FAIL] operator-new deallocation not redirected though my operator delete\n");
+        return 0;
+    }
 
+    printf("[PASS] operator-new\n");
        return 0;
 }