Skip to content

Commit cd2ca64

Browse files
authoredApr 13, 2025··
Faster processing of array comparisons with constant offsets
1 parent 375f68e commit cd2ca64

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed
 

‎src/Analyser/MutatingScope.php

+4
Original file line numberDiff line numberDiff line change
@@ -4428,6 +4428,10 @@ public function addTypeToExpression(Expr $expr, Type $type): self
44284428

44294429
if ($originalExprType->equals($nativeType)) {
44304430
$newType = TypeCombinator::intersect($type, $originalExprType);
4431+
if ($newType->isConstantScalarValue()->yes() && $newType->equals($originalExprType)) {
4432+
// don't add the same type over and over again to improve performance
4433+
return $this;
4434+
}
44314435
return $this->specifyExpressionType($expr, $newType, $newType, TrinaryLogic::createYes());
44324436
}
44334437

‎tests/PHPStan/Analyser/AnalyserIntegrationTest.php

+6
Original file line numberDiff line numberDiff line change
@@ -1554,6 +1554,12 @@ public function testBug12787(): void
15541554
$this->assertNoErrors($errors);
15551555
}
15561556

1557+
public function testBug12800(): void
1558+
{
1559+
$errors = $this->runAnalyse(__DIR__ . '/data/bug-12800.php');
1560+
$this->assertNoErrors($errors);
1561+
}
1562+
15571563
/**
15581564
* @param string[]|null $allAnalysedFiles
15591565
* @return Error[]
+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
<?php
2+
3+
namespace Bug12800;
4+
5+
class a
6+
{
7+
/**
8+
* @param array<mixed> $labels
9+
*/
10+
public function b(array $labels, \stdClass $payment): bool
11+
{
12+
$fullData = '
13+
{
14+
"additionalData": {
15+
"acquirerAccountCode": "TestPmmAcquirerAccount",
16+
"authorisationMid": "1009",
17+
"cvcResult": "1 Matches",
18+
"avsResult": "4 AVS not supported for this card type",
19+
"authCode": "25595",
20+
"acquirerReference": "acquirerReference",
21+
"expiryDate": "8/2018",
22+
"avsResultRaw": "Y",
23+
"cvcResultRaw": "M",
24+
"refusalReasonRaw": "00 : Approved or completed successfully",
25+
"refusalCodeRaw": "00",
26+
"acquirerCode": "TestPmmAcquirer",
27+
"inferredRefusalReason": "3D Secure Mandated",
28+
"networkTxReference": "MCC123456789012",
29+
"cardHolderName": "Test Cardholder",
30+
"issuerCountry": "NL",
31+
"countryCode": "NL",
32+
"cardBin": "411111",
33+
"issuerBin": "41111101",
34+
"cardSchemeCommercial": "true",
35+
"cardPaymentMethod": "visa",
36+
"cardIssuingBank": "Bank of America",
37+
"cardIssuingCountry": "US",
38+
"cardIssuingCurrency": "USD",
39+
"fundingSource": "PREPAID_RELOADABLE",
40+
"cardSummary": "1111",
41+
"isCardCommercial": "true",
42+
"paymentMethodVariant": "visadebit",
43+
"paymentMethod": "visa",
44+
"coBrandedWith": "visa",
45+
"businessTypeIdentifier": "PP",
46+
"cardProductId": "P",
47+
"bankSummary": "1111",
48+
"bankAccount.ownerName": "A. Klaassen",
49+
"bankAccount.iban": "NL13TEST0123456789",
50+
"cavv": "AQIDBAUGBw",
51+
"xid": "ODgxNDc2MDg2",
52+
"cavvAlgorithm": "3",
53+
"eci": "02",
54+
"dsTransID": "f8062b92-66e9-4c5a-979a-f465e66a6e48",
55+
"threeDSVersion": "2.1.0",
56+
"threeDAuthenticatedResponse": "Y",
57+
"liabilityShift": "true",
58+
"threeDOffered": "true",
59+
"threeDAuthenticated": "false",
60+
"challengeCancel": "01",
61+
"fraudResultType": "FRAUD",
62+
"fraudManualReview": "false"
63+
},
64+
"fraudResult": {
65+
"accountScore": 10,
66+
"result": {
67+
"fraudCheckResult": {
68+
"accountScore": "10",
69+
"checkId": "26",
70+
"name": "ShopperEmailRefCheck"
71+
}
72+
}
73+
},
74+
"response": "[cancelOrRefund-received]"
75+
}';
76+
77+
$result = json_decode($fullData, true);
78+
79+
$r = $labels['result_code'] === ''
80+
&& $labels['merchant_reference'] === $payment->merchant_reference
81+
&& $labels['brand_code'] === $payment->brand_code
82+
&& $labels['acquirer_account_code'] === $result['additionalData']['acquirerAccountCode']
83+
&& $labels['authorisation_mid'] === $result['additionalData']['authorisationMid']
84+
&& $labels['cvc_result'] === $result['additionalData']['cvcResult']
85+
&& $labels['auth_code'] === $result['additionalData']['authCode']
86+
&& $labels['acquirer_reference'] === $result['additionalData']['acquirerReference']
87+
&& $labels['expiry_date'] === $result['additionalData']['expiryDate']
88+
&& $labels['avs_result_raw'] === $result['additionalData']['avsResultRaw']
89+
&& $labels['cvc_result_raw'] === $result['additionalData']['cvcResultRaw']
90+
&& $labels['acquirer_code'] === $result['additionalData']['acquirerCode']
91+
&& $labels['inferred_refusal_reason'] === $result['additionalData']['inferredRefusalReason']
92+
&& $labels['network_tx_reference'] === $result['additionalData']['networkTxReference']
93+
&& $labels['issuer_country'] === $result['additionalData']['issuerCountry']
94+
&& $labels['country_code'] === $result['additionalData']['countryCode']
95+
&& $labels['card_bin'] === $result['additionalData']['cardBin']
96+
&& $labels['issuer_bin'] === $result['additionalData']['issuerBin']
97+
&& $labels['card_scheme_commercial'] === $result['additionalData']['cardSchemeCommercial']
98+
&& $labels['card_payment_method'] === $result['additionalData']['cardPaymentMethod']
99+
&& $labels['card_issuing_bank'] === $result['additionalData']['cardIssuingBank']
100+
&& $labels['card_issuing_country'] === $result['additionalData']['cardIssuingCountry']
101+
&& $labels['card_issuing_currency'] === $result['additionalData']['cardIssuingCurrency']
102+
&& $labels['card_summary'] === $result['additionalData']['cardSummary']
103+
&& $labels['payment_method_variant'] === $result['additionalData']['paymentMethodVariant']
104+
&& $labels['payment_method'] === $result['additionalData']['paymentMethod']
105+
&& $labels['co_branded_with'] === $result['additionalData']['coBrandedWith']
106+
&& $labels['business_type_identifier'] === $result['additionalData']['businessTypeIdentifier']
107+
&& $labels['card_product_id'] === $result['additionalData']['cardProductId']
108+
&& $labels['bank_summary'] === $result['additionalData']['bankSummary']
109+
&& $labels['cavv'] === $result['additionalData']['cavv']
110+
&& $labels['xid'] === $result['additionalData']['xid']
111+
&& $labels['cavv_algorithm'] === $result['additionalData']['cavvAlgorithm']
112+
&& $labels['eci'] === $result['additionalData']['eci']
113+
&& $labels['ds_trans_id'] === $result['additionalData']['dsTransID']
114+
&& $labels['liability_shift'] === $result['additionalData']['liabilityShift']
115+
&& $labels['fraud_result_type'] === $result['additionalData']['fraudResultType']
116+
&& $labels['fraud_manual_review'] === $result['additionalData']['fraudManualReview']
117+
&& $labels['fraud_result_account_score'] === $result['fraudResult']['accountScore']
118+
&& $labels['fraud_result_check_id'] === $result['fraudResult']['result']['fraudCheckResult']['checkId']
119+
&& $labels['fraud_result_name'] === $result['fraudResult']['result']['fraudCheckResult']['name']
120+
&& $labels['response'] === $result['response'];
121+
return $r;
122+
}
123+
}

0 commit comments

Comments
 (0)
Please sign in to comment.