Skip to content

Commit dc4fc46

Browse files
committed
Faster processing of array comparisons with constant offsets
1 parent 375f68e commit dc4fc46

File tree

3 files changed

+132
-0
lines changed

3 files changed

+132
-0
lines changed

Diff for: src/Analyser/MutatingScope.php

+5
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
use PHPStan\Type\Constant\ConstantFloatType;
101101
use PHPStan\Type\Constant\ConstantIntegerType;
102102
use PHPStan\Type\Constant\ConstantStringType;
103+
use PHPStan\Type\ConstantScalarType;
103104
use PHPStan\Type\ConstantTypeHelper;
104105
use PHPStan\Type\DynamicReturnTypeExtensionRegistry;
105106
use PHPStan\Type\ErrorType;
@@ -4428,6 +4429,10 @@ public function addTypeToExpression(Expr $expr, Type $type): self
44284429

44294430
if ($originalExprType->equals($nativeType)) {
44304431
$newType = TypeCombinator::intersect($type, $originalExprType);
4432+
if ($newType->isConstantScalarValue()->yes() && $newType->equals($nativeType)) {
4433+
// don't add the same type over and over again to improve performance
4434+
return $this;
4435+
}
44314436
return $this->specifyExpressionType($expr, $newType, $newType, TrinaryLogic::createYes());
44324437
}
44334438

Diff for: 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[]

Diff for: tests/PHPStan/Analyser/data/bug-12800.php

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

0 commit comments

Comments
 (0)