@@ -436,7 +436,7 @@ dummy_func(
436
436
PREDICT (JUMP_BACKWARD );
437
437
}
438
438
439
- family (store_subscr ) = {
439
+ family (store_subscr , INLINE_CACHE_ENTRIES_STORE_SUBSCR ) = {
440
440
STORE_SUBSCR ,
441
441
STORE_SUBSCR_DICT ,
442
442
STORE_SUBSCR_LIST_INT ,
@@ -950,7 +950,7 @@ dummy_func(
950
950
Py_DECREF (seq );
951
951
}
952
952
953
- family (store_attr ) = {
953
+ family (store_attr , INLINE_CACHE_ENTRIES_STORE_ATTR ) = {
954
954
STORE_ATTR ,
955
955
STORE_ATTR_INSTANCE_VALUE ,
956
956
STORE_ATTR_SLOT ,
@@ -1436,6 +1436,20 @@ dummy_func(
1436
1436
PREDICT (JUMP_BACKWARD );
1437
1437
}
1438
1438
1439
+ family (load_attr , INLINE_CACHE_ENTRIES_LOAD_ATTR ) = {
1440
+ LOAD_ATTR ,
1441
+ LOAD_ATTR_INSTANCE_VALUE ,
1442
+ LOAD_ATTR_MODULE ,
1443
+ LOAD_ATTR_WITH_HINT ,
1444
+ LOAD_ATTR_SLOT ,
1445
+ LOAD_ATTR_CLASS ,
1446
+ LOAD_ATTR_PROPERTY ,
1447
+ LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN ,
1448
+ LOAD_ATTR_METHOD_WITH_VALUES ,
1449
+ LOAD_ATTR_METHOD_NO_DICT ,
1450
+ LOAD_ATTR_METHOD_LAZY_DICT ,
1451
+ };
1452
+
1439
1453
inst (LOAD_ATTR , (unused /9 , owner -- res2 if (oparg & 1 ), res )) {
1440
1454
#if ENABLE_SPECIALIZATION
1441
1455
_PyAttrCache * cache = (_PyAttrCache * )next_instr ;
@@ -1485,64 +1499,43 @@ dummy_func(
1485
1499
}
1486
1500
}
1487
1501
1488
- // error: LOAD_ATTR has irregular stack effect
1489
- inst (LOAD_ATTR_INSTANCE_VALUE ) {
1502
+ inst (LOAD_ATTR_INSTANCE_VALUE , (unused /1 , type_version /2 , index /1 , unused /5 , owner -- res2 if (oparg & 1 ), res )) {
1490
1503
assert (cframe .use_tracing == 0 );
1491
- PyObject * owner = TOP ();
1492
- PyObject * res ;
1493
1504
PyTypeObject * tp = Py_TYPE (owner );
1494
- _PyAttrCache * cache = (_PyAttrCache * )next_instr ;
1495
- uint32_t type_version = read_u32 (cache -> version );
1496
1505
assert (type_version != 0 );
1497
1506
DEOPT_IF (tp -> tp_version_tag != type_version , LOAD_ATTR );
1498
1507
assert (tp -> tp_dictoffset < 0 );
1499
1508
assert (tp -> tp_flags & Py_TPFLAGS_MANAGED_DICT );
1500
1509
PyDictOrValues dorv = * _PyObject_DictOrValuesPointer (owner );
1501
1510
DEOPT_IF (!_PyDictOrValues_IsValues (dorv ), LOAD_ATTR );
1502
- res = _PyDictOrValues_GetValues (dorv )-> values [cache -> index ];
1511
+ res = _PyDictOrValues_GetValues (dorv )-> values [index ];
1503
1512
DEOPT_IF (res == NULL , LOAD_ATTR );
1504
1513
STAT_INC (LOAD_ATTR , hit );
1505
1514
Py_INCREF (res );
1506
- SET_TOP (NULL );
1507
- STACK_GROW ((oparg & 1 ));
1508
- SET_TOP (res );
1515
+ res2 = NULL ;
1509
1516
Py_DECREF (owner );
1510
- JUMPBY (INLINE_CACHE_ENTRIES_LOAD_ATTR );
1511
1517
}
1512
1518
1513
- // error: LOAD_ATTR has irregular stack effect
1514
- inst (LOAD_ATTR_MODULE ) {
1519
+ inst (LOAD_ATTR_MODULE , (unused /1 , type_version /2 , index /1 , unused /5 , owner -- res2 if (oparg & 1 ), res )) {
1515
1520
assert (cframe .use_tracing == 0 );
1516
- PyObject * owner = TOP ();
1517
- PyObject * res ;
1518
- _PyAttrCache * cache = (_PyAttrCache * )next_instr ;
1519
1521
DEOPT_IF (!PyModule_CheckExact (owner ), LOAD_ATTR );
1520
1522
PyDictObject * dict = (PyDictObject * )((PyModuleObject * )owner )-> md_dict ;
1521
1523
assert (dict != NULL );
1522
- DEOPT_IF (dict -> ma_keys -> dk_version != read_u32 (cache -> version ),
1523
- LOAD_ATTR );
1524
+ DEOPT_IF (dict -> ma_keys -> dk_version != type_version , LOAD_ATTR );
1524
1525
assert (dict -> ma_keys -> dk_kind == DICT_KEYS_UNICODE );
1525
- assert (cache -> index < dict -> ma_keys -> dk_nentries );
1526
- PyDictUnicodeEntry * ep = DK_UNICODE_ENTRIES (dict -> ma_keys ) + cache -> index ;
1526
+ assert (index < dict -> ma_keys -> dk_nentries );
1527
+ PyDictUnicodeEntry * ep = DK_UNICODE_ENTRIES (dict -> ma_keys ) + index ;
1527
1528
res = ep -> me_value ;
1528
1529
DEOPT_IF (res == NULL , LOAD_ATTR );
1529
1530
STAT_INC (LOAD_ATTR , hit );
1530
1531
Py_INCREF (res );
1531
- SET_TOP (NULL );
1532
- STACK_GROW ((oparg & 1 ));
1533
- SET_TOP (res );
1532
+ res2 = NULL ;
1534
1533
Py_DECREF (owner );
1535
- JUMPBY (INLINE_CACHE_ENTRIES_LOAD_ATTR );
1536
1534
}
1537
1535
1538
- // error: LOAD_ATTR has irregular stack effect
1539
- inst (LOAD_ATTR_WITH_HINT ) {
1536
+ inst (LOAD_ATTR_WITH_HINT , (unused /1 , type_version /2 , index /1 , unused /5 , owner -- res2 if (oparg & 1 ), res )) {
1540
1537
assert (cframe .use_tracing == 0 );
1541
- PyObject * owner = TOP ();
1542
- PyObject * res ;
1543
1538
PyTypeObject * tp = Py_TYPE (owner );
1544
- _PyAttrCache * cache = (_PyAttrCache * )next_instr ;
1545
- uint32_t type_version = read_u32 (cache -> version );
1546
1539
assert (type_version != 0 );
1547
1540
DEOPT_IF (tp -> tp_version_tag != type_version , LOAD_ATTR );
1548
1541
assert (tp -> tp_flags & Py_TPFLAGS_MANAGED_DICT );
@@ -1552,7 +1545,7 @@ dummy_func(
1552
1545
DEOPT_IF (dict == NULL , LOAD_ATTR );
1553
1546
assert (PyDict_CheckExact ((PyObject * )dict ));
1554
1547
PyObject * name = GETITEM (names , oparg >>1 );
1555
- uint16_t hint = cache -> index ;
1548
+ uint16_t hint = index ;
1556
1549
DEOPT_IF (hint >= (size_t )dict -> ma_keys -> dk_nentries , LOAD_ATTR );
1557
1550
if (DK_IS_UNICODE (dict -> ma_keys )) {
1558
1551
PyDictUnicodeEntry * ep = DK_UNICODE_ENTRIES (dict -> ma_keys ) + hint ;
@@ -1567,73 +1560,49 @@ dummy_func(
1567
1560
DEOPT_IF (res == NULL , LOAD_ATTR );
1568
1561
STAT_INC (LOAD_ATTR , hit );
1569
1562
Py_INCREF (res );
1570
- SET_TOP (NULL );
1571
- STACK_GROW ((oparg & 1 ));
1572
- SET_TOP (res );
1563
+ res2 = NULL ;
1573
1564
Py_DECREF (owner );
1574
- JUMPBY (INLINE_CACHE_ENTRIES_LOAD_ATTR );
1575
1565
}
1576
1566
1577
- // error: LOAD_ATTR has irregular stack effect
1578
- inst (LOAD_ATTR_SLOT ) {
1567
+ inst (LOAD_ATTR_SLOT , (unused /1 , type_version /2 , index /1 , unused /5 , owner -- res2 if (oparg & 1 ), res )) {
1579
1568
assert (cframe .use_tracing == 0 );
1580
- PyObject * owner = TOP ();
1581
- PyObject * res ;
1582
1569
PyTypeObject * tp = Py_TYPE (owner );
1583
- _PyAttrCache * cache = (_PyAttrCache * )next_instr ;
1584
- uint32_t type_version = read_u32 (cache -> version );
1585
1570
assert (type_version != 0 );
1586
1571
DEOPT_IF (tp -> tp_version_tag != type_version , LOAD_ATTR );
1587
- char * addr = (char * )owner + cache -> index ;
1572
+ char * addr = (char * )owner + index ;
1588
1573
res = * (PyObject * * )addr ;
1589
1574
DEOPT_IF (res == NULL , LOAD_ATTR );
1590
1575
STAT_INC (LOAD_ATTR , hit );
1591
1576
Py_INCREF (res );
1592
- SET_TOP (NULL );
1593
- STACK_GROW ((oparg & 1 ));
1594
- SET_TOP (res );
1577
+ res2 = NULL ;
1595
1578
Py_DECREF (owner );
1596
- JUMPBY (INLINE_CACHE_ENTRIES_LOAD_ATTR );
1597
1579
}
1598
1580
1599
- // error: LOAD_ATTR has irregular stack effect
1600
- inst (LOAD_ATTR_CLASS ) {
1581
+ inst (LOAD_ATTR_CLASS , (unused /1 , type_version /2 , unused /2 , descr /4 , cls -- res2 if (oparg & 1 ), res )) {
1601
1582
assert (cframe .use_tracing == 0 );
1602
- _PyLoadMethodCache * cache = (_PyLoadMethodCache * )next_instr ;
1603
1583
1604
- PyObject * cls = TOP ();
1605
1584
DEOPT_IF (!PyType_Check (cls ), LOAD_ATTR );
1606
- uint32_t type_version = read_u32 (cache -> type_version );
1607
1585
DEOPT_IF (((PyTypeObject * )cls )-> tp_version_tag != type_version ,
1608
1586
LOAD_ATTR );
1609
1587
assert (type_version != 0 );
1610
1588
1611
1589
STAT_INC (LOAD_ATTR , hit );
1612
- PyObject * res = read_obj (cache -> descr );
1590
+ res2 = NULL ;
1591
+ res = descr ;
1613
1592
assert (res != NULL );
1614
1593
Py_INCREF (res );
1615
- SET_TOP (NULL );
1616
- STACK_GROW ((oparg & 1 ));
1617
- SET_TOP (res );
1618
1594
Py_DECREF (cls );
1619
- JUMPBY (INLINE_CACHE_ENTRIES_LOAD_ATTR );
1620
1595
}
1621
1596
1622
- // error: LOAD_ATTR has irregular stack effect
1623
- inst (LOAD_ATTR_PROPERTY ) {
1597
+ inst (LOAD_ATTR_PROPERTY , (unused /1 , type_version /2 , func_version /2 , fget /4 , owner -- unused if (oparg & 1 ), unused )) {
1624
1598
assert (cframe .use_tracing == 0 );
1625
1599
DEOPT_IF (tstate -> interp -> eval_frame , LOAD_ATTR );
1626
- _PyLoadMethodCache * cache = (_PyLoadMethodCache * )next_instr ;
1627
1600
1628
- PyObject * owner = TOP ();
1629
1601
PyTypeObject * cls = Py_TYPE (owner );
1630
- uint32_t type_version = read_u32 (cache -> type_version );
1631
1602
DEOPT_IF (cls -> tp_version_tag != type_version , LOAD_ATTR );
1632
1603
assert (type_version != 0 );
1633
- PyObject * fget = read_obj (cache -> descr );
1634
1604
assert (Py_IS_TYPE (fget , & PyFunction_Type ));
1635
1605
PyFunctionObject * f = (PyFunctionObject * )fget ;
1636
- uint32_t func_version = read_u32 (cache -> keys_version );
1637
1606
assert (func_version != 0 );
1638
1607
DEOPT_IF (f -> func_version != func_version , LOAD_ATTR );
1639
1608
PyCodeObject * code = (PyCodeObject * )f -> func_code ;
@@ -1642,6 +1611,7 @@ dummy_func(
1642
1611
STAT_INC (LOAD_ATTR , hit );
1643
1612
Py_INCREF (fget );
1644
1613
_PyInterpreterFrame * new_frame = _PyFrame_PushUnchecked (tstate , f , 1 );
1614
+ // Manipulate stack directly because we exit with DISPATCH_INLINED().
1645
1615
SET_TOP (NULL );
1646
1616
int shrink_stack = !(oparg & 1 );
1647
1617
STACK_SHRINK (shrink_stack );
@@ -1650,20 +1620,14 @@ dummy_func(
1650
1620
DISPATCH_INLINED (new_frame );
1651
1621
}
1652
1622
1653
- // error: LOAD_ATTR has irregular stack effect
1654
- inst (LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN ) {
1623
+ inst (LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN , (unused /1 , type_version /2 , func_version /2 , getattribute /4 , owner -- unused if (oparg & 1 ), unused )) {
1655
1624
assert (cframe .use_tracing == 0 );
1656
1625
DEOPT_IF (tstate -> interp -> eval_frame , LOAD_ATTR );
1657
- _PyLoadMethodCache * cache = (_PyLoadMethodCache * )next_instr ;
1658
- PyObject * owner = TOP ();
1659
1626
PyTypeObject * cls = Py_TYPE (owner );
1660
- uint32_t type_version = read_u32 (cache -> type_version );
1661
1627
DEOPT_IF (cls -> tp_version_tag != type_version , LOAD_ATTR );
1662
1628
assert (type_version != 0 );
1663
- PyObject * getattribute = read_obj (cache -> descr );
1664
1629
assert (Py_IS_TYPE (getattribute , & PyFunction_Type ));
1665
1630
PyFunctionObject * f = (PyFunctionObject * )getattribute ;
1666
- uint32_t func_version = read_u32 (cache -> keys_version );
1667
1631
assert (func_version != 0 );
1668
1632
DEOPT_IF (f -> func_version != func_version , LOAD_ATTR );
1669
1633
PyCodeObject * code = (PyCodeObject * )f -> func_code ;
@@ -1674,6 +1638,7 @@ dummy_func(
1674
1638
PyObject * name = GETITEM (names , oparg >> 1 );
1675
1639
Py_INCREF (f );
1676
1640
_PyInterpreterFrame * new_frame = _PyFrame_PushUnchecked (tstate , f , 2 );
1641
+ // Manipulate stack directly because we exit with DISPATCH_INLINED().
1677
1642
SET_TOP (NULL );
1678
1643
int shrink_stack = !(oparg & 1 );
1679
1644
STACK_SHRINK (shrink_stack );
@@ -1768,6 +1733,7 @@ dummy_func(
1768
1733
ERROR_IF (res == NULL , error );
1769
1734
}
1770
1735
1736
+ // No cache size here, since this is a family of super-instructions.
1771
1737
family (compare_and_branch ) = {
1772
1738
COMPARE_AND_BRANCH ,
1773
1739
COMPARE_AND_BRANCH_FLOAT ,
@@ -2373,69 +2339,54 @@ dummy_func(
2373
2339
2374
2340
}
2375
2341
2376
- // error: LOAD_ATTR has irregular stack effect
2377
- inst (LOAD_ATTR_METHOD_WITH_VALUES ) {
2342
+ inst (LOAD_ATTR_METHOD_WITH_VALUES , (unused /1 , type_version /2 , keys_version /2 , descr /4 , self -- res2 if (oparg & 1 ), res )) {
2378
2343
/* Cached method object */
2379
2344
assert (cframe .use_tracing == 0 );
2380
- PyObject * self = TOP ();
2381
2345
PyTypeObject * self_cls = Py_TYPE (self );
2382
- _PyLoadMethodCache * cache = (_PyLoadMethodCache * )next_instr ;
2383
- uint32_t type_version = read_u32 (cache -> type_version );
2384
2346
assert (type_version != 0 );
2385
2347
DEOPT_IF (self_cls -> tp_version_tag != type_version , LOAD_ATTR );
2386
2348
assert (self_cls -> tp_flags & Py_TPFLAGS_MANAGED_DICT );
2387
2349
PyDictOrValues dorv = * _PyObject_DictOrValuesPointer (self );
2388
2350
DEOPT_IF (!_PyDictOrValues_IsValues (dorv ), LOAD_ATTR );
2389
2351
PyHeapTypeObject * self_heap_type = (PyHeapTypeObject * )self_cls ;
2390
2352
DEOPT_IF (self_heap_type -> ht_cached_keys -> dk_version !=
2391
- read_u32 ( cache -> keys_version ) , LOAD_ATTR );
2353
+ keys_version , LOAD_ATTR );
2392
2354
STAT_INC (LOAD_ATTR , hit );
2393
- PyObject * res = read_obj (cache -> descr );
2394
- assert (res != NULL );
2395
- assert (_PyType_HasFeature (Py_TYPE (res ), Py_TPFLAGS_METHOD_DESCRIPTOR ));
2396
- SET_TOP (Py_NewRef (res ));
2397
- PUSH (self );
2398
- JUMPBY (INLINE_CACHE_ENTRIES_LOAD_ATTR );
2355
+ assert (descr != NULL );
2356
+ res2 = Py_NewRef (descr );
2357
+ assert (_PyType_HasFeature (Py_TYPE (res2 ), Py_TPFLAGS_METHOD_DESCRIPTOR ));
2358
+ res = self ;
2359
+ assert (oparg & 1 );
2399
2360
}
2400
2361
2401
- // error: LOAD_ATTR has irregular stack effect
2402
- inst (LOAD_ATTR_METHOD_NO_DICT ) {
2362
+ inst (LOAD_ATTR_METHOD_NO_DICT , (unused /1 , type_version /2 , unused /2 , descr /4 , self -- res2 if (oparg & 1 ), res )) {
2403
2363
assert (cframe .use_tracing == 0 );
2404
- PyObject * self = TOP ();
2405
2364
PyTypeObject * self_cls = Py_TYPE (self );
2406
- _PyLoadMethodCache * cache = (_PyLoadMethodCache * )next_instr ;
2407
- uint32_t type_version = read_u32 (cache -> type_version );
2408
2365
DEOPT_IF (self_cls -> tp_version_tag != type_version , LOAD_ATTR );
2409
2366
assert (self_cls -> tp_dictoffset == 0 );
2410
2367
STAT_INC (LOAD_ATTR , hit );
2411
- PyObject * res = read_obj (cache -> descr );
2412
- assert (res != NULL );
2413
- assert (_PyType_HasFeature (Py_TYPE (res ), Py_TPFLAGS_METHOD_DESCRIPTOR ));
2414
- SET_TOP (Py_NewRef (res ));
2415
- PUSH (self );
2416
- JUMPBY (INLINE_CACHE_ENTRIES_LOAD_ATTR );
2368
+ assert (descr != NULL );
2369
+ assert (_PyType_HasFeature (Py_TYPE (descr ), Py_TPFLAGS_METHOD_DESCRIPTOR ));
2370
+ res2 = Py_NewRef (descr );
2371
+ res = self ;
2372
+ assert (oparg & 1 );
2417
2373
}
2418
2374
2419
- // error: LOAD_ATTR has irregular stack effect
2420
- inst (LOAD_ATTR_METHOD_LAZY_DICT ) {
2375
+ inst (LOAD_ATTR_METHOD_LAZY_DICT , (unused /1 , type_version /2 , unused /2 , descr /4 , self -- res2 if (oparg & 1 ), res )) {
2421
2376
assert (cframe .use_tracing == 0 );
2422
- PyObject * self = TOP ();
2423
2377
PyTypeObject * self_cls = Py_TYPE (self );
2424
- _PyLoadMethodCache * cache = (_PyLoadMethodCache * )next_instr ;
2425
- uint32_t type_version = read_u32 (cache -> type_version );
2426
2378
DEOPT_IF (self_cls -> tp_version_tag != type_version , LOAD_ATTR );
2427
2379
Py_ssize_t dictoffset = self_cls -> tp_dictoffset ;
2428
2380
assert (dictoffset > 0 );
2429
2381
PyObject * dict = * (PyObject * * )((char * )self + dictoffset );
2430
2382
/* This object has a __dict__, just not yet created */
2431
2383
DEOPT_IF (dict != NULL , LOAD_ATTR );
2432
2384
STAT_INC (LOAD_ATTR , hit );
2433
- PyObject * res = read_obj (cache -> descr );
2434
- assert (res != NULL );
2435
- assert (_PyType_HasFeature (Py_TYPE (res ), Py_TPFLAGS_METHOD_DESCRIPTOR ));
2436
- SET_TOP (Py_NewRef (res ));
2437
- PUSH (self );
2438
- JUMPBY (INLINE_CACHE_ENTRIES_LOAD_ATTR );
2385
+ assert (descr != NULL );
2386
+ assert (_PyType_HasFeature (Py_TYPE (descr ), Py_TPFLAGS_METHOD_DESCRIPTOR ));
2387
+ res2 = Py_NewRef (descr );
2388
+ res = self ;
2389
+ assert (oparg & 1 );
2439
2390
}
2440
2391
2441
2392
// stack effect: (__0, __array[oparg] -- )
@@ -3265,27 +3216,21 @@ dummy_func(
3265
3216
3266
3217
// Future families go below this point //
3267
3218
3268
- family (call ) = {
3219
+ family (call , INLINE_CACHE_ENTRIES_CALL ) = {
3269
3220
CALL , CALL_PY_EXACT_ARGS ,
3270
3221
CALL_PY_WITH_DEFAULTS , CALL_BOUND_METHOD_EXACT_ARGS , CALL_BUILTIN_CLASS ,
3271
3222
CALL_BUILTIN_FAST_WITH_KEYWORDS , CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS , CALL_NO_KW_BUILTIN_FAST ,
3272
3223
CALL_NO_KW_BUILTIN_O , CALL_NO_KW_ISINSTANCE , CALL_NO_KW_LEN ,
3273
3224
CALL_NO_KW_LIST_APPEND , CALL_NO_KW_METHOD_DESCRIPTOR_FAST , CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS ,
3274
3225
CALL_NO_KW_METHOD_DESCRIPTOR_O , CALL_NO_KW_STR_1 , CALL_NO_KW_TUPLE_1 ,
3275
3226
CALL_NO_KW_TYPE_1 };
3276
- family (for_iter ) = {
3227
+ family (for_iter , INLINE_CACHE_ENTRIES_FOR_ITER ) = {
3277
3228
FOR_ITER , FOR_ITER_LIST ,
3278
3229
FOR_ITER_RANGE };
3279
- family (load_attr ) = {
3280
- LOAD_ATTR , LOAD_ATTR_CLASS ,
3281
- LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN , LOAD_ATTR_INSTANCE_VALUE , LOAD_ATTR_MODULE ,
3282
- LOAD_ATTR_PROPERTY , LOAD_ATTR_SLOT , LOAD_ATTR_WITH_HINT ,
3283
- LOAD_ATTR_METHOD_LAZY_DICT , LOAD_ATTR_METHOD_NO_DICT ,
3284
- LOAD_ATTR_METHOD_WITH_VALUES };
3285
- family (load_global ) = {
3230
+ family (load_global , INLINE_CACHE_ENTRIES_LOAD_GLOBAL ) = {
3286
3231
LOAD_GLOBAL , LOAD_GLOBAL_BUILTIN ,
3287
3232
LOAD_GLOBAL_MODULE };
3288
3233
family (store_fast ) = { STORE_FAST , STORE_FAST__LOAD_FAST , STORE_FAST__STORE_FAST };
3289
- family (unpack_sequence ) = {
3234
+ family (unpack_sequence , INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE ) = {
3290
3235
UNPACK_SEQUENCE , UNPACK_SEQUENCE_LIST ,
3291
3236
UNPACK_SEQUENCE_TUPLE , UNPACK_SEQUENCE_TWO_TUPLE };
0 commit comments