bpo-28298: make array 'Q', 'L' and 'I' accept big intables as elements · python/cpython@e2c88bd (original) (raw)

`@@ -331,35 +331,51 @@ II_getitem(arrayobject *ap, Py_ssize_t i)

`

331

331

` (unsigned long) ((unsigned int *)ap->ob_item)[i]);

`

332

332

`}

`

333

333

``

``

334

`+

static PyObject *

`

``

335

`+

get_int_unless_float(PyObject *v)

`

``

336

`+

{

`

``

337

`+

if (PyFloat_Check(v)) {

`

``

338

`+

PyErr_SetString(PyExc_TypeError,

`

``

339

`+

"array item must be integer");

`

``

340

`+

return NULL;

`

``

341

`+

}

`

``

342

`+

return (PyObject *)_PyLong_FromNbInt(v);

`

``

343

`+

}

`

``

344

+

334

345

`static int

`

335

346

`II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)

`

336

347

`{

`

337

348

`unsigned long x;

`

338

``

`-

if (PyLong_Check(v)) {

`

339

``

`-

x = PyLong_AsUnsignedLong(v);

`

340

``

`-

if (x == (unsigned long) -1 && PyErr_Occurred())

`

``

349

`+

int do_decref = 0; /* if nb_int was called */

`

``

350

+

``

351

`+

if (!PyLong_Check(v)) {

`

``

352

`+

v = get_int_unless_float(v);

`

``

353

`+

if (NULL == v) {

`

341

354

`return -1;

`

``

355

`+

}

`

``

356

`+

do_decref = 1;

`

342

357

` }

`

343

``

`-

else {

`

344

``

`-

long y;

`

345

``

`-

if (!PyArg_Parse(v, "l;array item must be integer", &y))

`

346

``

`-

return -1;

`

347

``

`-

if (y < 0) {

`

348

``

`-

PyErr_SetString(PyExc_OverflowError,

`

349

``

`-

"unsigned int is less than minimum");

`

350

``

`-

return -1;

`

``

358

`+

x = PyLong_AsUnsignedLong(v);

`

``

359

`+

if (x == (unsigned long)-1 && PyErr_Occurred()) {

`

``

360

`+

if (do_decref) {

`

``

361

`+

Py_DECREF(v);

`

351

362

` }

`

352

``

`-

x = (unsigned long)y;

`

353

``

-

``

363

`+

return -1;

`

354

364

` }

`

355

365

`if (x > UINT_MAX) {

`

356

366

`PyErr_SetString(PyExc_OverflowError,

`

357

``

`-

"unsigned int is greater than maximum");

`

``

367

`+

"unsigned int is greater than maximum");

`

``

368

`+

if (do_decref) {

`

``

369

`+

Py_DECREF(v);

`

``

370

`+

}

`

358

371

`return -1;

`

359

372

` }

`

360

``

-

361

373

`if (i >= 0)

`

362

374

` ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;

`

``

375

+

``

376

`+

if (do_decref) {

`

``

377

`+

Py_DECREF(v);

`

``

378

`+

}

`

363

379

`return 0;

`

364

380

`}

`

365

381

``

`@@ -390,31 +406,28 @@ static int

`

390

406

`LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)

`

391

407

`{

`

392

408

`unsigned long x;

`

393

``

`-

if (PyLong_Check(v)) {

`

394

``

`-

x = PyLong_AsUnsignedLong(v);

`

395

``

`-

if (x == (unsigned long) -1 && PyErr_Occurred())

`

396

``

`-

return -1;

`

397

``

`-

}

`

398

``

`-

else {

`

399

``

`-

long y;

`

400

``

`-

if (!PyArg_Parse(v, "l;array item must be integer", &y))

`

401

``

`-

return -1;

`

402

``

`-

if (y < 0) {

`

403

``

`-

PyErr_SetString(PyExc_OverflowError,

`

404

``

`-

"unsigned long is less than minimum");

`

``

409

`+

int do_decref = 0; /* if nb_int was called */

`

``

410

+

``

411

`+

if (!PyLong_Check(v)) {

`

``

412

`+

v = get_int_unless_float(v);

`

``

413

`+

if (NULL == v) {

`

405

414

`return -1;

`

406

415

` }

`

407

``

`-

x = (unsigned long)y;

`

408

``

-

``

416

`+

do_decref = 1;

`

409

417

` }

`

410

``

`-

if (x > ULONG_MAX) {

`

411

``

`-

PyErr_SetString(PyExc_OverflowError,

`

412

``

`-

"unsigned long is greater than maximum");

`

``

418

`+

x = PyLong_AsUnsignedLong(v);

`

``

419

`+

if (x == (unsigned long)-1 && PyErr_Occurred()) {

`

``

420

`+

if (do_decref) {

`

``

421

`+

Py_DECREF(v);

`

``

422

`+

}

`

413

423

`return -1;

`

414

424

` }

`

415

``

-

416

425

`if (i >= 0)

`

417

426

` ((unsigned long *)ap->ob_item)[i] = x;

`

``

427

+

``

428

`+

if (do_decref) {

`

``

429

`+

Py_DECREF(v);

`

``

430

`+

}

`

418

431

`return 0;

`

419

432

`}

`

420

433

``

`@@ -448,25 +461,28 @@ static int

`

448

461

`QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)

`

449

462

`{

`

450

463

`unsigned PY_LONG_LONG x;

`

451

``

`-

if (PyLong_Check(v)) {

`

452

``

`-

x = PyLong_AsUnsignedLongLong(v);

`

453

``

`-

if (x == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred())

`

``

464

`+

int do_decref = 0; /* if nb_int was called */

`

``

465

+

``

466

`+

if (!PyLong_Check(v)) {

`

``

467

`+

v = get_int_unless_float(v);

`

``

468

`+

if (NULL == v) {

`

454

469

`return -1;

`

``

470

`+

}

`

``

471

`+

do_decref = 1;

`

455

472

` }

`

456

``

`-

else {

`

457

``

`-

PY_LONG_LONG y;

`

458

``

`-

if (!PyArg_Parse(v, "L;array item must be integer", &y))

`

459

``

`-

return -1;

`

460

``

`-

if (y < 0) {

`

461

``

`-

PyErr_SetString(PyExc_OverflowError,

`

462

``

`-

"unsigned long long is less than minimum");

`

463

``

`-

return -1;

`

``

473

`+

x = PyLong_AsUnsignedLongLong(v);

`

``

474

`+

if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) {

`

``

475

`+

if (do_decref) {

`

``

476

`+

Py_DECREF(v);

`

464

477

` }

`

465

``

`-

x = (unsigned PY_LONG_LONG)y;

`

``

478

`+

return -1;

`

466

479

` }

`

467

``

-

468

480

`if (i >= 0)

`

469

481

` ((unsigned PY_LONG_LONG *)ap->ob_item)[i] = x;

`

``

482

+

``

483

`+

if (do_decref) {

`

``

484

`+

Py_DECREF(v);

`

``

485

`+

}

`

470

486

`return 0;

`

471

487

`}

`

472

488

`#endif

`