| 1 | #include "mycpp/runtime.h" | 
| 2 | #include "vendor/greatest.h" | 
| 3 |  | 
| 4 | TEST tuple_field_masks_test() { | 
| 5 | if (sizeof(void *) != 8) { | 
| 6 | PASS(); | 
| 7 | } | 
| 8 |  | 
| 9 | auto ss = Tuple2<BigStr *, BigStr *>::obj_header(); | 
| 10 | ASSERT_EQ_FMT(0b11, FIELD_MASK(ss), "%d"); | 
| 11 |  | 
| 12 | // 8 + 4 on 64 bit | 
| 13 | auto si = Tuple2<BigStr *, int>::obj_header(); | 
| 14 | ASSERT_EQ_FMT(0b01, FIELD_MASK(si), "%d"); | 
| 15 |  | 
| 16 | // 4 + 8 on 64 bit | 
| 17 | auto is = Tuple2<int, BigStr *>::obj_header(); | 
| 18 | ASSERT_EQ_FMT(0b10, FIELD_MASK(is), "%d"); | 
| 19 |  | 
| 20 | auto sss = Tuple3<BigStr *, BigStr *, BigStr *>::obj_header(); | 
| 21 | ASSERT_EQ_FMT(0b111, FIELD_MASK(sss), "%d"); | 
| 22 |  | 
| 23 | auto iss = Tuple3<int, BigStr *, BigStr *>::obj_header(); | 
| 24 | ASSERT_EQ_FMT(0b110, FIELD_MASK(iss), "%d"); | 
| 25 |  | 
| 26 | // 4 + 4 + 8 + 8, so it's 0b110 not 0b1100 | 
| 27 | auto iiss = Tuple4<int, int, BigStr *, BigStr *>::obj_header(); | 
| 28 | ASSERT_EQ_FMT(0b110, FIELD_MASK(iiss), "%d"); | 
| 29 |  | 
| 30 | PASS(); | 
| 31 | } | 
| 32 |  | 
| 33 | TEST tuple234_test() { | 
| 34 | Tuple2<int, int> *t2 = Alloc<Tuple2<int, int>>(5, 6); | 
| 35 | log("t2[0] = %d", t2->at0()); | 
| 36 | log("t2[1] = %d", t2->at1()); | 
| 37 |  | 
| 38 | Tuple2<int, BigStr *> *u2 = | 
| 39 | Alloc<Tuple2<int, BigStr *>>(42, StrFromC("hello")); | 
| 40 | log("u2[0] = %d", u2->at0()); | 
| 41 | log("u2[1] = %s", u2->at1()->data_); | 
| 42 |  | 
| 43 | log(""); | 
| 44 |  | 
| 45 | auto t3 = Alloc<Tuple3<int, BigStr *, BigStr *>>(42, StrFromC("hello"), | 
| 46 | StrFromC("bye")); | 
| 47 | log("t3[0] = %d", t3->at0()); | 
| 48 | log("t3[1] = %s", t3->at1()->data_); | 
| 49 | log("t3[2] = %s", t3->at2()->data_); | 
| 50 |  | 
| 51 | log(""); | 
| 52 |  | 
| 53 | auto t4 = Alloc<Tuple4<int, BigStr *, BigStr *, int>>(42, StrFromC("4"), | 
| 54 | StrFromC("four"), -42); | 
| 55 |  | 
| 56 | log("t4[0] = %d", t4->at0()); | 
| 57 | log("t4[1] = %s", t4->at1()->data_); | 
| 58 | log("t4[2] = %s", t4->at2()->data_); | 
| 59 | log("t4[3] = %d", t4->at3()); | 
| 60 |  | 
| 61 | PASS(); | 
| 62 | } | 
| 63 |  | 
| 64 | TEST tuple_test() { | 
| 65 | gHeap.Collect(); | 
| 66 | printf("\n"); | 
| 67 |  | 
| 68 | Tuple2<int, Tuple2<int, BigStr *> *> *t3 = nullptr; | 
| 69 | StackRoots _roots2({&t3}); | 
| 70 |  | 
| 71 | { | 
| 72 | Tuple2<int, int> *t0 = nullptr; | 
| 73 | Tuple2<int, BigStr *> *t1 = nullptr; | 
| 74 | Tuple2<int, BigStr *> *t2 = nullptr; | 
| 75 |  | 
| 76 | BigStr *str0 = nullptr; | 
| 77 | BigStr *str1 = nullptr; | 
| 78 |  | 
| 79 | StackRoots _roots({&str0, &str1, &t0, &t1, &t2}); | 
| 80 |  | 
| 81 | gHeap.Collect(); | 
| 82 |  | 
| 83 | str0 = StrFromC("foo_0"); | 
| 84 | gHeap.Collect(); | 
| 85 |  | 
| 86 | str1 = StrFromC("foo_1"); | 
| 87 |  | 
| 88 | gHeap.Collect(); | 
| 89 |  | 
| 90 | t0 = Alloc<Tuple2<int, int>>(2, 3); | 
| 91 |  | 
| 92 | gHeap.Collect(); | 
| 93 |  | 
| 94 | printf("%s\n", str0->data_); | 
| 95 | printf("%s\n", str1->data_); | 
| 96 |  | 
| 97 | t1 = Alloc<Tuple2<int, BigStr *>>(4, str0); | 
| 98 | t2 = Alloc<Tuple2<int, BigStr *>>(5, str1); | 
| 99 |  | 
| 100 | gHeap.Collect(); | 
| 101 |  | 
| 102 | printf("%s\n", str0->data_); | 
| 103 | printf("%s\n", str1->data_); | 
| 104 |  | 
| 105 | printf("%d = %d\n", t0->at0(), t0->at1()); | 
| 106 | printf("%d = %s\n", t1->at0(), t1->at1()->data_); | 
| 107 | printf("%d = %s\n", t2->at0(), t2->at1()->data_); | 
| 108 |  | 
| 109 | gHeap.Collect(); | 
| 110 |  | 
| 111 | t3 = Alloc<Tuple2<int, Tuple2<int, BigStr *> *>>(6, t2); | 
| 112 |  | 
| 113 | gHeap.Collect(); | 
| 114 | } | 
| 115 |  | 
| 116 | printf("%d = { %d = %s }\n", t3->at0(), t3->at1()->at0(), | 
| 117 | t3->at1()->at1()->data_); | 
| 118 |  | 
| 119 | gHeap.Collect(); | 
| 120 |  | 
| 121 | PASS(); | 
| 122 | } | 
| 123 |  | 
| 124 | GREATEST_MAIN_DEFS(); | 
| 125 |  | 
| 126 | int main(int argc, char **argv) { | 
| 127 | gHeap.Init(); | 
| 128 |  | 
| 129 | GREATEST_MAIN_BEGIN(); | 
| 130 |  | 
| 131 | RUN_TEST(tuple_field_masks_test); | 
| 132 | RUN_TEST(tuple234_test); | 
| 133 | RUN_TEST(tuple_test); | 
| 134 |  | 
| 135 | gHeap.CleanProcessExit(); | 
| 136 |  | 
| 137 | GREATEST_MAIN_END(); /* display results */ | 
| 138 | return 0; | 
| 139 | } |