1
/*===========================================================================
2
* Filename : test-gc-protect-stack.c
3
* About : unit test for scm_gc_protect_stack()
5
* Copyright (C) 2006 YAMAMOTO Kengo <yamaken AT bp.iij4u.or.jp>
6
* Copyright (c) 2007 SigScheme Project <uim AT freedesktop.org>
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
* 3. Neither the name of authors nor the names of its contributors
20
* may be used to endorse or promote products derived from this software
21
* without specific prior written permission.
23
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
24
* IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
27
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
30
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
33
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
===========================================================================*/
37
/* Since introduction of libgcroots to SigScheme, the GC protection interfaces
38
* are withdrawn. These tests does not make sense now. -- YamaKen 2006-12-23 */
39
#define TST_EXCLUDE_THIS
42
#define TST_HAVE_MAIN 1
43
#include "sscm-test.h"
45
#ifndef TST_EXCLUDE_THIS
48
#include <sigscheme/sigscheme.h>
50
#define SCMOBJ_ALIGNEDP(ptr) (!((uintptr_t)(ptr) % sizeof(ScmObj)))
52
#define TEST_STACK_START(protected, actual) \
53
if (stack_dir == STACK_GROWS_DOWNWARDS) { \
54
TST_TN_TRUE(actual <= protected); \
56
TST_TN_TRUE(actual >= protected); \
59
enum stack_growth_dir {
60
STACK_GROWS_DOWNWARDS,
64
static enum stack_growth_dir stack_dir;
65
static void *volatile stack_start_protected;
66
static void *volatile stack_start_actual;
67
static void (*volatile fvv_internal)(void);
68
static int (*volatile fiv_internal)(void);
69
static void (*volatile fvi_internal)(int);
70
static int (*volatile fii_internal)(int);
71
static ScmObj *(*volatile fspsp_internal)(ScmObj *dummy);
72
static ScmObj *(*volatile fspsp2_internal)(ScmObj *dummy);
74
static enum stack_growth_dir probe_stack_growth_dir(void);
75
static enum stack_growth_dir probe_stack_growth_dir2(void *upper_frame);
76
static void fvv(void);
78
static void fvi(int dummy);
79
static int fii(int dummy);
80
static ScmObj *fspsp(ScmObj *dummy);
81
static ScmObj *fspsp2(ScmObj *dummy);
84
static enum stack_growth_dir
85
probe_stack_growth_dir(void)
89
return probe_stack_growth_dir2(&stack_start);
92
static enum stack_growth_dir
93
probe_stack_growth_dir2(void *upper_frame)
97
if ((void *)&stack_start < upper_frame)
98
return STACK_GROWS_DOWNWARDS;
100
return STACK_GROWS_UPWARDS;
108
stack_start_actual = &stack_start;
116
stack_start_actual = &stack_start;
125
stack_start_actual = &stack_start;
133
stack_start_actual = &stack_start;
142
stack_start_actual = &stack_start;
146
/* simulates scm_gc_protect_stack_internal() */
148
fspsp2(ScmObj *designated_stack_start)
152
if (!designated_stack_start)
153
designated_stack_start = &stack_start;
155
stack_start_actual = designated_stack_start;
157
/* enabling this fragment on --enable-debug configuration offsets stack
160
SCM_ASSERT(SCMOBJ_ALIGNEDP(stack_start_actual));
163
/* may intentionally be an invalidated local address */
164
return designated_stack_start;
168
main(int argc, char **argv)
170
tst_suite_info suite = TST_DEFAULT_SUITE_SETUP;
172
scm_initialize(NULL);
174
stack_dir = probe_stack_growth_dir();
179
fspsp_internal = fspsp;
180
fspsp2_internal = fspsp2;
186
TST_DEFAULT_SUITE_CLEANUP(suite);
187
return !!suite.stats.fail;
190
TST_CASE("void (*)(void)")
192
stack_start_protected = scm_gc_current_stack();
193
scm_gc_protect_stack(stack_start_protected);
195
scm_gc_unprotect_stack(stack_start_protected);
197
TEST_STACK_START(stack_start_protected, stack_start_actual);
200
TST_CASE("int (*)(void)")
202
stack_start_protected = scm_gc_current_stack();
203
scm_gc_protect_stack(stack_start_protected);
205
scm_gc_unprotect_stack(stack_start_protected);
207
TEST_STACK_START(stack_start_protected, stack_start_actual);
210
TST_CASE("void (*)(int)")
212
stack_start_protected = scm_gc_current_stack();
213
scm_gc_protect_stack(stack_start_protected);
215
scm_gc_unprotect_stack(stack_start_protected);
217
TEST_STACK_START(stack_start_protected, stack_start_actual);
220
TST_CASE("int (*)(int)")
222
stack_start_protected = scm_gc_current_stack();
223
scm_gc_protect_stack(stack_start_protected);
225
scm_gc_unprotect_stack(stack_start_protected);
227
TEST_STACK_START(stack_start_protected, stack_start_actual);
230
TST_CASE("ScmObj *(*)(ScmObj *)")
232
stack_start_protected = scm_gc_current_stack();
233
scm_gc_protect_stack(stack_start_protected);
234
(*fspsp_internal)(NULL);
235
scm_gc_unprotect_stack(stack_start_protected);
237
TEST_STACK_START(stack_start_protected, stack_start_actual);
240
TST_CASE("ScmObj *(*)(ScmObj *) (2)")
242
stack_start_protected = scm_gc_current_stack();
243
scm_gc_protect_stack(stack_start_protected);
244
(*fspsp2_internal)(NULL);
245
scm_gc_unprotect_stack(stack_start_protected);
247
TEST_STACK_START(stack_start_protected, stack_start_actual);
250
#endif /* TST_EXCLUDE_THIS */