summaryrefslogtreecommitdiffstats
path: root/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp')
-rw-r--r--toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp323
1 files changed, 323 insertions, 0 deletions
diff --git a/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp
new file mode 100644
index 000000000..79e21cc89
--- /dev/null
+++ b/toolkit/components/ctypes/tests/jsctypes-test-finalizer.cpp
@@ -0,0 +1,323 @@
+#include "errno.h"
+
+#include "jsctypes-test.h"
+#include "jsctypes-test-finalizer.h"
+
+/**
+ * Shared infrastructure
+ */
+
+
+/**
+ * An array of integers representing resources.
+ * - 0: unacquired
+ * - 1: acquired
+ * - < 0: error, resource has been released several times.
+ */
+int *gFinalizerTestResources = nullptr;
+char **gFinalizerTestNames = nullptr;
+size_t gFinalizerTestSize;
+
+void
+test_finalizer_start(size_t size)
+{
+ gFinalizerTestResources = new int[size];
+ gFinalizerTestNames = new char*[size];
+ gFinalizerTestSize = size;
+ for (size_t i = 0; i < size; ++i) {
+ gFinalizerTestResources[i] = 0;
+ gFinalizerTestNames[i] = nullptr;
+ }
+}
+
+void
+test_finalizer_stop()
+{
+ delete[] gFinalizerTestResources;
+}
+
+/**
+ * Check if an acquired resource has been released
+ */
+bool
+test_finalizer_resource_is_acquired(size_t i)
+{
+ return gFinalizerTestResources[i] == 1;
+}
+// Resource type: size_t
+
+// Acquire resource i
+size_t
+test_finalizer_acq_size_t(size_t i)
+{
+ gFinalizerTestResources[i] = 1;
+ return i;
+}
+
+// Release resource i
+void
+test_finalizer_rel_size_t(size_t i)
+{
+ if (--gFinalizerTestResources[i] < 0) {
+ MOZ_CRASH("Assertion failed");
+ }
+}
+
+size_t
+test_finalizer_rel_size_t_return_size_t(size_t i)
+{
+ if (-- gFinalizerTestResources[i] < 0) {
+ MOZ_CRASH("Assertion failed");
+ }
+ return i;
+}
+
+myRECT
+test_finalizer_rel_size_t_return_struct_t(size_t i)
+{
+ if (-- gFinalizerTestResources[i] < 0) {
+ MOZ_CRASH("Assertion failed");
+ }
+ const int32_t narrowed = (int32_t)i;
+ myRECT result = { narrowed, narrowed, narrowed, narrowed };
+ return result;
+}
+
+bool
+test_finalizer_cmp_size_t(size_t a, size_t b)
+{
+ return a==b;
+}
+
+// Resource type: int32_t
+
+// Acquire resource i
+int32_t
+test_finalizer_acq_int32_t(size_t i)
+{
+ gFinalizerTestResources[i] = 1;
+ return i;
+}
+
+// Release resource i
+void
+test_finalizer_rel_int32_t(int32_t i)
+{
+ if (--gFinalizerTestResources[i] < 0) {
+ MOZ_CRASH("Assertion failed");
+ }
+}
+
+bool
+test_finalizer_cmp_int32_t(int32_t a, int32_t b)
+{
+ return a==b;
+}
+
+// Resource type: int64_t
+
+// Acquire resource i
+int64_t
+test_finalizer_acq_int64_t(size_t i)
+{
+ gFinalizerTestResources[i] = 1;
+ return i;
+}
+
+// Release resource i
+void
+test_finalizer_rel_int64_t(int64_t i)
+{
+ if (-- gFinalizerTestResources[i] < 0) {
+ MOZ_CRASH("Assertion failed");
+ }
+}
+
+bool
+test_finalizer_cmp_int64_t(int64_t a, int64_t b)
+{
+ return a==b;
+}
+
+// Resource type: void*
+
+// Acquire resource i
+void*
+test_finalizer_acq_ptr_t(size_t i)
+{
+ gFinalizerTestResources[i] = 1;
+ return (void*)&gFinalizerTestResources[i];
+}
+
+// Release resource i
+void
+test_finalizer_rel_ptr_t(void *i)
+{
+ int *as_int = (int*)i;
+ -- (*as_int);
+ if (*as_int < 0) {
+ MOZ_CRASH("Assertion failed");
+ }
+}
+
+bool
+test_finalizer_cmp_ptr_t(void *a, void *b)
+{
+ return a==b;
+}
+
+// Resource type: int32_t*
+
+// Acquire resource i
+int32_t*
+test_finalizer_acq_int32_ptr_t(size_t i)
+{
+ gFinalizerTestResources[i] = 1;
+ return (int32_t*)&gFinalizerTestResources[i];
+}
+
+// Release resource i
+void
+test_finalizer_rel_int32_ptr_t(int32_t *i)
+{
+ -- (*i);
+ if (*i < 0) {
+ MOZ_CRASH("Assertion failed");
+ }
+}
+
+bool
+test_finalizer_cmp_int32_ptr_t(int32_t *a, int32_t *b)
+{
+ return a==b;
+}
+
+// Resource type: nullptr
+
+// Acquire resource i
+void*
+test_finalizer_acq_null_t(size_t i)
+{
+ gFinalizerTestResources[0] = 1;//Always index 0
+ return nullptr;
+}
+
+// Release resource i
+void
+test_finalizer_rel_null_t(void *i)
+{
+ if (i != nullptr) {
+ MOZ_CRASH("Assertion failed");
+ }
+ gFinalizerTestResources[0] --;
+}
+
+bool
+test_finalizer_null_resource_is_acquired(size_t)
+{
+ return gFinalizerTestResources[0] == 1;
+}
+
+bool
+test_finalizer_cmp_null_t(void *a, void *b)
+{
+ return a==b;
+}
+
+// Resource type: char*
+
+// Acquire resource i
+char*
+test_finalizer_acq_string_t(int i)
+{
+ gFinalizerTestResources[i] = 1;
+ if (!gFinalizerTestNames[i]) {
+ char* buf = new char[10];
+ snprintf(buf, 10, "%d", i);
+ gFinalizerTestNames[i] = buf;
+ return buf;
+ }
+ return gFinalizerTestNames[i];
+}
+
+// Release resource i
+void
+test_finalizer_rel_string_t(char *i)
+{
+ int index = atoi(i);
+ if (index < 0 || index >= (int)gFinalizerTestSize) {
+ MOZ_CRASH("Assertion failed");
+ }
+ gFinalizerTestResources[index] --;
+}
+
+bool
+test_finalizer_string_resource_is_acquired(size_t i)
+{
+ return gFinalizerTestResources[i] == 1;
+}
+
+bool
+test_finalizer_cmp_string_t(char *a, char *b)
+{
+ return !strncmp(a, b, 10);
+}
+
+// Resource type: myRECT
+
+// Acquire resource i
+myRECT
+test_finalizer_acq_struct_t(int i)
+{
+ gFinalizerTestResources[i] = 1;
+ myRECT result = { i, i, i, i };
+ return result;
+}
+
+// Release resource i
+void
+test_finalizer_rel_struct_t(myRECT i)
+{
+ int index = i.top;
+ if (index < 0 || index >= (int)gFinalizerTestSize) {
+ MOZ_CRASH("Assertion failed");
+ }
+ gFinalizerTestResources[index] --;
+}
+
+bool
+test_finalizer_struct_resource_is_acquired(myRECT i)
+{
+ int index = i.top;
+ if (index < 0 || index >= (int)gFinalizerTestSize) {
+ MOZ_CRASH("Assertion failed");
+ }
+ return gFinalizerTestResources[index] == 1;
+}
+
+bool
+test_finalizer_cmp_struct_t(myRECT a, myRECT b)
+{
+ return a.top == b.top;
+}
+
+// Support for checking that we reject nullptr finalizer
+afun* test_finalizer_rel_null_function()
+{
+ return nullptr;
+}
+
+void
+test_finalizer_rel_size_t_set_errno(size_t i)
+{
+ if (-- gFinalizerTestResources[i] < 0) {
+ MOZ_CRASH("Assertion failed");
+ }
+ errno = 10;
+}
+
+void
+reset_errno()
+{
+ errno = 0;
+}