aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Antipov2014-09-11 13:14:45 +0400
committerDmitry Antipov2014-09-11 13:14:45 +0400
commit5d27b6b6689b610096ecf5ca136eaa89e38ce6b6 (patch)
treed8081f4b4082fb179e05bfad8be3d8ea1f7d7aca
parent6e5fd4936d0d56abe13352a6b80446e62fab040a (diff)
downloademacs-5d27b6b6689b610096ecf5ca136eaa89e38ce6b6.tar.gz
emacs-5d27b6b6689b610096ecf5ca136eaa89e38ce6b6.zip
More debugging aids around GCPROs.
* lisp.h (struct gcpro) [DEBUG_GCPRO]: Add extra members. (GCPRO1, GCPRO2, GCPRO3, GCPRO4, GCPRO5, GCPRO6, GCPRO7): Minor restyle. If DEBUG_GCPRO, initialize extra fields.
-rw-r--r--src/ChangeLog5
-rw-r--r--src/lisp.h252
2 files changed, 150 insertions, 107 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 6f76ddd0cda..05ec1514f42 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -3,6 +3,11 @@
3 * lisp.h (make_local_string): Nitpick indent. 3 * lisp.h (make_local_string): Nitpick indent.
4 * print.c (Fprin1_to_string): Remove unused GCPROs. 4 * print.c (Fprin1_to_string): Remove unused GCPROs.
5 5
6 More debugging aids around GCPROs.
7 * lisp.h (struct gcpro) [DEBUG_GCPRO]: Add extra members.
8 (GCPRO1, GCPRO2, GCPRO3, GCPRO4, GCPRO5, GCPRO6, GCPRO7):
9 Minor restyle. If DEBUG_GCPRO, initialize extra fields.
10
62014-09-11 Paul Eggert <eggert@cs.ucla.edu> 112014-09-11 Paul Eggert <eggert@cs.ucla.edu>
7 12
8 Pacify --enable-gcc-warnings when no window system is used. 13 Pacify --enable-gcc-warnings when no window system is used.
diff --git a/src/lisp.h b/src/lisp.h
index 9cfcb244891..ba3c812f5d8 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3016,6 +3016,16 @@ struct gcpro
3016 ptrdiff_t nvars; 3016 ptrdiff_t nvars;
3017 3017
3018#ifdef DEBUG_GCPRO 3018#ifdef DEBUG_GCPRO
3019 /* File name where this record is used. */
3020 const char *name;
3021
3022 /* Line number in this file. */
3023 int lineno;
3024
3025 /* Index in the local chain of records. */
3026 int idx;
3027
3028 /* Nesting level. */
3019 int level; 3029 int level;
3020#endif 3030#endif
3021}; 3031};
@@ -3071,122 +3081,150 @@ struct gcpro
3071 3081
3072#ifndef DEBUG_GCPRO 3082#ifndef DEBUG_GCPRO
3073 3083
3074#define GCPRO1(varname) \ 3084#define GCPRO1(a) \
3075 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \ 3085 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3076 gcprolist = &gcpro1; } 3086 gcprolist = &gcpro1; }
3077 3087
3078#define GCPRO2(varname1, varname2) \ 3088#define GCPRO2(a, b) \
3079 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3089 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3080 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ 3090 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3081 gcprolist = &gcpro2; } 3091 gcprolist = &gcpro2; }
3082 3092
3083#define GCPRO3(varname1, varname2, varname3) \ 3093#define GCPRO3(a, b, c) \
3084 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3094 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3085 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ 3095 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3086 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \ 3096 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3087 gcprolist = &gcpro3; } 3097 gcprolist = &gcpro3; }
3098
3099#define GCPRO4(a, b, c, d) \
3100 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3101 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3102 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3103 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3104 gcprolist = &gcpro4; }
3105
3106#define GCPRO5(a, b, c, d, e) \
3107 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3108 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3109 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3110 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3111 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3112 gcprolist = &gcpro5; }
3113
3114#define GCPRO6(a, b, c, d, e, f) \
3115 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3116 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3117 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3118 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3119 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3120 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3121 gcprolist = &gcpro6; }
3088 3122
3089#define GCPRO4(varname1, varname2, varname3, varname4) \ 3123#define GCPRO7(a, b, c, d, e, f, g) \
3090 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3124 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3091 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ 3125 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3092 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \ 3126 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3093 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \ 3127 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3094 gcprolist = &gcpro4; } 3128 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3095 3129 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3096#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \ 3130 gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1; \
3097 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3131 gcprolist = &gcpro7; }
3098 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
3099 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
3100 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
3101 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
3102 gcprolist = &gcpro5; }
3103
3104#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
3105 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
3106 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
3107 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
3108 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
3109 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
3110 gcpro6.next = &gcpro5; gcpro6.var = &varname6; gcpro6.nvars = 1; \
3111 gcprolist = &gcpro6; }
3112
3113#define GCPRO7(a, b, c, d, e, f, g) \
3114 {gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3115 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3116 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3117 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3118 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3119 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3120 gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1; \
3121 gcprolist = &gcpro7; }
3122 3132
3123#define UNGCPRO (gcprolist = gcpro1.next) 3133#define UNGCPRO (gcprolist = gcpro1.next)
3124 3134
3125#else 3135#else /* !DEBUG_GCPRO */
3126 3136
3127extern int gcpro_level; 3137extern int gcpro_level;
3128 3138
3129#define GCPRO1(varname) \ 3139#define GCPRO1(a) \
3130 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \ 3140 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3131 gcpro1.level = gcpro_level++; \ 3141 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3132 gcprolist = &gcpro1; } 3142 gcpro1.level = gcpro_level++; \
3133 3143 gcprolist = &gcpro1; }
3134#define GCPRO2(varname1, varname2) \ 3144
3135 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3145#define GCPRO2(a, b) \
3136 gcpro1.level = gcpro_level; \ 3146 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3137 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ 3147 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3138 gcpro2.level = gcpro_level++; \ 3148 gcpro1.level = gcpro_level; \
3139 gcprolist = &gcpro2; } 3149 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3140 3150 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3141#define GCPRO3(varname1, varname2, varname3) \ 3151 gcpro2.level = gcpro_level++; \
3142 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3152 gcprolist = &gcpro2; }
3143 gcpro1.level = gcpro_level; \ 3153
3144 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ 3154#define GCPRO3(a, b, c) \
3145 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \ 3155 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3146 gcpro3.level = gcpro_level++; \ 3156 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3147 gcprolist = &gcpro3; } 3157 gcpro1.level = gcpro_level; \
3148 3158 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3149#define GCPRO4(varname1, varname2, varname3, varname4) \ 3159 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3150 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3160 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3151 gcpro1.level = gcpro_level; \ 3161 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3152 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ 3162 gcpro3.level = gcpro_level++; \
3153 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \ 3163 gcprolist = &gcpro3; }
3154 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \ 3164
3155 gcpro4.level = gcpro_level++; \ 3165#define GCPRO4(a, b, c, d) \
3156 gcprolist = &gcpro4; } 3166 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3157 3167 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3158#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \ 3168 gcpro1.level = gcpro_level; \
3159 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3169 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3160 gcpro1.level = gcpro_level; \ 3170 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3161 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ 3171 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3162 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \ 3172 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3163 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \ 3173 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3164 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \ 3174 gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
3165 gcpro5.level = gcpro_level++; \ 3175 gcpro4.level = gcpro_level++; \
3166 gcprolist = &gcpro5; } 3176 gcprolist = &gcpro4; }
3167 3177
3168#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \ 3178#define GCPRO5(a, b, c, d, e) \
3169 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ 3179 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3170 gcpro1.level = gcpro_level; \ 3180 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3171 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ 3181 gcpro1.level = gcpro_level; \
3172 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \ 3182 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3173 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \ 3183 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3174 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \ 3184 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3175 gcpro6.next = &gcpro5; gcpro6.var = &varname6; gcpro6.nvars = 1; \ 3185 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3176 gcpro6.level = gcpro_level++; \ 3186 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3177 gcprolist = &gcpro6; } 3187 gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
3188 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3189 gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
3190 gcpro5.level = gcpro_level++; \
3191 gcprolist = &gcpro5; }
3192
3193#define GCPRO6(a, b, c, d, e, f) \
3194 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3195 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3196 gcpro1.level = gcpro_level; \
3197 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3198 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3199 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3200 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3201 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3202 gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
3203 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3204 gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
3205 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3206 gcpro6.name = __FILE__; gcpro6.lineno = __LINE__; gcpro6.idx = 6; \
3207 gcpro6.level = gcpro_level++; \
3208 gcprolist = &gcpro6; }
3178 3209
3179#define GCPRO7(a, b, c, d, e, f, g) \ 3210#define GCPRO7(a, b, c, d, e, f, g) \
3180 {gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \ 3211 { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
3181 gcpro1.level = gcpro_level; \ 3212 gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
3182 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \ 3213 gcpro1.level = gcpro_level; \
3183 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \ 3214 gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
3184 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \ 3215 gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
3185 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \ 3216 gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
3186 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \ 3217 gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
3187 gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1; \ 3218 gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
3188 gcpro7.level = gcpro_level++; \ 3219 gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
3189 gcprolist = &gcpro7; } 3220 gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
3221 gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
3222 gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
3223 gcpro6.name = __FILE__; gcpro6.lineno = __LINE__; gcpro6.idx = 6; \
3224 gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1; \
3225 gcpro7.name = __FILE__; gcpro7.lineno = __LINE__; gcpro7.idx = 7; \
3226 gcpro7.level = gcpro_level++; \
3227 gcprolist = &gcpro7; }
3190 3228
3191#define UNGCPRO \ 3229#define UNGCPRO \
3192 (--gcpro_level != gcpro1.level \ 3230 (--gcpro_level != gcpro1.level \