Fossil SCM

Make sure that TH1 variables get removed from the call frame upon being unset.

mistachkin 2014-01-13 23:27 UTC th1Work
Commit fa17f1ce3a8915d5c26c1c7e736cc7a0033a3b8d
2 files changed +7 -3 +5
+7 -3
--- src/th.c
+++ src/th.c
@@ -1079,11 +1079,11 @@
10791079
if( isGlobal ){
10801080
while( pFrame->pCaller ) pFrame = pFrame->pCaller;
10811081
}
10821082
10831083
pEntry = Th_HashFind(interp, pFrame->paVar, zOuter, nOuter, create);
1084
- assert(pEntry || !create);
1084
+ assert(pEntry || create<=0);
10851085
if( !pEntry ){
10861086
goto no_such_var;
10871087
}
10881088
10891089
pValue = (Th_Variable *)pEntry->pData;
@@ -1253,17 +1253,21 @@
12531253
pValue = thFindValue(interp, zVar, nVar, 0, 1, 0);
12541254
if( !pValue ){
12551255
return TH_ERROR;
12561256
}
12571257
1258
- Th_Free(interp, pValue->zData);
1259
- pValue->zData = 0;
1258
+ if( pValue->zData ){
1259
+ Th_Free(interp, pValue->zData);
1260
+ pValue->zData = 0;
1261
+ }
12601262
if( pValue->pHash ){
12611263
Th_HashIterate(interp, pValue->pHash, thFreeVariable, (void *)interp);
12621264
Th_HashDelete(interp, pValue->pHash);
12631265
pValue->pHash = 0;
12641266
}
1267
+
1268
+ thFindValue(interp, zVar, nVar, -1, 1, 1); /* Finally, delete from frame */
12651269
return TH_OK;
12661270
}
12671271
12681272
/*
12691273
** Return an allocated buffer containing a copy of string (z, n). The
12701274
--- src/th.c
+++ src/th.c
@@ -1079,11 +1079,11 @@
1079 if( isGlobal ){
1080 while( pFrame->pCaller ) pFrame = pFrame->pCaller;
1081 }
1082
1083 pEntry = Th_HashFind(interp, pFrame->paVar, zOuter, nOuter, create);
1084 assert(pEntry || !create);
1085 if( !pEntry ){
1086 goto no_such_var;
1087 }
1088
1089 pValue = (Th_Variable *)pEntry->pData;
@@ -1253,17 +1253,21 @@
1253 pValue = thFindValue(interp, zVar, nVar, 0, 1, 0);
1254 if( !pValue ){
1255 return TH_ERROR;
1256 }
1257
1258 Th_Free(interp, pValue->zData);
1259 pValue->zData = 0;
 
 
1260 if( pValue->pHash ){
1261 Th_HashIterate(interp, pValue->pHash, thFreeVariable, (void *)interp);
1262 Th_HashDelete(interp, pValue->pHash);
1263 pValue->pHash = 0;
1264 }
 
 
1265 return TH_OK;
1266 }
1267
1268 /*
1269 ** Return an allocated buffer containing a copy of string (z, n). The
1270
--- src/th.c
+++ src/th.c
@@ -1079,11 +1079,11 @@
1079 if( isGlobal ){
1080 while( pFrame->pCaller ) pFrame = pFrame->pCaller;
1081 }
1082
1083 pEntry = Th_HashFind(interp, pFrame->paVar, zOuter, nOuter, create);
1084 assert(pEntry || create<=0);
1085 if( !pEntry ){
1086 goto no_such_var;
1087 }
1088
1089 pValue = (Th_Variable *)pEntry->pData;
@@ -1253,17 +1253,21 @@
1253 pValue = thFindValue(interp, zVar, nVar, 0, 1, 0);
1254 if( !pValue ){
1255 return TH_ERROR;
1256 }
1257
1258 if( pValue->zData ){
1259 Th_Free(interp, pValue->zData);
1260 pValue->zData = 0;
1261 }
1262 if( pValue->pHash ){
1263 Th_HashIterate(interp, pValue->pHash, thFreeVariable, (void *)interp);
1264 Th_HashDelete(interp, pValue->pHash);
1265 pValue->pHash = 0;
1266 }
1267
1268 thFindValue(interp, zVar, nVar, -1, 1, 1); /* Finally, delete from frame */
1269 return TH_OK;
1270 }
1271
1272 /*
1273 ** Return an allocated buffer containing a copy of string (z, n). The
1274
--- test/th1.test
+++ test/th1.test
@@ -147,5 +147,10 @@
147147
148148
###############################################################################
149149
150150
fossil test-th-eval "unset var"
151151
test th1-unset-2 {$RESULT eq {TH_ERROR: no such variable: var}}
152
+
153
+###############################################################################
154
+
155
+fossil test-th-eval "set var 1; unset var; unset var"
156
+test th1-unset-3 {$RESULT eq {TH_ERROR: no such variable: var}}
152157
--- test/th1.test
+++ test/th1.test
@@ -147,5 +147,10 @@
147
148 ###############################################################################
149
150 fossil test-th-eval "unset var"
151 test th1-unset-2 {$RESULT eq {TH_ERROR: no such variable: var}}
 
 
 
 
 
152
--- test/th1.test
+++ test/th1.test
@@ -147,5 +147,10 @@
147
148 ###############################################################################
149
150 fossil test-th-eval "unset var"
151 test th1-unset-2 {$RESULT eq {TH_ERROR: no such variable: var}}
152
153 ###############################################################################
154
155 fossil test-th-eval "set var 1; unset var; unset var"
156 test th1-unset-3 {$RESULT eq {TH_ERROR: no such variable: var}}
157

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button