changeset 1043:1098071e12b8

fix rbtree copy not expected goto
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Mon, 11 Dec 2023 15:39:53 +0900
parents 751d26c368fb
children de1a04a1a9c6
files src/parallel_execution/RedBlackTree.cbc src/parallel_execution/test/rbTreeCopy_test.cbc
diffstat 2 files changed, 18 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/RedBlackTree.cbc	Mon Nov 13 19:59:35 2023 +0900
+++ b/src/parallel_execution/RedBlackTree.cbc	Mon Dec 11 15:39:53 2023 +0900
@@ -90,11 +90,12 @@
 }
 
 __code copyRedBlackTree(struct RedBlackTree* tree) {
+    tree->current = tree->root;
     struct Stack* nodeStack = tree->nodeStack;
     struct Node* oldNode = tree->current;
     struct Node* newNode = tree->newNode;
     tree->previous = newNode;
-    *newNode = *oldNode;
+    newNode = oldNode;
     goto nodeStack->push((union Data*)newNode, leftDown);
 }
 
@@ -105,12 +106,14 @@
     newNode->color = tree->current->color;
     newNode->right = tree->current->right;
     struct Stack* nodeStack = tree->nodeStack;
+    printf("leftDown");
     goto nodeStack->push(newNode, leftDown1);
 }
 
 __code leftDown1(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
     struct Stack* nodeStack = tree->nodeStack;
-    if (tree->current->left) {
+    printf("leftDown1");
+    if (tree->current->left != NULL) {
         goto leftDown(tree->current->left, inputStack, outputStack);
     } else if (tree->current->right) {
         goto rightDown(tree->current->right, inputStack, outputStack);
@@ -127,12 +130,14 @@
     newNode->right = tree->current->right;
     tree->current = tree->current->right;
     struct Stack* nodeStack = tree->nodeStack;
+    printf("rightDown");
     goto nodeStack->push(newNode, leftDown);
 }
 
 __code up(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
     struct Stack* nodeStack = tree->nodeStack;
     struct Node* newNode = tree->newNode;
+    printf("up");
     if (node->left) {
         tree->current = node->right;
         node->left = newNode;
@@ -145,18 +150,24 @@
 }
 
 __code popWhenEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack, __code next(...)) {
+    printf("popWhenEmpty");
     goto next(...);
 }
 
-__code popWhenNoEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack, struct Stack* nodeStack) {
+__code popWhenNoEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+    struct Stack* nodeStack = tree->nodeStack;
+    printf("popWhenNoEmpty");
     goto nodeStack->pop(up1);
 }
 
-__code up1(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack, struct Stack* nodeStack) {
+__code up1(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+    struct Stack* nodeStack = tree->nodeStack;
+    printf("up1");
     goto nodeStack->pop(up2);
 }
 
 __code up2(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+    printf("up2");
     tree->current->right = node->right;
     goto up(tree, inputStack, outputStack);
 }
--- a/src/parallel_execution/test/rbTreeCopy_test.cbc	Mon Nov 13 19:59:35 2023 +0900
+++ b/src/parallel_execution/test/rbTreeCopy_test.cbc	Mon Dec 11 15:39:53 2023 +0900
@@ -20,63 +20,16 @@
   goto rbTreeTest1(context,tree);
 }
 
-
 __code rbTreeTest2(struct Tree* tree) {
-  printf("Test2\n");
-  Node* node = new Node();
-  node->value = (union Data*)new Integer();
-  // ((Integer*)(node->value))->value= 2;
-  node->key = 2;
-  goto tree->get(node, rbTreeTest3);
-}
-
-__code rbTreeTest2_stub(struct Context* context) {
-  printf("test2_stub\n");
-  Tree* tree = (struct Tree*)Gearef(context, Tree)->tree;
-  goto rbTreeTest2(context,tree);
-}
-
-
-__code rbTreeTest3(struct Tree* tree, struct Node* node0) {
-  printf("test3\n");
-  printf("value=%d key=%d\n", ((Integer*)node0->value)->value, node0->key);
-  Node* node = new Node();
-  node->value = (union Data*)new Integer();
-  ((Integer*)(node->value))->value = 3;
-  node->key = 3;
-  goto tree->put(node, rbTreeTest4);
-}
-
-__code rbTreeTest3_stub(struct Context* context) {
-  Tree* tree = (struct Tree*)Gearef(context, Tree)->tree;
-  Node* node0 = Gearef(context, Tree)->node;
-  goto rbTreeTest3(context,tree,node0);
-}
-
-__code rbTreeTest4(struct Tree* tree) {
-  printf("test4\n");
-  Node* node = new Node();
-  node->value = (union Data*)new Integer();
-  ((Integer*)(node->value))->value = 4;
-  node->key = 4;
-  goto tree->put(node, rbTreeTest5);
-}
-
-__code rbTreeTest4_stub(struct Context* context) {
-  Tree* tree = (struct Tree*)Gearef(context, Tree)->tree;
-  goto rbTreeTest4(context,tree);
-}
-
-__code rbTreeTest5(struct Tree* tree) {
-  printf("test5\n");
+  printf("test2\n");
   Node* node = new Node();
   node->value = (union Data*)new Integer();
   goto tree->copy(node, exit_code);
 }
 
-__code rbTreeTest5_stub(struct Context* context) {
+__code rbTreeTest2_stub(struct Context* context) {
   Tree* tree = (struct Tree*)Gearef(context, Tree)->tree;
-  goto rbTreeTest5(context,tree);
+  goto rbTreeTest2(context,tree);
 }
 
 int main(int argc, char const* argv[]) {