-C Use\scompiler\sintrinsics\sto\simprove\sthe\sperformance\sof\nsqlite3Multiply160().
-D 2026-03-19T13:40:40.360
+C Restructure\ssome\sinternal\ssubroutine\ssignatures\sfor\simproved\nperformance\sof\saffinity\stype\sconversions.
+D 2026-03-19T17:08:08.454
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
F src/util.c 51662502243422f3238a7220fe00de32d9a7d0d3149dd33c6d721d7039cb2e74
F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82
-F src/vdbe.c 01e380d1847dd934f9c6c73b2bb9df68915b3f917e63244f6f02c95641ca3acb
+F src/vdbe.c dbafc6f5762f9ae90d9dc9ed065a31743a8ceafbdbfb1a0a3a228921fb3cc36a
F src/vdbe.h 70e862ac8a11b590f8c1eaac17a0078429d42bc4ea3f757a9af0f451dd966a71
-F src/vdbeInt.h f7157f110f88f1d9d8338c292faf23a9129f6712563ade2b408537c95e17bdef
+F src/vdbeInt.h c31ba4dc8d280c2b1dc89c6fcee68f2555e3813ab34279552c20b964c0e338b1
F src/vdbeapi.c 6cdcbe5c7afa754c998e73d2d5d2805556268362914b952811bdfb9c78a37cf1
F src/vdbeaux.c 81687c55682b9f4d942186695f4f7fa4743c564a985e0889def52eded9076d61
F src/vdbeblob.c b3f0640db9642fbdc88bd6ebcc83d6009514cafc98f062f675f2c8d505d82692
-F src/vdbemem.c 317ec5e870ddb16951b606c9fe8be22baef22ecbe46f58fdefc259662238afb7
+F src/vdbemem.c 05610ea8423c4c852a9039e47fb6a2706d4d848758602ebf30da6c3212344695
F src/vdbesort.c b69220f4ea9ffea5fdef34d968c60305444eea909252a81933b54c296d9cca70
F src/vdbetrace.c 49e689f751505839742f4a243a1a566e57d5c9eaf0d33bbaa26e2de3febf7b41
F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P cadb6cdd32c3c9abd7e063f25acd39dddc9ff764a16019ffd5aa11063175326f
-R 4f3af9012bcfc827e4349045b7fa7e69
+P 3c64f31392328f51e205fde52f19cf70c193e90897ccb7e93c685bad4f342cac
+R 72f078867d2671a9f24c867ea87f8152
U drh
-Z 0005327f465235b9cff79f72edc88c99
+Z b5c58da09518d5fa628ac92460368943
# Remove this line to create a well-formed Fossil manifest.
}
/*
-** Invoke sqlite3AtoF() on the text value of pMem and return the
-** double result. If sqlite3AtoF() returns an error code, write
-** that code into *pRC if (*pRC)!=NULL.
-**
-** The caller must ensure that pMem->db!=0 and that pMem is in
-** mode MEM_Str or MEM_Blob.
+** This routine implements the uncommon and slower path for
+** sqlite3MemValueRC(). It is broken out into a separate
+** no-inline routine so that the main routine can avoid unnecessary
+** stack pushes.
*/
-SQLITE_NOINLINE double sqlite3MemRealValueRC(Mem *pMem, int *pRC){
- double val = (double)0;
- int rc = 0;
- assert( pMem->db!=0 );
- assert( pMem->flags & (MEM_Str|MEM_Blob) );
- if( pMem->z==0 ){
- /* no-op */
- }else if( pMem->enc==SQLITE_UTF8
- && ((pMem->flags & MEM_Term)!=0 || sqlite3VdbeMemZeroTerminateIfAble(pMem))
- ){
- rc = sqlite3AtoF(pMem->z, &val);
- }else if( pMem->n==0 ){
- /* no-op */
- }else if( pMem->enc==SQLITE_UTF8 ){
+static SQLITE_NOINLINE int sqlite3MemRealValueRCSlowPath(
+ Mem *pMem,
+ double *pValue
+){
+ int rc = SQLITE_OK;
+ *pValue = 0.0;
+ if( pMem->enc==SQLITE_UTF8 ){
char *zCopy = sqlite3DbStrNDup(pMem->db, pMem->z, pMem->n);
if( zCopy ){
- rc = sqlite3AtoF(zCopy, &val);
+ rc = sqlite3AtoF(zCopy, pValue);
sqlite3DbFree(pMem->db, zCopy);
}
+ return rc;
}else{
int n, i, j;
char *zCopy;
}
assert( j<=n/2 );
zCopy[j] = 0;
- rc = sqlite3AtoF(zCopy, &val);
+ rc = sqlite3AtoF(zCopy, pValue);
if( i<n ) rc = -100;
sqlite3DbFree(pMem->db, zCopy);
}
+ return rc;
}
- if( pRC ) *pRC = rc;
- return val;
+}
+
+/*
+** Invoke sqlite3AtoF() on the text value of pMem and return the
+** double result. If sqlite3AtoF() returns an error code, write
+** that code into *pRC if (*pRC)!=NULL.
+**
+** The caller must ensure that pMem->db!=0 and that pMem is in
+** mode MEM_Str or MEM_Blob.
+*/
+int sqlite3MemRealValueRC(Mem *pMem, double *pValue){
+ assert( pMem->db!=0 );
+ assert( pMem->flags & (MEM_Str|MEM_Blob) );
+ if( pMem->z==0 ){
+ *pValue = 0.0;
+ return 0;
+ }else if( pMem->enc==SQLITE_UTF8
+ && ((pMem->flags & MEM_Term)!=0 || sqlite3VdbeMemZeroTerminateIfAble(pMem))
+ ){
+ return sqlite3AtoF(pMem->z, pValue);
+ }else if( pMem->n==0 ){
+ *pValue = 0.0;
+ return 0;
+ }else{
+ return sqlite3MemRealValueRCSlowPath(pMem, pValue);
+ }
+}
+
+/*
+** This routine acts as a bridge from sqlite3VdbeRealValue() to
+** sqlite3VdbeRealValueRC, allowing sqlite3VdbeRealValue() to avoid
+** stuffing values onto the stack.
+*/
+static SQLITE_NOINLINE double sqlite3MemRealValueNoRC(Mem *pMem){
+ double r;
+ (void)sqlite3MemRealValueRC(pMem, &r);
+ return r;
}
/*
testcase( pMem->flags & MEM_IntReal );
return (double)pMem->u.i;
}else if( pMem->flags & (MEM_Str|MEM_Blob) ){
- return sqlite3MemRealValueRC(pMem, 0);
+ return sqlite3MemRealValueNoRC(pMem);
}else{
/* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
return (double)0;
sqlite3_int64 ix;
assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 );
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
- pMem->u.r = sqlite3MemRealValueRC(pMem, &rc);
+ rc = sqlite3MemRealValueRC(pMem, &pMem->u.r);
if( ((rc==0 || rc==1) && sqlite3Atoi64(pMem->z, &ix, pMem->n, pMem->enc)<=1)
|| sqlite3RealSameAsInt(pMem->u.r, (ix = sqlite3RealToI64(pMem->u.r)))
){