@@ -507,19 +507,20 @@ static int hash_probes[] = {0, 0};
507
507
508
508
enum { CHUNK = (1 << 14 ), SMALL = (1 << 9 ) };
509
509
510
- // Call malloc. Try to combine small blocks and free much later.
511
- void * unpacker::alloc_heap (size_t size, bool smallOK, bool temp) {
512
- if (!smallOK || size > SMALL) {
513
- void * res = must_malloc ((int )size);
510
+ // Call calloc. Try to combine small blocks and free much later.
511
+ void * unpacker::calloc_heap (size_t count, size_t size, bool smallOK, bool temp) {
512
+ size_t ssize = scale_size (count, size);
513
+ if (!smallOK || ssize > SMALL) {
514
+ void * res = must_calloc (count, size);
514
515
(temp ? &tmallocs : &mallocs)->add (res);
515
516
return res;
516
517
}
517
518
fillbytes& xsmallbuf = *(temp ? &tsmallbuf : &smallbuf);
518
- if (!xsmallbuf.canAppend (size +1 )) {
519
+ if (!xsmallbuf.canAppend (ssize +1 )) {
519
520
xsmallbuf.init (CHUNK);
520
521
(temp ? &tmallocs : &mallocs)->add (xsmallbuf.base ());
521
522
}
522
- int growBy = (int )size ;
523
+ int growBy = (int )ssize ;
523
524
growBy += -growBy & 7 ; // round up mod 8
524
525
return xsmallbuf.grow (growBy);
525
526
}
@@ -984,10 +985,6 @@ void cpool::init(unpacker* u_, int counts[CONSTANT_Limit]) {
984
985
tag_index[tag].init (tag_count[tag], cpMap, tag);
985
986
}
986
987
987
- // Initialize *all* our entries once
988
- for (int i = 0 ; i < maxentries ; i++)
989
- entries[i].outputIndex = REQUESTED_NONE;
990
-
991
988
initGroupIndexes ();
992
989
// Initialize hashTab to a generous power-of-two size.
993
990
uint pow2 = 1 ;
@@ -1057,7 +1054,7 @@ static int compare_Utf8_chars(bytes& b1, bytes& b2) {
1057
1054
1058
1055
// Cf. PackageReader.readUtf8Bands
1059
1056
local_inline
1060
- void unpacker::read_Utf8_values (entry* cpMap, int len) {
1057
+ void unpacker::read_Utf8_values (entry* cpMap, int len, byte tag ) {
1061
1058
// Implicit first Utf8 string is the empty string.
1062
1059
enum {
1063
1060
// certain bands begin with implicit zeroes
@@ -1083,10 +1080,11 @@ void unpacker::read_Utf8_values(entry* cpMap, int len) {
1083
1080
int nbigsuf = 0 ;
1084
1081
fillbytes charbuf; // buffer to allocate small strings
1085
1082
charbuf.init ();
1086
-
1087
1083
// Third band: Read the char values in the unshared suffixes:
1088
1084
cp_Utf8_chars.readData (cp_Utf8_suffix.getIntTotal ());
1089
1085
for (i = 0 ; i < len; i++) {
1086
+ cp.initValues (cpMap[i], tag, i);
1087
+
1090
1088
int suffix = (i < SUFFIX_SKIP_1)? 0 : cp_Utf8_suffix.getInt ();
1091
1089
if (suffix < 0 ) {
1092
1090
abort (" bad utf8 suffix" );
@@ -1235,35 +1233,40 @@ void unpacker::read_Utf8_values(entry* cpMap, int len) {
1235
1233
}
1236
1234
1237
1235
local_inline
1238
- void unpacker::read_single_words (band& cp_band, entry* cpMap, int len) {
1236
+ void unpacker::read_single_words (band& cp_band, entry* cpMap, int len, byte tag, int loadable_base ) {
1239
1237
cp_band.readData (len);
1240
1238
for (int i = 0 ; i < len; i++) {
1241
- cpMap[i].value .i = cp_band.getInt (); // coding handles signs OK
1239
+ entry& e = cpMap[i];
1240
+ cp.initValues (e, tag, i, loadable_base);
1241
+ e.value .i = cp_band.getInt (); // coding handles signs OK
1242
1242
}
1243
1243
}
1244
1244
1245
1245
maybe_inline
1246
- void unpacker::read_double_words (band& cp_bands, entry* cpMap, int len) {
1246
+ void unpacker::read_double_words (band& cp_bands, entry* cpMap, int len, byte tag, int loadable_base ) {
1247
1247
band& cp_band_hi = cp_bands;
1248
1248
band& cp_band_lo = cp_bands.nextBand ();
1249
1249
cp_band_hi.readData (len);
1250
1250
cp_band_lo.readData (len);
1251
1251
for (int i = 0 ; i < len; i++) {
1252
- cpMap[i].value .l = cp_band_hi.getLong (cp_band_lo, true );
1252
+ entry& e = cpMap[i];
1253
+ cp.initValues (e, tag, i, loadable_base);
1254
+ e.value .l = cp_band_hi.getLong (cp_band_lo, true );
1253
1255
}
1254
1256
// cp_band_hi.done();
1255
1257
// cp_band_lo.done();
1256
1258
}
1257
1259
1258
1260
maybe_inline
1259
- void unpacker::read_single_refs (band& cp_band, byte refTag, entry* cpMap, int len) {
1261
+ void unpacker::read_single_refs (band& cp_band, byte refTag, entry* cpMap, int len, byte tag, int loadable_base ) {
1260
1262
assert (refTag == CONSTANT_Utf8);
1261
1263
cp_band.setIndexByTag (refTag);
1262
1264
cp_band.readData (len);
1263
1265
CHECK;
1264
1266
int indexTag = (cp_band.bn == e_cp_Class) ? CONSTANT_Class : 0 ;
1265
1267
for (int i = 0 ; i < len; i++) {
1266
1268
entry& e = cpMap[i];
1269
+ cp.initValues (e, tag, i, loadable_base);
1267
1270
e.refs = U_NEW (entry*, e.nrefs = 1 );
1268
1271
entry* utf = cp_band.getRef ();
1269
1272
CHECK;
@@ -1284,7 +1287,7 @@ void unpacker::read_single_refs(band& cp_band, byte refTag, entry* cpMap, int le
1284
1287
1285
1288
maybe_inline
1286
1289
void unpacker::read_double_refs (band& cp_band, byte ref1Tag, byte ref2Tag,
1287
- entry* cpMap, int len) {
1290
+ entry* cpMap, int len, byte tag ) {
1288
1291
band& cp_band1 = cp_band;
1289
1292
band& cp_band2 = cp_band.nextBand ();
1290
1293
cp_band1.setIndexByTag (ref1Tag);
@@ -1294,6 +1297,7 @@ void unpacker::read_double_refs(band& cp_band, byte ref1Tag, byte ref2Tag,
1294
1297
CHECK;
1295
1298
for (int i = 0 ; i < len; i++) {
1296
1299
entry& e = cpMap[i];
1300
+ cp.initValues (e, tag, i);
1297
1301
e.refs = U_NEW (entry*, e.nrefs = 2 );
1298
1302
e.refs [0 ] = cp_band1.getRef ();
1299
1303
CHECK;
@@ -1306,14 +1310,15 @@ void unpacker::read_double_refs(band& cp_band, byte ref1Tag, byte ref2Tag,
1306
1310
1307
1311
// Cf. PackageReader.readSignatureBands
1308
1312
maybe_inline
1309
- void unpacker::read_signature_values (entry* cpMap, int len) {
1313
+ void unpacker::read_signature_values (entry* cpMap, int len, byte tag ) {
1310
1314
cp_Signature_form.setIndexByTag (CONSTANT_Utf8);
1311
1315
cp_Signature_form.readData (len);
1312
1316
CHECK;
1313
1317
int ncTotal = 0 ;
1314
1318
int i;
1315
1319
for (i = 0 ; i < len; i++) {
1316
1320
entry& e = cpMap[i];
1321
+ cp.initValues (e, tag, i);
1317
1322
entry& form = *cp_Signature_form.getRef ();
1318
1323
CHECK;
1319
1324
int nc = 0 ;
@@ -1350,7 +1355,7 @@ void unpacker::checkLegacy(const char* name) {
1350
1355
}
1351
1356
1352
1357
maybe_inline
1353
- void unpacker::read_method_handle (entry* cpMap, int len) {
1358
+ void unpacker::read_method_handle (entry* cpMap, int len, byte tag, int loadable_base ) {
1354
1359
if (len > 0 ) {
1355
1360
checkLegacy (cp_MethodHandle_refkind.name );
1356
1361
}
@@ -1359,6 +1364,7 @@ void unpacker::read_method_handle(entry* cpMap, int len) {
1359
1364
cp_MethodHandle_member.readData (len);
1360
1365
for (int i = 0 ; i < len ; i++) {
1361
1366
entry& e = cpMap[i];
1367
+ cp.initValues (e, tag, i, loadable_base);
1362
1368
e.value .i = cp_MethodHandle_refkind.getInt ();
1363
1369
e.refs = U_NEW (entry*, e.nrefs = 1 );
1364
1370
e.refs [0 ] = cp_MethodHandle_member.getRef ();
@@ -1367,22 +1373,23 @@ void unpacker::read_method_handle(entry* cpMap, int len) {
1367
1373
}
1368
1374
1369
1375
maybe_inline
1370
- void unpacker::read_method_type (entry* cpMap, int len) {
1376
+ void unpacker::read_method_type (entry* cpMap, int len, byte tag, int loadable_base ) {
1371
1377
if (len > 0 ) {
1372
1378
checkLegacy (cp_MethodType.name );
1373
1379
}
1374
1380
cp_MethodType.setIndexByTag (CONSTANT_Signature);
1375
1381
cp_MethodType.readData (len);
1376
1382
for (int i = 0 ; i < len ; i++) {
1377
1383
entry& e = cpMap[i];
1384
+ cp.initValues (e, tag, i, loadable_base);
1378
1385
e.refs = U_NEW (entry*, e.nrefs = 1 );
1379
1386
e.refs [0 ] = cp_MethodType.getRef ();
1380
1387
CHECK;
1381
1388
}
1382
1389
}
1383
1390
1384
1391
maybe_inline
1385
- void unpacker::read_bootstrap_methods (entry* cpMap, int len) {
1392
+ void unpacker::read_bootstrap_methods (entry* cpMap, int len, byte tag ) {
1386
1393
if (len > 0 ) {
1387
1394
checkLegacy (cp_BootstrapMethod_ref.name );
1388
1395
}
@@ -1396,6 +1403,7 @@ void unpacker::read_bootstrap_methods(entry* cpMap, int len) {
1396
1403
for (int i = 0 ; i < len; i++) {
1397
1404
entry& e = cpMap[i];
1398
1405
int argc = cp_BootstrapMethod_arg_count.getInt ();
1406
+ cp.initValues (e, tag, i);
1399
1407
e.value .i = argc;
1400
1408
e.refs = U_NEW (entry*, e.nrefs = argc + 1 );
1401
1409
e.refs [0 ] = cp_BootstrapMethod_ref.getRef ();
@@ -1405,23 +1413,22 @@ void unpacker::read_bootstrap_methods(entry* cpMap, int len) {
1405
1413
}
1406
1414
}
1407
1415
}
1416
+
1417
+ static bool isLoadableValue (int tag);
1408
1418
// Cf. PackageReader.readConstantPool
1409
1419
void unpacker::read_cp () {
1410
1420
byte* rp0 = rp;
1411
-
1412
- int i ;
1421
+ uint cpentries = 0 ;
1422
+ int loadable_count = 0 ;
1413
1423
1414
1424
for (int k = 0 ; k < (int )N_TAGS_IN_ORDER; k++) {
1415
1425
byte tag = TAGS_IN_ORDER[k];
1416
1426
int len = cp.tag_count [tag];
1417
1427
int base = cp.tag_base [tag];
1428
+ int loadable_base = -1 ;
1418
1429
1419
1430
PRINTCR ((1 ," Reading %d %s entries..." , len, NOT_PRODUCT (TAG_NAME[tag])+0 ));
1420
1431
entry* cpMap = &cp.entries [base];
1421
- for (i = 0 ; i < len; i++) {
1422
- cpMap[i].tag = tag;
1423
- cpMap[i].inord = i;
1424
- }
1425
1432
// Initialize the tag's CP index right away, since it might be needed
1426
1433
// in the next pass to initialize the CP for another tag.
1427
1434
#ifndef PRODUCT
@@ -1431,67 +1438,73 @@ void unpacker::read_cp() {
1431
1438
assert (ix->base1 == cpMap);
1432
1439
#endif
1433
1440
1441
+ if (isLoadableValue (tag)) {
1442
+ loadable_base = loadable_count;
1443
+ loadable_count += len;
1444
+ }
1445
+
1446
+ cpentries += len;
1434
1447
switch (tag) {
1435
1448
case CONSTANT_Utf8:
1436
- read_Utf8_values (cpMap, len);
1449
+ read_Utf8_values (cpMap, len, tag );
1437
1450
break ;
1438
1451
case CONSTANT_Integer:
1439
- read_single_words (cp_Int, cpMap, len);
1452
+ read_single_words (cp_Int, cpMap, len, tag, loadable_base );
1440
1453
break ;
1441
1454
case CONSTANT_Float:
1442
- read_single_words (cp_Float, cpMap, len);
1455
+ read_single_words (cp_Float, cpMap, len, tag, loadable_base );
1443
1456
break ;
1444
1457
case CONSTANT_Long:
1445
- read_double_words (cp_Long_hi /* & cp_Long_lo*/ , cpMap, len);
1458
+ read_double_words (cp_Long_hi /* & cp_Long_lo*/ , cpMap, len, tag, loadable_base );
1446
1459
break ;
1447
1460
case CONSTANT_Double:
1448
- read_double_words (cp_Double_hi /* & cp_Double_lo*/ , cpMap, len);
1461
+ read_double_words (cp_Double_hi /* & cp_Double_lo*/ , cpMap, len, tag, loadable_base );
1449
1462
break ;
1450
1463
case CONSTANT_String:
1451
- read_single_refs (cp_String, CONSTANT_Utf8, cpMap, len);
1464
+ read_single_refs (cp_String, CONSTANT_Utf8, cpMap, len, tag, loadable_base );
1452
1465
break ;
1453
1466
case CONSTANT_Class:
1454
- read_single_refs (cp_Class, CONSTANT_Utf8, cpMap, len);
1467
+ read_single_refs (cp_Class, CONSTANT_Utf8, cpMap, len, tag, loadable_base );
1455
1468
break ;
1456
1469
case CONSTANT_Signature:
1457
- read_signature_values (cpMap, len);
1470
+ read_signature_values (cpMap, len, tag );
1458
1471
break ;
1459
1472
case CONSTANT_NameandType:
1460
1473
read_double_refs (cp_Descr_name /* & cp_Descr_type*/ ,
1461
1474
CONSTANT_Utf8, CONSTANT_Signature,
1462
- cpMap, len);
1475
+ cpMap, len, tag );
1463
1476
break ;
1464
1477
case CONSTANT_Fieldref:
1465
1478
read_double_refs (cp_Field_class /* & cp_Field_desc*/ ,
1466
1479
CONSTANT_Class, CONSTANT_NameandType,
1467
- cpMap, len);
1480
+ cpMap, len, tag );
1468
1481
break ;
1469
1482
case CONSTANT_Methodref:
1470
1483
read_double_refs (cp_Method_class /* & cp_Method_desc*/ ,
1471
1484
CONSTANT_Class, CONSTANT_NameandType,
1472
- cpMap, len);
1485
+ cpMap, len, tag );
1473
1486
break ;
1474
1487
case CONSTANT_InterfaceMethodref:
1475
1488
read_double_refs (cp_Imethod_class /* & cp_Imethod_desc*/ ,
1476
1489
CONSTANT_Class, CONSTANT_NameandType,
1477
- cpMap, len);
1490
+ cpMap, len, tag );
1478
1491
break ;
1479
1492
case CONSTANT_MethodHandle:
1480
1493
// consumes cp_MethodHandle_refkind and cp_MethodHandle_member
1481
- read_method_handle (cpMap, len);
1494
+ read_method_handle (cpMap, len, tag, loadable_base );
1482
1495
break ;
1483
1496
case CONSTANT_MethodType:
1484
1497
// consumes cp_MethodType
1485
- read_method_type (cpMap, len);
1498
+ read_method_type (cpMap, len, tag, loadable_base );
1486
1499
break ;
1487
1500
case CONSTANT_InvokeDynamic:
1488
1501
read_double_refs (cp_InvokeDynamic_spec, CONSTANT_BootstrapMethod,
1489
1502
CONSTANT_NameandType,
1490
- cpMap, len);
1503
+ cpMap, len, tag );
1491
1504
break ;
1492
1505
case CONSTANT_BootstrapMethod:
1493
1506
// consumes cp_BootstrapMethod_ref, cp_BootstrapMethod_arg_count and cp_BootstrapMethod_arg
1494
- read_bootstrap_methods (cpMap, len);
1507
+ read_bootstrap_methods (cpMap, len, tag );
1495
1508
break ;
1496
1509
default :
1497
1510
assert (false );
@@ -1500,6 +1513,11 @@ void unpacker::read_cp() {
1500
1513
CHECK;
1501
1514
}
1502
1515
1516
+ // Initialize extra entries
1517
+ for (; cpentries < cp.maxentries ; cpentries++) {
1518
+ cp.entries [cpentries].outputIndex = REQUESTED_NONE;
1519
+ }
1520
+
1503
1521
cp.expandSignatures ();
1504
1522
CHECK;
1505
1523
cp.initMemberIndexes ();
@@ -3372,25 +3390,15 @@ bool isLoadableValue(int tag) {
3372
3390
return false ;
3373
3391
}
3374
3392
}
3375
- /*
3376
- * this method can be used to size an array using null as the parameter,
3377
- * thereafter can be reused to initialize the array using a valid pointer
3378
- * as a parameter.
3379
- */
3380
- int cpool::initLoadableValues (entry** loadable_entries) {
3381
- int loadable_count = 0 ;
3382
- for (int i = 0 ; i < (int )N_TAGS_IN_ORDER; i++) {
3383
- int tag = TAGS_IN_ORDER[i];
3384
- if (!isLoadableValue (tag))
3385
- continue ;
3386
- if (loadable_entries != NULL ) {
3387
- for (int n = 0 ; n < tag_count[tag] ; n++) {
3388
- loadable_entries[loadable_count + n] = &entries[tag_base[tag] + n];
3389
- }
3390
- }
3391
- loadable_count += tag_count[tag];
3393
+
3394
+ void cpool::initValues (entry& e, byte tag, int n, int loadable_base) {
3395
+ e.tag = tag;
3396
+ e.inord = n;
3397
+ e.outputIndex = REQUESTED_NONE;
3398
+ if (loadable_base >= 0 ) {
3399
+ entry** loadable_entries = tag_group_index[CONSTANT_LoadableValue - CONSTANT_All].base2 ;
3400
+ loadable_entries[loadable_base + n] = &e;
3392
3401
}
3393
- return loadable_count;
3394
3402
}
3395
3403
3396
3404
// Initialize various views into the constant pool.
@@ -3405,9 +3413,14 @@ void cpool::initGroupIndexes() {
3405
3413
tag_group_index[CONSTANT_All - CONSTANT_All].init (all_count, all_entries, CONSTANT_All);
3406
3414
3407
3415
// Initialize LoadableValues
3408
- int loadable_count = initLoadableValues (NULL );
3416
+ int loadable_count = 0 ;
3417
+ for (int i = 0 ; i < (int )N_TAGS_IN_ORDER; i++) {
3418
+ int tag = TAGS_IN_ORDER[i];
3419
+ if (isLoadableValue (tag)) {
3420
+ loadable_count += tag_count[tag];
3421
+ }
3422
+ }
3409
3423
entry** loadable_entries = U_NEW (entry*, loadable_count);
3410
- initLoadableValues (loadable_entries);
3411
3424
tag_group_count[CONSTANT_LoadableValue - CONSTANT_All] = loadable_count;
3412
3425
tag_group_index[CONSTANT_LoadableValue - CONSTANT_All].init (loadable_count,
3413
3426
loadable_entries, CONSTANT_LoadableValue);
0 commit comments