diff options
author | sebres <sebres@users.sourceforge.net> | 2024-06-12 19:54:34 (GMT) |
---|---|---|
committer | sebres <sebres@users.sourceforge.net> | 2024-06-12 19:54:34 (GMT) |
commit | aeb50c05d348df60864b97608661cb5f5e222ac8 (patch) | |
tree | ebfa6fce955518c0a4d2778d08dd61e13820564b /generic | |
parent | c0602af1ad679af5d001d79c58d9811ef9cc476a (diff) | |
download | tcl-aeb50c05d348df60864b97608661cb5f5e222ac8.zip tcl-aeb50c05d348df60864b97608661cb5f5e222ac8.tar.gz tcl-aeb50c05d348df60864b97608661cb5f5e222ac8.tar.bz2 |
ultimately closes [f05f5ef759c1f7f9]: since bigints are not supported yet, trying to use them as series parameters would cause "integer value too large to represent" unless implemented.
Diffstat (limited to 'generic')
-rwxr-xr-x | generic/tclArithSeries.c | 62 | ||||
-rw-r--r-- | generic/tclCmdIL.c | 6 | ||||
-rw-r--r-- | generic/tclInt.h | 5 |
3 files changed, 40 insertions, 33 deletions
diff --git a/generic/tclArithSeries.c b/generic/tclArithSeries.c index 7a41518..cd3b54f 100755 --- a/generic/tclArithSeries.c +++ b/generic/tclArithSeries.c @@ -421,8 +421,9 @@ NewArithSeriesDbl(double start, double end, double step, Tcl_WideInt len) * None. *---------------------------------------------------------------------- */ -static void +static int assignNumber( + Tcl_Interp *interp, int useDoubles, Tcl_WideInt *intNumberPtr, double *dblNumberPtr, @@ -431,9 +432,15 @@ assignNumber( void *clientData; int tcl_number_type; - if (Tcl_GetNumberFromObj(NULL, numberObj, &clientData, &tcl_number_type) != TCL_OK - || tcl_number_type == TCL_NUMBER_BIG) { - return; + if (Tcl_GetNumberFromObj(interp, numberObj, &clientData, + &tcl_number_type) != TCL_OK) { + return TCL_ERROR; + } + if (tcl_number_type == TCL_NUMBER_BIG) { + /* bignum is not supported yet. */ + Tcl_WideInt w; + (void)Tcl_GetWideIntFromObj(interp, numberObj, &w); + return TCL_ERROR; } if (useDoubles) { if (tcl_number_type != TCL_NUMBER_INT) { @@ -448,6 +455,7 @@ assignNumber( *intNumberPtr = (Tcl_WideInt)*(double *)clientData; } } + return TCL_OK; } /* @@ -462,7 +470,7 @@ assignNumber( * Results: * * A Tcl_Obj pointer to the created ArithSeries object. - * An empty Tcl_Obj if the range is invalid. + * NULL if the range is invalid. * * Side Effects: * @@ -470,10 +478,9 @@ assignNumber( *---------------------------------------------------------------------- */ -int +Tcl_Obj * TclNewArithSeriesObj( Tcl_Interp *interp, /* For error reporting */ - Tcl_Obj **arithSeriesObj, /* return value */ int useDoubles, /* Flag indicates values start, ** end, step, are treated as doubles */ Tcl_Obj *startObj, /* Starting value */ @@ -484,31 +491,38 @@ TclNewArithSeriesObj( double dstart, dend, dstep; Tcl_WideInt start, end, step; Tcl_WideInt len = -1; + Tcl_Obj *objPtr; if (startObj) { - assignNumber(useDoubles, &start, &dstart, startObj); + if (assignNumber(interp, useDoubles, &start, &dstart, startObj) != TCL_OK) { + return NULL; + } } else { start = 0; dstart = start; } if (stepObj) { - assignNumber(useDoubles, &step, &dstep, stepObj); + if (assignNumber(interp, useDoubles, &step, &dstep, stepObj) != TCL_OK) { + return NULL; + } if (useDoubles) { step = dstep; } else { dstep = step; } if (dstep == 0) { - TclNewObj(*arithSeriesObj); - return TCL_OK; + TclNewObj(objPtr); + return objPtr; } } if (endObj) { - assignNumber(useDoubles, &end, &dend, endObj); + if (assignNumber(interp, useDoubles, &end, &dend, endObj) != TCL_OK) { + return NULL; + } } if (lenObj) { if (TCL_OK != Tcl_GetWideIntFromObj(interp, lenObj, &len)) { - return TCL_ERROR; + return NULL; } } @@ -552,15 +566,13 @@ TclNewArithSeriesObj( interp, Tcl_NewStringObj("max length of a Tcl list exceeded", -1)); Tcl_SetErrorCode(interp, "TCL", "MEMORY", (void *)NULL); - return TCL_ERROR; + return NULL; } - if (arithSeriesObj) { - *arithSeriesObj = (useDoubles) + objPtr = (useDoubles) ? NewArithSeriesDbl(dstart, dend, dstep, len) : NewArithSeriesInt(start, end, step, len); - } - return TCL_OK; + return objPtr; } /* @@ -769,12 +781,8 @@ TclArithSeriesObjRange( if (Tcl_IsShared(arithSeriesObj) || ((arithSeriesObj->refCount > 1))) { - Tcl_Obj *newSlicePtr; - if (TclNewArithSeriesObj(interp, &newSlicePtr, - arithSeriesRepPtr->isDouble, startObj, endObj, - stepObj, NULL) != TCL_OK) { - newSlicePtr = NULL; - } + Tcl_Obj *newSlicePtr = TclNewArithSeriesObj(interp, + arithSeriesRepPtr->isDouble, startObj, endObj, stepObj, NULL); Tcl_DecrRefCount(startObj); Tcl_DecrRefCount(endObj); Tcl_DecrRefCount(stepObj); @@ -974,10 +982,8 @@ TclArithSeriesObjReverse( ((arithSeriesObj->refCount > 1))) { Tcl_Obj *lenObj; TclNewIntObj(lenObj, len); - if (TclNewArithSeriesObj(interp, &resultObj, isDouble, - startObj, endObj, stepObj, lenObj) != TCL_OK) { - resultObj = NULL; - } + resultObj = TclNewArithSeriesObj(interp, isDouble, + startObj, endObj, stepObj, lenObj); Tcl_DecrRefCount(lenObj); } else { diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index 986bd1e..f01eb2d 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -4352,10 +4352,12 @@ Tcl_LseqObjCmd( /* * Success! Now lets create the series object. */ - status = TclNewArithSeriesObj(interp, &arithSeriesPtr, + arithSeriesPtr = TclNewArithSeriesObj(interp, useDoubles, start, end, step, elementCount); - if (status == TCL_OK) { + status = TCL_ERROR; + if (arithSeriesPtr) { + status = TCL_OK; Tcl_SetObjResult(interp, arithSeriesPtr); } diff --git a/generic/tclInt.h b/generic/tclInt.h index 1b88332..5a09f34 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -1081,9 +1081,8 @@ MODULE_SCOPE Tcl_Obj * TclArithSeriesObjReverse(Tcl_Interp *interp, Tcl_Obj *arithSeriesPtr); MODULE_SCOPE int TclArithSeriesGetElements(Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size *objcPtr, Tcl_Obj ***objvPtr); -MODULE_SCOPE int TclNewArithSeriesObj(Tcl_Interp *interp, - Tcl_Obj **arithSeriesObj, int useDoubles, - Tcl_Obj *startObj, Tcl_Obj *endObj, +MODULE_SCOPE Tcl_Obj * TclNewArithSeriesObj(Tcl_Interp *interp, + int useDoubles, Tcl_Obj *startObj, Tcl_Obj *endObj, Tcl_Obj *stepObj, Tcl_Obj *lenObj); /* |