** But other routines are also provided to help in building up
** a program instruction by instruction.
**
-** $Id: vdbe.c,v 1.45 2000/10/19 14:42:05 drh Exp $
+** $Id: vdbe.c,v 1.46 2000/10/23 01:08:00 drh Exp $
*/
#include "sqliteInt.h"
#include <unistd.h>
return sHead.pNext;
}
+/*
+** Code contained within the VERIFY() macro is not needed for correct
+** execution. It is there only to catch errors. So when we compile
+** with NDEBUG=1, the VERIFY() code is omitted.
+*/
+#ifdef NDEBUG
+# define VERIFY(X)
+#else
+# define VERIFY(X) X
+#endif
+
/*
** Execute the program in the VDBE.
**
Op *pOp; /* Current operation */
int rc; /* Value to return */
Dbbe *pBe = p->pBe; /* The backend driver */
+ sqlite *db = p->db; /* The database */
char zBuf[100]; /* Space to sprintf() and integer */
+
+ /* No instruction ever pushes more than a single element onto the
+ ** stack. And the stack never grows on successive executions of the
+ ** same loop. So the total number of instructions is an upper bound
+ ** on the maximum stack depth required.
+ **
+ ** Allocation all the stack space we will ever need.
+ */
+ NeedStack(p, p->nOp);
p->tos = -1;
+
rc = SQLITE_OK;
#ifdef MEMORY_DEBUG
if( access("vdbe_trace",0)==0 ){
}
#endif
/* if( pzErrMsg ){ *pzErrMsg = 0; } */
- for(pc=0; rc==SQLITE_OK && pc<p->nOp && pc>=0; pc++){
+ for(pc=0; rc==SQLITE_OK && pc<p->nOp VERIFY(&& pc>=0); pc++){
pOp = &p->aOp[pc];
/* Interrupt processing if requested.
*/
- if( p->db->flags & SQLITE_Interrupt ){
- p->db->flags &= ~SQLITE_Interrupt;
+ if( db->flags & SQLITE_Interrupt ){
+ db->flags &= ~SQLITE_Interrupt;
rc = SQLITE_INTERRUPT;
sqliteSetString(pzErrMsg, "interrupted", 0);
break;
*/
case OP_Integer: {
int i = ++p->tos;
- if( NeedStack(p, p->tos) ) goto no_mem;
+ VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
p->aStack[i].i = pOp->p1;
p->aStack[i].flags = STK_Int;
break;
case OP_String: {
int i = ++p->tos;
char *z;
- if( NeedStack(p, p->tos) ) goto no_mem;
+ VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
z = pOp->p3;
if( z==0 ) z = "";
p->zStack[i] = z;
*/
case OP_Null: {
int i = ++p->tos;
- if( NeedStack(p, p->tos) ) goto no_mem;
+ VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
p->zStack[i] = 0;
p->aStack[i].flags = STK_Null;
break;
case OP_Dup: {
int i = p->tos - pOp->p1;
int j = ++p->tos;
- if( i<0 ) goto not_enough_stack;
- if( NeedStack(p, p->tos) ) goto no_mem;
+ VERIFY( if( i<0 ) goto not_enough_stack; )
+ VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
p->aStack[j] = p->aStack[i];
if( p->aStack[i].flags & STK_Dyn ){
p->zStack[j] = sqliteMalloc( p->aStack[j].n );
int i;
Stack ts;
char *tz;
- if( from<0 ) goto not_enough_stack;
+ VERIFY( if( from<0 ) goto not_enough_stack; )
ts = p->aStack[from];
tz = p->zStack[from];
for(i=from; i<to; i++){
case OP_Callback: {
int i = p->tos - pOp->p1 + 1;
int j;
- if( i<0 ) goto not_enough_stack;
- if( NeedStack(p, p->tos+2) ) goto no_mem;
+ VERIFY( if( i<0 ) goto not_enough_stack; )
+ VERIFY( if( NeedStack(p, p->tos+2) ) goto no_mem; )
for(j=i; j<=p->tos; j++){
if( (p->aStack[j].flags & STK_Null)==0 ){
if( Stringify(p, j) ) goto no_mem;
zSep = pOp->p3;
if( zSep==0 ) zSep = "";
nSep = strlen(zSep);
- if( p->tos+1<nField ) goto not_enough_stack;
+ VERIFY( if( p->tos+1<nField ) goto not_enough_stack; )
nByte = 1 - nSep;
for(i=p->tos-nField+1; i<=p->tos; i++){
if( p->aStack[i].flags & STK_Null ){
}
zNew[j] = 0;
if( pOp->p2==0 ) PopStack(p, nField);
- NeedStack(p, p->tos+1);
+ VERIFY( NeedStack(p, p->tos+1); )
p->tos++;
p->aStack[p->tos].n = nByte;
p->aStack[p->tos].flags = STK_Str|STK_Dyn;
case OP_Divide: {
int tos = p->tos;
int nos = tos - 1;
- if( nos<0 ) goto not_enough_stack;
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
if( (p->aStack[tos].flags & p->aStack[nos].flags & STK_Int)==STK_Int ){
int a, b;
a = p->aStack[tos].i;
int nos = tos - 1;
int ft, fn;
int copy = 0;
- if( nos<0 ) goto not_enough_stack;
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
ft = p->aStack[tos].flags;
fn = p->aStack[nos].flags;
if( fn & STK_Null ){
int nos = tos - 1;
int ft, fn;
int copy = 0;
- if( nos<0 ) goto not_enough_stack;
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
ft = p->aStack[tos].flags;
fn = p->aStack[nos].flags;
if( fn & STK_Null ){
*/
case OP_AddImm: {
int tos = p->tos;
- if( tos<0 ) goto not_enough_stack;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
Integerify(p, tos);
p->aStack[tos].i += pOp->p1;
break;
int nos = tos - 1;
int c;
int ft, fn;
- if( nos<0 ) goto not_enough_stack;
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
ft = p->aStack[tos].flags;
fn = p->aStack[nos].flags;
if( (ft & fn)==STK_Int ){
int tos = p->tos;
int nos = tos - 1;
int c;
- if( nos<0 ) goto not_enough_stack;
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
Stringify(p, tos);
Stringify(p, nos);
c = sqliteLikeCompare(p->zStack[tos], p->zStack[nos]);
int tos = p->tos;
int nos = tos - 1;
int c;
- if( nos<0 ) goto not_enough_stack;
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
Stringify(p, tos);
Stringify(p, nos);
c = sqliteGlobCompare(p->zStack[tos], p->zStack[nos]);
int tos = p->tos;
int nos = tos - 1;
int c;
- if( nos<0 ) goto not_enough_stack;
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
Integerify(p, tos);
Integerify(p, nos);
if( pOp->opcode==OP_And ){
** with its additive inverse.
*/
case OP_Negative: {
- int tos;
- if( (tos = p->tos)<0 ) goto not_enough_stack;
+ int tos = p->tos;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
if( p->aStack[tos].flags & STK_Real ){
Release(p, tos);
p->aStack[tos].r = -p->aStack[tos].r;
*/
case OP_Not: {
int tos = p->tos;
- if( p->tos<0 ) goto not_enough_stack;
+ VERIFY( if( p->tos<0 ) goto not_enough_stack; )
Integerify(p, tos);
Release(p, tos);
p->aStack[tos].i = !p->aStack[tos].i;
*/
case OP_If: {
int c;
- if( p->tos<0 ) goto not_enough_stack;
+ VERIFY( if( p->tos<0 ) goto not_enough_stack; )
Integerify(p, p->tos);
c = p->aStack[p->tos].i;
PopStack(p, 1);
*/
case OP_IsNull: {
int c;
- if( p->tos<0 ) goto not_enough_stack;
+ VERIFY( if( p->tos<0 ) goto not_enough_stack; )
c = (p->aStack[p->tos].flags & STK_Null)!=0;
PopStack(p, 1);
if( c ) pc = pOp->p2-1;
*/
case OP_NotNull: {
int c;
- if( p->tos<0 ) goto not_enough_stack;
+ VERIFY( if( p->tos<0 ) goto not_enough_stack; )
c = (p->aStack[p->tos].flags & STK_Null)==0;
PopStack(p, 1);
if( c ) pc = pOp->p2-1;
int addr;
nField = pOp->p1;
- if( p->tos+1<nField ) goto not_enough_stack;
+ VERIFY( if( p->tos+1<nField ) goto not_enough_stack; )
nByte = 0;
for(i=p->tos-nField+1; i<=p->tos; i++){
if( (p->aStack[i].flags & STK_Null)==0 ){
}
}
PopStack(p, nField);
- NeedStack(p, p->tos+1);
+ VERIFY( NeedStack(p, p->tos+1); )
p->tos++;
p->aStack[p->tos].n = nByte;
p->aStack[p->tos].flags = STK_Str | STK_Dyn;
int i, j;
nField = pOp->p1;
- if( p->tos+1<nField ) goto not_enough_stack;
+ VERIFY( if( p->tos+1<nField ) goto not_enough_stack; )
nByte = 0;
for(i=p->tos-nField+1; i<=p->tos; i++){
if( p->aStack[i].flags & STK_Null ){
}
zNewKey[j] = 0;
if( pOp->p2==0 ) PopStack(p, nField);
- NeedStack(p, p->tos+1);
+ VERIFY( NeedStack(p, p->tos+1); )
p->tos++;
p->aStack[p->tos].n = nByte;
p->aStack[p->tos].flags = STK_Str|STK_Dyn;
case OP_Open: {
int busy = 0;
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
+ VERIFY( if( i<0 ) goto bad_instruction; )
if( i>=p->nCursor ){
int j;
p->aCsr = sqliteRealloc( p->aCsr, (i+1)*sizeof(Cursor) );
case OP_Fetch: {
int i = pOp->p1;
int tos = p->tos;
- if( tos<0 ) goto not_enough_stack;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
if( i>=0 && i<p->nCursor && p->aCsr[i].pCursor ){
if( p->aStack[tos].flags & STK_Int ){
pBe->Fetch(p->aCsr[i].pCursor, sizeof(int),
*/
case OP_Fcnt: {
int i = ++p->tos;
- if( NeedStack(p, p->tos) ) goto no_mem;
+ VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
p->aStack[i].i = p->nFetch;
p->aStack[i].flags = STK_Int;
break;
int i = pOp->p1;
int tos = p->tos;
int alreadyExists = 0;
- if( tos<0 ) goto not_enough_stack;
- if( i>=0 && i<p->nCursor && p->aCsr[i].pCursor ){
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
+ if( VERIFY( i>=0 && i<p->nCursor && ) p->aCsr[i].pCursor ){
if( p->aStack[tos].flags & STK_Int ){
alreadyExists = pBe->Test(p->aCsr[i].pCursor, sizeof(int),
(char*)&p->aStack[tos].i);
case OP_New: {
int i = pOp->p1;
int v;
- if( i<0 || i>=p->nCursor || p->aCsr[i].pCursor==0 ){
+ if( VERIFY( i<0 || i>=p->nCursor || ) p->aCsr[i].pCursor==0 ){
v = 0;
}else{
v = pBe->New(p->aCsr[i].pCursor);
}
- NeedStack(p, p->tos+1);
+ VERIFY( NeedStack(p, p->tos+1); )
p->tos++;
p->aStack[p->tos].i = v;
p->aStack[p->tos].flags = STK_Int;
int tos = p->tos;
int nos = p->tos-1;
int i = pOp->p1;
- if( nos<0 ) goto not_enough_stack;
- if( i>=0 && i<p->nCursor && p->aCsr[i].pCursor!=0 ){
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
+ if( VERIFY( i>=0 && i<p->nCursor && ) p->aCsr[i].pCursor!=0 ){
char *zKey;
int nKey;
if( (p->aStack[nos].flags & STK_Int)==0 ){
case OP_Delete: {
int tos = p->tos;
int i = pOp->p1;
- if( tos<0 ) goto not_enough_stack;
- if( i>=0 && i<p->nCursor && p->aCsr[i].pCursor!=0 ){
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
+ if( VERIFY( i>=0 && i<p->nCursor && ) p->aCsr[i].pCursor!=0 ){
char *zKey;
int nKey;
if( p->aStack[tos].flags & STK_Int ){
*/
case OP_KeyAsData: {
int i = pOp->p1;
- if( i>=0 && i<p->nCursor && p->aCsr[i].pCursor!=0 ){
+ if( VERIFY( i>=0 && i<p->nCursor && ) p->aCsr[i].pCursor!=0 ){
p->aCsr[i].keyAsData = pOp->p2;
}
break;
DbbeCursor *pCrsr;
char *z;
- if( NeedStack(p, tos) ) goto no_mem;
- if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
+ VERIFY( if( NeedStack(p, tos) ) goto no_mem; )
+ if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){
if( p->aCsr[i].keyAsData ){
amt = pBe->KeyLength(pCrsr);
if( amt<=sizeof(int)*(p2+1) ){
int tos = ++p->tos;
DbbeCursor *pCrsr;
- if( NeedStack(p, p->tos) ) goto no_mem;
- if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
+ VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
+ if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){
char *z = pBe->ReadKey(pCrsr, 0);
if( p->aCsr[i].keyAsData ){
p->zStack[tos] = z;
*/
case OP_Rewind: {
int i = pOp->p1;
- if( i>=0 && i<p->nCursor && p->aCsr[i].pCursor!=0 ){
+ if( VERIFY( i>=0 && i<p->nCursor && ) p->aCsr[i].pCursor!=0 ){
pBe->Rewind(p->aCsr[i].pCursor);
}
break;
*/
case OP_Next: {
int i = pOp->p1;
- if( i>=0 && i<p->nCursor && p->aCsr[i].pCursor!=0 ){
+ if( VERIFY( i>=0 && i<p->nCursor && ) p->aCsr[i].pCursor!=0 ){
if( pBe->NextKey(p->aCsr[i].pCursor)==0 ){
pc = pOp->p2 - 1;
}else{
int tos = ++p->tos;
DbbeCursor *pCrsr;
- if( NeedStack(p, p->tos) ) goto no_mem;
+ VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
p->zStack[tos] = 0;
- if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
+ if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){
int *aIdx;
int nIdx;
int j, k;
int tos = p->tos;
int nos = tos - 1;
DbbeCursor *pCrsr;
- if( nos<0 ) goto not_enough_stack;
- if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
+ if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){
int r;
int newVal;
Integerify(p, nos);
int tos = p->tos;
int nos = tos - 1;
DbbeCursor *pCrsr;
- if( nos<0 ) goto not_enough_stack;
- if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
+ VERIFY( if( nos<0 ) goto not_enough_stack; )
+ if( VERIFY( i>=0 && i<p->nCursor && ) (pCrsr = p->aCsr[i].pCursor)!=0 ){
int *aIdx;
int nIdx;
int j, k;
*/
case OP_ListOpen: {
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
+ VERIFY( if( i<0 ) goto bad_instruction; )
if( i>=p->nList ){
int j;
p->apList = sqliteRealloc( p->apList, (i+1)*sizeof(FILE*) );
*/
case OP_ListWrite: {
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
- if( p->tos<0 ) goto not_enough_stack;
- if( i<p->nList && p->apList[i]!=0 ){
+ VERIFY( if( i<0 ) goto bad_instruction; )
+ VERIFY( if( p->tos<0 ) goto not_enough_stack; )
+ if( VERIFY( i<p->nList && ) p->apList[i]!=0 ){
int val;
Integerify(p, p->tos);
val = p->aStack[p->tos].i;
*/
case OP_ListRewind: {
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
- if( i<p->nList && p->apList[i]!=0 ){
+ VERIFY( if( i<0 ) goto bad_instruction; )
+ if( VERIFY( i<p->nList && ) p->apList[i]!=0 ){
rewind(p->apList[i]);
}
break;
case OP_ListRead: {
int i = pOp->p1;
int val, amt;
- if( i<0 || i>=p->nList || p->apList[i]==0 ) goto bad_instruction;
+ VERIFY(if( i<0 || i>=p->nList || p->apList[i]==0 )goto bad_instruction;)
amt = fread(&val, sizeof(int), 1, p->apList[i]);
if( amt==1 ){
p->tos++;
*/
case OP_ListClose: {
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
- if( i<p->nList && p->apList[i]!=0 ){
+ VERIFY( if( i<0 ) goto bad_instruction; )
+ if( VERIFY( i<p->nList && ) p->apList[i]!=0 ){
pBe->CloseTempFile(pBe, p->apList[i]);
p->apList[i] = 0;
}
*/
case OP_SortOpen: {
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
+ VERIFY( if( i<0 ) goto bad_instruction; )
if( i>=p->nSort ){
int j;
p->apSort = sqliteRealloc( p->apSort, (i+1)*sizeof(Sorter*) );
int tos = p->tos;
int nos = tos - 1;
Sorter *pSorter;
- if( i<0 || i>=p->nSort ) goto bad_instruction;
- if( tos<1 ) goto not_enough_stack;
+ VERIFY( if( i<0 || i>=p->nSort ) goto bad_instruction; )
+ VERIFY( if( tos<1 ) goto not_enough_stack; )
if( Stringify(p, tos) || Stringify(p, nos) ) goto no_mem;
pSorter = sqliteMalloc( sizeof(Sorter) );
if( pSorter==0 ) goto no_mem;
int i, j;
nField = pOp->p1;
- if( p->tos+1<nField ) goto not_enough_stack;
+ VERIFY( if( p->tos+1<nField ) goto not_enough_stack; )
nByte = 0;
for(i=p->tos-nField+1; i<=p->tos; i++){
if( (p->aStack[i].flags & STK_Null)==0 ){
}
}
PopStack(p, nField);
- NeedStack(p, p->tos+1);
+ VERIFY( NeedStack(p, p->tos+1); )
p->tos++;
p->aStack[p->tos].n = nByte;
p->zStack[p->tos] = (char*)azArg;
int i, j, k;
nField = strlen(pOp->p3);
- if( p->tos+1<nField ) goto not_enough_stack;
+ VERIFY( if( p->tos+1<nField ) goto not_enough_stack; )
nByte = 1;
for(i=p->tos-nField+1; i<=p->tos; i++){
if( Stringify(p, i) ) goto no_mem;
}
zNewKey[j] = 0;
PopStack(p, nField);
- NeedStack(p, p->tos+1);
+ VERIFY( NeedStack(p, p->tos+1); )
p->tos++;
p->aStack[p->tos].n = nByte;
p->aStack[p->tos].flags = STK_Str|STK_Dyn;
case OP_Sort: {
int j;
j = pOp->p1;
- if( j<0 ) goto bad_instruction;
+ VERIFY( if( j<0 ) goto bad_instruction; )
if( j<p->nSort ){
int i;
Sorter *pElem;
*/
case OP_SortNext: {
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
- if( i<p->nSort && p->apSort[i]!=0 ){
+ VERIFY( if( i<0 ) goto bad_instruction; )
+ if( VERIFY( i<p->nSort && ) p->apSort[i]!=0 ){
Sorter *pSorter = p->apSort[i];
p->apSort[i] = pSorter->pNext;
p->tos++;
- NeedStack(p, p->tos);
+ VERIFY( NeedStack(p, p->tos); )
p->zStack[p->tos] = pSorter->pData;
p->aStack[p->tos].n = pSorter->nData;
p->aStack[p->tos].flags = STK_Str|STK_Dyn;
*/
case OP_SortKey: {
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
+ VERIFY( if( i<0 ) goto bad_instruction; )
if( i<p->nSort && p->apSort[i]!=0 ){
Sorter *pSorter = p->apSort[i];
p->tos++;
- NeedStack(p, p->tos);
+ VERIFY( NeedStack(p, p->tos); )
sqliteSetString(&p->zStack[p->tos], pSorter->zKey, 0);
p->aStack[p->tos].n = pSorter->nKey;
p->aStack[p->tos].flags = STK_Str|STK_Dyn;
*/
case OP_SortCallback: {
int i = p->tos;
- if( i<0 ) goto not_enough_stack;
+ VERIFY( if( i<0 ) goto not_enough_stack; )
if( xCallback!=0 ){
if( xCallback(pArg, pOp->p1, (char**)p->zStack[i], p->azColName) ){
rc = SQLITE_ABORT;
case OP_SortClose: {
Sorter *pSorter;
int i = pOp->p1;
- if( i<0 ) goto bad_instruction;
+ VERIFY( if( i<0 ) goto bad_instruction; )
if( i<p->nSort ){
while( (pSorter = p->apSort[i])!=0 ){
p->apSort[i] = pSorter->pNext;
** If P3 is "stdin" then open standard input for reading.
*/
case OP_FileOpen: {
- if( pOp->p3==0 ) goto bad_instruction;
+ VERIFY( if( pOp->p3==0 ) goto bad_instruction; )
if( p->pFile ){
if( p->pFile!=stdin ) fclose(p->pFile);
p->pFile = 0;
case OP_FileField: {
int i = pOp->p1;
char *z;
- if( NeedStack(p, p->tos+1) ) goto no_mem;
- if( i>=0 && i<p->nField && p->azField ){
+ VERIFY( if( NeedStack(p, p->tos+1) ) goto no_mem; )
+ if( VERIFY( i>=0 && i<p->nField && ) p->azField ){
z = p->azField[i];
}else{
z = 0;
int tos = p->tos;
Mem *pMem;
char *zOld;
- if( tos<0 ) goto not_enough_stack;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
if( i>=p->nMem ){
int nOld = p->nMem;
p->nMem = i + 5;
case OP_MemLoad: {
int tos = ++p->tos;
int i = pOp->p1;
- if( NeedStack(p, tos) ) goto no_mem;
+ VERIFY( if( NeedStack(p, tos) ) goto no_mem; )
if( i<0 || i>=p->nMem ){
p->aStack[tos].flags = STK_Null;
p->zStack[tos] = 0;
char *zKey;
int nKey;
- if( tos<0 ) goto not_enough_stack;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
Stringify(p, tos);
zKey = p->zStack[tos];
nKey = p->aStack[tos].n;
AggElem *pFocus = AggInFocus(p->agg);
int i = pOp->p2;
int tos = p->tos;
- if( tos<0 ) goto not_enough_stack;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
if( pFocus==0 ) goto no_mem;
- if( i>=0 && i<p->agg.nMem ){
+ if( VERIFY( i>=0 && ) i<p->agg.nMem ){
Mem *pMem = &pFocus->aMem[i];
char *zOld;
if( pMem->s.flags & STK_Dyn ){
AggElem *pFocus = AggInFocus(p->agg);
int i = pOp->p2;
int tos = ++p->tos;
- if( NeedStack(p, tos) ) goto no_mem;
+ VERIFY( if( NeedStack(p, tos) ) goto no_mem; )
if( pFocus==0 ) goto no_mem;
- if( i>=0 && i<p->agg.nMem ){
+ if( VERIFY( i>=0 && ) i<p->agg.nMem ){
Mem *pMem = &pFocus->aMem[i];
p->aStack[tos] = pMem->s;
p->zStack[tos] = pMem->z;
case OP_SetFound: {
int i = pOp->p1;
int tos = p->tos;
- if( tos<0 ) goto not_enough_stack;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
Stringify(p, tos);
- if( i>=0 && i<p->nSet && SetTest(&p->aSet[i], p->zStack[tos]) ){
+ if( VERIFY( i>=0 && i<p->nSet &&) SetTest(&p->aSet[i], p->zStack[tos])){
pc = pOp->p2 - 1;
}
PopStack(p, 1);
case OP_SetNotFound: {
int i = pOp->p1;
int tos = p->tos;
- if( tos<0 ) goto not_enough_stack;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
Stringify(p, tos);
- if( i>=0 && i<p->nSet && !SetTest(&p->aSet[i], p->zStack[tos]) ){
+ if(VERIFY( i>=0 && i<p->nSet &&) !SetTest(&p->aSet[i], p->zStack[tos])){
pc = pOp->p2 - 1;
}
PopStack(p, 1);
case OP_Strlen: {
int tos = p->tos;
int len;
- if( tos<0 ) goto not_enough_stack;
+ VERIFY( if( tos<0 ) goto not_enough_stack; )
Stringify(p, tos);
len = p->aStack[tos].n-1;
PopStack(p, 1);
char *z;
if( pOp->p2==0 ){
- if( p->tos<0 ) goto not_enough_stack;
+ VERIFY( if( p->tos<0 ) goto not_enough_stack; )
Integerify(p, p->tos);
cnt = p->aStack[p->tos].i;
PopStack(p, 1);
cnt = pOp->p2;
}
if( pOp->p1==0 ){
- if( p->tos<0 ) goto not_enough_stack;
+ VERIFY( if( p->tos<0 ) goto not_enough_stack; )
Integerify(p, p->tos);
start = p->aStack[p->tos].i - 1;
PopStack(p, 1);
}else{
start = pOp->p1 - 1;
}
- if( p->tos<0 ) goto not_enough_stack;
+ VERIFY( if( p->tos<0 ) goto not_enough_stack; )
Stringify(p, p->tos);
n = p->aStack[p->tos].n - 1;
if( start<0 ){