Skip to content

Commit 166fcf8

Browse files
authored
Merge pull request #46 from opensourcecobol/feature/fix_cob_push_call_stack_list
複数プログラム実行時のCANCEL ALLに関する問題 / Problems with CANCEL ALL when running multiple programs 親プログラムから3つ以上のプログラムを実行したのち、CANCEL ALLを実施した際に、正常にすべてのプログラムがCANCELされていなかった問題を修正した。 Fixed the problem that not all programs were normally CANCELed when CANCEL ALL was executed after executing 3 or more programs from the parent program.
2 parents 37a6aa5 + c803e89 commit 166fcf8

File tree

2 files changed

+68
-5
lines changed

2 files changed

+68
-5
lines changed

libcob/call.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,10 +316,8 @@ cob_cancel_call_stack_list (struct call_stack_list *p)
316316
if (p->children) {
317317
cob_cancel_call_stack_list (p->children);
318318
}
319-
struct call_stack_list *s = p->sister;
320-
while (s != NULL) {
321-
cob_cancel_call_stack_list (s);
322-
s = s->sister;
319+
if (p->sister) {
320+
cob_cancel_call_stack_list (p->sister);
323321
}
324322
}
325323

@@ -768,7 +766,7 @@ cob_push_call_stack_list (char *name)
768766
}
769767
p = p->sister;
770768
}
771-
current_call_stack_list->sister = cob_create_call_stack_list (name);
769+
p->sister = cob_create_call_stack_list (name);
772770
return;
773771
}
774772

tests/run.src/misc.at

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,71 @@ AT_CHECK([./prog], [0],
605605

606606
AT_CLEANUP
607607

608+
AT_SETUP([CANCEL ALL horizontal program])
609+
610+
AT_DATA([prog.cob], [
611+
IDENTIFICATION DIVISION.
612+
PROGRAM-ID. prog.
613+
PROCEDURE DIVISION.
614+
CALL "call01"
615+
END-CALL.
616+
CALL "call02"
617+
END-CALL.
618+
CALL "call03"
619+
END-CALL.
620+
CANCEL ALL.
621+
CALL "call01"
622+
END-CALL.
623+
CALL "call02"
624+
END-CALL.
625+
CALL "call03"
626+
END-CALL.
627+
STOP RUN.
628+
])
629+
630+
AT_DATA([call01.cob], [
631+
IDENTIFICATION DIVISION.
632+
PROGRAM-ID. call01.
633+
DATA DIVISION.
634+
WORKING-STORAGE SECTION.
635+
PROCEDURE DIVISION.
636+
GOBACK.
637+
])
638+
639+
AT_DATA([call02.cob], [
640+
IDENTIFICATION DIVISION.
641+
PROGRAM-ID. call02.
642+
DATA DIVISION.
643+
WORKING-STORAGE SECTION.
644+
PROCEDURE DIVISION.
645+
GOBACK.
646+
])
647+
648+
AT_DATA([call03.cob], [
649+
IDENTIFICATION DIVISION.
650+
PROGRAM-ID. call03.
651+
DATA DIVISION.
652+
WORKING-STORAGE SECTION.
653+
01 X PIC 9.
654+
PROCEDURE DIVISION.
655+
ADD 1 TO X.
656+
DISPLAY X
657+
END-DISPLAY.
658+
EXIT PROGRAM.
659+
GOBACK.
660+
])
661+
662+
AT_CHECK([${COMPILE} -o prog prog.cob])
663+
AT_CHECK([${COMPILE_MODULE} call01.cob])
664+
AT_CHECK([${COMPILE_MODULE} call02.cob])
665+
AT_CHECK([${COMPILE_MODULE} call03.cob])
666+
AT_CHECK([./prog], [0],
667+
[1
668+
1
669+
])
670+
671+
AT_CLEANUP
672+
608673
AT_SETUP([CALL binary literal parameter/LENGTH OF - so])
609674

610675
AT_CHECK([test $SHREXT != "dll" || exit 77])

0 commit comments

Comments
 (0)